From 49ff62920ce3fc9be0fadfad7ad2484d1d81d86b Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Tue, 17 Nov 2015 13:28:50 +0000 Subject: [PATCH 1/4] Improve quickstart page to more involved example --- quickstart.md | 55 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/quickstart.md b/quickstart.md index d74c7151..762cdc42 100644 --- a/quickstart.md +++ b/quickstart.md @@ -33,20 +33,59 @@ pip install graphene ## Types -First we're going to define some GraphQL ObjectTypes for our `Schema`: +First we're going to define some GraphQL ObjectTypes and relay Nodes for our `Schema`: ```python import graphene +from graphene import relay +from somewhere import (fetch_user_from_database, fetch_users_from_database) schema = graphene.Schema() +class User(relay.Node): + """A User fetched from the database""" + user_id = graphene.ID() + first_name = graphene.String() + last_name = graphene.String() + full_name = graphene.String(description='A field created by setting the first and last name.') + email_address = graphene.String() + age = graphene.Int() + + @classmethod + def get_node(cls, user_id): + user_dict = fetch_user_from_database(user_id) + # user_dict will contain the fields, user_id, first_name, last_name, email_address and age + user_dict['id'] = user_dict['user_id'] # will be used to set the global ID used by relay + return User(**user_dict) + + def resolve_full_name(self, *args): + if self.first_name and self.last_name: + return self.first_name + ' ' + self.last_name + return None + +def _create_relay_user(user): + # user_dict will contain the fields, user_id, first_name, last_name, email_address and age + user['id'] = user['user_id'] + return User(**user) + # This will be our root query class Query(graphene.ObjectType): - username = graphene.StringField(description='The username') + users = graphene.List(User, + userName=graphene.Argument(graphene.String), + sortKey=graphene.Argument(graphene.String), + sortDirection=graphene.Argument(graphene.String)) + user = relay.NodeField(Users) + viewer = graphene.Field('self') # needed for Relay + + # args will be a dict with 'userName', 'sortKey' and 'sortDirection' + # info is an object with information about the query being sent + def resolve_users(self, args, info): + list_of_user_dicts = fetch_users_from_database(args) + return [_create_relay_user(user) for user in list_of_user_dicts] - def resolve_username(self, *args): - return 'Hello World' + def resolve_viewer(self, *args, **kwargs): + return self # Here we set the root query for our schema schema.query = Query @@ -55,12 +94,12 @@ schema.query = Query Then, we can start querying our schema: ```python -result = schema.execute('{ username }') +result = schema.execute('query { users { fullName } }') -# result.data should be {'username': 'Hello World'} -username = result.data['username'] +# result.data should be {'users': [{fullName: 'Provided Name'}]} +users = result.data['users'] -print(username) +print(users) ``` Congrats! You got your first version of graphene working! From 586e141be18242177d5187047b59e2da245958e2 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Wed, 18 Nov 2015 12:50:49 +0000 Subject: [PATCH 2/4] Updated example to be fully self-contained --- quickstart.md | 64 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/quickstart.md b/quickstart.md index 762cdc42..00de5ffd 100644 --- a/quickstart.md +++ b/quickstart.md @@ -39,7 +39,51 @@ First we're going to define some GraphQL ObjectTypes and relay Nodes for our `Sc ```python import graphene from graphene import relay -from somewhere import (fetch_user_from_database, fetch_users_from_database) + +USER_DATA = [ + { + user_id = '1' + first_name = 'Peter' + last_name = 'Cabbage' + email_address = 'peter@cabbage.com' + age = 32 + }, + { + user_id = '2' + first_name = 'Lukas' + last_name = 'Chard' + email_address = 'lukas@broccoli.com' + age = 54 + }, + { + user_id = '3' + first_name = 'Marie' + last_name = 'Cauliflower' + email_address = 'marie@cauliflower.com' + age = 27 + }, +] + +def fetch_user_from_database(user_id): + user, = [user for user in USER_DATA if user['user_id'] == user_id] + return user + +def fetch_users_from_database(args): + full_name = args.get('fullName', None) + if full_name: + full_name = full_name.upper() + sort_key = args.get('sortKey', None) + sort_direction = args.get('sortDirection', None) + reversed = False + if sort_directon == 'DESC': + reversed = True + + filtered_users = [user for user in USER_DATA if full_name is None or full_name in + user['first_name'].upper() + ' ' + user['last_name'].upper()] + if sort_key and sort_direction: + filtered_users.sort(lambda item: item[sort_key], reverse=reversed) + + return filtered_users schema = graphene.Schema() @@ -60,11 +104,9 @@ class User(relay.Node): return User(**user_dict) def resolve_full_name(self, *args): - if self.first_name and self.last_name: - return self.first_name + ' ' + self.last_name - return None + return ' '.join([self.first_name, self.last_name]) -def _create_relay_user(user): +def _user_container(user): # user_dict will contain the fields, user_id, first_name, last_name, email_address and age user['id'] = user['user_id'] return User(**user) @@ -72,17 +114,17 @@ def _create_relay_user(user): # This will be our root query class Query(graphene.ObjectType): users = graphene.List(User, - userName=graphene.Argument(graphene.String), - sortKey=graphene.Argument(graphene.String), - sortDirection=graphene.Argument(graphene.String)) + fullName=graphene.String(), + sortKey=graphene.String(), + sortDirection=graphene.String()) user = relay.NodeField(Users) viewer = graphene.Field('self') # needed for Relay - # args will be a dict with 'userName', 'sortKey' and 'sortDirection' + # args will be a dict with 'fullName', 'sortKey' and 'sortDirection' # info is an object with information about the query being sent def resolve_users(self, args, info): list_of_user_dicts = fetch_users_from_database(args) - return [_create_relay_user(user) for user in list_of_user_dicts] + return [_user_container(user) for user in list_of_user_dicts] def resolve_viewer(self, *args, **kwargs): return self @@ -96,7 +138,7 @@ Then, we can start querying our schema: ```python result = schema.execute('query { users { fullName } }') -# result.data should be {'users': [{fullName: 'Provided Name'}]} +# result.data should be {'users': [{fullName: 'Peter Cabbage'}, {fullName: 'Lukas Chart'}, {fullName: 'Marie Cauliflower'}]} users = result.data['users'] print(users) From 72090027cb292c893c290a297952f23e80468ee9 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Thu, 19 Nov 2015 10:30:29 +0000 Subject: [PATCH 3/4] Fixed typos. --- quickstart.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/quickstart.md b/quickstart.md index 00de5ffd..ad87e89a 100644 --- a/quickstart.md +++ b/quickstart.md @@ -42,25 +42,25 @@ from graphene import relay USER_DATA = [ { - user_id = '1' - first_name = 'Peter' - last_name = 'Cabbage' - email_address = 'peter@cabbage.com' - age = 32 + 'user_id': '1' + 'first_name': 'Peter' + 'last_name': 'Cabbage' + 'email_address': 'peter@cabbage.com' + 'age': 32 }, { - user_id = '2' - first_name = 'Lukas' - last_name = 'Chard' - email_address = 'lukas@broccoli.com' - age = 54 + 'user_id': '2' + 'first_name': 'Lukas' + 'last_name': 'Chard' + 'email_address': 'lukas@broccoli.com' + 'age': 54 }, { - user_id = '3' - first_name = 'Marie' - last_name = 'Cauliflower' - email_address = 'marie@cauliflower.com' - age = 27 + 'user_id': '3' + 'first_name': 'Marie' + 'last_name': 'Cauliflower' + 'email_address': 'marie@cauliflower.com' + 'age': 27 }, ] From 0779329ad3be85294401bb0385546959f91f607b Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 Nov 2015 17:09:24 +0000 Subject: [PATCH 4/4] Fix type --- quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstart.md b/quickstart.md index ad87e89a..3bb9f595 100644 --- a/quickstart.md +++ b/quickstart.md @@ -117,7 +117,7 @@ class Query(graphene.ObjectType): fullName=graphene.String(), sortKey=graphene.String(), sortDirection=graphene.String()) - user = relay.NodeField(Users) + user = relay.NodeField(User) viewer = graphene.Field('self') # needed for Relay # args will be a dict with 'fullName', 'sortKey' and 'sortDirection'