mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 12:44:15 +03:00
Merge branch 'master' of github.com:syrusakbary/graphene
This commit is contained in:
commit
b1e0c3b533
|
@ -12,7 +12,9 @@ easily.
|
||||||
`Django <http://github.com/graphql-python/swapi-graphene>`__
|
`Django <http://github.com/graphql-python/swapi-graphene>`__
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
*What is supported in this Python version?* **Everything**: Interfaces, ObjectTypes, Scalars, Unions and Relay (Nodes, Connections and Mutations), in addition to queries, mutations and subscriptions.
|
*What is supported in this Python version?* **Everything**: Interfaces,
|
||||||
|
ObjectTypes, Scalars, Unions and Relay (Nodes, Connections), in addition
|
||||||
|
to queries, mutations and subscriptions.
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
27
examples/field_example.py
Normal file
27
examples/field_example.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import graphene
|
||||||
|
|
||||||
|
|
||||||
|
class Patron(graphene.ObjectType):
|
||||||
|
id = graphene.ID()
|
||||||
|
name = graphene.String()
|
||||||
|
age = graphene.ID()
|
||||||
|
|
||||||
|
|
||||||
|
class Query(graphene.ObjectType):
|
||||||
|
|
||||||
|
patron = graphene.Field(Patron)
|
||||||
|
|
||||||
|
def resolve_patron(self, args, info):
|
||||||
|
return Patron(id=1, name='Demo')
|
||||||
|
|
||||||
|
schema = graphene.Schema(query=Query)
|
||||||
|
query = '''
|
||||||
|
query something{
|
||||||
|
patron {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
result = schema.execute(query)
|
||||||
|
print(result.data['patron'])
|
|
@ -1,6 +1,6 @@
|
||||||
from pytest import raises
|
|
||||||
from graphql.core.type import GraphQLInterfaceType, GraphQLObjectType
|
from graphql.core.type import GraphQLInterfaceType, GraphQLObjectType
|
||||||
from mock import patch
|
from mock import patch
|
||||||
|
from pytest import raises
|
||||||
|
|
||||||
from graphene import Schema
|
from graphene import Schema
|
||||||
from graphene.contrib.django.types import DjangoInterface, DjangoNode
|
from graphene.contrib.django.types import DjangoInterface, DjangoNode
|
||||||
|
@ -36,7 +36,7 @@ def test_django_interface():
|
||||||
|
|
||||||
@patch('graphene.contrib.django.tests.models.Article.objects.get', return_value=Article(id=1))
|
@patch('graphene.contrib.django.tests.models.Article.objects.get', return_value=Article(id=1))
|
||||||
def test_django_get_node(get):
|
def test_django_get_node(get):
|
||||||
human = Human.get_node(1)
|
human = Human.get_node(1, None)
|
||||||
get.assert_called_with(id=1)
|
get.assert_called_with(id=1)
|
||||||
assert human.id == 1
|
assert human.id == 1
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,14 @@ class InstanceObjectType(BaseObjectType):
|
||||||
))
|
))
|
||||||
super(InstanceObjectType, self).__init__(_root=_root)
|
super(InstanceObjectType, self).__init__(_root=_root)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def instance(self):
|
||||||
|
return self._root
|
||||||
|
|
||||||
|
@instance.setter
|
||||||
|
def instance(self, value):
|
||||||
|
self._root = value
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
return getattr(self._root, attr)
|
return getattr(self._root, attr)
|
||||||
|
|
||||||
|
@ -67,7 +75,7 @@ class DjangoNode(BaseNode, DjangoInterface):
|
||||||
id = GlobalIDField()
|
id = GlobalIDField()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_node(cls, id):
|
def get_node(cls, id, info=None):
|
||||||
try:
|
try:
|
||||||
instance = cls._meta.model.objects.get(id=id)
|
instance = cls._meta.model.objects.get(id=id)
|
||||||
return cls(instance)
|
return cls(instance)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from pytest import raises
|
|
||||||
from graphql.core.type import GraphQLList
|
from graphql.core.type import GraphQLList
|
||||||
|
from pytest import raises
|
||||||
|
|
||||||
import graphene
|
import graphene
|
||||||
from graphene import relay
|
from graphene import relay
|
||||||
|
@ -11,10 +11,32 @@ class OtherNode(relay.Node):
|
||||||
name = graphene.String()
|
name = graphene.String()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_node(cls, id):
|
def get_node(cls, id, info):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_works_old_get_node():
|
||||||
|
class Part(relay.Node):
|
||||||
|
x = graphene.String()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_node(cls, id):
|
||||||
|
return id
|
||||||
|
|
||||||
|
assert Part.get_node(1) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_works_old_static_get_node():
|
||||||
|
class Part(relay.Node):
|
||||||
|
x = graphene.String()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_node(id):
|
||||||
|
return id
|
||||||
|
|
||||||
|
assert Part.get_node(1) == 1
|
||||||
|
|
||||||
|
|
||||||
def test_field_no_contributed_raises_error():
|
def test_field_no_contributed_raises_error():
|
||||||
with raises(Exception) as excinfo:
|
with raises(Exception) as excinfo:
|
||||||
class Part(relay.Node):
|
class Part(relay.Node):
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
import inspect
|
||||||
|
import warnings
|
||||||
|
from functools import wraps
|
||||||
from graphql_relay.node.node import to_global_id
|
from graphql_relay.node.node import to_global_id
|
||||||
|
|
||||||
from ..core.types import (Boolean, Field, InputObjectType, Interface, List,
|
from ..core.types import (Boolean, Field, InputObjectType, Interface, List,
|
||||||
|
@ -73,8 +76,27 @@ class BaseNode(object):
|
||||||
def _prepare_class(cls):
|
def _prepare_class(cls):
|
||||||
from graphene.relay.utils import is_node
|
from graphene.relay.utils import is_node
|
||||||
if is_node(cls):
|
if is_node(cls):
|
||||||
assert hasattr(
|
get_node = getattr(cls, 'get_node')
|
||||||
cls, 'get_node'), 'get_node classmethod not found in %s Node' % cls
|
assert get_node, 'get_node classmethod not found in %s Node' % cls
|
||||||
|
assert callable(get_node), 'get_node have to be callable'
|
||||||
|
args = 3
|
||||||
|
if isinstance(get_node, staticmethod):
|
||||||
|
args -= 1
|
||||||
|
|
||||||
|
get_node_num_args = len(inspect.getargspec(get_node).args)
|
||||||
|
if get_node_num_args < args:
|
||||||
|
warnings.warn("get_node will receive also the info arg"
|
||||||
|
" in future versions of graphene".format(cls.__name__),
|
||||||
|
FutureWarning)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
@wraps(get_node)
|
||||||
|
def wrapped_node(*node_args):
|
||||||
|
if len(node_args) < args:
|
||||||
|
node_args += (None, )
|
||||||
|
return get_node(*node_args[:-1])
|
||||||
|
|
||||||
|
setattr(cls, 'get_node', wrapped_node)
|
||||||
|
|
||||||
def to_global_id(self):
|
def to_global_id(self):
|
||||||
type_name = self._meta.type_name
|
type_name = self._meta.type_name
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -24,7 +24,7 @@ class PyTest(TestCommand):
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='graphene',
|
name='graphene',
|
||||||
version='0.4.0.1',
|
version='0.4.1.1',
|
||||||
|
|
||||||
description='Graphene: Python DSL for GraphQL',
|
description='Graphene: Python DSL for GraphQL',
|
||||||
long_description=open('README.rst').read(),
|
long_description=open('README.rst').read(),
|
||||||
|
|
Loading…
Reference in New Issue
Block a user