def test_source_reference(tmpdir): import pydevd_file_utils pydevd_file_utils.set_ide_os('WINDOWS') if IS_WINDOWS: # Client and server are on windows. pydevd_file_utils.setup_client_server_paths([('c:\\foo', 'c:\\bar')]) assert pydevd_file_utils.map_file_to_client('c:\\bar\\my') == ('c:\\foo\\my', True) assert pydevd_file_utils.get_client_filename_source_reference('c:\\foo\\my') == 0 assert pydevd_file_utils.map_file_to_client('c:\\another\\my') == ('c:\\another\\my', False) source_reference = pydevd_file_utils.get_client_filename_source_reference('c:\\another\\my') assert source_reference != 0 assert pydevd_file_utils.get_server_filename_from_source_reference(source_reference) == 'c:\\another\\my' else: # Client on windows and server on unix pydevd_file_utils.set_ide_os('WINDOWS') pydevd_file_utils.setup_client_server_paths([('c:\\foo', '/bar')]) assert pydevd_file_utils.map_file_to_client('/bar/my') == ('c:\\foo\\my', True) assert pydevd_file_utils.get_client_filename_source_reference('c:\\foo\\my') == 0 assert pydevd_file_utils.map_file_to_client('/another/my') == ('\\another\\my', False) source_reference = pydevd_file_utils.get_client_filename_source_reference('\\another\\my') assert source_reference != 0 assert pydevd_file_utils.get_server_filename_from_source_reference(source_reference) == '/another/my'
def on_source_request(self, py_db, request): ''' :param SourceRequest request: ''' source_reference = request.arguments.sourceReference server_filename = None content = None if source_reference != 0: server_filename = pydevd_file_utils.get_server_filename_from_source_reference(source_reference) if not server_filename: server_filename = pydevd_file_utils.get_source_reference_filename_from_linecache(source_reference) if server_filename: # Try direct file access first - it's much faster when available. try: with open(server_filename, 'r') as stream: content = stream.read() except: pass if content is None: # File might not exist at all, or we might not have a permission to read it, # but it might also be inside a zipfile, or an IPython cell. In this case, # linecache might still be able to retrieve the source. lines = (linecache.getline(server_filename, i) for i in itertools.count(1)) lines = itertools.takewhile(bool, lines) # empty lines are '\n', EOF is '' # If we didn't get at least one line back, reset it to None so that it's # reported as error below, and not as an empty file. content = ''.join(lines) or None if content is None: frame_id = pydevd_file_utils.get_frame_id_from_source_reference(source_reference) pydev_log.debug('Found frame id: %s for source reference: %s', frame_id, source_reference) if frame_id is not None: try: content = self.api.get_decompiled_source_from_frame_id(py_db, frame_id) except Exception: pydev_log.exception('Error getting source for frame id: %s', frame_id) content = None body = SourceResponseBody(content or '') response_args = {'body': body} if content is None: if source_reference == 0: message = 'Source unavailable' elif server_filename: message = 'Unable to retrieve source for %s' % (server_filename,) else: message = 'Invalid sourceReference %d' % (source_reference,) response_args.update({'success': False, 'message': message}) response = pydevd_base_schema.build_response(request, kwargs=response_args) return NetCommand(CMD_RETURN, 0, response, is_json=True)
def on_source_request(self, py_db, request): ''' :param SourceRequest request: ''' source_reference = request.arguments.sourceReference server_filename = None content = None if source_reference != 0: server_filename = pydevd_file_utils.get_server_filename_from_source_reference(source_reference) if server_filename: # Try direct file access first - it's much faster when available. try: with open(server_filename, 'r') as stream: content = stream.read() except: pass if content is None: # File might not exist at all, or we might not have a permission to read it, # but it might also be inside a zipfile, or an IPython cell. In this case, # linecache might still be able to retrieve the source. lines = (linecache.getline(server_filename, i) for i in itertools.count(1)) lines = itertools.takewhile(bool, lines) # empty lines are '\n', EOF is '' # If we didn't get at least one line back, reset it to None so that it's # reported as error below, and not as an empty file. content = ''.join(lines) or None body = SourceResponseBody(content or '') response_args = {'body': body} if content is None: if source_reference == 0: message = 'Source unavailable' elif server_filename: message = 'Unable to retrieve source for %s' % (server_filename,) else: message = 'Invalid sourceReference %d' % (source_reference,) response_args.update({'success': False, 'message': message}) response = pydevd_base_schema.build_response(request, kwargs=response_args) return NetCommand(CMD_RETURN, 0, response, is_json=True)