Skip to content

Commit 22be073

Browse files
committed
Require data_source when creating a RelayMixin.
1 parent 495efa8 commit 22be073

File tree

6 files changed

+29
-25
lines changed

6 files changed

+29
-25
lines changed
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class BaseDataSource(object):
2+
def fetch_node(self, object_type, id, resolve_info):
3+
raise NotImplementedError('Must implement fetch_node to resolve node by ID.')
4+
5+
def make_connection_resolver(self, relay, object_type_thunk):
6+
raise NotImplementedError('Must implement make_connection_resolver so that RelayMixin can automatically '
7+
'create connection resolvers')

epoxy/contrib/relay/data_source/memory.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from collections import defaultdict
2-
32
from operator import attrgetter
3+
44
from ..connections.sorted_collection import SortedCollection
5+
from .base import BaseDataSource
56

67

7-
class InMemoryDataSource(object):
8+
class InMemoryDataSource(BaseDataSource):
89
def __init__(self):
910
self.objects_by_type_and_id = defaultdict(dict)
1011
self.objects_by_type = defaultdict(lambda: SortedCollection(key=attrgetter('id')))
@@ -16,9 +17,6 @@ def add(self, obj):
1617
def fetch_node(self, object_type, id, resolve_info):
1718
return self.objects_by_type_and_id[object_type].get(id)
1819

19-
def get_collection(self, object_type):
20-
return self.objects_by_type[object_type()]
21-
2220
def make_connection_resolver(self, relay, object_type_thunk):
2321
def resolver(obj, args, info):
2422
object_type = relay.R[object_type_thunk]()

epoxy/contrib/relay/mixin.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66

77
class RelayMixin(object):
8-
def __init__(self, registry):
8+
def __init__(self, registry, data_source):
99
self.R = registry
10+
self.data_source = data_source
1011
self._node_field = None
1112
self._connections = {}
12-
self.data_source = None
1313

1414
@property
1515
def NodeField(self):
@@ -25,9 +25,6 @@ def NodeField(self):
2525
resolver=lambda obj, args, info: self.fetch_node(args.get('id'), info)
2626
)
2727

28-
def set_data_source(self, data_source):
29-
self.data_source = data_source
30-
3128
def get_connection_and_edge_types(self, type_name):
3229
return self._connections[type_name]
3330

@@ -78,8 +75,11 @@ class Connection(R.ObjectType):
7875
self._connections[name] = Connection, Edge
7976
return Connection, Edge
8077

81-
def Connection(self, name, object_type, args=None, **kwargs):
78+
def Connection(self, name, object_type, args=None, resolver=None, **kwargs):
8279
args = args or {}
8380
args.update(connection_args)
84-
field = self.R.Field(self.connection_definitions(name, object_type)[0], args=args, **kwargs)
81+
if not resolver:
82+
resolver = self.data_source.make_connection_resolver(self, object_type)
83+
84+
field = self.R.Field(self.connection_definitions(name, object_type)[0], args=args, resolver=resolver, **kwargs)
8585
return field

epoxy/registry.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ def Schema(self, query, mutation=None):
219219
self._add_impl_to_interfaces()
220220
return GraphQLSchema(query=query, mutation=mutation)
221221

222-
def Mixin(self, mixin_cls):
223-
mixin = mixin_cls(self)
222+
def Mixin(self, mixin_cls, *args, **kwargs):
223+
mixin = mixin_cls(self, *args, **kwargs)
224224
mixin.register_types()
225225
return mixin
226226

tests/test_relay/test_relay_connections.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@
1414
"Spike", "Gunner", "Sparky", "Mickey", "Kobe", "Chase", "Oreo", "Frankie", "Mac", "Benji", "Bubba",
1515
"Champ", "Brady", "Elvis", "Copper", "Cash", "Archie", "Walter"]
1616

17+
data_source = InMemoryDataSource()
18+
1719
R = TypeRegistry()
18-
Relay = R.Mixin(RelayMixin)
20+
Relay = R.Mixin(RelayMixin, data_source)
1921

2022

21-
class Pet(R.Implements[R.Node]):
23+
class Pet(R.Implements[Relay.Node]):
2224
name = R.String
2325

2426

25-
data_source = InMemoryDataSource()
26-
27-
2827
class Query(R.ObjectType):
29-
pets = Relay.Connection('Pet', R.Pet, resolver=data_source.make_connection_resolver(Relay, R.Pet))
28+
pets = Relay.Connection('Pet', R.Pet)
3029
node = Relay.NodeField
3130

3231

tests/test_relay/test_relay_node.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
def test_relay_node_definition():
88
R = TypeRegistry()
9-
Relay = R.Mixin(RelayMixin)
9+
Relay = R.Mixin(RelayMixin, InMemoryDataSource())
1010

1111
class Pet(R.Implements[R.Node]):
1212
name = R.String
@@ -30,7 +30,7 @@ class Query(R.ObjectType):
3030

3131
def test_relay_node_definition_using_custom_type():
3232
R = TypeRegistry()
33-
Relay = R.Mixin(RelayMixin)
33+
Relay = R.Mixin(RelayMixin, InMemoryDataSource())
3434

3535
class Pet(R.Implements[R.Node]):
3636
name = R.String
@@ -59,10 +59,10 @@ def __init__(self, id, name):
5959

6060

6161
def test_relay_node_field_resolver():
62-
R = TypeRegistry()
63-
Relay = R.Mixin(RelayMixin)
6462
data_source = InMemoryDataSource()
65-
Relay.set_data_source(data_source)
63+
64+
R = TypeRegistry()
65+
Relay = R.Mixin(RelayMixin, data_source)
6666

6767
class Pet(R.Implements[R.Node]):
6868
name = R.String

0 commit comments

Comments
 (0)