Modified:
/trunk/namespace.py
/trunk/reloader.py
=======================================
--- /trunk/namespace.py Fri Feb 12 23:34:45 2010
+++ /trunk/namespace.py Sun Feb 21 17:06:02 2010
@@ -42,7 +42,7 @@
def Load(self, filePath):
self.filePath = filePath
- script = open(self.filePath, 'rU').read()
+ script = open(self.filePath, 'rU').read() +"\n"
self.codeObject = compile(script, self.filePath, "exec")
def GetAttributeValue(self, attributeName):
@@ -171,6 +171,7 @@
self.namespaces = {}
self.classCreationCallback = None
+ self.validateScriptCallback = None
self.delScriptGlobals = delScriptGlobals
self.SetBaseDirectory(baseDirPath)
@@ -182,6 +183,9 @@
def SetClassCreationCallback(self, ob):
self.classCreationCallback = ob
+ def SetValidateScriptCallback(self, ob):
+ self.validateScriptCallback = ob
+
def SetBaseDirectory(self, baseDirPath):
self.baseDirPath = baseDirPath
@@ -352,6 +356,10 @@
logger.debug("RunScript failed")
return False
+ # Give whatever is using the framework to analyse and reject
script changes.
+ if not self.BroadcastValidateScriptEvent(scriptFile):
+ return False
+
if self.unitTest and not scriptFile.UnitTest():
logger.debug("RunScript tests failed or errored")
return False
@@ -364,6 +372,20 @@
return True
+ def BroadcastValidateScriptEvent(self, scriptFile):
+ if self.validateScriptCallback:
+ try:
+ if type(self.validateScriptCallback) is tuple:
+ getattr(self.validateScriptCallback[0],
self.validateScriptCallback[1])(scriptFile)
+ else:
+ self.validateScriptCallback(scriptFile)
+ except ReferenceError:
+ self.validateScriptCallback = None
+ except Exception:
+ scriptFile.lastError =
traceback.format_exception(*sys.exc_info())
+ return False
+ return True
+
def UnloadScript(self, scriptFile, force=False):
namespace = self.GetNamespace(scriptFile.namespacePath)
if self.RemoveModuleAttributes(scriptFile, namespace):
=======================================
--- /trunk/reloader.py Fri Feb 12 23:34:45 2010
+++ /trunk/reloader.py Sun Feb 21 17:06:02 2010
@@ -37,6 +37,7 @@
self.namespaceLeaks = {}
self.classCreationCallback = None
self.classUpdateCallback = None
+ self.validateScriptCallback = None
if monitorFileChanges:
# Grabbing a weakref to a method of this instance requires me
to
@@ -76,6 +77,19 @@
for handler in self.directoriesByPath.itervalues():
handler.SetClassCreationCallback(self.classCreationCallback)
+ def SetValidateScriptCallback(self, ob):
+ if type(ob) is types.MethodType:
+ self.validateScriptCallback = (weakref.proxy(ob.im_self),
ob.func_name)
+ elif type(ob) is types.FunctionType:
+ self.validateScriptCallback = weakref.proxy(ob)
+ elif ob is None:
+ self.validateScriptCallback = ob
+ else:
+ raise Exception("Bad callback")
+
+ for handler in self.directoriesByPath.itervalues():
+ handler.SetValidateScriptCallback(self.validateScriptCallback)
+
#
------------------------------------------------------------------------
# Directory registration support.
@@ -83,6 +97,8 @@
handler = self.scriptDirectoryClass(baseDirPath, baseNamespace,
delScriptGlobals=(self.mode == MODE_UPDATE))
if self.classCreationCallback:
handler.SetClassCreationCallback(self.classCreationCallback)
+ if self.validateScriptCallback:
+ handler.SetValidateScriptCallback(self.validateScriptCallback)
if handler.Load():
self.directoriesByPath[baseDirPath] = handler