From 1dbdb42deecaf01a6a8be43c3e351bf339c2aac9 Mon Sep 17 00:00:00 2001 From: Kristian Uzhca Date: Fri, 30 Sep 2022 15:52:45 -0400 Subject: [PATCH] Add copy function for GrapheneGraphQLType Fixes https://github.com/graphql-python/graphene/issues/1333 First found when using with a Django project. Django's tries to create a copy of a GrapheneGraphQLType and raises this KeyError --- graphene/types/definitions.py | 5 +++++ graphene/types/tests/test_definition.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/graphene/types/definitions.py b/graphene/types/definitions.py index e5505fd3..ac574bed 100644 --- a/graphene/types/definitions.py +++ b/graphene/types/definitions.py @@ -20,6 +20,11 @@ class GrapheneGraphQLType: self.graphene_type = kwargs.pop("graphene_type") super(GrapheneGraphQLType, self).__init__(*args, **kwargs) + def __copy__(self): + result = GrapheneGraphQLType(graphene_type=self.graphene_type) + result.__dict__.update(self.__dict__) + return result + class GrapheneInterfaceType(GrapheneGraphQLType, GraphQLInterfaceType): pass diff --git a/graphene/types/tests/test_definition.py b/graphene/types/tests/test_definition.py index 0d8a95df..83f6792d 100644 --- a/graphene/types/tests/test_definition.py +++ b/graphene/types/tests/test_definition.py @@ -1,4 +1,7 @@ +import copy + from ..argument import Argument +from ..definitions import GrapheneGraphQLType from ..enum import Enum from ..field import Field from ..inputfield import InputField @@ -312,3 +315,15 @@ def test_does_not_mutate_passed_field_definitions(): pass assert TestInputObject1._meta.fields == TestInputObject2._meta.fields + +def test_graphene_graphql_type_can_be_copied(): + class Query(ObjectType): + field = String() + + def resolve_field(self, info): + return '' + + schema = Schema(query=Query) + query_type_copy = copy.copy(schema.graphql_schema.query_type) + assert query_type_copy.__dict__ == schema.graphql_schema.query_type.__dict__ + assert isinstance(schema.graphql_schema.query_type, GrapheneGraphQLType)