mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 12:44:15 +03:00
Added auto_camelcase to TypeMap/Schema
This commit is contained in:
parent
210a2aed49
commit
9f30aa2d45
|
@ -141,3 +141,45 @@ def test_inputobject():
|
|||
foo_field = fields['fooBar']
|
||||
assert isinstance(foo_field, GraphQLInputObjectField)
|
||||
assert foo_field.description == 'Field description'
|
||||
|
||||
|
||||
def test_objecttype_camelcase():
|
||||
class MyObjectType(ObjectType):
|
||||
'''Description'''
|
||||
foo_bar = String(bar_foo=String())
|
||||
|
||||
typemap = TypeMap([MyObjectType])
|
||||
assert 'MyObjectType' in typemap
|
||||
graphql_type = typemap['MyObjectType']
|
||||
assert isinstance(graphql_type, GraphQLObjectType)
|
||||
assert graphql_type.name == 'MyObjectType'
|
||||
assert graphql_type.description == 'Description'
|
||||
|
||||
fields = graphql_type.fields
|
||||
assert list(fields.keys()) == ['fooBar']
|
||||
foo_field = fields['fooBar']
|
||||
assert isinstance(foo_field, GraphQLField)
|
||||
assert foo_field.args == {
|
||||
'barFoo': GraphQLArgument(GraphQLString, out_name='bar_foo')
|
||||
}
|
||||
|
||||
|
||||
def test_objecttype_camelcase_disabled():
|
||||
class MyObjectType(ObjectType):
|
||||
'''Description'''
|
||||
foo_bar = String(bar_foo=String())
|
||||
|
||||
typemap = TypeMap([MyObjectType], auto_camelcase=False)
|
||||
assert 'MyObjectType' in typemap
|
||||
graphql_type = typemap['MyObjectType']
|
||||
assert isinstance(graphql_type, GraphQLObjectType)
|
||||
assert graphql_type.name == 'MyObjectType'
|
||||
assert graphql_type.description == 'Description'
|
||||
|
||||
fields = graphql_type.fields
|
||||
assert list(fields.keys()) == ['foo_bar']
|
||||
foo_field = fields['foo_bar']
|
||||
assert isinstance(foo_field, GraphQLField)
|
||||
assert foo_field.args == {
|
||||
'bar_foo': GraphQLArgument(GraphQLString, out_name='bar_foo')
|
||||
}
|
||||
|
|
|
@ -41,45 +41,41 @@ def resolve_type(resolve_type_func, map, root, args, info):
|
|||
class TypeMap(GraphQLTypeMap):
|
||||
|
||||
def __init__(self, types, auto_camelcase=True):
|
||||
if not auto_camelcase:
|
||||
raise Exception("Disabling auto_camelcase is not *yet* supported, but will be soon!")
|
||||
self.auto_camelcase = auto_camelcase
|
||||
super(TypeMap, self).__init__(types)
|
||||
|
||||
@classmethod
|
||||
def reducer(cls, map, type):
|
||||
def reducer(self, map, type):
|
||||
if not type:
|
||||
return map
|
||||
if inspect.isfunction(type):
|
||||
type = type()
|
||||
if is_graphene_type(type):
|
||||
return cls.graphene_reducer(map, type)
|
||||
return super(TypeMap, cls).reducer(map, type)
|
||||
return self.graphene_reducer(map, type)
|
||||
return GraphQLTypeMap.reducer(map, type)
|
||||
|
||||
@classmethod
|
||||
def graphene_reducer(cls, map, type):
|
||||
def graphene_reducer(self, map, type):
|
||||
if isinstance(type, (List, NonNull)):
|
||||
return cls.reducer(map, type.of_type)
|
||||
return self.reducer(map, type.of_type)
|
||||
if type._meta.name in map:
|
||||
_type = map[type._meta.name]
|
||||
if is_graphene_type(_type):
|
||||
assert _type.graphene_type == type
|
||||
return map
|
||||
if issubclass(type, ObjectType):
|
||||
return cls.construct_objecttype(map, type)
|
||||
return self.construct_objecttype(map, type)
|
||||
if issubclass(type, InputObjectType):
|
||||
return cls.construct_inputobjecttype(map, type)
|
||||
return self.construct_inputobjecttype(map, type)
|
||||
if issubclass(type, Interface):
|
||||
return cls.construct_interface(map, type)
|
||||
return self.construct_interface(map, type)
|
||||
if issubclass(type, Scalar):
|
||||
return cls.construct_scalar(map, type)
|
||||
return self.construct_scalar(map, type)
|
||||
if issubclass(type, Enum):
|
||||
return cls.construct_enum(map, type)
|
||||
return self.construct_enum(map, type)
|
||||
if issubclass(type, Union):
|
||||
return cls.construct_union(map, type)
|
||||
return self.construct_union(map, type)
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_scalar(cls, map, type):
|
||||
def construct_scalar(self, map, type):
|
||||
from .definitions import GrapheneScalarType
|
||||
_scalars = {
|
||||
String: GraphQLString,
|
||||
|
@ -102,8 +98,7 @@ class TypeMap(GraphQLTypeMap):
|
|||
)
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_enum(cls, map, type):
|
||||
def construct_enum(self, map, type):
|
||||
from .definitions import GrapheneEnumType
|
||||
values = OrderedDict()
|
||||
for name, value in type._meta.enum.__members__.items():
|
||||
|
@ -121,8 +116,7 @@ class TypeMap(GraphQLTypeMap):
|
|||
)
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_objecttype(cls, map, type):
|
||||
def construct_objecttype(self, map, type):
|
||||
from .definitions import GrapheneObjectType
|
||||
map[type._meta.name] = GrapheneObjectType(
|
||||
graphene_type=type,
|
||||
|
@ -134,15 +128,14 @@ class TypeMap(GraphQLTypeMap):
|
|||
)
|
||||
interfaces = []
|
||||
for i in type._meta.interfaces:
|
||||
map = cls.reducer(map, i)
|
||||
map = self.reducer(map, i)
|
||||
interfaces.append(map[i._meta.name])
|
||||
map[type._meta.name]._provided_interfaces = interfaces
|
||||
map[type._meta.name]._fields = cls.construct_fields_for_type(map, type)
|
||||
# cls.reducer(map, map[type._meta.name])
|
||||
map[type._meta.name]._fields = self.construct_fields_for_type(map, type)
|
||||
# self.reducer(map, map[type._meta.name])
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_interface(cls, map, type):
|
||||
def construct_interface(self, map, type):
|
||||
from .definitions import GrapheneInterfaceType
|
||||
_resolve_type = None
|
||||
if type.resolve_type:
|
||||
|
@ -154,12 +147,11 @@ class TypeMap(GraphQLTypeMap):
|
|||
fields=None,
|
||||
resolve_type=_resolve_type,
|
||||
)
|
||||
map[type._meta.name]._fields = cls.construct_fields_for_type(map, type)
|
||||
# cls.reducer(map, map[type._meta.name])
|
||||
map[type._meta.name]._fields = self.construct_fields_for_type(map, type)
|
||||
# self.reducer(map, map[type._meta.name])
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_inputobjecttype(cls, map, type):
|
||||
def construct_inputobjecttype(self, map, type):
|
||||
from .definitions import GrapheneInputObjectType
|
||||
map[type._meta.name] = GrapheneInputObjectType(
|
||||
graphene_type=type,
|
||||
|
@ -167,18 +159,17 @@ class TypeMap(GraphQLTypeMap):
|
|||
description=type._meta.description,
|
||||
fields=None,
|
||||
)
|
||||
map[type._meta.name]._fields = cls.construct_fields_for_type(map, type, is_input_type=True)
|
||||
map[type._meta.name]._fields = self.construct_fields_for_type(map, type, is_input_type=True)
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def construct_union(cls, map, type):
|
||||
def construct_union(self, map, type):
|
||||
from .definitions import GrapheneUnionType
|
||||
_resolve_type = None
|
||||
if type.resolve_type:
|
||||
_resolve_type = partial(resolve_type, type.resolve_type, map)
|
||||
types = []
|
||||
for i in type._meta.types:
|
||||
map = cls.construct_objecttype(map, i)
|
||||
map = self.construct_objecttype(map, i)
|
||||
types.append(map[i._meta.name])
|
||||
map[type._meta.name] = GrapheneUnionType(
|
||||
graphene_type=type,
|
||||
|
@ -189,24 +180,23 @@ class TypeMap(GraphQLTypeMap):
|
|||
map[type._meta.name].types = types
|
||||
return map
|
||||
|
||||
@classmethod
|
||||
def process_field_name(cls, name):
|
||||
return to_camel_case(name)
|
||||
def get_name(self, name):
|
||||
if self.auto_camelcase:
|
||||
return to_camel_case(name)
|
||||
return name
|
||||
|
||||
@classmethod
|
||||
def default_resolver(cls, attname, root, *_):
|
||||
def default_resolver(self, attname, root, *_):
|
||||
return getattr(root, attname, None)
|
||||
|
||||
@classmethod
|
||||
def construct_fields_for_type(cls, map, type, is_input_type=False):
|
||||
def construct_fields_for_type(self, map, type, is_input_type=False):
|
||||
fields = OrderedDict()
|
||||
for name, field in type._meta.fields.items():
|
||||
if isinstance(field, Dynamic):
|
||||
field = field.get_type()
|
||||
if not field:
|
||||
continue
|
||||
map = cls.reducer(map, field.type)
|
||||
field_type = cls.get_field_type(map, field.type)
|
||||
map = self.reducer(map, field.type)
|
||||
field_type = self.get_field_type(map, field.type)
|
||||
if is_input_type:
|
||||
_field = GraphQLInputObjectField(
|
||||
field_type,
|
||||
|
@ -217,9 +207,9 @@ class TypeMap(GraphQLTypeMap):
|
|||
else:
|
||||
args = OrderedDict()
|
||||
for arg_name, arg in field.args.items():
|
||||
map = cls.reducer(map, arg.type)
|
||||
arg_type = cls.get_field_type(map, arg.type)
|
||||
processed_arg_name = arg.name or cls.process_field_name(arg_name)
|
||||
map = self.reducer(map, arg.type)
|
||||
arg_type = self.get_field_type(map, arg.type)
|
||||
processed_arg_name = arg.name or self.get_name(arg_name)
|
||||
args[processed_arg_name] = GraphQLArgument(
|
||||
arg_type,
|
||||
out_name=arg.name or arg_name,
|
||||
|
@ -229,16 +219,15 @@ class TypeMap(GraphQLTypeMap):
|
|||
_field = GraphQLField(
|
||||
field_type,
|
||||
args=args,
|
||||
resolver=field.get_resolver(cls.get_resolver_for_type(type, name)),
|
||||
resolver=field.get_resolver(self.get_resolver_for_type(type, name)),
|
||||
deprecation_reason=field.deprecation_reason,
|
||||
description=field.description
|
||||
)
|
||||
field_name = field.name or cls.process_field_name(name)
|
||||
field_name = field.name or self.get_name(name)
|
||||
fields[field_name] = _field
|
||||
return fields
|
||||
|
||||
@classmethod
|
||||
def get_resolver_for_type(cls, type, name):
|
||||
def get_resolver_for_type(self, type, name):
|
||||
if not issubclass(type, ObjectType):
|
||||
return
|
||||
resolver = getattr(type, 'resolve_{}'.format(name), None)
|
||||
|
@ -259,14 +248,13 @@ class TypeMap(GraphQLTypeMap):
|
|||
return resolver.__func__
|
||||
return resolver
|
||||
|
||||
return partial(cls.default_resolver, name)
|
||||
return partial(self.default_resolver, name)
|
||||
|
||||
@classmethod
|
||||
def get_field_type(cls, map, type):
|
||||
def get_field_type(self, map, type):
|
||||
if isinstance(type, List):
|
||||
return GraphQLList(cls.get_field_type(map, type.of_type))
|
||||
return GraphQLList(self.get_field_type(map, type.of_type))
|
||||
if isinstance(type, NonNull):
|
||||
return GraphQLNonNull(cls.get_field_type(map, type.of_type))
|
||||
return GraphQLNonNull(self.get_field_type(map, type.of_type))
|
||||
if inspect.isfunction(type):
|
||||
type = type()
|
||||
return map.get(type._meta.name)
|
||||
|
|
Loading…
Reference in New Issue
Block a user