@@ -36,7 +36,7 @@ that documentation and the corresponding tests in this library together.
3636Install Relay Library for GraphQL Python
3737
3838``` sh
39- pip install " graphql-core>=2,<3 " # use version 2.x of graphql-core
39+ pip install graphql-core --pre # Last version of graphql-core
4040pip install graphql-relay
4141```
4242
@@ -54,13 +54,13 @@ returning those types.
5454they return a connection type.
5555 - ` connection_definitions ` returns a ` connection_type ` and its associated
5656` edgeType ` , given a name and a node type.
57- - ` connection_from_list ` is a helper method that takes a list and the
57+ - ` connection_from_list ` is a helper method that takes an array and the
5858arguments from ` connection_args ` , does pagination and filtering, and returns
5959an object in the shape expected by a ` connection_type ` 's ` resolver ` function.
6060 - ` connection_from_promised_list ` is similar to ` connection_from_list ` , but
6161it takes a promise that resolves to an array, and returns a promise that
6262resolves to the expected shape by ` connection_type ` .
63- - ` cursor_for_object_in_connection ` is a helper method that takes a list and a
63+ - ` cursor_for_object_in_connection ` is a helper method that takes an array and a
6464member object, and returns a cursor for use in the mutation payload.
6565
6666An example usage of these methods from the [ test schema] ( tests/starwars/schema.py ) :
@@ -69,31 +69,32 @@ An example usage of these methods from the [test schema](tests/starwars/schema.p
6969ship_edge, ship_connection = connection_definitions(' Ship' , shipType)
7070
7171factionType = GraphQLObjectType(
72- name = ' Faction' ,
73- description = ' A faction in the Star Wars saga' ,
72+ name = ' Faction' ,
73+ description = ' A faction in the Star Wars saga' ,
7474 fields = lambda : {
7575 ' id' : global_id_field(' Faction' ),
7676 ' name' : GraphQLField(
7777 GraphQLString,
7878 description = ' The name of the faction.' ,
7979 ),
8080 ' ships' : GraphQLField(
81- ship_connection,
82- description = ' The ships used by the faction.' ,
83- args = connection_args,
84- resolver = lambda faction , _info , ** args : connection_from_list(
85- [getShip(ship) for ship in faction.ships], args
81+ shipConnection,
82+ description = ' The ships used by the faction.' ,
83+ args = connection_args,
84+ resolver = lambda faction , args , * _ : connection_from_list(
85+ map (getShip, faction.ships),
86+ args
8687 ),
8788 )
8889 },
89- interfaces = [node_interface]
90+ interfaces = [node_interface]
9091)
9192```
9293
9394This shows adding a ` ships ` field to the ` Faction ` object that is a connection.
9495It uses ` connection_definitions({name: 'Ship', nodeType: shipType}) ` to create
9596the connection type, adds ` connection_args ` as arguments on this function, and
96- then implements the resolver function by passing the list of ships and the
97+ then implements the resolver function by passing the array of ships and the
9798arguments to ` connection_from_list ` .
9899
99100### Object Identification
@@ -107,7 +108,7 @@ this, it takes a function to resolve an ID to an object, and to determine
107108the type of a given object.
108109 - ` to_global_id ` takes a type name and an ID specific to that type name,
109110and returns a "global ID" that is unique among all types.
110- - ` from_global_id ` takes the "global ID" created by ` to_global_id ` , and returns
111+ - ` from_global_id ` takes the "global ID" created by ` toGlobalID ` , and retuns
111112the type name and ID used to create it.
112113 - ` global_id_field ` creates the configuration for an ` id ` field on a node.
113114 - ` plural_identifying_root_field ` creates a field that accepts a list of
@@ -117,16 +118,17 @@ objects.
117118An example usage of these methods from the [ test schema] ( tests/starwars/schema.py ) :
118119
119120``` python
120- def get_node (global_id , _info ):
121- type_, id_ = from_global_id(global_id)
122- if type_ == ' Faction' :
123- return getFaction(id_)
124- elif type_ == ' Ship' :
125- return getShip(id_)
121+ def get_node (global_id , context , info ):
122+ resolvedGlobalId = from_global_id(global_id)
123+ _type, _id = resolvedGlobalId.type, resolvedGlobalId.id
124+ if _type == ' Faction' :
125+ return getFaction(_id)
126+ elif _type == ' Ship' :
127+ return getShip(_id)
126128 else :
127129 return None
128130
129- def get_node_type (obj , _info ):
131+ def get_node_type (obj , context , info ):
130132 if isinstance (obj, Faction):
131133 return factionType
132134 else :
@@ -175,9 +177,11 @@ class IntroduceShipMutation(object):
175177 def __init__ (self , shipId , factionId , clientMutationId = None ):
176178 self .shipId = shipId
177179 self .factionId = factionId
178- self .clientMutationId = clientMutationId
180+ self .clientMutationId = None
179181
180- def mutate_and_get_payload (_info , shipName , factionId , ** _input ):
182+ def mutate_and_get_payload (data , * _ ):
183+ shipName = data.get(' shipName' )
184+ factionId = data.get(' factionId' )
181185 newShip = createShip(shipName, factionId)
182186 return IntroduceShipMutation(
183187 shipId = newShip.id,
@@ -197,19 +201,19 @@ shipMutation = mutation_with_client_mutation_id(
197201 output_fields = {
198202 ' ship' : GraphQLField(
199203 shipType,
200- resolver = lambda payload , _info : getShip(payload.shipId)
204+ resolver = lambda payload , * _ : getShip(payload.shipId)
201205 ),
202206 ' faction' : GraphQLField(
203207 factionType,
204- resolver = lambda payload , _info : getFaction(payload.factionId)
208+ resolver = lambda payload , * _ : getFaction(payload.factionId)
205209 )
206210 },
207211 mutate_and_get_payload = mutate_and_get_payload
208212)
209213
210214mutationType = GraphQLObjectType(
211215 ' Mutation' ,
212- fields = lambda : {
216+ fields = lambda : {
213217 ' introduceShip' : shipMutation
214218 }
215219)
0 commit comments