graphene icon indicating copy to clipboard operation
graphene copied to clipboard

[Documentation] Fix TypeError and make the examples in ObjectType > Resolver Parameters > Parent Value Object section self contained

Open rednafi opened this issue 4 years ago • 1 comments

Note: for support questions, please use stackoverflow. This repository's issues are reserved for feature requests and bug reports.

  • What is the current behavior? You can't actually execute the example under the Parent Value Object section. There are mainly two issues. Let's have a look at the code snippet:
from graphene import ObjectType, String, Field

class Person(ObjectType):
    full_name = String()

    def resolve_full_name(parent, info):
        return f"{parent.first_name} {parent.last_name}"

class Query(ObjectType):
    me = Field(Person)

    def resolve_me(parent, info):
        # returns an object that represents a Person
        return get_human(name="Luke Skywalker")
  • From a beginner's perspective, it's unclear how the resolve_full_name method has access to first_name and last_name when they aren't defined in the Person class.
  • Seems like this get_human function(or method?) came out of nowhere.

Then it gets executed like this:


schema = Schema(query=Query)

query_string = "{ me { fullName } }"
result = schema.execute(query_string)

assert result["data"]["me"] == {"fullName": "Luke Skywalker")
  • The last line of the above snippet has a misplaced parenthesis

  • Even if you fix that one, it raises TypeError saying TypeError: 'ExecutionResult' object is not subscriptable. result object has a to_dict method, maybe we should use that here.

  • If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via a Github repo, https://repl.it or similar.

  • What is the expected behavior? At this stage of the documentation, the example should be self-contained, even if it gets a bit verbose.

  • What is the motivation / use case for changing the behavior?

Maybe this is the expected behavior?

from graphene import ObjectType, String, Field, Schema


class Person(ObjectType):
    first_name = String()
    last_name = String()
    full_name = String()

    def resolve_full_name(parent, info):
        return f"{parent.first_name} {parent.last_name}"


def get_human(name):
    first_name, last_name = name.split()
    return Person(first_name=first_name, last_name=last_name)


class Query(ObjectType):
    me = Field(Person)

    def resolve_me(parent, info):
        # returns an object that represents a Person
        return get_human(name="Luke Skywalker")


schema = Schema(query=Query)

query_string = "{ me { fullName } }"
result = schema.execute(query_string)

assert result.to_dict()["data"]["me"] == {"fullName": "Luke Skywalker"}
  • Please tell us about your environment:

    • Version: graphql-core==2.3.2, graphql-relay==2.0.1
    • Platform: Ubuntu 20.04
  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow)

rednafi avatar Jul 27 '20 18:07 rednafi

I totally agree that this example brings a lot of troubles. We will appreciate a clearer example :pray:

jmaralc avatar Nov 22 '20 15:11 jmaralc