Skip to content

Commit 632ec96

Browse files
authored
Fix missing empty directives in DSL nodes (#448)
1 parent c5a164c commit 632ec96

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

gql/dsl.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ def executable_ast(self) -> OperationDefinitionNode:
503503
selection_set=self.selection_set,
504504
variable_definitions=self.variable_definitions.get_ast_definitions(),
505505
**({"name": NameNode(value=self.name)} if self.name else {}),
506+
directives=(),
506507
)
507508

508509
def __repr__(self) -> str:
@@ -597,6 +598,7 @@ def get_ast_definitions(self) -> Tuple[VariableDefinitionNode, ...]:
597598
default_value=None
598599
if var.default_value is None
599600
else ast_from_value(var.default_value, var.type),
601+
directives=(),
600602
)
601603
for var in self.variables.values()
602604
if var.type is not None # only variables used
@@ -818,7 +820,11 @@ def __init__(
818820
"""
819821
self.parent_type = parent_type
820822
self.field = field
821-
self.ast_field = FieldNode(name=NameNode(value=name), arguments=())
823+
self.ast_field = FieldNode(
824+
name=NameNode(value=name),
825+
arguments=(),
826+
directives=(),
827+
)
822828
self.dsl_type = dsl_type
823829

824830
log.debug(f"Creating {self!r}")
@@ -950,7 +956,7 @@ def __init__(
950956

951957
log.debug(f"Creating {self!r}")
952958

953-
self.ast_field = InlineFragmentNode()
959+
self.ast_field = InlineFragmentNode(directives=())
954960

955961
DSLSelector.__init__(self, *fields, **fields_with_alias)
956962

@@ -1018,7 +1024,7 @@ def ast_field(self) -> FragmentSpreadNode: # type: ignore
10181024
`issue #4125 of mypy <https://github.com/python/mypy/issues/4125>`_.
10191025
"""
10201026

1021-
spread_node = FragmentSpreadNode()
1027+
spread_node = FragmentSpreadNode(directives=())
10221028
spread_node.name = NameNode(value=self.name)
10231029

10241030
return spread_node
@@ -1067,6 +1073,7 @@ def executable_ast(self) -> FragmentDefinitionNode:
10671073
selection_set=self.selection_set,
10681074
variable_definitions=self.variable_definitions.get_ast_definitions(),
10691075
name=NameNode(value=self.name),
1076+
directives=(),
10701077
)
10711078

10721079
def __repr__(self) -> str:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from gql import Client
2+
from gql.dsl import DSLFragment, DSLQuery, DSLSchema, dsl_gql
3+
4+
schema_str = """
5+
type MonsterForm {
6+
sprites: MonsterFormSprites!
7+
}
8+
9+
union SpriteUnion = Sprite | CopyOf
10+
11+
type Query {
12+
monster: [Monster!]!
13+
}
14+
15+
type MonsterFormSprites {
16+
actions: [SpriteUnion!]!
17+
}
18+
19+
type CopyOf {
20+
action: String!
21+
}
22+
23+
type Monster {
24+
manual(path: String!): MonsterForm
25+
}
26+
27+
type Sprite {
28+
action: String!
29+
}
30+
"""
31+
32+
33+
def test_issue_447():
34+
35+
client = Client(schema=schema_str)
36+
ds = DSLSchema(client.schema)
37+
38+
sprite = DSLFragment("SpriteUnionAsSprite")
39+
sprite.on(ds.Sprite)
40+
sprite.select(
41+
ds.Sprite.action,
42+
)
43+
copy_of = DSLFragment("SpriteUnionAsCopyOf")
44+
copy_of.on(ds.CopyOf)
45+
copy_of.select(
46+
ds.CopyOf.action,
47+
)
48+
49+
query = ds.Query.monster.select(
50+
ds.Monster.manual(path="").select(
51+
ds.MonsterForm.sprites.select(
52+
ds.MonsterFormSprites.actions.select(sprite, copy_of),
53+
),
54+
),
55+
)
56+
57+
q = dsl_gql(sprite, copy_of, DSLQuery(query))
58+
59+
client.validate(q)

0 commit comments

Comments
 (0)