Skip to content

Commit 7354976

Browse files
committed
Allow to change a fragment name after initialization
1 parent 27dd5b2 commit 7354976

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

gql/dsl.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,10 +753,23 @@ def __init__(
753753

754754
self.name = name
755755
self._type = None
756-
self.ast_field = FragmentSpreadNode()
757-
self.ast_field.name = NameNode(value=self.name)
756+
758757
log.debug(f"Creating {self!r}")
759758

759+
@property # type: ignore
760+
def ast_field(self) -> FragmentSpreadNode: # type: ignore
761+
"""ast_field property will generate a FragmentSpreadNode with the
762+
provided name.
763+
764+
Note: We need to ignore the type because of
765+
`issue #4125 of mypy <https://github.com/python/mypy/issues/4125>`_.
766+
"""
767+
768+
spread_node = FragmentSpreadNode()
769+
spread_node.name = NameNode(value=self.name)
770+
771+
return spread_node
772+
760773
def select(
761774
self, *fields: "DSLSelectable", **fields_with_alias: "DSLSelectableWithAlias"
762775
) -> "DSLFragment":

tests/starwars/test_dsl.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,17 @@ def test_fragment_without_type_condition_error(ds):
499499
dsl_gql(name_and_appearances)
500500

501501

502+
def test_fragment_with_name_changed(ds):
503+
504+
fragment = DSLFragment("ABC")
505+
506+
assert str(fragment) == "...ABC"
507+
508+
fragment.name = "DEF"
509+
510+
assert str(fragment) == "...DEF"
511+
512+
502513
def test_dsl_nested_query_with_fragment(ds):
503514
query = """fragment NameAndAppearances on Character {
504515
name

0 commit comments

Comments
 (0)