Skip to content

Commit 77ca8b1

Browse files
authored
Merge pull request #25 from metaobjectsdev/fix/verify-templates-fqn-payloadref
fix(verify): resolve @payloadRef by FQN short-segment in verify --templates
2 parents 1d01654 + 781deaa commit 77ca8b1

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

server/python/src/metaobjects/codegen/generators/render_helper_generator.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,14 @@ def _field_tree_literal(fields: list[PayloadField]) -> str:
144144

145145
def _resolve_payload_vo(root: MetaData, payload_ref: str) -> MetaObject | None:
146146
"""``@payloadRef`` must resolve to an ``object.value`` (same contract as the
147-
parser/prompt generators). Bare short-name match on a value-object child."""
147+
parser/prompt generators). Matches a value-object child by short name OR by the
148+
last segment of a fully-qualified ``a::b::Name`` ref (FR-026 expands refs to FQN,
149+
while the child node still carries the short ``name``)."""
150+
ref_short = payload_ref.rsplit("::", 1)[-1]
148151
for child in root.own_children():
149152
if child.type != TYPE_OBJECT or not isinstance(child, MetaObject):
150153
continue
151-
if child.sub_type == OBJECT_SUBTYPE_VALUE and child.name == payload_ref:
154+
if child.sub_type == OBJECT_SUBTYPE_VALUE and child.name in (payload_ref, ref_short):
152155
return child
153156
return None
154157

server/python/tests/codegen/test_render_helper_generator.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from metaobjects.codegen.generator import GenContext
2626
from metaobjects.codegen.generators.render_helper_generator import (
2727
RenderHelperGenerator,
28+
_resolve_payload_vo,
2829
_snake_case,
2930
render_helper_generator,
3031
)
@@ -394,3 +395,24 @@ def test_generator_requires_template_root() -> None:
394395
def test_snake_case_pascal_to_snake() -> None:
395396
assert _snake_case("WelcomePage") == "welcome_page"
396397
assert _snake_case("Alpha") == "alpha"
398+
399+
400+
def test_resolve_payload_vo_matches_short_and_fully_qualified_ref() -> None:
401+
"""FR-026 expands @payloadRef to a fully-qualified ``a::b::Name`` while the
402+
object.value child still carries the short ``name`` — both forms must resolve."""
403+
import json
404+
405+
from metaobjects import InMemoryStringSource, MetaDataFormat, MetaDataLoader
406+
407+
root = MetaDataLoader().load([
408+
InMemoryStringSource(
409+
json.dumps({"metadata.root": {"package": "acme::blog", "children": [
410+
{"object.value": {"name": "WelcomePayload",
411+
"children": [{"field.string": {"name": "x"}}]}},
412+
]}}),
413+
id="m.json", format=MetaDataFormat.JSON,
414+
)
415+
]).root
416+
assert _resolve_payload_vo(root, "WelcomePayload") is not None # short ref
417+
assert _resolve_payload_vo(root, "acme::blog::WelcomePayload") is not None # FQN ref
418+
assert _resolve_payload_vo(root, "acme::blog::Missing") is None

0 commit comments

Comments
 (0)