Skip to content
This repository was archived by the owner on Apr 30, 2025. It is now read-only.

Commit e4c6b25

Browse files
JozefielJozef Volak
and
Jozef Volak
authored
[graphql-pydantic-converter] Fix rendering issue when payload is Boolean only (#84)
Co-authored-by: Jozef Volak <[email protected]>
1 parent cc4330f commit e4c6b25

File tree

5 files changed

+58
-8
lines changed

5 files changed

+58
-8
lines changed

utils/graphql-pydantic-converter/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@
1919

2020
# 1.2.0
2121
- Allow to populate by name
22+
23+
# 1.2.1
24+
- Fix rendering issue when payload is bool

utils/graphql-pydantic-converter/graphql_pydantic_converter/graphql_types.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class Mutation(GraphqlSchemaType):
167167
payload: Payload | bool
168168
_name: str
169169
_operation: str = 'mutation'
170-
_query = Template('$operation $operation_name$variable_def { $projects$aggregations { $payload } }')
170+
_query = Template('$operation $operation_name$variable_def { $projects$aggregations $payload }')
171171

172172
def dict_to_custom_string(self, value: Any) -> str:
173173
match value:
@@ -206,7 +206,7 @@ def _inline_variables(self, payload: str) -> QueryForm:
206206

207207
arguments = ', '.join(variables)
208208

209-
return QueryForm(f'mutation {{ {self._name} ({arguments}) {{ {payload} }} }}')
209+
return QueryForm(f'mutation {{ {self._name} ({arguments}) {payload} }}')
210210

211211
def _extracted_variables(self, payload: str) -> QueryForm:
212212
input_dict: dict[str, Any] = self.model_dump(exclude={'_name', 'payload'}, exclude_none=True, by_alias=True)
@@ -251,18 +251,18 @@ def _extracted_variables(self, payload: str) -> QueryForm:
251251
def render(self, form: typing.Literal['inline', 'extracted'] = 'extracted') -> QueryForm:
252252
payload: str = ''
253253
if isinstance(self.payload, Payload):
254-
payload = self.payload.render()
254+
payload = f'{{ {self.payload.render()} }}'
255255
if form == 'inline':
256256
return self._inline_variables(payload)
257257
else:
258258
return self._extracted_variables(payload)
259259

260260

261261
class Query(GraphqlSchemaType):
262-
payload: Payload
262+
payload: Payload | bool
263263
_name: str
264264
_operation: str = 'query'
265-
_query = Template('$operation $operation_name$variable_def { $projects$aggregations { $payload } }')
265+
_query = Template('$operation $operation_name$variable_def { $projects$aggregations $payload }')
266266

267267
def parse_inputs(self, value: Any) -> str:
268268
match value:
@@ -334,7 +334,7 @@ def _inline_variables(self, payload: str) -> QueryForm:
334334
if arguments:
335335
arguments = f' ( {arguments} )'
336336

337-
return QueryForm(f'{{ {self._name}{arguments} {{ {payload} }} }}')
337+
return QueryForm(f'{{ {self._name}{arguments} {payload} }}')
338338

339339
def _extracted_variables(self, payload: str) -> QueryForm:
340340
input_dict: dict[str, Any] = self.model_dump(exclude={'_name', 'payload'}, exclude_none=True, by_alias=True)
@@ -377,7 +377,11 @@ def _extracted_variables(self, payload: str) -> QueryForm:
377377
)
378378

379379
def render(self, form: typing.Literal['inline', 'extracted'] = 'extracted') -> QueryForm:
380-
payload: str = self.dict_to_custom_string(self.payload.model_dump(exclude_none=True, by_alias=True))
380+
381+
payload: str = ''
382+
if isinstance(self.payload, Payload):
383+
payload = f'{{ {self.dict_to_custom_string(self.payload.model_dump(exclude_none=True, by_alias=True))} }}'
384+
381385
if form == 'inline':
382386
return self._inline_variables(payload)
383387
else:

utils/graphql-pydantic-converter/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ packages = [{ include = "graphql_pydantic_converter" }]
1919
name = "graphql-pydantic-converter"
2020
description = "Convert pydantic schema to pydantic datamodel and build request from it"
2121
authors = ["Jozef Volak <[email protected]>"]
22-
version = '1.2.0'
22+
version = '1.2.1'
2323
readme = ["README.md", "CHANGELOG.md"]
2424
keywords = ["graphql", "pydantic"]
2525
license = "Apache 2.0"

utils/graphql-pydantic-converter/tests/render_models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,15 @@ class CreateScheduleMutation(Mutation):
155155
_name: str = PrivateAttr('createSchedule')
156156
input: CreateScheduleInput = Field(json_schema_extra={'type': 'CreateScheduleInput!'})
157157
payload: Schedule
158+
159+
160+
class DeleteScheduleMutation(Mutation):
161+
_name: str = PrivateAttr('deleteSchedule')
162+
name: String = Field(json_schema_extra={'type': 'String!'})
163+
payload: Boolean
164+
165+
166+
class DeleteScheduleQuery(Query):
167+
_name: str = PrivateAttr('deleteScheduleQuery')
168+
name: String = Field(json_schema_extra={'type': 'String!'})
169+
payload: Boolean

utils/graphql-pydantic-converter/tests/test_graphql_generator.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
from .render_models import SearchPoolsByTagsQuery
3535
from .render_models import TagAnd
3636
from .render_models import TagOr
37+
from .render_models import DeleteScheduleMutation
38+
from .render_models import DeleteScheduleQuery
3739

3840

3941
class TestTaskGenerator:
@@ -95,6 +97,34 @@ def test_render_mutation(self) -> None:
9597
).render(form='inline')
9698
assert reference == mutation.query
9799

100+
reference = 'mutation deleteSchedule($name: String!) { deleteSchedule(name: $name) }'
101+
mutation = DeleteScheduleMutation(
102+
payload=True,
103+
name="ScheduledWF"
104+
).render()
105+
assert reference == mutation.query
106+
107+
reference = 'mutation { deleteSchedule ( name: "ScheduledWF") }'
108+
mutation = DeleteScheduleMutation(
109+
payload=True,
110+
name="ScheduledWF"
111+
).render(form='inline')
112+
assert reference == mutation.query
113+
114+
reference = 'query deleteScheduleQuery($name: String!) { deleteScheduleQuery(name: $name) }'
115+
mutation = DeleteScheduleQuery(
116+
payload=True,
117+
name="ScheduledWF"
118+
).render()
119+
assert reference == mutation.query
120+
121+
reference = '{ deleteScheduleQuery ( name: "ScheduledWF" ) }'
122+
mutation = DeleteScheduleQuery(
123+
payload=True,
124+
name="ScheduledWF"
125+
).render(form='inline')
126+
assert reference == mutation.query
127+
98128
def test_render_input(self) -> None:
99129
class DeviceSize(ENUM):
100130
SMALL = 'SMALL'
@@ -498,3 +528,4 @@ def test_extracted_render(self) -> None:
498528

499529
assert reference_mutation == mutation_str.query
500530
assert reference_variable == mutation_str.variable
531+

0 commit comments

Comments
 (0)