From 22970e94f1016e813848fc0ab5d1e7ab9ad612e4 Mon Sep 17 00:00:00 2001 From: Christoph Zwerschke Date: Sun, 30 Aug 2020 01:03:42 +0200 Subject: [PATCH] Upgrade Sphinx and fix various autodoc issues (#104) --- docs/conf.py | 143 +++++++++--- docs/diffs.rst | 10 +- docs/modules/error.rst | 9 - docs/modules/execution.rst | 9 - docs/modules/graphql.rst | 4 +- docs/modules/language.rst | 21 +- docs/modules/pyutils.rst | 15 +- docs/modules/subscription.rst | 3 - docs/modules/type.rst | 3 +- docs/modules/utilities.rst | 2 + docs/modules/validation.rst | 62 +++--- docs/usage/extension.rst | 9 +- docs/usage/introspection.rst | 13 +- docs/usage/methods.rst | 13 +- docs/usage/other.rst | 11 +- docs/usage/parser.rst | 13 +- docs/usage/resolvers.rst | 4 +- docs/usage/schema.rst | 2 +- docs/usage/sdl.rst | 12 +- docs/usage/validator.rst | 13 +- poetry.lock | 205 +++++++++--------- pyproject.toml | 6 +- src/graphql/language/parser.py | 4 +- .../utilities/value_from_ast_untyped.py | 2 +- 24 files changed, 345 insertions(+), 243 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 0d198e68..83139bba 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -85,50 +85,121 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # AutoDoc configuration -#autoclass_content = "both" +autoclass_content = "class" autodoc_default_options = { 'members': True, 'inherited-members': True, - 'private-members': False, 'special-members': '__init__', 'undoc-members': True, 'show-inheritance': True } autosummary_generate = True -# ignore certain warnings -# (references to some of the Python built-in types do not resolve correctly) +# GraphQL-core top level modules with submodules that can be omitted. +# Sometimes autodoc cannot find classes since it is looking for the +# qualified form, but the documentation has the shorter form. +# We need to give autodoc a little help in this cases. +graphql_modules = { + 'error': ['graphql_error'], + 'execution': ['execute', 'middleware'], + 'language': ['ast', 'directive_locations', 'location', + 'source', 'token_kind', 'visitor'], + 'pyutils': ['event_emitter', 'frozen_list', 'path'], + 'type': ['definition', 'directives', 'schema'], + 'utilities': ['find_breaking_changes', 'type_info'], + 'validation': ['rules', 'validation_context']} + +# GraphQL-core classes that autodoc sometimes cannot find +# (e.g. where specified as string in type hints). +# We need to give autodoc a little help in this cases, too: +graphql_classes = { + 'GraphQLAbstractType': 'type', + 'GraphQLObjectType': 'type', + 'Node': 'language', + 'Source': 'language', + 'SourceLocation': 'language' +} + +# ignore the following undocumented or internal references: +ignore_references = set(''' +GNT GT T +enum.Enum +asyncio.events.AbstractEventLoop +graphql.type.schema.InterfaceImplementations +graphql.validation.validation_context.VariableUsage +graphql.validation.rules.known_argument_names.KnownArgumentNamesOnDirectivesRule +graphql.validation.rules.provided_required_arguments.ProvidedRequiredArgumentsOnDirectivesRule +'''.split()) + +ignore_references.update(__builtins__.keys()) + + +def on_missing_reference(app, env, node, contnode): + """Fix or skip any missing references.""" + if node.get('refdomain') != 'py': + return None + target = node.get('reftarget') + if not target: + return None + if target in ignore_references: + return contnode + typ = node.get('reftype') + if typ != 'class': + return None + if '.' in target: # maybe too specific + base_module, target = target.split('.', 1) + if base_module == 'typing': + return contnode + if base_module == 'graphql': + if '.' not in target: + return None + base_module, target = target.split('.', 1) + if '.' not in target: + return None + sub_modules = graphql_modules.get(base_module) + if not sub_modules: + return + sub_module = target.split('.', 1)[0] + if sub_module not in sub_modules: + return None + target = 'graphql.' + base_module + '.' + target.rsplit('.', 1)[-1] + else: # maybe not specific enough + base_module = graphql_classes.get(target) + if not base_module: + return None + target = 'graphql.' + base_module + '.' + target + # replace target + if contnode.__class__.__name__ == 'Text': + contnode = contnode.__class__(target) + elif contnode.__class__.__name__ == 'literal': + if len(contnode.children) != 1: + return None + textnode = contnode.children[0] + contnode.children[0] = textnode.__class__(target) + else: + return None + node['reftarget'] = target + fromdoc = node.get('refdoc') + if not fromdoc: + doc_module = node.get('py:module') + if doc_module: + if doc_module.startswith('graphql.'): + doc_module = doc_module.split('.', 1)[-1] + if doc_module not in graphql_modules: + doc_module = None + fromdoc = 'modules/' + (doc_module or base_module) + # try resolving again with replaced target + return env.domains['py'].resolve_xref( + env, fromdoc, app.builder, typ, target, node, contnode) + + +def setup(app): + app.connect('missing-reference', on_missing_reference) + + +# be nitpicky (handle all possible problems in on_missing_reference) nitpicky = True -nitpick_ignore = [('py:class', t) for t in ( - 'dict', 'list', 'object', 'tuple', - 'Exception', 'TypeError', 'ValueError', - 'builtins.str', 'enum.Enum', - 'typing.Callable', 'typing.Dict', 'typing.Generic', 'typing.List', - 'graphql.pyutils.cached_property.CachedProperty', - 'graphql.pyutils.path.Path', - 'graphql.error.graphql_error.GraphQLError', - 'graphql.language.ast.DefinitionNode', - 'graphql.language.ast.ExecutableDefinitionNode', - 'graphql.language.ast.Node', - 'graphql.language.ast.ScalarTypeDefinitionNode', - 'graphql.language.ast.SelectionNode', - 'graphql.language.ast.TypeDefinitionNode', - 'graphql.language.ast.TypeExtensionNode', - 'graphql.language.ast.TypeNode', - 'graphql.language.ast.TypeSystemDefinitionNode', - 'graphql.language.ast.ValueNode', - 'graphql.language.visitor.Visitor', - 'graphql.type.definition.GraphQLNamedType', - 'graphql.type.definition.GraphQLType', - 'graphql.type.definition.GraphQLWrappingType', - 'graphql.validation.rules.ASTValidationRule', - 'graphql.validation.rules.SDLValidationRule', - 'graphql.validation.rules.ValidationRule', - 'graphql.validation.validation_context.ASTValidationContext', - 'graphql.validation.rules.known_argument_names' - '.KnownArgumentNamesOnDirectivesRule', - 'graphql.validation.rules.provided_required_arguments' - '.ProvidedRequiredArgumentsOnDirectivesRule')] + # The reST default role (used for this markup: `text`) to use for all # documents. @@ -172,7 +243,9 @@ # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + 'navigation_depth': 5 +} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] diff --git a/docs/diffs.rst b/docs/diffs.rst index 0bdae09f..399eee06 100644 --- a/docs/diffs.rst +++ b/docs/diffs.rst @@ -49,6 +49,8 @@ The following shorthand notations are possible: * Where you need to pass a GraphQLEnumValueMap, i.e. a dictionary with names as keys and GraphQLEnumValues as values, you can pass any other Python objects as values. These will be automatically wrapped into GraphQLEnumValues. You can also pass a Python Enum type as GraphQLEnumValueMap. +.. currentmodule:: graphql.type + Custom output names of arguments and input fields ------------------------------------------------- @@ -61,18 +63,22 @@ Custom output types of input object types You can also pass a custom ``out_type`` argument to :class:`GraphQLInputObjectType` that allows conversion to any Python type on egress instead of conversion to a dictionary, which is the default. This is used to support the container feature of Graphene InputObjectTypes. +.. currentmodule:: graphql.execution + Custom middleware ----------------- -The :func:`execution.execute` function takes an additional ``middleware`` argument which must be a sequence of middleware functions or a :class:`MiddlewareManager` object. This feature is used by Graphene to affect the evaluation of fields using custom middleware. There has been a `request `_ to add this to GraphQL.js as well, but so far this feature only exists in GraphQL-core. +The :func:`execute` function takes an additional ``middleware`` argument which must be a sequence of middleware functions or a :class:`MiddlewareManager` object. This feature is used by Graphene to affect the evaluation of fields using custom middleware. There has been a `request `_ to add this to GraphQL.js as well, but so far this feature only exists in GraphQL-core. Custom execution context ------------------------ -The :func:`execution.execute` function takes an additional ``execution_context_class`` argument which allows specifying a custom execution context class instead of the default :class:`ExecutionContext` used by GraphQL-core. +The :func:`execute` function takes an additional ``execution_context_class`` argument which allows specifying a custom execution context class instead of the default :class:`ExecutionContext` used by GraphQL-core. +.. currentmodule:: graphql + Registering special types for descriptions ------------------------------------------ diff --git a/docs/modules/error.rst b/docs/modules/error.rst index ef513161..bdc4fc92 100644 --- a/docs/modules/error.rst +++ b/docs/modules/error.rst @@ -4,12 +4,3 @@ Error .. currentmodule:: graphql.error .. automodule:: graphql.error - -.. autoexception:: GraphQLError - :members: - -.. autoexception:: GraphQLSyntaxError - -.. autofunction:: format_error -.. autofunction:: located_error -.. autofunction:: print_error diff --git a/docs/modules/execution.rst b/docs/modules/execution.rst index 6565b0b7..e3996adb 100644 --- a/docs/modules/execution.rst +++ b/docs/modules/execution.rst @@ -4,12 +4,3 @@ Execution .. currentmodule:: graphql.execution .. automodule:: graphql.execution - -.. autofunction:: execute -.. autofunction:: default_field_resolver - -.. autoclass:: ExecutionContext -.. autoclass:: ExecutionResult - -.. autofunction:: get_directive_values - diff --git a/docs/modules/graphql.rst b/docs/modules/graphql.rst index 2109e44f..336c4c0e 100644 --- a/docs/modules/graphql.rst +++ b/docs/modules/graphql.rst @@ -4,6 +4,8 @@ Reference .. currentmodule:: graphql .. automodule:: graphql + :no-members: + :no-inherited-members: .. _top-level-functions: @@ -19,7 +21,7 @@ Sub-Packages ------------ .. toctree:: - :maxdepth: 1 + :maxdepth: 2 error execution diff --git a/docs/modules/language.rst b/docs/modules/language.rst index ef649d61..b5806718 100644 --- a/docs/modules/language.rst +++ b/docs/modules/language.rst @@ -1,7 +1,11 @@ Language ======== +.. currentmodule:: graphql.language + .. automodule:: graphql.language + :no-members: + :no-inherited-members: AST --- @@ -65,6 +69,10 @@ Each kind of AST node has its own class: .. autoclass:: VariableDefinitionNode .. autoclass:: VariableNode +Directive locations are specified using the following enumeration: + +.. autoclass:: DirectiveLocation + Lexer ----- @@ -99,8 +107,17 @@ Visitor .. autoclass:: Visitor .. autoclass:: ParallelVisitor -The module also exports the following special symbols which can be used as -return values in the :class:`Visitor` methods to signal particular actions: +The module also exports the following enumeration that can be used as the return type +for :class:`Visitor` methods: + +.. currentmodule:: graphql.language.visitor + +.. autoclass:: VisitorActionEnum + +.. currentmodule:: graphql.language + +The module also exports the values of this enumeration directly. These can be used as +return values of :class:`Visitor` methods to signal particular actions: .. data:: BREAK :annotation: (same as ``True``) diff --git a/docs/modules/pyutils.rst b/docs/modules/pyutils.rst index b11d6eeb..0c036521 100644 --- a/docs/modules/pyutils.rst +++ b/docs/modules/pyutils.rst @@ -4,6 +4,8 @@ PyUtils .. currentmodule:: graphql.pyutils .. automodule:: graphql.pyutils + :no-members: + :no-inherited-members: .. autofunction:: camel_to_snake .. autofunction:: snake_to_camel @@ -12,21 +14,26 @@ PyUtils .. autofunction:: register_description .. autofunction:: unregister_description .. autoclass:: EventEmitter - :members: .. autoclass:: EventEmitterAsyncIterator - :members: .. autofunction:: identity_func .. autofunction:: inspect .. autofunction:: is_finite .. autofunction:: is_integer .. autoclass:: AwaitableOrValue - :members: .. autofunction:: suggestion_list .. autoclass:: FrozenError + :no-members: + :no-inherited-members: + :no-special-members: .. autoclass:: FrozenList + :no-members: + :no-inherited-members: + :no-special-members: .. autoclass:: FrozenDict + :no-members: + :no-inherited-members: + :no-special-members: .. autoclass:: Path - :members: .. autofunction:: print_path_list .. autodata:: Undefined diff --git a/docs/modules/subscription.rst b/docs/modules/subscription.rst index 2dfc4a1c..43aba329 100644 --- a/docs/modules/subscription.rst +++ b/docs/modules/subscription.rst @@ -5,6 +5,3 @@ Subscription .. automodule:: graphql.subscription -.. autofunction:: subscribe -.. autofunction:: create_source_event_stream - diff --git a/docs/modules/type.rst b/docs/modules/type.rst index 91ed8992..1cf0fbf3 100644 --- a/docs/modules/type.rst +++ b/docs/modules/type.rst @@ -4,7 +4,8 @@ Type .. currentmodule:: graphql.type .. automodule:: graphql.type - + :no-members: + :no-inherited-members: Definition ---------- diff --git a/docs/modules/utilities.rst b/docs/modules/utilities.rst index bb0ae33b..7545cca5 100644 --- a/docs/modules/utilities.rst +++ b/docs/modules/utilities.rst @@ -4,6 +4,8 @@ Utilities .. currentmodule:: graphql.utilities .. automodule:: graphql.utilities + :no-members: + :no-inherited-members: The GraphQL query recommended for a full schema introspection: diff --git a/docs/modules/validation.rst b/docs/modules/validation.rst index 7dbb8367..8b0f513c 100644 --- a/docs/modules/validation.rst +++ b/docs/modules/validation.rst @@ -4,6 +4,8 @@ Validation .. currentmodule:: graphql.validation .. automodule:: graphql.validation + :no-members: + :no-inherited-members: .. autofunction:: validate @@ -20,121 +22,121 @@ Validation .. autoclass:: ValidationRule + Rules ----- -This list includes all validation rules defined by the GraphQL spec. The order of the -rules in this list has been adjusted to lead to the most clear output when encountering -multiple validation errors: +.. module:: graphql.validation.rules +.. currentmodule:: graphql.validation .. autodata:: specified_rules :annotation: = FrozenList([...]) -Spec Section: "Executable Definitions" +**Spec Section: "Executable Definitions"** .. autoclass:: ExecutableDefinitionsRule -Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" +**Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"** .. autoclass:: FieldsOnCorrectTypeRule -Spec Section: "Fragments on Composite Types" +**Spec Section: "Fragments on Composite Types"** .. autoclass:: FragmentsOnCompositeTypesRule -Spec Section: "Argument Names" +**Spec Section: "Argument Names"** .. autoclass:: KnownArgumentNamesRule -Spec Section: "Directives Are Defined" +**Spec Section: "Directives Are Defined"** .. autoclass:: KnownDirectivesRule -Spec Section: "Fragment spread target defined" +**Spec Section: "Fragment spread target defined"** .. autoclass:: KnownFragmentNamesRule -Spec Section: "Fragment Spread Type Existence" +**Spec Section: "Fragment Spread Type Existence"** .. autoclass:: KnownTypeNamesRule -Spec Section: "Lone Anonymous Operation" +**Spec Section: "Lone Anonymous Operation"** .. autoclass:: LoneAnonymousOperationRule -Spec Section: "Fragments must not form cycles" +**Spec Section: "Fragments must not form cycles"** .. autoclass:: NoFragmentCyclesRule -Spec Section: "All Variable Used Defined" +**Spec Section: "All Variable Used Defined"** .. autoclass:: NoUndefinedVariablesRule -Spec Section: "Fragments must be used" +**Spec Section: "Fragments must be used"** .. autoclass:: NoUnusedFragmentsRule -Spec Section: "All Variables Used" +**Spec Section: "All Variables Used"** .. autoclass:: NoUnusedVariablesRule -Spec Section: "Field Selection Merging" +**Spec Section: "Field Selection Merging"** .. autoclass:: OverlappingFieldsCanBeMergedRule -Spec Section: "Fragment spread is possible" +**Spec Section: "Fragment spread is possible"** .. autoclass:: PossibleFragmentSpreadsRule -Spec Section: "Argument Optionality" +**Spec Section: "Argument Optionality"** .. autoclass:: ProvidedRequiredArgumentsRule -Spec Section: "Leaf Field Selections" +**Spec Section: "Leaf Field Selections"** .. autoclass:: ScalarLeafsRule -Spec Section: "Subscriptions with Single Root Field" +**Spec Section: "Subscriptions with Single Root Field"** .. autoclass:: SingleFieldSubscriptionsRule -Spec Section: "Argument Uniqueness" +**Spec Section: "Argument Uniqueness"** .. autoclass:: UniqueArgumentNamesRule -Spec Section: "Directives Are Unique Per Location" +**Spec Section: "Directives Are Unique Per Location"** .. autoclass:: UniqueDirectivesPerLocationRule -Spec Section: "Fragment Name Uniqueness" +**Spec Section: "Fragment Name Uniqueness"** .. autoclass:: UniqueFragmentNamesRule -Spec Section: "Input Object Field Uniqueness" +**Spec Section: "Input Object Field Uniqueness"** .. autoclass:: UniqueInputFieldNamesRule -Spec Section: "Operation Name Uniqueness" +**Spec Section: "Operation Name Uniqueness"** .. autoclass:: UniqueOperationNamesRule -Spec Section: "Variable Uniqueness" +**Spec Section: "Variable Uniqueness"** .. autoclass:: UniqueVariableNamesRule -Spec Section: "Value Type Correctness" +**Spec Section: "Value Type Correctness"** .. autoclass:: ValuesOfCorrectTypeRule -Spec Section: "Variables are Input Types" +**Spec Section: "Variables are Input Types"** .. autoclass:: VariablesAreInputTypesRule -Spec Section: "All Variable Usages Are Allowed" +**Spec Section: "All Variable Usages Are Allowed"** .. autoclass:: VariablesInAllowedPositionRule -SDL-specific validation rules +**SDL-specific validation rules** .. autoclass:: LoneSchemaDefinitionRule .. autoclass:: UniqueOperationTypesRule diff --git a/docs/usage/extension.rst b/docs/usage/extension.rst index 4d6c49b3..3d2fe46f 100644 --- a/docs/usage/extension.rst +++ b/docs/usage/extension.rst @@ -1,12 +1,13 @@ Extending a Schema ------------------ +.. currentmodule:: graphql.utilities + With GraphQL-core 3 you can also extend a given schema using type extensions. For example, we might want to add a ``lastName`` property to our ``Human`` data type to retrieve only the last name of the person. -This can be achieved with the :func:`graphql.utilities.extend_schema` function as -follows:: +This can be achieved with the :func:`extend_schema` function as follows:: from graphql import extend_schema, parse @@ -17,8 +18,8 @@ follows:: """)) Note that this function expects the extensions as an AST, which we can get using the -:func:`graphql.language.parse` function. Also note that the :func:`~graphql.extend_schema` function -does not alter the original schema, but returns a new schema object. +:func:`~graphql.language.parse` function. Also note that the :func:`extend_schema` +function does not alter the original schema, but returns a new schema object. We also need to attach a resolver function to the new field:: diff --git a/docs/usage/introspection.rst b/docs/usage/introspection.rst index 095ce5e2..1faa946c 100644 --- a/docs/usage/introspection.rst +++ b/docs/usage/introspection.rst @@ -1,9 +1,12 @@ Using an Introspection Query ---------------------------- +.. currentmodule:: graphql.utilities + A third way of building a schema is using an introspection query on an existing server. -This is what GraphiQL uses to get information about the schema on the remote server. You -can create an introspection query using GraphQL-core 3 with:: +This is what GraphiQL uses to get information about the schema on the remote server. +You can create an introspection query using GraphQL-core 3 with the +:func:`get_introspection_query` function:: from graphql import get_introspection_query @@ -42,7 +45,7 @@ schema, i.e. it does not contain the resolve functions and information on the server-side values of the enum types. You can convert the introspection result into ``GraphQLSchema`` with GraphQL-core 3 by -using the :func:`graphql.utilities.build_client_schema` function:: +using the :func:`build_client_schema` function:: from graphql import build_client_schema @@ -50,7 +53,7 @@ using the :func:`graphql.utilities.build_client_schema` function:: It is also possible to convert the result to SDL with GraphQL-core 3 by using the -:func:`graphql.utilities.print_schema` function:: +:func:`print_schema` function:: from graphql import print_schema @@ -60,4 +63,4 @@ It is also possible to convert the result to SDL with GraphQL-core 3 by using th This prints the SDL representation of the schema that we started with. As you see, it is easy to convert between the three forms of representing a GraphQL -schema in GraphQL-core 3. +schema in GraphQL-core 3 using the :mod:`graphql.utilities` module. diff --git a/docs/usage/methods.rst b/docs/usage/methods.rst index 64f8e304..2274e750 100644 --- a/docs/usage/methods.rst +++ b/docs/usage/methods.rst @@ -1,10 +1,12 @@ Using resolver methods ---------------------- +.. currentmodule:: graphql + Above we have attached resolver functions to the schema only. However, it is also possible to define resolver methods on the resolved objects, starting with the -``root_value`` object that you can pass to the :func:`graphql.graphql` function when -executing a query. +``root_value`` object that you can pass to the :func:`graphql` function when executing +a query. In our case, we could create a ``Root`` class with three methods as root resolvers, like so:: @@ -22,9 +24,8 @@ so:: return droid_data.get(id) -Since we have defined synchronous methods only, we will use the -:func:`graphql.graphql_sync` function to execute a query, passing a ``Root()`` object as -the ``root_value``:: +Since we have defined synchronous methods only, we will use the :func:`graphql_sync` +function to execute a query, passing a ``Root()`` object as the ``root_value``:: from graphql import graphql_sync @@ -46,7 +47,7 @@ now still resolve and give the following output:: errors=None) Of course you can also define asynchronous methods as resolvers, and execute queries -asynchronously with :func:`graphql.graphql`. +asynchronously with :func:`graphql`. In a similar vein, you can also attach resolvers as methods to the resolved objects on deeper levels than the root of the query. In that case, instead of resolving to diff --git a/docs/usage/other.rst b/docs/usage/other.rst index fc58b3c5..e790136f 100644 --- a/docs/usage/other.rst +++ b/docs/usage/other.rst @@ -7,15 +7,18 @@ Sometimes you need to not only query data from a server, but you also want to pu from the server to the client. GraphQL-core 3 has you also covered here, because it implements the "Subscribe" algorithm described in the GraphQL spec. To execute a GraphQL subscription, you must use the :func:`subscribe` method from the -:mod:`graphql.subscription` module. Instead of a single ``ExecutionResult``, this -function returns an asynchronous iterator yielding a stream of those, unless there was -an immediate error. Of course you will then also need to maintain a persistent channel -to the client (often realized via WebSockets) to push these results back. +:mod:`graphql.subscription` module. Instead of a single +:class:`~graphql.execution.ExecutionResult`, this function returns an asynchronous +iterator yielding a stream of those, unless there was an immediate error. +Of course you will then also need to maintain a persistent channel to the client +(often realized via WebSockets) to push these results back. Other Usages ------------ +.. currentmodule:: graphql.utilities + GraphQL-core 3 provides many more low-level functions that can be used to work with GraphQL schemas and queries. We encourage you to explore the contents of the various :ref:`sub-packages`, particularly :mod:`graphql.utilities`, and to look into the source diff --git a/docs/usage/parser.rst b/docs/usage/parser.rst index 8335d7ce..049fd7b3 100644 --- a/docs/usage/parser.rst +++ b/docs/usage/parser.rst @@ -5,12 +5,11 @@ Parsing GraphQL Queries and Schema Notation When executing GraphQL queries, the first step that happens under the hood is parsing the query. But GraphQL-core 3 also exposes the parser for direct usage via the -:func:`graphql.language.parse` function. When you pass this function a GraphQL source -code, it will be parsed and returned as a Document, i.e. an abstract syntax tree (AST) -of :class:`graphql.language.Node` objects. The root node will be a -:class:`graphql.language.DocumentNode`, with child nodes of different kinds -corresponding to the GraphQL source. The nodes also carry information on the location in -the source code that they correspond to. +:func:`parse` function. When you pass this function a GraphQL source code, it will be +parsed and returned as a Document, i.e. an abstract syntax tree (AST) of :class:`Node` +objects. The root node will be a :class:`DocumentNode`, with child nodes of different +kinds corresponding to the GraphQL source. The nodes also carry information on the +location in the source code that they correspond to. Here is an example:: @@ -67,7 +66,7 @@ When parsing with ``no_location=False`` (the default), the AST nodes will also h to the AST nodes. When there is a syntax error in the GraphQL source code, then the :func:`parse` function -will raise a :exc:`graphql.error.GraphQLSyntaxError`. +will raise a :exc:`~graphql.error.GraphQLSyntaxError`. The parser can not only be used to parse GraphQL queries, but also to parse the GraphQL schema definition language. This will result in another way of representing a GraphQL diff --git a/docs/usage/resolvers.rst b/docs/usage/resolvers.rst index d75d75bb..0689dbd4 100644 --- a/docs/usage/resolvers.rst +++ b/docs/usage/resolvers.rst @@ -1,6 +1,8 @@ Implementing the Resolver Functions ----------------------------------- +.. currentmodule:: graphql.type + Before we can execute queries against our schema, we also need to define the data (the humans and droids appearing in the Star Wars trilogy) and implement resolver functions that fetch the data (at the beginning of our schema module, because we are referencing @@ -80,7 +82,7 @@ them later):: Note that the resolver functions get the current object as first argument. For a field on the root Query type this is often not used, but a root object can also be defined when executing the query. As the second argument, they get an object containing -execution information, as defined in the :class:`graphql.type.GraphQLResolveInfo` class. +execution information, as defined in the :class:`~GraphQLResolveInfo` class. This object also has a ``context`` attribute that can be used to provide every resolver with contextual information like the currently logged in user, or a database session. In our simple example we don't authenticate users and use static data instead of a diff --git a/docs/usage/schema.rst b/docs/usage/schema.rst index 4a7dbf6f..d33891cf 100644 --- a/docs/usage/schema.rst +++ b/docs/usage/schema.rst @@ -192,4 +192,4 @@ Using our query type we can define our schema:: schema = GraphQLSchema(query_type) Note that you can also pass a mutation type and a subscription type as additional -arguments to the ``GraphQLSchema``. +arguments to the :class:`GraphQLSchema`. diff --git a/docs/usage/sdl.rst b/docs/usage/sdl.rst index 1227c522..d7eb1546 100644 --- a/docs/usage/sdl.rst +++ b/docs/usage/sdl.rst @@ -1,13 +1,15 @@ Using the Schema Definition Language ------------------------------------ -Above we defined the GraphQL schema as Python code, using the ``GraphQLSchema`` class -and other classes representing the various GraphQL types. +.. currentmodule:: graphql.type + +Above we defined the GraphQL schema as Python code, using the :class:`GraphQLSchema` +class and other classes representing the various GraphQL types. GraphQL-core 3 also provides a language-agnostic way of defining a GraphQL schema using the GraphQL schema definition language (SDL) which is also part of the GraphQL specification. To do this, we simply feed the SDL as a string to the -:func:`graphql.utilities.build_schema` function:: +:func:`~graphql.utilities.build_schema` function in :mod:`graphql.utilities`:: from graphql import build_schema @@ -45,8 +47,8 @@ specification. To do this, we simply feed the SDL as a string to the } """) -The result is a ``GraphQLSchema`` object just like the one we defined above, except for -the resolver functions which cannot be defined in the SDL. +The result is a :class:`GraphQLSchema` object just like the one we defined above, except +for the resolver functions which cannot be defined in the SDL. We would need to manually attach these functions to the schema, like so:: diff --git a/docs/usage/validator.rst b/docs/usage/validator.rst index dc696d27..e5c79d8e 100644 --- a/docs/usage/validator.rst +++ b/docs/usage/validator.rst @@ -6,7 +6,7 @@ Validating GraphQL Queries When executing GraphQL queries, the second step that happens under the hood after parsing the source code is a validation against the given schema using the rules of the GraphQL specification. You can also run the validation step manually by calling the -:func:`graphql.validation.validate` function, passing the schema and the AST document:: +:func:`validate` function, passing the schema and the AST document:: from graphql import parse, validate @@ -21,7 +21,7 @@ GraphQL specification. You can also run the validation step manually by calling """)) As a result, you will get a complete list of all errors that the validators has found. -In this case, we will get:: +In this case, we will get the following three validation errors:: [GraphQLError( 'String cannot represent a non string value: NEWHOPE', @@ -36,8 +36,7 @@ In this case, we will get:: locations=[SourceLocation(line=6, column=9)])] These rules are available in the :data:`specified_rules` list and implemented in the -``graphql.validation.rules`` subpackage. Instead of the default rules, -you can also use a subset or create custom rules. The rules are -based on the :class:`graphql.validation.ValidationRule` class which is based on the -:class:`graphql.language.Visitor` class which provides a way of walking through an AST -document using the visitor pattern. +:mod:`graphql.validation.rules` subpackage. Instead of the default rules, you can also +use a subset or create custom rules. The rules are based on the :class:`ValidationRule` +class which is based on the :class:`~graphql.language.Visitor` class which provides a +way of walking through an AST document using the visitor pattern. diff --git a/poetry.lock b/poetry.lock index 69d2bd24..218a762d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -29,13 +29,12 @@ description = "Classes Without Boilerplate" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.3.0" +version = "20.1.0" [package.extras] -azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] -dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] [[package]] category = "dev" @@ -120,7 +119,7 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.7" +version = "2.1.9" [package.dependencies] coverage = "*" @@ -129,7 +128,7 @@ requests = ">=2.7.9" [[package]] category = "dev" description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" +marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -141,7 +140,7 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.1" +version = "5.2.1" [package.extras] toml = ["toml"] @@ -272,7 +271,7 @@ description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" optional = false python-versions = ">=3.5" -version = "8.4.0" +version = "8.5.0" [[package]] category = "dev" @@ -348,7 +347,7 @@ description = "Get CPU info with pure Python 2 & 3" name = "py-cpuinfo" optional = false python-versions = "*" -version = "6.0.0" +version = "7.0.0" [[package]] category = "dev" @@ -445,7 +444,7 @@ description = "Pytest plugin for measuring coverage." name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.10.0" +version = "2.10.1" [package.dependencies] coverage = ">=4.4" @@ -471,7 +470,7 @@ description = "py.test plugin to abort hanging tests" name = "pytest-timeout" optional = false python-versions = "*" -version = "1.4.1" +version = "1.4.2" [package.dependencies] pytest = ">=3.6.0" @@ -490,7 +489,7 @@ description = "Alternative regular expression module, to replace re." name = "regex" optional = false python-versions = "*" -version = "2020.6.8" +version = "2020.7.14" [[package]] category = "dev" @@ -532,13 +531,13 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "2.4.4" +version = "3.2.1" [package.dependencies] Jinja2 = ">=2.3" Pygments = ">=2.0" alabaster = ">=0.7,<0.8" -babel = ">=1.3,<2.0 || >2.0" +babel = ">=1.3" colorama = ">=0.3.5" docutils = ">=0.12" imagesize = "*" @@ -555,7 +554,8 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -test = ["pytest (<5.3.3)", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] [[package]] category = "dev" @@ -656,7 +656,7 @@ description = "tox is a generic virtualenv management and test command line tool name = "tox" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "3.16.1" +version = "3.19.0" [package.dependencies] colorama = ">=0.4.1" @@ -673,8 +673,8 @@ python = "<3.8" version = ">=0.12,<2" [package.extras] -docs = ["sphinx (>=2.0.0)", "towncrier (>=18.5.0)", "pygments-github-lexers (>=0.0.5)", "sphinxcontrib-autoprogram (>=0.1.5)"] -testing = ["freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-xdist (>=1.22.2)", "pytest-randomly (>=1.0.0)", "flaky (>=3.4.0)", "psutil (>=5.6.1)"] +docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] +testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)"] [[package]] category = "dev" @@ -690,7 +690,7 @@ description = "Backported and Experimental Type Hints for Python 3.5+" name = "typing-extensions" optional = false python-versions = "*" -version = "3.7.4.2" +version = "3.7.4.3" [[package]] category = "dev" @@ -698,7 +698,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.9" +version = "1.25.10" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -711,11 +711,11 @@ description = "Virtual Python Environment builder" name = "virtualenv" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "20.0.25" +version = "20.0.31" [package.dependencies] appdirs = ">=1.4.3,<2" -distlib = ">=0.3.0,<1" +distlib = ">=0.3.1,<1" filelock = ">=3.0.0,<4" six = ">=1.9.0,<2" @@ -728,8 +728,8 @@ python = "<3.7" version = ">=1.0" [package.extras] -docs = ["sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)", "proselint (>=0.10.2)"] -testing = ["pytest (>=4)", "coverage (>=5)", "coverage-enable-subprocess (>=1)", "pytest-xdist (>=1.31.0)", "pytest-mock (>=2)", "pytest-env (>=0.6.2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-freezegun (>=0.4.1)", "flaky (>=3)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] +testing = ["coverage (>=5)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-xdist (>=1.31.0)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] [[package]] category = "dev" @@ -753,7 +753,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "e39116c151dc49dcea69d5e32850bb695985fb46db2ba200321f56a43abf26b1" +content-hash = "2ba0b1d40a57e73810f2fa714f5d5072dac4becb082fed517cf1fc55d0802404" python-versions = "^3.6" [metadata.files] @@ -770,8 +770,8 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, + {file = "attrs-20.1.0-py2.py3-none-any.whl", hash = "sha256:2867b7b9f8326499ab5b0e2d12801fa5c98842d2cbd22b35112ae04bf85b4dff"}, + {file = "attrs-20.1.0.tar.gz", hash = "sha256:0ef97238856430dcf9228e07f316aefc17e8939fc8507e18c6501b761ef1a42a"}, ] babel = [ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, @@ -802,46 +802,49 @@ click = [ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] codecov = [ - {file = "codecov-2.1.7-py2.py3-none-any.whl", hash = "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728"}, - {file = "codecov-2.1.7-py3.8.egg", hash = "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34"}, - {file = "codecov-2.1.7.tar.gz", hash = "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091"}, + {file = "codecov-2.1.9-py2.py3-none-any.whl", hash = "sha256:24545847177a893716b3455ac5bfbafe0465f38d4eb86ea922c09adc7f327e65"}, + {file = "codecov-2.1.9-py3.8.egg", hash = "sha256:7877f68effde3c2baadcff807a5d13f01019a337f9596eece0d64e57393adf3a"}, + {file = "codecov-2.1.9.tar.gz", hash = "sha256:355fc7e0c0b8a133045f0d6089bde351c845e7b52b99fec5903b4ea3ab5f6aab"}, ] colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, ] coverage = [ - {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, - {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, - {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, - {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, - {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, - {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, - {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, - {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, - {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, - {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, - {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, - {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, - {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, - {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, - {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, - {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, - {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, - {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, - {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59"}, + {file = "coverage-5.2.1-cp27-cp27m-win32.whl", hash = "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3"}, + {file = "coverage-5.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651"}, + {file = "coverage-5.2.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3"}, + {file = "coverage-5.2.1-cp35-cp35m-win32.whl", hash = "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"}, + {file = "coverage-5.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962"}, + {file = "coverage-5.2.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb"}, + {file = "coverage-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d"}, + {file = "coverage-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546"}, + {file = "coverage-5.2.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034"}, + {file = "coverage-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46"}, + {file = "coverage-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8"}, + {file = "coverage-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b"}, + {file = "coverage-5.2.1-cp38-cp38-win32.whl", hash = "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd"}, + {file = "coverage-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d"}, + {file = "coverage-5.2.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4"}, + {file = "coverage-5.2.1-cp39-cp39-win32.whl", hash = "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89"}, + {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, + {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, ] distlib = [ {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"}, @@ -914,8 +917,8 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ - {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, - {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, + {file = "more-itertools-8.5.0.tar.gz", hash = "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20"}, + {file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"}, ] mypy = [ {file = "mypy-0.782-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:2c6cde8aa3426c1682d35190b59b71f661237d74b053822ea3d748e2c9578a7c"}, @@ -954,7 +957,7 @@ py = [ {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, ] py-cpuinfo = [ - {file = "py-cpuinfo-6.0.0.tar.gz", hash = "sha256:7ffb31dea845b9f359b99bd5f7eea72dc70f852e0e34547d261a630f2b8c9c61"}, + {file = "py-cpuinfo-7.0.0.tar.gz", hash = "sha256:9aa2e49675114959697d25cf57fec41c29b55887bff3bc4809b44ac6f5730097"}, ] pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, @@ -985,8 +988,8 @@ pytest-benchmark = [ {file = "pytest_benchmark-3.2.3-py2.py3-none-any.whl", hash = "sha256:01f79d38d506f5a3a0a9ada22ded714537bbdfc8147a881a35c1655db07289d9"}, ] pytest-cov = [ - {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, - {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, + {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, + {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, ] pytest-describe = [ {file = "pytest-describe-1.0.0.tar.gz", hash = "sha256:3e2ea0e77efa09edb98cf90423bf1da21a462ed90bd3120f8f98fe7519a167d5"}, @@ -994,35 +997,35 @@ pytest-describe = [ {file = "pytest_describe-1.0.0-py3-none-any.whl", hash = "sha256:95fe78639d4d16c4a1e7d62c70f63030b217c08d2ee6dca49559fe6e730c6696"}, ] pytest-timeout = [ - {file = "pytest-timeout-1.4.1.tar.gz", hash = "sha256:6d0fb4ce74cebb81be252e4e0d9c2a91f30270b33208cfa0f1da6eed9abf18ac"}, - {file = "pytest_timeout-1.4.1-py2.py3-none-any.whl", hash = "sha256:c10650550e0c4fef5b06274411377c8b54c7b370c34b632fd4ce1a9b170f5ba3"}, + {file = "pytest-timeout-1.4.2.tar.gz", hash = "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76"}, + {file = "pytest_timeout-1.4.2-py2.py3-none-any.whl", hash = "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063"}, ] pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] regex = [ - {file = "regex-2020.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"}, - {file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"}, - {file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"}, - {file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"}, - {file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"}, - {file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"}, - {file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"}, - {file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"}, - {file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"}, + {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, + {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, + {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, + {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, + {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, + {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, + {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, + {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, + {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, @@ -1037,8 +1040,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, ] sphinx = [ - {file = "Sphinx-2.4.4-py3-none-any.whl", hash = "sha256:fc312670b56cb54920d6cc2ced455a22a547910de10b3142276495ced49231cb"}, - {file = "Sphinx-2.4.4.tar.gz", hash = "sha256:b4c750d546ab6d7e05bdff6ac24db8ae3e8b8253a3569b754e445110a0a12b66"}, + {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"}, + {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"}, ] sphinx-rtd-theme = [ {file = "sphinx_rtd_theme-0.5.0-py2.py3-none-any.whl", hash = "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"}, @@ -1073,8 +1076,8 @@ toml = [ {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] tox = [ - {file = "tox-3.16.1-py2.py3-none-any.whl", hash = "sha256:60c3793f8ab194097ec75b5a9866138444f63742b0f664ec80be1222a40687c5"}, - {file = "tox-3.16.1.tar.gz", hash = "sha256:9a746cda9cadb9e1e05c7ab99f98cfcea355140d2ecac5f97520be94657c3bc7"}, + {file = "tox-3.19.0-py2.py3-none-any.whl", hash = "sha256:3d94b6921a0b6dc90fd8128df83741f30bb41ccd6cd52d131a6a6944ca8f16e6"}, + {file = "tox-3.19.0.tar.gz", hash = "sha256:17e61a93afe5c49281fb969ab71f7a3f22d7586d1c56f9a74219910f356fe7d3"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, @@ -1100,17 +1103,17 @@ typed-ast = [ {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.2-py2-none-any.whl", hash = "sha256:f8d2bd89d25bc39dabe7d23df520442fa1d8969b82544370e03d88b5a591c392"}, - {file = "typing_extensions-3.7.4.2-py3-none-any.whl", hash = "sha256:6e95524d8a547a91e08f404ae485bbb71962de46967e1b71a0cb89af24e761c5"}, - {file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"}, + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, - {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, + {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, + {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, ] virtualenv = [ - {file = "virtualenv-20.0.25-py2.py3-none-any.whl", hash = "sha256:ffffcb3c78a671bb3d590ac3bc67c081ea2188befeeb058870cba13e7f82911b"}, - {file = "virtualenv-20.0.25.tar.gz", hash = "sha256:f332ba0b2dfbac9f6b1da9f11224f0036b05cdb4df23b228527c2a2d5504aeed"}, + {file = "virtualenv-20.0.31-py2.py3-none-any.whl", hash = "sha256:e0305af10299a7fb0d69393d8f04cb2965dda9351140d11ac8db4e5e3970451b"}, + {file = "virtualenv-20.0.31.tar.gz", hash = "sha256:43add625c53c596d38f971a465553f6318decc39d98512bc100fa1b1e839c8dc"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, diff --git a/pyproject.toml b/pyproject.toml index b2eadf74..cd2df1b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,11 +42,11 @@ black = "19.10b0" flake8 = "^3.8" mypy = "0.782" codecov = "^2" -sphinx = "^2.4" -sphinx_rtd_theme = ">=0.4,<1" +sphinx = "^3.2" +sphinx_rtd_theme = ">=0.5,<1" check-manifest = "0.40" bump2version = ">=1.0,<2" -tox = "^3.16" +tox = "^3.19" [tool.black] target-version = ['py36', 'py37', 'py38'] diff --git a/src/graphql/language/parser.py b/src/graphql/language/parser.py index 10509f0c..059f307e 100644 --- a/src/graphql/language/parser.py +++ b/src/graphql/language/parser.py @@ -117,7 +117,7 @@ def parse_value( isolation of complete GraphQL documents. Consider providing the results to the utility function: - :func:`~graphql.value_from_ast`. + :func:`~graphql.utilities.value_from_ast`. """ parser = Parser( source, @@ -143,7 +143,7 @@ def parse_type( in isolation of complete GraphQL documents. Consider providing the results to the utility function: - :func:`~graphql.value_from_ast`. + :func:`~graphql.utilities.value_from_ast`. """ parser = Parser( source, diff --git a/src/graphql/utilities/value_from_ast_untyped.py b/src/graphql/utilities/value_from_ast_untyped.py index 7ac40c96..795160b5 100644 --- a/src/graphql/utilities/value_from_ast_untyped.py +++ b/src/graphql/utilities/value_from_ast_untyped.py @@ -24,7 +24,7 @@ def value_from_ast_untyped( ) -> Any: """Produce a Python value given a GraphQL Value AST. - Unlike :func:`~graphql.value_from_ast`, no type is provided. + Unlike :func:`~graphql.utilities.value_from_ast`, no type is provided. The resulting Python value will reflect the provided GraphQL value AST. =================== ============== ================