From d27e3e4fa321943545d8e49fe91db8f0644ee536 Mon Sep 17 00:00:00 2001 From: David Acevedo Date: Fri, 26 Jul 2024 15:30:20 -0500 Subject: [PATCH] feat: improved alias resolvers (#1181) - added support for resolving trivial nested fields --- ariadne/resolvers.py | 13 ++++++++++--- tests/test_default_resolvers.py | 9 +++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ariadne/resolvers.py b/ariadne/resolvers.py index 21a3014a6..7a4334149 100644 --- a/ariadne/resolvers.py +++ b/ariadne/resolvers.py @@ -79,9 +79,16 @@ def add_resolver_to_field( def resolve_parent_field(parent: Any, field_name: str) -> Any: - if isinstance(parent, Mapping): - return parent.get(field_name) - return getattr(parent, field_name, None) + value = parent + for name in field_name.split("."): + if isinstance(value, Mapping): + value = value.get(name) + else: + value = getattr(value, name, None) + + if value is None: + break + return value def resolve_to(attr_name: str) -> Resolver: diff --git a/tests/test_default_resolvers.py b/tests/test_default_resolvers.py index 6efa5d21d..58b24d935 100644 --- a/tests/test_default_resolvers.py +++ b/tests/test_default_resolvers.py @@ -14,6 +14,15 @@ def callable_resolver(*_): assert alias_resolver(obj, None) +def test_alias_resolver_supports_nested_name(): + parent_mapping = {"nested": {"hello": "world"}} + parent_object = Mock(nested=Mock(hello="world")) + + alias_resolver = resolve_to("nested.hello") + assert alias_resolver(parent_mapping, None) == "world" + assert alias_resolver(parent_object, None) == "world" + + def test_alias_resolver_passess_field_args_to_callable_return_value(): def callable_resolver(*_, test): return test