Skip to content

Commit b18fda5

Browse files
authored
10 cannot render list of strings argument (#11)
* feature: Moved test_variable * feature: Add new types for Argument.value
1 parent a73799d commit b18fda5

File tree

8 files changed

+215
-120
lines changed

8 files changed

+215
-120
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ name }}: [{% for value in values %}{{ value }}{% if not loop.last -%}, {% endif %}{% endfor %}]

graphql_query/types.py

Lines changed: 76 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,19 @@ class Argument(GraphQL2PythonQuery):
163163
"""
164164

165165
name: str
166-
value: Union[str, 'Argument', List['Argument'], List[List['Argument']], Variable]
166+
value: Union[
167+
str,
168+
int,
169+
'Argument',
170+
Variable,
171+
List[str],
172+
List[int],
173+
List['Argument'],
174+
List[List['Argument']],
175+
]
167176

168177
_template_key_value: Template = template_env.get_template("argument_key_value.jinja2")
178+
_template_key_values: Template = template_env.get_template("argument_key_values.jinja2")
169179
_template_key_argument: Template = template_env.get_template("argument_key_argument.jinja2")
170180
_template_key_variable: Template = template_env.get_template("argument_key_variable.jinja2")
171181
_template_key_arguments: Template = template_env.get_template("argument_key_arguments.jinja2")
@@ -175,41 +185,82 @@ class Argument(GraphQL2PythonQuery):
175185
def graphql_argument_name(cls, name: str):
176186
return assert_name(name)
177187

188+
def _render_for_str(self, name: str, value: str) -> str:
189+
return self._template_key_value.render(name=name, value=value)
190+
191+
def _render_for_int(self, name: str, value: int) -> str:
192+
return self._template_key_value.render(name=name, value=str(value))
193+
194+
def _render_for_argument(self, name: str, value: 'Argument') -> str:
195+
return self._template_key_argument.render(
196+
name=name,
197+
argument=self._line_shift(value.render())
198+
)
199+
200+
def _render_for_list_str(self, name: str, value: List[str]) -> str:
201+
return self._template_key_values.render(name=name, values=value)
202+
203+
def _render_for_list_int(self, name: str, value: List[int]) -> str:
204+
return self._template_key_values.render(
205+
name=name, values=[str(v) for v in value]
206+
)
207+
208+
def _render_for_list_argument(self, name: str, value: List['Argument']) -> str:
209+
return self._template_key_arguments.render(
210+
name=name,
211+
arguments=[
212+
self._line_shift(argument.render()) for argument in value
213+
]
214+
)
215+
216+
def _render_for_list_list_argument(self, name: str, value: List[List['Argument']]) -> str:
217+
return self._template_key_objects.render(
218+
name=name,
219+
list_arguments=[
220+
[
221+
self._line_shift(self._line_shift(argument.render()))
222+
for argument in arguments
223+
] for arguments in value
224+
]
225+
)
226+
227+
def _render_for_variable(self, name: str, value: Variable) -> str:
228+
return self._template_key_variable.render(
229+
name=name,
230+
value=value.name
231+
)
232+
178233
def render(self) -> str:
234+
# pylint: disable=too-many-return-statements
179235
if isinstance(self.value, str):
180-
return self._template_key_value.render(name=self.name, value=self.value)
236+
return self._render_for_str(self.name, self.value)
237+
238+
if isinstance(self.value, int):
239+
return self._render_for_int(self.name, self.value)
181240

182241
if isinstance(self.value, Argument):
183-
return self._template_key_argument.render(
184-
name=self.name,
185-
argument=self._line_shift(self.value.render())
186-
)
242+
return self._render_for_argument(self.name, self.value)
187243

188244
if isinstance(self.value, Variable):
189-
return self._template_key_variable.render(
190-
name=self.name,
191-
value=self.value.name
192-
)
245+
return self._render_for_variable(self.name, self.value)
246+
247+
if isinstance(self.value, list) and (len(self.value) == 0):
248+
return self._render_for_list_str(self.name, self.value) # type: ignore
193249

194250
if isinstance(self.value, list) and isinstance(self.value[0], Argument):
195251
# self.value is List[Argument]
196-
return self._template_key_arguments.render(
197-
name=self.name,
198-
arguments=[
199-
self._line_shift(argument.render()) for argument in self.value # type: ignore
200-
]
201-
)
252+
return self._render_for_list_argument(self.name, self.value) # type: ignore
253+
254+
if isinstance(self.value, list) and isinstance(self.value[0], str):
255+
# self.value is List[str]
256+
return self._render_for_list_str(self.name, self.value) # type: ignore
257+
258+
if isinstance(self.value, list) and isinstance(self.value[0], int):
259+
# self.value is List[str]
260+
return self._render_for_list_int(self.name, self.value) # type: ignore
202261

203262
# self.value is List[List[Argument]]
204-
return self._template_key_objects.render(
205-
name=self.name,
206-
list_arguments=[
207-
[
208-
self._line_shift(self._line_shift(argument.render())) # type: ignore
209-
for argument in arguments
210-
] for arguments in self.value
211-
]
212-
)
263+
return self._render_for_list_list_argument(self.name, self.value) # type: ignore
213264

214265

215266
class Directive(GraphQL2PythonQuery):

tests/test_argument.py

Lines changed: 0 additions & 90 deletions
This file was deleted.

tests/test_argument/__init__.py

Whitespace-only changes.

tests/test_argument/test_argument.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import pytest
2+
3+
from graphql_query import Argument, Variable
4+
5+
6+
def test_value_is_str():
7+
assert Argument(name="arg1", value="VALUE1").render() == "arg1: VALUE1"
8+
assert Argument(name="id", value='"1000"').render() == 'id: "1000"'
9+
assert Argument(name="length", value='911').render() == 'length: 911'
10+
assert Argument(name="unit", value="null").render() == "unit: null"
11+
12+
13+
def test_value_is_int():
14+
assert Argument(name="length", value=911).render() == 'length: 911'
15+
assert Argument(name="length", value=0).render() == 'length: 0'
16+
assert Argument(name="length", value=-1).render() == 'length: -1'
17+
18+
19+
def test_value_is_list_str():
20+
assert Argument(name="someListArgument", value=['"123"']).render() == 'someListArgument: ["123"]'
21+
assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []'
22+
assert Argument(name="someListArgument", value=['"123", "456"']).render() == 'someListArgument: ["123", "456"]'
23+
24+
25+
def test_value_is_list_int():
26+
assert Argument(name="someListArgument", value=[123]).render() == 'someListArgument: [123]'
27+
assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []'
28+
assert Argument(name="someListArgument", value=[123, 456]).render() == 'someListArgument: [123, 456]'
29+
30+
31+
@pytest.mark.parametrize(
32+
"name, value, result",
33+
[
34+
("filter", Argument(name="field", value=123), "filter: {\n field: 123\n}"),
35+
("filter", Argument(name="field", value="VALUE"), "filter: {\n field: VALUE\n}"),
36+
("filter", Argument(name="field", value='"value"'), 'filter: {\n field: "value"\n}'),
37+
("filter", Argument(name="field", value=[123, -456]), "filter: {\n field: [123, -456]\n}"),
38+
(
39+
"filter",
40+
Argument(name="field", value=['"value1"', '"value2"']),
41+
'filter: {\n field: ["value1", "value2"]\n}'
42+
),
43+
(
44+
"filter",
45+
Argument(name="field", value=Variable(name="var", type="Variable")),
46+
'filter: {\n field: $var\n}'
47+
)
48+
]
49+
)
50+
def test_value_is_argument(name: str, value: Argument, result: str):
51+
arg = Argument(name=name, value=value)
52+
assert arg.render() == result
53+
54+
55+
def test_value_is_variable():
56+
var = Variable(name="var", type="Variable")
57+
arg = Argument(name="field", value=var)
58+
assert arg.render() == 'field: $var'
59+
60+
61+
def test_value_is_list_of_args():
62+
arg = Argument(
63+
name="filter",
64+
value=[
65+
Argument(name="arg1", value="VALUE1"),
66+
Argument(name="arg2", value="VALUE2")
67+
]
68+
)
69+
assert arg.render() == "filter: {\n arg1: VALUE1\n arg2: VALUE2\n}"
70+
71+
72+
def test_value_is_args_with_args():
73+
arg = Argument(
74+
name="filter1",
75+
value=[
76+
Argument(
77+
name="filter2",
78+
value=[
79+
Argument(name="arg1", value="VALUE1"),
80+
Argument(name="arg2", value="VALUE2")
81+
]
82+
)
83+
]
84+
)
85+
assert arg.render() == "filter1: {\n filter2: {\n arg1: VALUE1\n arg2: VALUE2\n }\n}"
86+
87+
88+
def test_value_long():
89+
arg = Argument(
90+
name="filter1",
91+
value=[
92+
Argument(
93+
name="filter2",
94+
value=[
95+
Argument(name="arg1", value="VALUE1"),
96+
Argument(name="filter3", value=Argument(name="arg2", value="VALUE2"))
97+
]
98+
)
99+
]
100+
)
101+
assert arg.render() == """filter1: {
102+
filter2: {
103+
arg1: VALUE1
104+
filter3: {
105+
arg2: VALUE2
106+
}
107+
}
108+
}"""
109+
110+
111+
def test_value_if_list_of_list_of_args():
112+
arg = Argument(
113+
name="lessons",
114+
value=[
115+
[
116+
Argument(name="title", value='"lesson title"'),
117+
Argument(name="filePath", value='"static-resource-path"')
118+
],
119+
[
120+
Argument(name="title", value='"lesson title 2"'),
121+
Argument(name="filePath", value='"static-resource-path 2"')
122+
],
123+
],
124+
)
125+
assert arg.render() == """lessons: [
126+
{
127+
title: "lesson title"
128+
filePath: "static-resource-path"
129+
}
130+
{
131+
title: "lesson title 2"
132+
filePath: "static-resource-path 2"
133+
}
134+
]"""

tests/test_exist_templates.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"variable.jinja2",
1212
# for Argument
1313
"argument_key_value.jinja2",
14+
"argument_key_values.jinja2",
1415
"argument_key_argument.jinja2",
1516
"argument_key_variable.jinja2",
1617
"argument_key_arguments.jinja2",

tests/test_variable/__init__.py

Whitespace-only changes.

tests/test_variable.py renamed to tests/test_variable/test_variable.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
from graphql_query import Variable
66

7-
from .data import var_ep, var_first, var_review
8-
97

108
@pytest.mark.parametrize(
119
"name, var_type, default, result",
@@ -23,9 +21,9 @@ def test_variable(name: str, var_type: str, default: Optional[str], result: str)
2321
@pytest.mark.parametrize(
2422
"var, result",
2523
[
26-
(var_ep, "$ep: Episode!"),
27-
(var_first, "$first: Int = 3"),
28-
(var_review, "$review: ReviewInput!"),
24+
(Variable(name="ep", type="Episode!"), "$ep: Episode!"),
25+
(Variable(name="first", type="Int", default="3"), "$first: Int = 3"),
26+
(Variable(name="review", type="ReviewInput!"), "$review: ReviewInput!"),
2927
]
3028
)
3129
def test_variable_from_data(var: Variable, result: str):

0 commit comments

Comments
 (0)