diff --git a/graphene/contrib/django/fields.py b/graphene/contrib/django/fields.py index 80925e4c..2bd173a7 100644 --- a/graphene/contrib/django/fields.py +++ b/graphene/contrib/django/fields.py @@ -1,6 +1,7 @@ from graphene.core.fields import ( ListField ) +from graphene import relay from graphene.core.fields import Field, LazyField from graphene.utils import cached_property @@ -21,8 +22,8 @@ class ConnectionOrListField(LazyField): schema = self.schema model_field = self.field_type field_object_type = model_field.get_object_type() - if field_object_type and issubclass(field_object_type, schema.relay.Node): - field = schema.relay.ConnectionField(model_field) + if field_object_type and issubclass(field_object_type, schema.Node): + field = relay.ConnectionField(model_field) else: field = ListField(model_field) field.contribute_to_class(self.object_type, self.field_name) diff --git a/graphene/core/schema.py b/graphene/core/schema.py index 63cf2318..225fffda 100644 --- a/graphene/core/schema.py +++ b/graphene/core/schema.py @@ -42,6 +42,9 @@ class Schema(object): raise Exception('Type %s not found in %r' % (type_name, self)) return self._types[type_name] + def __getattr__(self, name): + return self.get_type(name) + @property def types(self): return self._types diff --git a/graphene/core/types.py b/graphene/core/types.py index fcafa0d6..432bf2a9 100644 --- a/graphene/core/types.py +++ b/graphene/core/types.py @@ -153,20 +153,3 @@ class Interface(ObjectType): class Meta: interface = True proxy = True - - -@signals.init_schema.connect -def add_types_to_schema(schema): - own_schema = schema - class _Interface(Interface): - class Meta: - schema = own_schema - proxy = True - - class _ObjectType(ObjectType): - class Meta: - schema = own_schema - proxy = True - - setattr(own_schema, 'Interface', _Interface) - setattr(own_schema, 'ObjectType', _ObjectType) diff --git a/graphene/relay/__init__.py b/graphene/relay/__init__.py index 76020a69..ec44068e 100644 --- a/graphene/relay/__init__.py +++ b/graphene/relay/__init__.py @@ -1,22 +1,10 @@ -from graphene.relay.nodes import ( - create_node_definitions -) - from graphene.relay.fields import ( ConnectionField, + NodeField ) import graphene.relay.connections -from graphene.relay.relay import ( - Relay +from graphene.relay.nodes import ( + Node ) - -from graphene.env import get_global_schema -from graphene.relay.utils import setup - -schema = get_global_schema() -setup(schema) -relay = schema.relay - -Node, NodeField = relay.Node, relay.NodeField diff --git a/graphene/relay/connections.py b/graphene/relay/connections.py index db241bb8..ba2053ec 100644 --- a/graphene/relay/connections.py +++ b/graphene/relay/connections.py @@ -7,14 +7,12 @@ from graphql_relay.connection.connection import ( from graphene import signals from graphene.core.fields import NativeField -from graphene.relay.utils import get_relay, setup -from graphene.relay.relay import Relay @signals.class_prepared.connect def object_type_created(object_type): - relay = get_relay(object_type._meta.schema) - if relay and issubclass(object_type, relay.Node): + schema = object_type._meta.schema + if issubclass(object_type, schema.Node) and object_type != schema.Node: if object_type._meta.proxy: return type_name = object_type._meta.type_name @@ -24,8 +22,3 @@ def object_type_created(object_type): connection = connectionDefinitions(type_name, object_type._meta.type).connectionType object_type.add_to_class('connection', connection) - - -@signals.init_schema.connect -def schema_created(schema): - setup(schema) diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index acdeb2f5..2a35763a 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -6,9 +6,8 @@ from graphql_relay.connection.arrayconnection import ( from graphql_relay.connection.connection import ( connectionArgs ) -from graphene.core.fields import Field +from graphene.core.fields import Field, LazyNativeField from graphene.utils import cached_property -from graphene.relay.utils import get_relay class ConnectionField(Field): @@ -25,6 +24,10 @@ class ConnectionField(Field): @cached_property def type(self): object_type = self.get_object_type() - relay = get_relay(object_type._meta.schema) - assert issubclass(object_type, relay.Node), 'Only nodes have connections.' + assert issubclass(object_type, self.schema.Node), 'Only nodes have connections.' return object_type.connection + + +class NodeField(LazyNativeField): + def get_field(self): + return self.schema.Node._definitions.nodeField diff --git a/graphene/relay/nodes.py b/graphene/relay/nodes.py index e2cb9c5f..1b0c51bc 100644 --- a/graphene/relay/nodes.py +++ b/graphene/relay/nodes.py @@ -4,40 +4,34 @@ from graphql_relay.node.node import ( ) from graphene.env import get_global_schema from graphene.core.types import Interface -from graphene.core.fields import Field, LazyNativeField +from graphene.core.fields import LazyNativeField -def getSchemaNode(schema=None): - def getNode(globalId, *args): - _schema = schema or get_global_schema() - resolvedGlobalId = fromGlobalId(globalId) - _type, _id = resolvedGlobalId.type, resolvedGlobalId.id - object_type = schema.get_type(_type) - return object_type.get_node(_id) - return getNode - - -def getNodeType(obj): +def get_node_type(obj): return obj._meta.type -def create_node_definitions(getNode=None, getNodeType=getNodeType, schema=None): - getNode = getNode or getSchemaNode(schema) - _nodeDefinitions = nodeDefinitions(getNode, getNodeType) +def get_node(schema, globalId, *args): + resolvedGlobalId = fromGlobalId(globalId) + _type, _id = resolvedGlobalId.type, resolvedGlobalId.id + object_type = schema.get_type(_type) + return object_type.get_node(_id) - _Interface = getattr(schema, 'Interface', Interface) +class Node(Interface): + _definitions = None - class Node(_Interface): - @classmethod - def get_graphql_type(cls): - if cls is Node: - # Return only nodeInterface when is the Node Inerface - return _nodeDefinitions.nodeInterface - return super(Node, cls).get_graphql_type() + @classmethod + def contribute_to_schema(cls, schema): + if cls._definitions: + return + schema = cls._meta.schema + cls._definitions = nodeDefinitions(lambda *args: get_node(schema, *args), get_node_type) + @classmethod + def get_graphql_type(cls): + if cls is cls._meta.schema.Node: + # Return only nodeInterface when is the Node Inerface + cls.contribute_to_schema(cls._meta.schema) + return cls._definitions.nodeInterface + return super(Node, cls).get_graphql_type() - class NodeField(LazyNativeField): - def get_field(self): - return _nodeDefinitions.nodeField - - return Node, NodeField diff --git a/graphene/relay/relay.py b/graphene/relay/relay.py deleted file mode 100644 index 2ff4eb9b..00000000 --- a/graphene/relay/relay.py +++ /dev/null @@ -1,14 +0,0 @@ -from graphene.relay.nodes import ( - create_node_definitions -) - -from graphene.relay.fields import ( - ConnectionField, -) - - -class Relay(object): - def __init__(self, schema): - self.schema = schema - self.Node, self.NodeField = create_node_definitions(schema=self.schema) - self.ConnectionField = ConnectionField diff --git a/graphene/relay/utils.py b/graphene/relay/utils.py deleted file mode 100644 index 2974fbab..00000000 --- a/graphene/relay/utils.py +++ /dev/null @@ -1,9 +0,0 @@ -def get_relay(schema): - return getattr(schema, 'relay', None) - - -def setup(schema): - from graphene.relay.relay import Relay - if not hasattr(schema, 'relay'): - return setattr(schema, 'relay', Relay(schema)) - return schema diff --git a/tests/relay/test_relay.py b/tests/relay/test_relay.py index 7314c096..2bcdc836 100644 --- a/tests/relay/test_relay.py +++ b/tests/relay/test_relay.py @@ -4,7 +4,6 @@ import graphene from graphene import relay schema = graphene.Schema() -relay = schema.relay class OtherNode(relay.Node): name = graphene.StringField() diff --git a/tests/starwars_relay/schema.py b/tests/starwars_relay/schema.py index 4bcdb87d..8c9bc494 100644 --- a/tests/starwars_relay/schema.py +++ b/tests/starwars_relay/schema.py @@ -1,5 +1,5 @@ import graphene -from graphene import resolve_only_args +from graphene import resolve_only_args, relay from .data import ( getFaction, @@ -9,7 +9,6 @@ from .data import ( ) schema = graphene.Schema(name='Starwars Relay Schema') -relay = schema.relay class Ship(relay.Node): '''A ship in the Star Wars saga''' @@ -34,7 +33,7 @@ class Faction(relay.Node): return Faction(getFaction(id)) -class Query(schema.ObjectType): +class Query(graphene.ObjectType): rebels = graphene.Field(Faction) empire = graphene.Field(Faction) node = relay.NodeField()