Skip to content

Commit c29aa51

Browse files
committed
Effect registry: Split up effect loading to allow hacking the loader
1 parent bceff33 commit c29aa51

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

demosys/effects/registry.py

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
EFFECT_MODULE = 'effect'
77

88

9+
class EffectError(Exception):
10+
pass
11+
12+
913
class EffectConfig:
1014
def __init__(self, module=None, cls=None):
1115
self.module = module
@@ -29,21 +33,34 @@ def get_dirs(self):
2933
yield v.path
3034

3135
def polulate(self, effect_list):
32-
"""
33-
Load all effects
34-
"""
36+
"""Find all effects"""
3537
for effect in effect_list:
36-
module = importlib.import_module(f'{effect}.{EFFECT_MODULE}')
37-
# Find the Effect class in the module
38-
for name, cls in inspect.getmembers(module):
39-
if inspect.isclass(cls):
40-
if cls == Effect:
41-
continue
42-
# Use MRO to figure out if this is really an effect
43-
mro = inspect.getmro(cls)
44-
if cls in mro and Effect in mro:
45-
cls.name = effect
46-
self.effects[module.__name__] = EffectConfig(module=module, cls=cls)
38+
name = f'{effect}.{EFFECT_MODULE}'
39+
module, cls = self.get_effect_cls(name)
40+
if cls:
41+
cls.name = effect
42+
self.effects[module.__name__] = EffectConfig(module=module, cls=cls)
43+
else:
44+
raise EffectError(f"Effect '{effect}' has no effect class")
45+
46+
def get_effect_cls(self, module_name):
47+
"""Find and return an effect class in a module
48+
:param module_name: Name of the module
49+
:returns: module, cls tuple
50+
"""
51+
module = importlib.import_module(module_name)
52+
53+
# Find the Effect class in the module
54+
for name, cls in inspect.getmembers(module):
55+
if inspect.isclass(cls):
56+
if cls == Effect:
57+
continue
58+
# Use MRO to figure out if this is really an effect
59+
mro = inspect.getmro(cls)
60+
if cls in mro and Effect in mro:
61+
return module, cls
62+
63+
return None, None
4764

4865

4966
effects = Effects()

0 commit comments

Comments
 (0)