Commit 48f6394b authored by Jérome Perrin's avatar Jérome Perrin Committed by Arnaud Fontaine

patches/python: update linecache patch for python3

patches/python: fix linecache for python scripts on py3
parent 52412e54
...@@ -155,24 +155,67 @@ def patch_linecache(): ...@@ -155,24 +155,67 @@ def patch_linecache():
data = get_source(name) data = get_source(name)
except (ImportError, AttributeError): except (ImportError, AttributeError):
pass pass
return data.splitlines(True) if data is not None else () return data.splitlines(True) if data is not None else ()
if basename(filename) in ('Script (Python)', 'ERP5 Python Script', 'ERP5 Workflow Script'): if module_globals is not None:
try: # in-ZODB python scripts
script = module_globals['script'] if basename(filename) in ('Script (Python)', 'ERP5 Python Script', 'ERP5 Workflow Script'):
if script._p_jar.opened: try:
return script.body().splitlines(True) script = module_globals['script']
except Exception: if script._p_jar.opened:
pass return script.body().splitlines(True)
return () except Exception:
pass
return ()
# TALES expressions
x = expr_search(filename) x = expr_search(filename)
if x: if x:
return x.groups() return x.groups()
if filename.startswith('<portal_components/'):
# use our special key for lazycache
filename = 'erp5-linecache://' + filename
return linecache_getlines(filename, module_globals) return linecache_getlines(filename, module_globals)
linecache.getlines = getlines linecache.getlines = getlines
if sys.version_info[:3] >= (3, ):
linecache_lazycache = linecache.lazycache
def lazycache(filename, module_globals):
if filename:
# XXX linecache ignores files named like <this>, but this is
# what we used for portal_components filename (and it's not so
# good because it's not easy to copy paste, so we might want to
# reconsider), for now, we add an arbitrary prefix for cache.
if (filename.startswith('<') and filename.endswith('>')):
filename = 'erp5-linecache://' + filename
# For python scripts, insert a fake PEP302 loader so that
# linecache can find the source code
if basename(filename) in (
'Script (Python)',
'ERP5 Python Script',
'ERP5 Workflow Script',
) and module_globals is not None:
script = module_globals['script']
body = ''
if script._p_jar is None or script._p_jar.opened:
body = script.body()
class PythonScriptLoader:
def __init__(self, filename, body):
self.filename = filename
self.body = body
def get_source(self, name, *args, **kw):
return self.body
assert '__loader___' not in module_globals
module_globals['__loader__'] = PythonScriptLoader(filename, body)
return linecache_lazycache(filename, module_globals)
linecache.lazycache = lazycache
patch_linecache() patch_linecache()
import decimal as _decimal import decimal as _decimal
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment