66EFFECT_MODULE = 'effect'
77
88
9+ class EffectError (Exception ):
10+ pass
11+
12+
913class 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
4966effects = Effects ()
0 commit comments