mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 20:54:16 +03:00
Improved Mutation
This commit is contained in:
parent
563ca23d00
commit
4820a7fede
|
@ -6,7 +6,7 @@ from graphql_relay import from_global_id, to_global_id
|
|||
|
||||
from ..types import ID, Field, Interface, ObjectType
|
||||
from ..types.utils import get_type
|
||||
from ..types.interface import InterfaceMeta
|
||||
from ..types.interface import InterfaceOptions
|
||||
|
||||
|
||||
def is_node(objecttype):
|
||||
|
@ -22,18 +22,6 @@ def is_node(objecttype):
|
|||
return False
|
||||
|
||||
|
||||
def get_default_connection(cls):
|
||||
from .connection import Connection
|
||||
assert issubclass(cls, ObjectType), (
|
||||
'Can only get connection type on implemented Nodes.'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
node = cls
|
||||
|
||||
return type('{}Connection'.format(cls.__name__), (Connection,), {'Meta': Meta})
|
||||
|
||||
|
||||
class GlobalID(Field):
|
||||
|
||||
def __init__(self, node=None, parent_type=None, required=True, *args, **kwargs):
|
||||
|
@ -51,14 +39,6 @@ class GlobalID(Field):
|
|||
return partial(self.id_resolver, parent_resolver, self.node, parent_type_name=self.parent_type_name)
|
||||
|
||||
|
||||
class NodeMeta(InterfaceMeta):
|
||||
|
||||
def __new__(cls, name, bases, attrs):
|
||||
cls = InterfaceMeta.__new__(cls, name, bases, attrs)
|
||||
cls._meta.fields['id'] = GlobalID(cls, description='The ID of the object.')
|
||||
return cls
|
||||
|
||||
|
||||
class NodeField(Field):
|
||||
|
||||
def __init__(self, node, type=False, deprecation_reason=None,
|
||||
|
@ -78,9 +58,16 @@ class NodeField(Field):
|
|||
return partial(self.node_type.node_resolver, only_type=get_type(self.field_type))
|
||||
|
||||
|
||||
class Node(six.with_metaclass(NodeMeta, Interface)):
|
||||
class Node(Interface):
|
||||
'''An object with an ID'''
|
||||
|
||||
def __init_subclass_with_meta__(cls, **options):
|
||||
_meta = InterfaceOptions(cls)
|
||||
_meta.fields = {
|
||||
'id': GlobalID(cls, description='The ID of the object.')
|
||||
}
|
||||
super(Node, cls).__init_subclass_with_meta__(cls, _meta=_meta, **options)
|
||||
|
||||
@classmethod
|
||||
def Field(cls, *args, **kwargs): # noqa: N802
|
||||
return NodeField(cls, *args, **kwargs)
|
||||
|
@ -117,11 +104,3 @@ class Node(six.with_metaclass(NodeMeta, Interface)):
|
|||
@classmethod
|
||||
def to_global_id(cls, type, id):
|
||||
return to_global_id(type, id)
|
||||
|
||||
@classmethod
|
||||
def implements(cls, objecttype):
|
||||
get_connection = getattr(objecttype, 'get_connection', None)
|
||||
if not get_connection:
|
||||
get_connection = partial(get_default_connection, objecttype)
|
||||
|
||||
objecttype.Connection = get_connection()
|
||||
|
|
|
@ -19,8 +19,9 @@ class Interface(BaseType):
|
|||
when the field is resolved.
|
||||
'''
|
||||
@classmethod
|
||||
def __init_subclass_with_meta__(cls, **options):
|
||||
_meta = InterfaceOptions(cls)
|
||||
def __init_subclass_with_meta__(cls, _meta=None, **options):
|
||||
if not _meta:
|
||||
_meta = InterfaceOptions(cls)
|
||||
|
||||
fields = OrderedDict()
|
||||
for base in reversed(cls.__mro__):
|
||||
|
@ -28,7 +29,11 @@ class Interface(BaseType):
|
|||
yank_fields_from_attrs(base.__dict__, _as=Field)
|
||||
)
|
||||
|
||||
_meta.fields = fields
|
||||
if _meta.fields:
|
||||
_meta.fields.update(fields)
|
||||
else:
|
||||
_meta.fields = fields
|
||||
|
||||
super(Interface, cls).__init_subclass_with_meta__(_meta=_meta, **options)
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -35,7 +35,12 @@ class Mutation(ObjectType):
|
|||
output = cls
|
||||
|
||||
if not arguments:
|
||||
input_class = getattr(cls, 'Input', None)
|
||||
input_class = getattr(cls, 'Arguments', None)
|
||||
if not input_class:
|
||||
input_class = getattr(cls, 'Input', None)
|
||||
if input_class:
|
||||
print("WARNING: Please use Arguments for Mutation (Input is for ClientMutationID)")
|
||||
|
||||
if input_class:
|
||||
arguments = props(input_class)
|
||||
else:
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
import pytest
|
||||
|
||||
from ..options import Options
|
||||
|
||||
|
||||
def test_options():
|
||||
class BaseOptions:
|
||||
option_1 = False
|
||||
name = True
|
||||
meta = Options(BaseOptions, name=False, option_1=False)
|
||||
assert meta.name == True
|
||||
assert meta.option_1 == False
|
||||
|
||||
|
||||
def test_options_extra_attrs():
|
||||
class BaseOptions:
|
||||
name = True
|
||||
type = True
|
||||
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
meta = Options(BaseOptions)
|
||||
|
||||
assert str(exc_info.value) == 'Invalid attributes: name, type'
|
||||
|
||||
|
||||
def test_options_repr():
|
||||
class BaseOptions:
|
||||
name = True
|
||||
meta = Options(BaseOptions, name=False)
|
||||
assert repr(meta) == '<Options name=True>'
|
Loading…
Reference in New Issue
Block a user