From 24d96e5e686b7261d4024e35181585241ab4989e Mon Sep 17 00:00:00 2001 From: Salman Shaikh Date: Wed, 17 Apr 2024 01:45:16 +0530 Subject: [PATCH 1/3] fix: fixed `@Include` result type generation when using `convert_to_snake_case=True` config --- .../client_generators/constants.py | 1 + .../client_generators/result_types.py | 4 ++ .../result_types_generator/schema.py | 1 + .../result_types_generator/test_directives.py | 44 +++++++++++++++++++ 4 files changed, 50 insertions(+) diff --git a/ariadne_codegen/client_generators/constants.py b/ariadne_codegen/client_generators/constants.py index 5cecf209..fe614d27 100644 --- a/ariadne_codegen/client_generators/constants.py +++ b/ariadne_codegen/client_generators/constants.py @@ -52,6 +52,7 @@ PYDANTIC_MODULE = "pydantic" FIELD_CLASS = "Field" ALIAS_KEYWORD = "alias" +DEFAULT_KEYWORD = "default" DISCRIMINATOR_KEYWORD = "discriminator" MODEL_VALIDATE_METHOD = "model_validate" PLAIN_SERIALIZER = "PlainSerializer" diff --git a/ariadne_codegen/client_generators/result_types.py b/ariadne_codegen/client_generators/result_types.py index 745a45fa..b77a445a 100644 --- a/ariadne_codegen/client_generators/result_types.py +++ b/ariadne_codegen/client_generators/result_types.py @@ -48,6 +48,7 @@ ANY, BASE_MODEL_CLASS_NAME, BEFORE_VALIDATOR, + DEFAULT_KEYWORD, DISCRIMINATOR_KEYWORD, FIELD_CLASS, LIST, @@ -405,6 +406,9 @@ def _process_field_implementation( if is_union(field_implementation.annotation): keywords[DISCRIMINATOR_KEYWORD] = generate_constant(TYPENAME_ALIAS) + if keywords and isinstance(field_implementation.value, ast.Constant): + keywords[DEFAULT_KEYWORD] = generate_constant(field_implementation.value.value) + if keywords: field_implementation.value = generate_pydantic_field(keywords) diff --git a/tests/client_generators/result_types_generator/schema.py b/tests/client_generators/result_types_generator/schema.py index 2ad4efbd..6ae1cffb 100644 --- a/tests/client_generators/result_types_generator/schema.py +++ b/tests/client_generators/result_types_generator/schema.py @@ -50,6 +50,7 @@ field1: CustomType1! field2: CustomType1! field3: CustomType1 + camelCaseField: CustomType1 } enum CustomEnum { diff --git a/tests/client_generators/result_types_generator/test_directives.py b/tests/client_generators/result_types_generator/test_directives.py index 96e9a7ef..3c978f6e 100644 --- a/tests/client_generators/result_types_generator/test_directives.py +++ b/tests/client_generators/result_types_generator/test_directives.py @@ -6,6 +6,7 @@ from ariadne_codegen.client_generators.constants import ( BASE_MODEL_CLASS_NAME, + FIELD_CLASS, INCLUDE_DIRECTIVE_NAME, MIXIN_FROM_NAME, MIXIN_IMPORT_NAME, @@ -215,3 +216,46 @@ def test_generator_returns_module_with_handled_skip_and_include_directives(direc assert class_def.name == "CustomQueryQuery3" assert compare_ast(class_def.body[0], expected_field_def_1) assert compare_ast(class_def.body[2], expected_field_def_2) + +@pytest.mark.parametrize("directive", [INCLUDE_DIRECTIVE_NAME, SKIP_DIRECTIVE_NAME]) +def test_generator_returns_module_with_handled_skip_and_include_directives_snake_case(directive): + query_str = f""" + query CustomQuery {{ + query3 {{ + camelCaseField @{directive} {{ + fielda + }} + }} + }} + """ + expected_field_def_3 = ast.AnnAssign( + target=ast.Name(id="camel_case_field"), + annotation=ast.Subscript( + value=ast.Name(id=OPTIONAL), + slice=ast.Name(id='"CustomQueryQuery3CamelCaseField"'), + ), + value=ast.Call( + func=ast.Name(id=FIELD_CLASS), + args=[], + keywords=[ + ast.keyword(arg="alias", value=ast.Constant(value="camelCaseField")), + ast.keyword(arg="default", value=ast.Constant(value=None)), + ] + ), + simple=1, + ) + + generator = ResultTypesGenerator( + schema=build_ast_schema(parse(SCHEMA_STR)), + operation_definition=cast( + OperationDefinitionNode, parse(query_str).definitions[0] + ), + enums_module_name="enums", + convert_to_snake_case=True, + ) + + module = generator.generate() + + class_def = get_class_def(module, 1) + assert class_def.name == "CustomQueryQuery3" + assert compare_ast(class_def.body[0], expected_field_def_3) From 5f6e8c34603102ab78ff1e5b60170917d22bbba7 Mon Sep 17 00:00:00 2001 From: Salman Shaikh Date: Wed, 17 Apr 2024 01:56:14 +0530 Subject: [PATCH 2/3] fix: fixed linting issues --- ariadne_codegen/client_generators/result_types.py | 4 +++- .../result_types_generator/test_directives.py | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ariadne_codegen/client_generators/result_types.py b/ariadne_codegen/client_generators/result_types.py index b77a445a..d28fa6c5 100644 --- a/ariadne_codegen/client_generators/result_types.py +++ b/ariadne_codegen/client_generators/result_types.py @@ -407,7 +407,9 @@ def _process_field_implementation( keywords[DISCRIMINATOR_KEYWORD] = generate_constant(TYPENAME_ALIAS) if keywords and isinstance(field_implementation.value, ast.Constant): - keywords[DEFAULT_KEYWORD] = generate_constant(field_implementation.value.value) + keywords[DEFAULT_KEYWORD] = generate_constant( + field_implementation.value.value + ) if keywords: field_implementation.value = generate_pydantic_field(keywords) diff --git a/tests/client_generators/result_types_generator/test_directives.py b/tests/client_generators/result_types_generator/test_directives.py index 3c978f6e..7c389624 100644 --- a/tests/client_generators/result_types_generator/test_directives.py +++ b/tests/client_generators/result_types_generator/test_directives.py @@ -217,8 +217,11 @@ def test_generator_returns_module_with_handled_skip_and_include_directives(direc assert compare_ast(class_def.body[0], expected_field_def_1) assert compare_ast(class_def.body[2], expected_field_def_2) + @pytest.mark.parametrize("directive", [INCLUDE_DIRECTIVE_NAME, SKIP_DIRECTIVE_NAME]) -def test_generator_returns_module_with_handled_skip_and_include_directives_snake_case(directive): +def test_generator_returns_module_with_handled_skip_and_include_directives_snake_case( + directive, +): query_str = f""" query CustomQuery {{ query3 {{ @@ -240,7 +243,7 @@ def test_generator_returns_module_with_handled_skip_and_include_directives_snake keywords=[ ast.keyword(arg="alias", value=ast.Constant(value="camelCaseField")), ast.keyword(arg="default", value=ast.Constant(value=None)), - ] + ], ), simple=1, ) From f4c1339ec81a91c13d1c07831fb0e8181dd0f7dd Mon Sep 17 00:00:00 2001 From: Salman Shaikh Date: Sun, 21 Apr 2024 22:12:37 +0530 Subject: [PATCH 3/3] chore: updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5ed968d..f339a2a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Added `ClientForwardRefsPlugin` to standard plugins. - Re-added `model_rebuild` calls for input types with forward references. +- Fixed `@Include` directive result type when using `convert_to_snake_case` option ## 0.13.0 (2024-03-4)