aboutsummaryrefslogtreecommitdiff
path: root/src/ModuleManager.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ModuleManager.py')
-rw-r--r--src/ModuleManager.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/ModuleManager.py b/src/ModuleManager.py
index 62dd6fa6..5f1bfa61 100644
--- a/src/ModuleManager.py
+++ b/src/ModuleManager.py
@@ -19,9 +19,13 @@ class ModuleNotLoadedWarning(ModuleWarning):
pass
class ModuleDependencyNotFulfilled(ModuleException):
- def __init__(self, message, dependency):
- ModuleException.__init__(self, message)
+ def __init__(self, module, dependency):
+ ModuleException.__init__(self, "Dependency for %s not fulfilled: %s"
+ % (module, dependency))
+ self.module = module
self.dependency = dependency
+class ModuleCircularDependency(ModuleException):
+ pass
class ModuleType(enum.Enum):
FILE = 0
@@ -123,6 +127,8 @@ class ModuleManager(object):
if os.path.isdir(path):
type = ModuleType.DIRECTORY
path = os.path.join(path, "__init__.py")
+ else:
+ path = "%s.py" % path
return self.define_module(type, path)
@@ -155,9 +161,8 @@ class ModuleManager(object):
dependencies = definition.get_dependencies()
for dependency in dependencies:
if not dependency in self.modules:
- raise ModuleDependencyNotFulfilled(
- "Dependency for %s not fulfilled: %s" %
- (definition.name, dependency) ,dependency)
+ raise ModuleDependencyNotFulfilled(definition.name,
+ dependency)
for hashflag, value in definition.hashflags:
if hashflag == "ignore":
@@ -235,12 +240,19 @@ class ModuleManager(object):
definition_dependencies = {
d.name: d.get_dependencies() for d in definitions}
+ for name, deps in definition_dependencies.items():
+ for dep in deps:
+ if not dep in definition_dependencies:
+ # unknown dependency!
+ raise ModuleDependencyNotFulfilled(name, dep)
+
while definition_dependencies:
changed = False
to_remove = []
for name, dependencies in definition_dependencies.items():
if not dependencies:
+ changed = True
# pop things with no unfufilled dependencies
to_remove.append(name)
for name in to_remove:
@@ -248,19 +260,23 @@ class ModuleManager(object):
del definition_dependencies[name]
for deps in definition_dependencies.values():
if name in deps:
- # fulfill dependencies for things we just popped
changed = True
+ # fulfill dependencies for things we just popped
deps.remove(name)
if not changed:
for name, deps in definition_dependencies.items():
for dep_name in deps:
if name in definition_dependencies[dep_name]:
- self.log.warn("Circular dependencies: %s<->%s",
+ self.log.warn(
+ "Circular dependencies detected: %s<->%s",
[name, dep_name])
+ changed = True
# snap a circular dependence
deps.remove(dep_name)
definition_dependencies[dep_name].remove(name)
+ if not changed:
+ raise ModuleCircularDependency()
return [definition_names[name] for name in definitions_ordered]