From 94fd25811443225a18b83baa3b9774b4d4b4eede Mon Sep 17 00:00:00 2001 From: Alon Palgy Date: Sun, 30 Jun 2024 14:48:08 +0300 Subject: [PATCH 1/5] support for simple str list ['123', '456'] and keep backward compatible --- graphql_query/types.py | 17 +++++++++++++++-- tests/test_argument/test_argument.py | 13 ++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/graphql_query/types.py b/graphql_query/types.py index d01ec40..a9e5a59 100644 --- a/graphql_query/types.py +++ b/graphql_query/types.py @@ -217,7 +217,20 @@ def _render_for_float(name: str, value: float) -> str: @staticmethod def _render_for_list_str(name: str, value: List[str]) -> str: - return _template_key_values.render(name=name, values=value) + clean_list = [] + for item in value: + result = item.replace('"', '').split(',') + if type(result) is list: + trimmed_result = [i.strip() for i in result] + clean_list.extend(trimmed_result) + else: + clean_list.append(result) + + return _template_key_values.render(name=name, values=[f"\"{v.replace('"', '')}\"" for v in clean_list]) + + @staticmethod + def _render_for_list_int(name: str, value: List[str]) -> str: + return _template_key_values.render(name=name, values=[str(v) for v in value]) @staticmethod def _render_for_list_bool(name: str, value: List[bool]) -> str: @@ -277,7 +290,7 @@ def render(self) -> str: return self._render_for_list_float(self.name, self.value) if self._check_is_list_of_int(self.value): - return self._render_for_list_str(self.name, [str(v) for v in self.value]) + return self._render_for_list_int(self.name, self.value) if self._check_is_list_of_arguments(self.value): return self._render_for_list_argument(self.name, self.value) diff --git a/tests/test_argument/test_argument.py b/tests/test_argument/test_argument.py index 661f589..d3b154d 100644 --- a/tests/test_argument/test_argument.py +++ b/tests/test_argument/test_argument.py @@ -26,12 +26,23 @@ def test_value_is_float(): assert Argument(name="some", value=0.2).render() == 'some: 0.2' -def test_value_is_list_str(): +def test_value_is_list_str_with_backward_compatible_workarounds(): assert Argument(name="someListArgument", value=['"123"']).render() == 'someListArgument: ["123"]' assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []' assert Argument(name="someListArgument", value=['"123", "456"']).render() == 'someListArgument: ["123", "456"]' +def test_value_is_list_str(): + assert Argument(name="someListArgument", value=["123", "456"]).render() == 'someListArgument: ["123", "456"]' + assert Argument(name="someListArgument", + value=["hello", "world"]).render() == 'someListArgument: ["hello", "world"]' + + +def test_value_is_list_str_with_apostrophe(): + assert Argument(name="someListArgument", + value=["you'r", "isn't"]).render() == 'someListArgument: ["you\'r", "isn\'t"]' + + def test_value_is_list_int(): assert Argument(name="someListArgument", value=[123]).render() == 'someListArgument: [123]' assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []' From bd2ad922e57d2a4483ab6fda0cbc017e145ddf95 Mon Sep 17 00:00:00 2001 From: Alon Palgy Date: Mon, 1 Jul 2024 13:24:57 +0300 Subject: [PATCH 2/5] using isinstance --- graphql_query/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql_query/types.py b/graphql_query/types.py index a9e5a59..2742d13 100644 --- a/graphql_query/types.py +++ b/graphql_query/types.py @@ -220,7 +220,7 @@ def _render_for_list_str(name: str, value: List[str]) -> str: clean_list = [] for item in value: result = item.replace('"', '').split(',') - if type(result) is list: + if isinstance(result, list): trimmed_result = [i.strip() for i in result] clean_list.extend(trimmed_result) else: From a395ed04bad0d2e5ae335a1c4ed583b25271c7d5 Mon Sep 17 00:00:00 2001 From: Alon Palgy Date: Mon, 1 Jul 2024 15:46:04 +0300 Subject: [PATCH 3/5] fixed formatting --- tests/test_argument/test_argument.py | 48 +++++++++++++++------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/tests/test_argument/test_argument.py b/tests/test_argument/test_argument.py index d3b154d..ca88176 100644 --- a/tests/test_argument/test_argument.py +++ b/tests/test_argument/test_argument.py @@ -6,58 +6,60 @@ def test_value_is_str(): assert Argument(name="arg1", value="VALUE1").render() == "arg1: VALUE1" assert Argument(name="id", value='"1000"').render() == 'id: "1000"' - assert Argument(name="length", value='911').render() == 'length: 911' + assert Argument(name="length", value="911").render() == "length: 911" assert Argument(name="unit", value="null").render() == "unit: null" def test_value_is_int(): - assert Argument(name="length", value=911).render() == 'length: 911' - assert Argument(name="length", value=0).render() == 'length: 0' - assert Argument(name="length", value=-1).render() == 'length: -1' + assert Argument(name="length", value=911).render() == "length: 911" + assert Argument(name="length", value=0).render() == "length: 0" + assert Argument(name="length", value=-1).render() == "length: -1" def test_value_is_bool(): - assert Argument(name="some", value=True).render() == 'some: true' - assert Argument(name="some", value=False).render() == 'some: false' + assert Argument(name="some", value=True).render() == "some: true" + assert Argument(name="some", value=False).render() == "some: false" def test_value_is_float(): - assert Argument(name="some", value=1.0).render() == 'some: 1.0' - assert Argument(name="some", value=0.2).render() == 'some: 0.2' + assert Argument(name="some", value=1.0).render() == "some: 1.0" + assert Argument(name="some", value=0.2).render() == "some: 0.2" def test_value_is_list_str_with_backward_compatible_workarounds(): assert Argument(name="someListArgument", value=['"123"']).render() == 'someListArgument: ["123"]' - assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []' + assert Argument(name="someListArgument", value=[]).render() == "someListArgument: []" assert Argument(name="someListArgument", value=['"123", "456"']).render() == 'someListArgument: ["123", "456"]' def test_value_is_list_str(): assert Argument(name="someListArgument", value=["123", "456"]).render() == 'someListArgument: ["123", "456"]' - assert Argument(name="someListArgument", - value=["hello", "world"]).render() == 'someListArgument: ["hello", "world"]' + assert ( + Argument(name="someListArgument", value=["hello", "world"]).render() == 'someListArgument: ["hello", "world"]' + ) def test_value_is_list_str_with_apostrophe(): - assert Argument(name="someListArgument", - value=["you'r", "isn't"]).render() == 'someListArgument: ["you\'r", "isn\'t"]' + assert ( + Argument(name="someListArgument", value=["you'r", "isn't"]).render() == 'someListArgument: ["you\'r", "isn\'t"]' + ) def test_value_is_list_int(): - assert Argument(name="someListArgument", value=[123]).render() == 'someListArgument: [123]' - assert Argument(name="someListArgument", value=[]).render() == 'someListArgument: []' - assert Argument(name="someListArgument", value=[123, 456]).render() == 'someListArgument: [123, 456]' + assert Argument(name="someListArgument", value=[123]).render() == "someListArgument: [123]" + assert Argument(name="someListArgument", value=[]).render() == "someListArgument: []" + assert Argument(name="someListArgument", value=[123, 456]).render() == "someListArgument: [123, 456]" def test_value_is_list_bool(): - assert Argument(name="someListArgument", value=[True, False]).render() == 'someListArgument: [true, false]' - assert Argument(name="someListArgument", value=[True]).render() == 'someListArgument: [true]' - assert Argument(name="someListArgument", value=[False]).render() == 'someListArgument: [false]' + assert Argument(name="someListArgument", value=[True, False]).render() == "someListArgument: [true, false]" + assert Argument(name="someListArgument", value=[True]).render() == "someListArgument: [true]" + assert Argument(name="someListArgument", value=[False]).render() == "someListArgument: [false]" def test_value_is_list_float(): - assert Argument(name="someListArgument", value=[1.0, 0.2]).render() == 'someListArgument: [1.0, 0.2]' - assert Argument(name="someListArgument", value=[42.0]).render() == 'someListArgument: [42.0]' + assert Argument(name="someListArgument", value=[1.0, 0.2]).render() == "someListArgument: [1.0, 0.2]" + assert Argument(name="someListArgument", value=[42.0]).render() == "someListArgument: [42.0]" @pytest.mark.parametrize( @@ -73,7 +75,7 @@ def test_value_is_list_float(): Argument(name="field", value=['"value1"', '"value2"']), 'filter: {\n field: ["value1", "value2"]\n}', ), - ("filter", Argument(name="field", value=Variable(name="var", type="Variable")), 'filter: {\n field: $var\n}'), + ("filter", Argument(name="field", value=Variable(name="var", type="Variable")), "filter: {\n field: $var\n}"), ], ) def test_value_is_argument(name: str, value: Argument, result: str): @@ -84,7 +86,7 @@ def test_value_is_argument(name: str, value: Argument, result: str): def test_value_is_variable(): var = Variable(name="var", type="Variable") arg = Argument(name="field", value=var) - assert arg.render() == 'field: $var' + assert arg.render() == "field: $var" def test_value_is_list_of_args(): From 7deaebde7ae1301b754cf75802793e0186f09acd Mon Sep 17 00:00:00 2001 From: Alon Palgy Date: Mon, 1 Jul 2024 15:46:16 +0300 Subject: [PATCH 4/5] fixed type for list of int --- graphql_query/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql_query/types.py b/graphql_query/types.py index 2742d13..28833b1 100644 --- a/graphql_query/types.py +++ b/graphql_query/types.py @@ -229,7 +229,7 @@ def _render_for_list_str(name: str, value: List[str]) -> str: return _template_key_values.render(name=name, values=[f"\"{v.replace('"', '')}\"" for v in clean_list]) @staticmethod - def _render_for_list_int(name: str, value: List[str]) -> str: + def _render_for_list_int(name: str, value: List[int]) -> str: return _template_key_values.render(name=name, values=[str(v) for v in value]) @staticmethod From 6b4b5346653ac37eb5334a6ad682b8976f1a6a3f Mon Sep 17 00:00:00 2001 From: Alon Palgy Date: Mon, 22 Jul 2024 09:49:23 +0300 Subject: [PATCH 5/5] using triple ''' for the f string --- graphql_query/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql_query/types.py b/graphql_query/types.py index 28833b1..70eb836 100644 --- a/graphql_query/types.py +++ b/graphql_query/types.py @@ -226,7 +226,7 @@ def _render_for_list_str(name: str, value: List[str]) -> str: else: clean_list.append(result) - return _template_key_values.render(name=name, values=[f"\"{v.replace('"', '')}\"" for v in clean_list]) + return _template_key_values.render(name=name, values=[f'''\"{v.replace('"', '')}\"''' for v in clean_list]) @staticmethod def _render_for_list_int(name: str, value: List[int]) -> str: