diff --git a/graphene/core/schema.py b/graphene/core/schema.py index 2eea83ea..4da067e4 100644 --- a/graphene/core/schema.py +++ b/graphene/core/schema.py @@ -12,6 +12,7 @@ from graphene import signals from .classtypes.base import ClassType from .types.base import BaseType +from ..plugins import Plugin, CamelCase class GraphQLSchema(_GraphQLSchema): @@ -25,7 +26,7 @@ class Schema(object): _executor = None def __init__(self, query=None, mutation=None, subscription=None, - name='Schema', executor=None): + name='Schema', executor=None, plugins=None, auto_camelcase=True): self._types_names = {} self._types = {} self.mutation = mutation @@ -33,12 +34,25 @@ class Schema(object): self.subscription = subscription self.name = name self.executor = executor + self.plugins = [] + plugins = plugins or [] + if auto_camelcase: + plugins.append(CamelCase()) + for plugin in plugins: + self.add_plugin(plugin) signals.init_schema.send(self) def __repr__(self): return '' % (str(self.name), hash(self)) + def add_plugin(self, plugin): + assert isinstance(plugin, Plugin), 'A plugin need to subclass graphene.Plugin and be instantiated' + plugin.contribute_to_schema(self) + self.plugins.append(plugin) + def get_internal_type(self, objecttype): + for plugin in self.plugins: + objecttype = plugin.transform_type(objecttype) return objecttype.internal_type(self) def T(self, object_type): diff --git a/graphene/core/types/base.py b/graphene/core/types/base.py index 96523c7b..94e8a75c 100644 --- a/graphene/core/types/base.py +++ b/graphene/core/types/base.py @@ -140,7 +140,7 @@ class GroupNamedType(BaseType): self.types = types def get_named_type(self, schema, type): - name = type.name or to_camel_case(type.attname) + name = type.name or type.attname return name, schema.T(type) def internal_type(self, schema): diff --git a/graphene/plugins/__init__.py b/graphene/plugins/__init__.py new file mode 100644 index 00000000..5a9bf26b --- /dev/null +++ b/graphene/plugins/__init__.py @@ -0,0 +1,6 @@ +from .base import Plugin +from .camel_case import CamelCase + +__all__ = [ + 'Plugin', 'CamelCase' +] diff --git a/graphene/plugins/base.py b/graphene/plugins/base.py new file mode 100644 index 00000000..557099c7 --- /dev/null +++ b/graphene/plugins/base.py @@ -0,0 +1,6 @@ +class Plugin(object): + def contribute_to_schema(self, schema): + self.schema = schema + + def transform_type(self, objecttype): + return objecttype diff --git a/graphene/plugins/camel_case.py b/graphene/plugins/camel_case.py new file mode 100644 index 00000000..cba39ad5 --- /dev/null +++ b/graphene/plugins/camel_case.py @@ -0,0 +1,22 @@ +from .base import Plugin + +from ..core.types.base import GroupNamedType +from ..utils import memoize, to_camel_case + + +def camelcase_named_type(schema, type): + name = type.name or to_camel_case(type.attname) + return name, schema.T(type) + + +class CamelCase(Plugin): + @memoize + def transform_group(self, _type): + new_type = _type.__class__(*_type.types) + setattr(new_type, 'get_named_type', camelcase_named_type) + return new_type + + def transform_type(self, _type): + if isinstance(_type, GroupNamedType): + return self.transform_group(_type) + return _type