From 2f2b425cd31aaa4b12db394e743d264a656612f2 Mon Sep 17 00:00:00 2001 From: "Philipp Lohmann [pl]" Date: Thu, 4 Mar 2010 18:30:56 +0100 Subject: fix a snafu --- scripting/source/pyprov/pythonscript.py | 50 ++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 17 deletions(-) (limited to 'scripting/source/pyprov/pythonscript.py') diff --git a/scripting/source/pyprov/pythonscript.py b/scripting/source/pyprov/pythonscript.py index 6a57fa7928..00992a625c 100644 --- a/scripting/source/pyprov/pythonscript.py +++ b/scripting/source/pyprov/pythonscript.py @@ -5,6 +5,7 @@ import sys import os import imp import time +import ast class LogLevel: NONE = 0 @@ -340,6 +341,31 @@ class ProviderContext: ret = url[0:pos]+ package.transientPathElement + "/" + url[pos:len(url)] log.isDebugLevel() and log.debug( "getStorageUrlFromPersistentUrl " + url + " -> "+ ret) return ret + + def getFuncsByUrl( self, url ): + src = readTextFromStream( self.sfa.openFileRead( url ) ) + checkForPythonPathBesideScript( url[0:url.rfind('/')] ) + src = ensureSourceState( src ) + + if url.startswith( "file:" ): + code = compile( src, encfile(uno.fileUrlToSystemPath( url ) ), "exec", ast.PyCF_ONLY_AST, 0 ) + else: + code = compile( src, url, "exec", ast.PyCF_ONLY_AST, 0 ) + + allFuncs = [] + g_exportedScripts = [] + + nodes = ast.iter_child_nodes(code) + for node in nodes: + if type(node).__name__ == 'FunctionDef': + allFuncs.append(node.name) + elif type(node).__name__ == 'Assign': + if node.targets[0].id == 'g_exportedScripts': + for i in node.value.elts: + g_exportedScripts.append(i.id) + return g_exportedScripts + + return allFuncs def getModuleByUrl( self, url ): entry = self.modules.get(url) @@ -382,11 +408,10 @@ def isScript( candidate ): #------------------------------------------------------- class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, XActionListener ): - def __init__( self, provCtx, uri, fileName, funcName, func ): + def __init__( self, provCtx, uri, fileName, funcName ): self.fileName = fileName self.funcName = funcName self.provCtx = provCtx - self.func = func self.uri = uri def getName( self ): @@ -407,8 +432,6 @@ class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, if name == "URI": ret = self.provCtx.uriHelper.getScriptURI( self.provCtx.getPersistentUrlFromStorageUrl( self.uri + "$" + self.funcName ) ) - elif name == "Description": - ret = getattr( self.func, "__doc__", None ) elif name == "Editable" and ENABLE_EDIT_DIALOG: ret = not self.provCtx.sfa.isReadOnly( self.uri ) @@ -506,7 +529,7 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): self.provCtx = provCtx self.uri = uri self.name = name - self.module = None + self.funcnames = None def getName( self ): return self.name @@ -514,21 +537,14 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): def getChildNodes(self): ret = () try: - self.module = self.provCtx.getModuleByUrl( self.uri ) - values = self.module.__dict__.get( CALLABLE_CONTAINER_NAME , None ) + self.funcnames = self.provCtx.getFuncsByUrl( self.uri ) - # no g_exportedScripts, export every function - if not isinstance(values, type(())): - values = self.module.__dict__.values() - scriptNodeList = [] - for i in values: - if isScript( i ): - scriptNodeList.append( - ScriptBrowseNode( - self.provCtx, self.uri, self.name, i.__name__, i )) + for i in self.funcnames: + scriptNodeList.append( + ScriptBrowseNode( + self.provCtx, self.uri, self.name, i )) ret = tuple( scriptNodeList ) - # must compile ! log.isDebugLevel() and log.debug( "returning " +str(len(ret)) + " ScriptChildNodes on " + self.uri ) except Exception, e: text = lastException2String() -- cgit v1.2.3 From 0d3a3e0d445de739b73b41bac6486169cca4bcd4 Mon Sep 17 00:00:00 2001 From: "Philipp Lohmann [pl]" Date: Mon, 8 Mar 2010 16:22:14 +0100 Subject: undo previous change --- scripting/source/pyprov/pythonscript.py | 50 +++++++++++---------------------- 1 file changed, 17 insertions(+), 33 deletions(-) (limited to 'scripting/source/pyprov/pythonscript.py') diff --git a/scripting/source/pyprov/pythonscript.py b/scripting/source/pyprov/pythonscript.py index 00992a625c..6a57fa7928 100644 --- a/scripting/source/pyprov/pythonscript.py +++ b/scripting/source/pyprov/pythonscript.py @@ -5,7 +5,6 @@ import sys import os import imp import time -import ast class LogLevel: NONE = 0 @@ -341,31 +340,6 @@ class ProviderContext: ret = url[0:pos]+ package.transientPathElement + "/" + url[pos:len(url)] log.isDebugLevel() and log.debug( "getStorageUrlFromPersistentUrl " + url + " -> "+ ret) return ret - - def getFuncsByUrl( self, url ): - src = readTextFromStream( self.sfa.openFileRead( url ) ) - checkForPythonPathBesideScript( url[0:url.rfind('/')] ) - src = ensureSourceState( src ) - - if url.startswith( "file:" ): - code = compile( src, encfile(uno.fileUrlToSystemPath( url ) ), "exec", ast.PyCF_ONLY_AST, 0 ) - else: - code = compile( src, url, "exec", ast.PyCF_ONLY_AST, 0 ) - - allFuncs = [] - g_exportedScripts = [] - - nodes = ast.iter_child_nodes(code) - for node in nodes: - if type(node).__name__ == 'FunctionDef': - allFuncs.append(node.name) - elif type(node).__name__ == 'Assign': - if node.targets[0].id == 'g_exportedScripts': - for i in node.value.elts: - g_exportedScripts.append(i.id) - return g_exportedScripts - - return allFuncs def getModuleByUrl( self, url ): entry = self.modules.get(url) @@ -408,10 +382,11 @@ def isScript( candidate ): #------------------------------------------------------- class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, XActionListener ): - def __init__( self, provCtx, uri, fileName, funcName ): + def __init__( self, provCtx, uri, fileName, funcName, func ): self.fileName = fileName self.funcName = funcName self.provCtx = provCtx + self.func = func self.uri = uri def getName( self ): @@ -432,6 +407,8 @@ class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, if name == "URI": ret = self.provCtx.uriHelper.getScriptURI( self.provCtx.getPersistentUrlFromStorageUrl( self.uri + "$" + self.funcName ) ) + elif name == "Description": + ret = getattr( self.func, "__doc__", None ) elif name == "Editable" and ENABLE_EDIT_DIALOG: ret = not self.provCtx.sfa.isReadOnly( self.uri ) @@ -529,7 +506,7 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): self.provCtx = provCtx self.uri = uri self.name = name - self.funcnames = None + self.module = None def getName( self ): return self.name @@ -537,14 +514,21 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): def getChildNodes(self): ret = () try: - self.funcnames = self.provCtx.getFuncsByUrl( self.uri ) + self.module = self.provCtx.getModuleByUrl( self.uri ) + values = self.module.__dict__.get( CALLABLE_CONTAINER_NAME , None ) + # no g_exportedScripts, export every function + if not isinstance(values, type(())): + values = self.module.__dict__.values() + scriptNodeList = [] - for i in self.funcnames: - scriptNodeList.append( - ScriptBrowseNode( - self.provCtx, self.uri, self.name, i )) + for i in values: + if isScript( i ): + scriptNodeList.append( + ScriptBrowseNode( + self.provCtx, self.uri, self.name, i.__name__, i )) ret = tuple( scriptNodeList ) + # must compile ! log.isDebugLevel() and log.debug( "returning " +str(len(ret)) + " ScriptChildNodes on " + self.uri ) except Exception, e: text = lastException2String() -- cgit v1.2.3 From d0ebfa5de681d71da228d693fdcc1a421dc5068b Mon Sep 17 00:00:00 2001 From: "Philipp Lohmann [pl]" Date: Tue, 9 Mar 2010 14:37:11 +0100 Subject: python script fix (thanks cmc) --- scripting/source/pyprov/pythonscript.py | 51 ++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 17 deletions(-) (limited to 'scripting/source/pyprov/pythonscript.py') diff --git a/scripting/source/pyprov/pythonscript.py b/scripting/source/pyprov/pythonscript.py index 6a57fa7928..88e0a9efbc 100644 --- a/scripting/source/pyprov/pythonscript.py +++ b/scripting/source/pyprov/pythonscript.py @@ -5,6 +5,7 @@ import sys import os import imp import time +import compiler class LogLevel: NONE = 0 @@ -340,6 +341,32 @@ class ProviderContext: ret = url[0:pos]+ package.transientPathElement + "/" + url[pos:len(url)] log.isDebugLevel() and log.debug( "getStorageUrlFromPersistentUrl " + url + " -> "+ ret) return ret + + def getFuncsByUrl( self, url ): + src = readTextFromStream( self.sfa.openFileRead( url ) ) + checkForPythonPathBesideScript( url[0:url.rfind('/')] ) + src = ensureSourceState( src ) + + code = compiler.parse( src ) + + allFuncs = [] + + if code == None: + return allFuncs + + g_exportedScripts = [] + for node in code.node.nodes: + if node.__class__.__name__ == 'Function': + allFuncs.append(node.name) + elif node.__class__.__name__ == 'Assign': + for assignee in node.nodes: + if assignee.name == 'g_exportedScripts': + for item in node.expr: + if item.__class__.__name__ == 'Name': + g_exportedScripts.append(item.name) + return g_exportedScripts + + return allFuncs def getModuleByUrl( self, url ): entry = self.modules.get(url) @@ -382,11 +409,10 @@ def isScript( candidate ): #------------------------------------------------------- class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, XActionListener ): - def __init__( self, provCtx, uri, fileName, funcName, func ): + def __init__( self, provCtx, uri, fileName, funcName ): self.fileName = fileName self.funcName = funcName self.provCtx = provCtx - self.func = func self.uri = uri def getName( self ): @@ -407,8 +433,6 @@ class ScriptBrowseNode( unohelper.Base, XBrowseNode , XPropertySet, XInvocation, if name == "URI": ret = self.provCtx.uriHelper.getScriptURI( self.provCtx.getPersistentUrlFromStorageUrl( self.uri + "$" + self.funcName ) ) - elif name == "Description": - ret = getattr( self.func, "__doc__", None ) elif name == "Editable" and ENABLE_EDIT_DIALOG: ret = not self.provCtx.sfa.isReadOnly( self.uri ) @@ -506,7 +530,7 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): self.provCtx = provCtx self.uri = uri self.name = name - self.module = None + self.funcnames = None def getName( self ): return self.name @@ -514,21 +538,14 @@ class FileBrowseNode( unohelper.Base, XBrowseNode ): def getChildNodes(self): ret = () try: - self.module = self.provCtx.getModuleByUrl( self.uri ) - values = self.module.__dict__.get( CALLABLE_CONTAINER_NAME , None ) + self.funcnames = self.provCtx.getFuncsByUrl( self.uri ) - # no g_exportedScripts, export every function - if not isinstance(values, type(())): - values = self.module.__dict__.values() - scriptNodeList = [] - for i in values: - if isScript( i ): - scriptNodeList.append( - ScriptBrowseNode( - self.provCtx, self.uri, self.name, i.__name__, i )) + for i in self.funcnames: + scriptNodeList.append( + ScriptBrowseNode( + self.provCtx, self.uri, self.name, i )) ret = tuple( scriptNodeList ) - # must compile ! log.isDebugLevel() and log.debug( "returning " +str(len(ret)) + " ScriptChildNodes on " + self.uri ) except Exception, e: text = lastException2String() -- cgit v1.2.3