Skip to content

Commit a8ec068

Browse files
committed
Handle effect package path with class names
1 parent 0fd7f6c commit a8ec068

File tree

4 files changed

+41
-16
lines changed

4 files changed

+41
-16
lines changed

demosys/effects/registry.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def parse_package_string(path):
3131
if parts[-1][0].isupper():
3232
return ".".join(parts[:-1]), parts[-1]
3333

34-
return path
34+
return path, ""
3535

3636

3737
class EffectRegistry:
@@ -79,6 +79,8 @@ def add_package(self, name):
7979
8080
:param name: (str) The effect package to add
8181
"""
82+
name, cls_name = parse_package_string(name)
83+
8284
if name in self.package_map:
8385
return
8486

@@ -93,14 +95,39 @@ def add_package(self, name):
9395

9496
def get_package(self, name) -> 'EffectPackage':
9597
"""
96-
Get a package by python path
98+
Get a package by python path. Can also contain path to an effect.
99+
100+
Args:
101+
name (str): Path to effect package or effect
102+
103+
Returns:
104+
The requested EffectPackage
105+
106+
Raises:
107+
EffectError when no package is found
97108
"""
109+
name, cls_name = parse_package_string(name)
110+
98111
try:
99112
return self.package_map[name]
100113
except KeyError:
101114
raise EffectError("No package '{}' registered".format(name))
102115

103-
def find_effect_class(self, class_name, package_name=None) -> Type[Effect]:
116+
def find_effect_class(self, path) -> Type[Effect]:
117+
"""
118+
Find an effect class by class name or full python path to class
119+
120+
Args:
121+
path (str): effect class name or full python path to effect class
122+
123+
Returns:
124+
Effect class
125+
126+
Raises:
127+
EffectError if no class is found
128+
"""
129+
package_name, class_name = parse_package_string(path)
130+
104131
if package_name:
105132
package = self.get_package(package_name)
106133
return package.find_effect_class(class_name, raise_for_error=True)

demosys/management/commands/runeffect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Command(RunCommand):
99
help = "Runs an effect"
1010

1111
def add_arguments(self, parser):
12-
parser.add_argument("effect_package", help="Name of the effect package")
12+
parser.add_argument("effect_package", help="Python path to effect package or effect class")
1313

1414
def handle(self, *args, **options):
1515
demosys.setup(

demosys/project/base.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ def create_effect(self, label: str, name: str, *args, **kwargs) -> Effect:
117117
Returns:
118118
The newly created Effect instance
119119
"""
120-
params = name.split('.')
121-
effect_cls = effects.find_effect_class(params[-1], package_name=".".join(params[:-1]))
120+
effect_cls = effects.find_effect_class(name)
122121
effect = effect_cls(*args, **kwargs)
123122
effect._label = label
124123

demosys/project/default.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from demosys.project.base import BaseProject
2-
from demosys.effects.registry import effects
2+
from demosys.effects.registry import effects, parse_package_string
33

44

55
class Project(BaseProject):
@@ -9,7 +9,9 @@ class Project(BaseProject):
99
"""
1010
def __init__(self, effect_package):
1111
super().__init__()
12-
self.effect_packages = [effect_package]
12+
self.path = effect_package
13+
self.effect_package_name, self.effect_class_name = parse_package_string(effect_package)
14+
self.effect_packages = [self.effect_package_name]
1315
self.effect = None
1416

1517
def get_default_effect(self):
@@ -19,12 +21,9 @@ def create_resources(self):
1921
pass
2022

2123
def create_effect_instances(self):
22-
cls = self.get_runnable_effect()
23-
self.effect = self.create_effect('default', cls.__name__)
24+
cls = effects.find_effect_class(self.path)
25+
26+
if not cls.runnable:
27+
raise ValueError("Effect doesn't have the runnable flag set:", self.path)
2428

25-
def get_runnable_effect(self):
26-
"""
27-
Attempt to get a runnable effect in a package
28-
"""
29-
runnable = effects.packages[0].runnable_effects()
30-
return runnable[0]
29+
self.effect = self.create_effect('default', cls.__name__)

0 commit comments

Comments
 (0)