Skip to content

Commit cb4131a

Browse files
committed
Support optional references
1 parent f5d4bab commit cb4131a

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

pylasu/model/model.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def compute_feature_from_annotation(cl, name, decl_type):
158158
elif type(decl_type) is str:
159159
decl_type = try_to_resolve_string_type(decl_type, name, cl)
160160
if not isinstance(decl_type, type):
161-
raise Exception(f"Unsupported feature {name} of type {decl_type}")
161+
raise Exception(f"Unsupported feature {name} of type {decl_type} in {cl}")
162162
feature.type = decl_type
163163
feature.is_containment = provides_nodes(decl_type) and not feature.is_reference
164164
return feature
@@ -169,7 +169,7 @@ def try_to_resolve_string_type(decl_type, name, cl):
169169
ns = getattr(sys.modules.get(cl.__module__, None), '__dict__', globals())
170170
decl_type = ns[decl_type]
171171
except KeyError:
172-
raise Exception(f"Unsupported feature {name} of unknown type {decl_type}")
172+
raise Exception(f"Unsupported feature {name} of unknown type {decl_type} in {cl}")
173173
return decl_type
174174

175175

@@ -195,6 +195,7 @@ def try_to_resolve_type(decl_type, feature):
195195
feature.multiplicity = Multiplicity.OPTIONAL
196196
else:
197197
raise Exception(f"Unsupported feature {feature.name} of union type {decl_type}")
198+
decl_type = try_to_resolve_type(decl_type, feature)
198199
return decl_type
199200

200201

tests/model/test_model.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class SomeNode(Node, Named):
2020
optional: Optional[Node] = None
2121
multiple_opt: List[Optional[Node]] = dataclasses.field(default_factory=list)
2222
internal: Node = internal_field(default=None)
23+
optional_ref: Optional[ReferenceByName["SomeNode"]] = None
2324

2425
def __post_init__(self):
2526
self.bar = 5
@@ -208,7 +209,7 @@ def frob_node(_: Node):
208209
pass
209210

210211
pds = [pd for pd in sorted(SomeNode.node_properties, key=lambda x: x.name)]
211-
self.assertEqual(8, len(pds), f"{pds} should be 7")
212+
self.assertEqual(9, len(pds), f"{pds} should be 9")
212213
self.assertEqual("bar", pds[0].name)
213214
self.assertFalse(pds[0].is_containment)
214215
self.assertEqual("containment", pds[1].name)
@@ -226,8 +227,11 @@ def frob_node(_: Node):
226227
self.assertEqual("optional", pds[6].name)
227228
self.assertTrue(pds[6].is_containment)
228229
self.assertEqual(Multiplicity.OPTIONAL, pds[6].multiplicity)
229-
self.assertEqual("reference", pds[7].name)
230+
self.assertEqual("optional_ref", pds[7].name)
230231
self.assertTrue(pds[7].is_reference)
232+
self.assertEqual(Multiplicity.OPTIONAL, pds[7].multiplicity)
233+
self.assertEqual("reference", pds[8].name)
234+
self.assertTrue(pds[8].is_reference)
231235

232236
self.assertRaises(Exception, lambda: [x for x in InvalidNode.node_properties])
233237

@@ -237,7 +241,7 @@ def frob_node_2(_: Node):
237241
pass
238242

239243
pds = [pd for pd in sorted(ExtendedNode.node_properties, key=lambda x: x.name)]
240-
self.assertEqual(15, len(pds), f"{pds}")
244+
self.assertEqual(16, len(pds), f"{pds}")
241245
self.assertEqual("bar", pds[0].name)
242246
self.assertFalse(pds[0].is_containment)
243247
self.assertEqual("cont_fwd", pds[1].name)

0 commit comments

Comments
 (0)