Skip to content

Commit 7ef3e4d

Browse files
committed
factory function instead of class
1 parent 0c866d1 commit 7ef3e4d

3 files changed

Lines changed: 35 additions & 43 deletions

File tree

src/compas/scene/scene.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def add(self, item, parent=None, **kwargs):
119119
del kwargs["context"] # otherwist the SceneObject receives "context" twice, which results in an error
120120

121121
# Create a corresponding new scene object
122-
sceneobject = SceneObjectFactory.create(item=item, context=self.context, scene=self, **kwargs)
122+
sceneobject = SceneObjectFactory(item=item, context=self.context, scene=self, **kwargs)
123123

124124
# Add the scene object and item to the data store
125125
self.objectstore[str(sceneobject.guid)] = sceneobject

src/compas/scene/sceneobject.py

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,47 +21,39 @@
2121
from .descriptors.protocol import DescriptorProtocol
2222

2323

24-
class SceneObjectFactory:
25-
"""Factory class for creating appropriate SceneObject instances based on input item type.
24+
def SceneObjectFactory(item=None, scene=None, **kwargs):
25+
"""Create appropriate SceneObject instance based on item type.
2626
27-
This factory encapsulates the logic for selecting the right SceneObject subclass
28-
for a given data item, making the creation process more explicit and easier to understand.
27+
Parameters
28+
----------
29+
item : :class:`compas.data.Data`
30+
The data item to create a scene object for.
31+
**kwargs : dict
32+
Additional keyword arguments to pass to the SceneObject constructor.
33+
34+
Returns
35+
-------
36+
:class:`compas.scene.SceneObject`
37+
A SceneObject instance of the appropriate subclass for the given item.
38+
39+
Raises
40+
------
41+
ValueError
42+
If item is None.
43+
SceneObjectNotRegisteredError
44+
If no scene object is registered for the item type in the current context.
2945
"""
46+
if item is None:
47+
raise ValueError("Cannot create a scene object for None. Please ensure you pass an instance of a supported class.")
3048

31-
@staticmethod
32-
def create(item=None, scene=None, **kwargs):
33-
"""Create appropriate SceneObject instance based on item type.
34-
35-
Parameters
36-
----------
37-
item : :class:`compas.data.Data`
38-
The data item to create a scene object for.
39-
**kwargs : dict
40-
Additional keyword arguments to pass to the SceneObject constructor.
41-
42-
Returns
43-
-------
44-
:class:`compas.scene.SceneObject`
45-
A SceneObject instance of the appropriate subclass for the given item.
46-
47-
Raises
48-
------
49-
ValueError
50-
If item is None.
51-
SceneObjectNotRegisteredError
52-
If no scene object is registered for the item type in the current context.
53-
"""
54-
if item is None:
55-
raise ValueError("Cannot create a scene object for None. Please ensure you pass an instance of a supported class.")
56-
57-
if isinstance(item, SceneObject):
58-
item._scene = scene
59-
return item
49+
if isinstance(item, SceneObject):
50+
item._scene = scene
51+
return item
6052

61-
sceneobject_cls = get_sceneobject_cls(item, **kwargs)
53+
sceneobject_cls = get_sceneobject_cls(item, **kwargs)
6254

63-
# Create and return an instance of the appropriate scene object class
64-
return sceneobject_cls(item=item, scene=scene, **kwargs)
55+
# Create and return an instance of the appropriate scene object class
56+
return sceneobject_cls(item=item, scene=scene, **kwargs)
6557

6658

6759
class SceneObject(Data):

tests/compas/scene/test_scene.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,29 @@ def test_get_sceneobject_cls_with_orderly_registration():
4747
register(FakeItem, FakeSceneObject, context="fake")
4848
register(FakeSubItem, FakeSubSceneObject, context="fake")
4949
item = FakeItem()
50-
sceneobject = SceneObjectFactory.create(item, context="fake")
50+
sceneobject = SceneObjectFactory(item=item, context="fake")
5151
assert isinstance(sceneobject, FakeSceneObject)
5252

5353
item = FakeSubItem()
54-
sceneobject = SceneObjectFactory.create(item, context="fake")
54+
sceneobject = SceneObjectFactory(item=item, context="fake")
5555
assert isinstance(sceneobject, FakeSubSceneObject)
5656

5757
def test_get_sceneobject_cls_with_out_of_order_registration():
5858
register(FakeSubItem, FakeSubSceneObject, context="fake")
5959
register(FakeItem, FakeSceneObject, context="fake")
6060
item = FakeItem()
61-
sceneobject = SceneObjectFactory.create(item, context="fake")
61+
sceneobject = SceneObjectFactory(item=item, context="fake")
6262
assert isinstance(sceneobject, FakeSceneObject)
6363

6464
item = FakeSubItem()
65-
sceneobject = SceneObjectFactory.create(item, context="fake")
65+
sceneobject = SceneObjectFactory(item=item, context="fake")
6666
assert isinstance(sceneobject, FakeSubSceneObject)
6767

6868
def test_sceneobject_auto_context_discovery(mocker):
6969
register_fake_context()
7070

7171
item = FakeItem()
72-
sceneobject = SceneObjectFactory.create(item)
72+
sceneobject = SceneObjectFactory(item=item)
7373

7474
assert isinstance(sceneobject, FakeSceneObject)
7575

@@ -79,7 +79,7 @@ def test_sceneobject_auto_context_discovery_no_context(mocker):
7979

8080
with pytest.raises(SceneObjectNotRegisteredError):
8181
item = FakeSubItem()
82-
_ = SceneObjectFactory.create(item)
82+
_ = SceneObjectFactory(item=item)
8383

8484
def test_sceneobject_transform():
8585
scene = Scene()

0 commit comments

Comments
 (0)