mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-13 10:00:39 +03:00
Removed plugins. Added middlewares
This commit is contained in:
parent
3428725314
commit
577b76e436
|
@ -8,6 +8,7 @@ from ...tests.models import Reporter
|
||||||
from ..middleware import DjangoDebugMiddleware
|
from ..middleware import DjangoDebugMiddleware
|
||||||
from ..types import DjangoDebug
|
from ..types import DjangoDebug
|
||||||
|
|
||||||
|
|
||||||
class context(object):
|
class context(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -56,7 +57,7 @@ def test_should_query_field():
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
|
schema = graphene.Schema(query=Query, middlewares=[DjangoDebugMiddleware()])
|
||||||
result = schema.execute(query, context_value=context())
|
result = schema.execute(query, context_value=context())
|
||||||
assert not result.errors
|
assert not result.errors
|
||||||
assert result.data == expected
|
assert result.data == expected
|
||||||
|
@ -104,7 +105,7 @@ def test_should_query_list():
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
|
schema = graphene.Schema(query=Query, middlewares=[DjangoDebugMiddleware()])
|
||||||
result = schema.execute(query, context_value=context())
|
result = schema.execute(query, context_value=context())
|
||||||
assert not result.errors
|
assert not result.errors
|
||||||
assert result.data == expected
|
assert result.data == expected
|
||||||
|
@ -153,7 +154,7 @@ def test_should_query_connection():
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
|
schema = graphene.Schema(query=Query, middlewares=[DjangoDebugMiddleware()])
|
||||||
result = schema.execute(query, context_value=context())
|
result = schema.execute(query, context_value=context())
|
||||||
assert not result.errors
|
assert not result.errors
|
||||||
assert result.data['allReporters'] == expected['allReporters']
|
assert result.data['allReporters'] == expected['allReporters']
|
||||||
|
@ -209,7 +210,7 @@ def test_should_query_connectionfilter():
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
|
schema = graphene.Schema(query=Query, middlewares=[DjangoDebugMiddleware()])
|
||||||
result = schema.execute(query, context_value=context())
|
result = schema.execute(query, context_value=context())
|
||||||
assert not result.errors
|
assert not result.errors
|
||||||
assert result.data['allReporters'] == expected['allReporters']
|
assert result.data['allReporters'] == expected['allReporters']
|
||||||
|
|
|
@ -7,8 +7,7 @@ from graphql.utils.schema_printer import print_schema
|
||||||
|
|
||||||
from graphene import signals
|
from graphene import signals
|
||||||
|
|
||||||
from ..plugins import CamelCase, PluginManager
|
from ..middlewares import MiddlewareManager, CamelCaseArgsMiddleware
|
||||||
from ..utils import promise_middleware
|
|
||||||
from .classtypes.base import ClassType
|
from .classtypes.base import ClassType
|
||||||
from .types.base import InstanceType
|
from .types.base import InstanceType
|
||||||
|
|
||||||
|
@ -24,7 +23,7 @@ class Schema(object):
|
||||||
_executor = None
|
_executor = None
|
||||||
|
|
||||||
def __init__(self, query=None, mutation=None, subscription=None,
|
def __init__(self, query=None, mutation=None, subscription=None,
|
||||||
name='Schema', executor=None, plugins=None, auto_camelcase=True, **options):
|
name='Schema', executor=None, middlewares=None, auto_camelcase=True, **options):
|
||||||
self._types_names = {}
|
self._types_names = {}
|
||||||
self._types = {}
|
self._types = {}
|
||||||
self.mutation = mutation
|
self.mutation = mutation
|
||||||
|
@ -32,11 +31,13 @@ class Schema(object):
|
||||||
self.subscription = subscription
|
self.subscription = subscription
|
||||||
self.name = name
|
self.name = name
|
||||||
self.executor = executor
|
self.executor = executor
|
||||||
plugins = plugins or []
|
if 'plugins' in options:
|
||||||
|
raise Exception('Plugins are deprecated, please use middlewares.')
|
||||||
|
middlewares = middlewares or []
|
||||||
if auto_camelcase:
|
if auto_camelcase:
|
||||||
plugins.append(CamelCase())
|
middlewares.append(CamelCaseArgsMiddleware())
|
||||||
self.auto_camelcase = auto_camelcase
|
self.auto_camelcase = auto_camelcase
|
||||||
self.plugins = PluginManager(self, plugins)
|
self.middleware_manager = MiddlewareManager(self, middlewares)
|
||||||
self.options = options
|
self.options = options
|
||||||
signals.init_schema.send(self)
|
signals.init_schema.send(self)
|
||||||
|
|
||||||
|
@ -109,8 +110,7 @@ class Schema(object):
|
||||||
return self._types_names[type_name]
|
return self._types_names[type_name]
|
||||||
|
|
||||||
def resolver_with_middleware(self, resolver):
|
def resolver_with_middleware(self, resolver):
|
||||||
plugins_resolve = self.plugins.get_plugin_functions('resolve')
|
return self.middleware_manager.wrap(resolver)
|
||||||
return promise_middleware(resolver, plugins_resolve)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def types(self):
|
def types(self):
|
||||||
|
|
|
@ -154,6 +154,12 @@ def test_lazytype():
|
||||||
assert schema.T(t) == schema.T(MyType)
|
assert schema.T(t) == schema.T(MyType)
|
||||||
|
|
||||||
|
|
||||||
|
def test_deprecated_plugins_throws_exception():
|
||||||
|
with raises(Exception) as excinfo:
|
||||||
|
Schema(plugins=[])
|
||||||
|
assert 'Plugins are deprecated, please use middlewares' in str(excinfo.value)
|
||||||
|
|
||||||
|
|
||||||
def test_schema_str():
|
def test_schema_str():
|
||||||
expected = """
|
expected = """
|
||||||
schema {
|
schema {
|
||||||
|
|
6
graphene/middlewares/__init__.py
Normal file
6
graphene/middlewares/__init__.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from .base import MiddlewareManager
|
||||||
|
from .camel_case import CamelCaseArgsMiddleware
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'MiddlewareManager', 'CamelCaseArgsMiddleware'
|
||||||
|
]
|
23
graphene/middlewares/base.py
Normal file
23
graphene/middlewares/base.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
from ..utils import promise_middleware
|
||||||
|
|
||||||
|
MIDDLEWARE_RESOLVER_FUNCTION = 'resolve'
|
||||||
|
|
||||||
|
|
||||||
|
class MiddlewareManager(object):
|
||||||
|
|
||||||
|
def __init__(self, schema, middlewares=None):
|
||||||
|
self.schema = schema
|
||||||
|
self.middlewares = middlewares or []
|
||||||
|
|
||||||
|
def add_middleware(self, middleware):
|
||||||
|
self.middlewares.append(middleware)
|
||||||
|
|
||||||
|
def get_middleware_resolvers(self):
|
||||||
|
for middleware in self.middlewares:
|
||||||
|
if not hasattr(middleware, MIDDLEWARE_RESOLVER_FUNCTION):
|
||||||
|
continue
|
||||||
|
yield getattr(middleware, MIDDLEWARE_RESOLVER_FUNCTION)
|
||||||
|
|
||||||
|
def wrap(self, resolver):
|
||||||
|
middleware_resolvers = self.get_middleware_resolvers()
|
||||||
|
return promise_middleware(resolver, middleware_resolvers)
|
8
graphene/middlewares/camel_case.py
Normal file
8
graphene/middlewares/camel_case.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
from ..utils import ProxySnakeDict
|
||||||
|
|
||||||
|
|
||||||
|
class CamelCaseArgsMiddleware(object):
|
||||||
|
|
||||||
|
def resolve(self, next, root, args, context, info):
|
||||||
|
args = ProxySnakeDict(args)
|
||||||
|
return next(root, args, context, info)
|
|
@ -1,6 +0,0 @@
|
||||||
from .base import Plugin, PluginManager
|
|
||||||
from .camel_case import CamelCase
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'Plugin', 'PluginManager', 'CamelCase'
|
|
||||||
]
|
|
|
@ -1,53 +0,0 @@
|
||||||
from contextlib import contextmanager
|
|
||||||
from functools import partial, reduce
|
|
||||||
|
|
||||||
|
|
||||||
class Plugin(object):
|
|
||||||
|
|
||||||
def contribute_to_schema(self, schema):
|
|
||||||
self.schema = schema
|
|
||||||
|
|
||||||
|
|
||||||
def apply_function(a, b):
|
|
||||||
return b(a)
|
|
||||||
|
|
||||||
|
|
||||||
class PluginManager(object):
|
|
||||||
|
|
||||||
PLUGIN_FUNCTIONS = ('get_default_namedtype_name', )
|
|
||||||
|
|
||||||
def __init__(self, schema, plugins=[]):
|
|
||||||
self.schema = schema
|
|
||||||
self.plugins = []
|
|
||||||
for plugin in plugins:
|
|
||||||
self.add_plugin(plugin)
|
|
||||||
|
|
||||||
def add_plugin(self, plugin):
|
|
||||||
if hasattr(plugin, 'contribute_to_schema'):
|
|
||||||
plugin.contribute_to_schema(self.schema)
|
|
||||||
self.plugins.append(plugin)
|
|
||||||
|
|
||||||
def get_plugin_functions(self, function):
|
|
||||||
for plugin in self.plugins:
|
|
||||||
if not hasattr(plugin, function):
|
|
||||||
continue
|
|
||||||
yield getattr(plugin, function)
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
functions = self.get_plugin_functions(name)
|
|
||||||
return partial(reduce, apply_function, functions)
|
|
||||||
|
|
||||||
def __contains__(self, name):
|
|
||||||
return name in self.PLUGIN_FUNCTIONS
|
|
||||||
|
|
||||||
@contextmanager
|
|
||||||
def context_execution(self, **executor):
|
|
||||||
contexts = []
|
|
||||||
functions = self.get_plugin_functions('context_execution')
|
|
||||||
for f in functions:
|
|
||||||
context = f(executor)
|
|
||||||
executor = context.__enter__()
|
|
||||||
contexts.append((context, executor))
|
|
||||||
yield executor
|
|
||||||
for context, value in contexts[::-1]:
|
|
||||||
context.__exit__(None, None, None)
|
|
|
@ -1,11 +0,0 @@
|
||||||
from ..utils import to_camel_case, ProxySnakeDict
|
|
||||||
|
|
||||||
|
|
||||||
class CamelCase(object):
|
|
||||||
|
|
||||||
def get_default_namedtype_name(self, value):
|
|
||||||
return to_camel_case(value)
|
|
||||||
|
|
||||||
def resolve(self, next, root, args, context, info):
|
|
||||||
args = ProxySnakeDict(args)
|
|
||||||
return next(root, args, context, info)
|
|
Loading…
Reference in New Issue
Block a user