def _map_file_to_server(filename, cache=norm_filename_to_server_container): # Eclipse will send the passed filename to be translated to the python process # So, this would be 'NormFileFromEclipseToPython' try: return cache[filename] except KeyError: if eclipse_sep != python_sep: # Make sure that the separators are what we expect from the IDE. filename = filename.replace(python_sep, eclipse_sep) # used to translate a path from the client to the debug server translated = filename translated_normalized = _normcase_from_client(filename) for eclipse_prefix, server_prefix in paths_from_eclipse_to_python: if translated_normalized.startswith(eclipse_prefix): found_translation = True if DEBUG_CLIENT_SERVER_TRANSLATION: pydev_log.critical( 'pydev debugger: replacing to server: %s', filename) translated = server_prefix + filename[len(eclipse_prefix):] if DEBUG_CLIENT_SERVER_TRANSLATION: pydev_log.critical( 'pydev debugger: sent to server: %s - matched prefix: %s', translated, eclipse_prefix) break else: found_translation = False # Note that when going to the server, we do the replace first and only later do the norm file. if eclipse_sep != python_sep: translated = translated.replace(eclipse_sep, python_sep) if found_translation: # Note: we don't normalize it here, this must be done as a separate # step by the caller. translated = absolute_path(translated) else: if not os_path_exists(translated): if not translated.startswith('<'): # This is a configuration error, so, write it always so # that the user can fix it. error_once( 'pydev debugger: unable to find translation for: "%s" in [%s] (please revise your path mappings).\n', filename, ', '.join([ '"%s"' % (x[0], ) for x in paths_from_eclipse_to_python ])) else: # It's possible that we had some round trip (say, we sent /usr/lib and received # it back, so, having no translation is ok too). # Note: we don't normalize it here, this must be done as a separate # step by the caller. translated = absolute_path(translated) cache[filename] = translated return translated
def test_pydevd_log(): from _pydev_bundle import pydev_log try: import StringIO as io except: import io from _pydev_bundle.pydev_log import log_context stream = io.StringIO() with log_context(0, stream=stream): pydev_log.critical('always') pydev_log.info('never') assert stream.getvalue() == 'always\n' stream = io.StringIO() with log_context(1, stream=stream): pydev_log.critical('always') pydev_log.info('this too') assert stream.getvalue() == 'always\nthis too\n' stream = io.StringIO() with log_context(0, stream=stream): pydev_log.critical('always %s', 1) assert stream.getvalue() == 'always 1\n' stream = io.StringIO() with log_context(0, stream=stream): pydev_log.critical('always %s %s', 1, 2) assert stream.getvalue() == 'always 1 2\n' stream = io.StringIO() with log_context(0, stream=stream): pydev_log.critical('always %s %s', 1) # Even if there's an error in the formatting, don't fail, just print the message and args. assert stream.getvalue() == 'always %s %s - (1,)\n' stream = io.StringIO() with log_context(0, stream=stream): try: raise RuntimeError() except: pydev_log.exception('foo') assert 'foo\n' in stream.getvalue() assert 'raise RuntimeError()' in stream.getvalue() stream = io.StringIO() with log_context(0, stream=stream): pydev_log.error_once('always %s %s', 1) # Even if there's an error in the formatting, don't fail, just print the message and args. assert stream.getvalue() == 'always %s %s - (1,)\n'
def _norm_file_to_server(filename, cache=norm_filename_to_server_container): # Eclipse will send the passed filename to be translated to the python process # So, this would be 'NormFileFromEclipseToPython' try: return cache[filename] except KeyError: if eclipse_sep != python_sep: # Make sure that the separators are what we expect from the IDE. filename = filename.replace(python_sep, eclipse_sep) # used to translate a path from the client to the debug server translated = filename translated_normalized = _normcase_from_client(filename) for eclipse_prefix, server_prefix in paths_from_eclipse_to_python: if translated_normalized.startswith(eclipse_prefix): found_translation = True if DEBUG_CLIENT_SERVER_TRANSLATION: sys.stderr.write('pydev debugger: replacing to server: %s\n' % (filename,)) translated = server_prefix + filename[len(eclipse_prefix):] if DEBUG_CLIENT_SERVER_TRANSLATION: sys.stderr.write('pydev debugger: sent to server: %s\n' % (translated,)) break else: found_translation = False # Note that when going to the server, we do the replace first and only later do the norm file. if eclipse_sep != python_sep: translated = translated.replace(eclipse_sep, python_sep) if found_translation: translated = _NormFile(translated) else: if not os.path.exists(translated): if not translated.startswith('<'): # This is a configuration error, so, write it always so # that the user can fix it. error_once('pydev debugger: unable to find translation for: "%s" in [%s] (please revise your path mappings).\n' % (filename, ', '.join(['"%s"' % (x[0],) for x in paths_from_eclipse_to_python]))) else: # It's possible that we had some round trip (say, we sent /usr/lib and received # it back, so, having no translation is ok too). translated = _NormFile(translated) cache[filename] = translated return translated
def delete_old_compiled_extensions(): import _pydevd_bundle cython_extensions_dir = os.path.dirname(os.path.dirname(_pydevd_bundle.__file__)) _pydevd_bundle_ext_dir = os.path.dirname(_pydevd_bundle.__file__) _pydevd_frame_eval_ext_dir = os.path.join(cython_extensions_dir, '_pydevd_frame_eval_ext') try: import shutil for file in os.listdir(_pydevd_bundle_ext_dir): if file.startswith("pydevd") and file.endswith(".so"): os.remove(os.path.join(_pydevd_bundle_ext_dir, file)) for file in os.listdir(_pydevd_frame_eval_ext_dir): if file.startswith("pydevd") and file.endswith(".so"): os.remove(os.path.join(_pydevd_frame_eval_ext_dir, file)) build_dir = os.path.join(cython_extensions_dir, "build") if os.path.exists(build_dir): shutil.rmtree(os.path.join(cython_extensions_dir, "build")) except OSError: pydev_log.error_once("warning: failed to delete old cython speedups. Please delete all *.so files from the directories " "\"%s\" and \"%s\"" % (_pydevd_bundle_ext_dir, _pydevd_frame_eval_ext_dir))
def _get_source_django_18_or_lower(frame): # This method is usable only for the Django <= 1.8 try: node = frame.f_locals['self'] if hasattr(node, 'source'): return node.source else: if IS_DJANGO18: # The debug setting was changed since Django 1.8 pydev_log.error_once("WARNING: Template path is not available. Set the 'debug' option in the OPTIONS of a DjangoTemplates " "backend.") else: # The debug setting for Django < 1.8 pydev_log.error_once("WARNING: Template path is not available. Please set TEMPLATE_DEBUG=True in your settings.py to make " "django template breakpoints working") return None except: pydev_log.debug(traceback.format_exc()) return None
def delete_old_compiled_extensions(): import _pydevd_bundle cython_extensions_dir = os.path.dirname( os.path.dirname(_pydevd_bundle.__file__)) _pydevd_bundle_ext_dir = os.path.dirname(_pydevd_bundle.__file__) _pydevd_frame_eval_ext_dir = os.path.join(cython_extensions_dir, '_pydevd_frame_eval_ext') try: import shutil for file in os.listdir(_pydevd_bundle_ext_dir): if file.startswith("pydevd") and file.endswith(".so"): os.remove(os.path.join(_pydevd_bundle_ext_dir, file)) for file in os.listdir(_pydevd_frame_eval_ext_dir): if file.startswith("pydevd") and file.endswith(".so"): os.remove(os.path.join(_pydevd_frame_eval_ext_dir, file)) build_dir = os.path.join(cython_extensions_dir, "build") if os.path.exists(build_dir): shutil.rmtree(os.path.join(cython_extensions_dir, "build")) except OSError: pydev_log.error_once( "warning: failed to delete old cython speedups. Please delete all *.so files from the directories " "\"%s\" and \"%s\"" % (_pydevd_bundle_ext_dir, _pydevd_frame_eval_ext_dir))
def log_error_once(msg): from _pydev_bundle import pydev_log pydev_log.error_once(msg)
def log_error_once(msg): pydev_log.error_once(msg)