Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-graphene for openSUSE:Factory checked in at 2022-08-10 17:14:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-graphene (Old) and /work/SRC/openSUSE:Factory/.python-graphene.new.1521 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-graphene" Wed Aug 10 17:14:48 2022 rev:6 rq:994268 version:3.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-graphene/python-graphene.changes 2022-03-21 20:13:28.120526207 +0100 +++ /work/SRC/openSUSE:Factory/.python-graphene.new.1521/python-graphene.changes 2022-08-10 17:15:55.878120074 +0200 @@ -1,0 +2,10 @@ +Wed Aug 10 07:54:15 UTC 2022 - Mark??ta Machov?? <mmach...@suse.com> + +- Update to version 3.1.0 + * Refactor Multi Expression Code + * Add Python 3.9 and 3.10 to the test matrix + * fix: default value for argument should be Undefined (Issue #1394) + * fix: add default param _variables to parse_literal #1419 + * Make Graphene compatible with GraphQL-Core 3.2 + +------------------------------------------------------------------- Old: ---- graphene-3.0.0.tar.gz New: ---- graphene-3.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-graphene.spec ++++++ --- /var/tmp/diff_new_pack.e1D2PV/_old 2022-08-10 17:15:56.530121776 +0200 +++ /var/tmp/diff_new_pack.e1D2PV/_new 2022-08-10 17:15:56.534121787 +0200 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-graphene -Version: 3.0.0 +Version: 3.1.0 Release: 0 Summary: GraphQL Framework for Python License: MIT @@ -27,8 +27,8 @@ URL: https://github.com/graphql-python/graphene Source: https://github.com/graphql-python/graphene/archive/v%{version}.tar.gz#/graphene-%{version}.tar.gz BuildRequires: %{python_module aniso8601 >= 8} -BuildRequires: %{python_module graphql-core >= 3.1.2} -BuildRequires: %{python_module graphql-relay >= 3.0} +BuildRequires: %{python_module graphql-core >= 3.1} +BuildRequires: %{python_module graphql-relay >= 3.1} BuildRequires: %{python_module promise} BuildRequires: %{python_module pytest-asyncio} BuildRequires: %{python_module pytest-benchmark} @@ -40,8 +40,8 @@ BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-aniso8601 >= 8 -Requires: python-graphql-core >= 3.1.2 -Requires: python-graphql-relay >= 3.0 +Requires: python-graphql-core >= 3.1 +Requires: python-graphql-relay >= 3.1 Requires: python-six BuildArch: noarch %python_subpackages @@ -61,12 +61,8 @@ %check # The example depend on snapshottest, which is a bit messy to package as of v0.5.1 -# https://github.com/syrusakbary/snapshottest/pull/114 - -# test_objecttype_as_container_extra_args and test_objecttype_as_container_invalid_kwargs -# have slightly different output on Python 3.10, that the tests do not expect -# https://github.com/graphql-python/graphene/issues/1400 -%pytest --ignore examples -k 'not (test_objecttype_as_container_extra_args or test_objecttype_as_container_invalid_kwargs)' +# https://github.com/syrusakbary/snapshottest/issues/92 +%pytest --ignore examples %files %{python_files} %doc README.rst ++++++ graphene-3.0.0.tar.gz -> graphene-3.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/.github/workflows/deploy.yml new/graphene-3.1.0/.github/workflows/deploy.yml --- old/graphene-3.0.0/.github/workflows/deploy.yml 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/.github/workflows/deploy.yml 2022-05-30 14:57:16.000000000 +0200 @@ -11,10 +11,10 @@ steps: - uses: actions/checkout@v2 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Build wheel and source tarball run: | pip install wheel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/.github/workflows/lint.yml new/graphene-3.1.0/.github/workflows/lint.yml --- old/graphene-3.0.0/.github/workflows/lint.yml 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/.github/workflows/lint.yml 2022-05-30 14:57:16.000000000 +0200 @@ -8,10 +8,10 @@ steps: - uses: actions/checkout@v2 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/.github/workflows/tests.yml new/graphene-3.1.0/.github/workflows/tests.yml --- old/graphene-3.0.0/.github/workflows/tests.yml 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/.github/workflows/tests.yml 2022-05-30 14:57:16.000000000 +0200 @@ -25,6 +25,8 @@ fail-fast: false matrix: include: + - {name: '3.10', python: '3.10', os: ubuntu-latest, tox: py310} + - {name: '3.9', python: '3.9', os: ubuntu-latest, tox: py39} - {name: '3.8', python: '3.8', os: ubuntu-latest, tox: py38} - {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37} - {name: '3.6', python: '3.6', os: ubuntu-latest, tox: py36} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/.pre-commit-config.yaml new/graphene-3.1.0/.pre-commit-config.yaml --- old/graphene-3.0.0/.pre-commit-config.yaml 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/.pre-commit-config.yaml 2022-05-30 14:57:16.000000000 +0200 @@ -1,9 +1,9 @@ default_language_version: - python: python3.8 + python: python3.9 repos: -- repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.2.0 hooks: - id: check-merge-conflict - id: check-json @@ -16,15 +16,15 @@ - --autofix - id: trailing-whitespace exclude: README.md -- repo: git://github.com/asottile/pyupgrade - rev: v2.24.0 +- repo: https://github.com/asottile/pyupgrade + rev: v2.32.1 hooks: - id: pyupgrade -- repo: git://github.com/ambv/black - rev: 19.3b0 +- repo: https://github.com/ambv/black + rev: 22.3.0 hooks: - id: black -- repo: git://github.com/PyCQA/flake8 - rev: 3.8.4 +- repo: https://github.com/PyCQA/flake8 + rev: 4.0.1 hooks: - id: flake8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/README.rst new/graphene-3.1.0/README.rst --- old/graphene-3.0.0/README.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/README.rst 2022-05-30 14:57:16.000000000 +0200 @@ -1,18 +1,18 @@ -**We are looking for contributors**! Please check the -`ROADMAP <https://github.com/graphql-python/graphene/blob/master/ROADMAP.md>`__ -to see how you can help ?????? - --------------- - |Graphene Logo| `Graphene <http://graphene-python.org>`__ |Build Status| |PyPI version| |Coverage Status| ========================================================================================================= +`???? Join the community on +Slack <https://join.slack.com/t/graphenetools/shared_invite/enQtOTE2MDQ1NTg4MDM1LTA4Nzk0MGU0NGEwNzUxZGNjNDQ4ZjAwNDJjMjY0OGE1ZDgxZTg4YjM2ZTc4MjE2ZTAzZjE2ZThhZTQzZTkyMmM>`__ + +**We are looking for contributors**! Please check the +`ROADMAP <https://github.com/graphql-python/graphene/blob/master/ROADMAP.md>`__ +to see how you can help ?????? Introduction ------------ -`Graphene <http://graphene-python.org>`__ is a Python library for -building GraphQL schemas/types fast and easily. +`Graphene <http://graphene-python.org>`__ is an opinionated Python +library for building GraphQL schemas/types fast and easily. - **Easy to use:** Graphene helps you use GraphQL in Python without effort. @@ -27,17 +27,18 @@ Graphene has multiple integrations with different frameworks: -+---------------------+----------------------------------------------------------------------------------------------+ -| integration | Package | -+=====================+==============================================================================================+ -| Django | `graphene-django <https://github.com/graphql-python/graphene-django/>`__ | -+---------------------+----------------------------------------------------------------------------------------------+ -| SQLAlchemy | `graphene-sqlalchemy <https://github.com/graphql-python/graphene-sqlalchemy/>`__ | -+---------------------+----------------------------------------------------------------------------------------------+ -| Google App Engine | `graphene-gae <https://github.com/graphql-python/graphene-gae/>`__ | -+---------------------+----------------------------------------------------------------------------------------------+ -| Peewee | *In progress* (`Tracking Issue <https://github.com/graphql-python/graphene/issues/289>`__) | -+---------------------+----------------------------------------------------------------------------------------------+ ++-------------------+-------------------------------------------------+ +| integration | Package | ++===================+=================================================+ +| Django | `graphene-django <https:/ | +| | /github.com/graphql-python/graphene-django/>`__ | ++-------------------+-------------------------------------------------+ +| SQLAlchemy | `graphene-sqlalchemy <https://git | +| | hub.com/graphql-python/graphene-sqlalchemy/>`__ | ++-------------------+-------------------------------------------------+ +| Google App Engine | `graphene-gae <http | +| | s://github.com/graphql-python/graphene-gae/>`__ | ++-------------------+-------------------------------------------------+ Also, Graphene is fully compatible with the GraphQL spec, working seamlessly with all GraphQL clients, such as @@ -52,13 +53,7 @@ .. code:: bash - pip install "graphene>=2.0" - -2.0 Upgrade Guide ------------------ - -Please read `UPGRADE-v2.0.md </UPGRADE-v2.0.md>`__ to learn how to -upgrade. + pip install "graphene>=3.0" Examples -------- @@ -67,26 +62,26 @@ .. code:: python - import graphene + import graphene - class Query(graphene.ObjectType): - hello = graphene.String(description='A typical hello world') + class Query(graphene.ObjectType): + hello = graphene.String(description='A typical hello world') - def resolve_hello(self, info): - return 'World' + def resolve_hello(self, info): + return 'World' - schema = graphene.Schema(query=Query) + schema = graphene.Schema(query=Query) Then Querying ``graphene.Schema`` is as simple as: .. code:: python - query = ''' - query SayHello { - hello - } - ''' - result = schema.execute(query) + query = ''' + query SayHello { + hello + } + ''' + result = schema.execute(query) If you want to learn even more, you can also check the following `examples <examples/>`__: @@ -110,20 +105,20 @@ .. code:: sh - virtualenv venv - source venv/bin/activate - pip install -e ".[test]" + virtualenv venv + source venv/bin/activate + pip install -e ".[test]" Well-written tests and maintaining good test coverage is important to this project. While developing, run new and existing tests with: .. code:: sh - py.test graphene/relay/tests/test_node.py # Single file - py.test graphene/relay # All tests in directory + py.test graphene/relay/tests/test_node.py # Single file + py.test graphene/relay # All tests in directory Add the ``-s`` flag if you have introduced breakpoints into the code for -debugging. Add the ``-v`` ("verbose") flag to get more detailed test +debugging. Add the ``-v`` (???verbose???) flag to get more detailed test output. For even more detailed output, use ``-vv``. Check out the `pytest documentation <https://docs.pytest.org/en/latest/>`__ for more options and test running controls. @@ -132,7 +127,7 @@ .. code:: sh - py.test graphene --benchmark-only + py.test graphene --benchmark-only Graphene supports several versions of Python. To make sure that changes do not break compatibility with any of those versions, we use ``tox`` to @@ -142,14 +137,14 @@ .. code:: sh - tox + tox If you wish to run against a specific version defined in the ``tox.ini`` file: .. code:: sh - tox -e py36 + tox -e py36 Tox can only use whatever versions of Python are installed on your system. When you create a pull request, Travis will also be running the @@ -168,7 +163,7 @@ .. code:: sh - make docs + make docs .. |Graphene Logo| image:: http://graphene-python.org/favicon.png .. |Build Status| image:: https://travis-ci.org/graphql-python/graphene.svg?branch=master diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/UPGRADE-v2.0.md new/graphene-3.1.0/UPGRADE-v2.0.md --- old/graphene-3.0.0/UPGRADE-v2.0.md 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/UPGRADE-v2.0.md 2022-05-30 14:57:16.000000000 +0200 @@ -123,7 +123,7 @@ return ... ``` -**PS.: Take care with receiving args like `my_arg` as above. This doesn't work for optional (non-required) arguments as stantard `Connection`'s arguments (first, before, after, before).** +**PS.: Take care with receiving args like `my_arg` as above. This doesn't work for optional (non-required) arguments as stantard `Connection`'s arguments (first, last, after, before).** You may need something like this: ```python diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/conf.py new/graphene-3.1.0/docs/conf.py --- old/graphene-3.0.0/docs/conf.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/conf.py 2022-05-30 14:57:16.000000000 +0200 @@ -64,18 +64,18 @@ master_doc = "index" # General information about the project. -project = u"Graphene" -copyright = u"Graphene 2016" -author = u"Syrus Akbary" +project = "Graphene" +copyright = "Graphene 2016" +author = "Syrus Akbary" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u"1.0" +version = "1.0" # The full version, including alpha/beta/rc tags. -release = u"1.0" +release = "1.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -278,7 +278,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, "Graphene.tex", u"Graphene Documentation", u"Syrus Akbary", "manual") + (master_doc, "Graphene.tex", "Graphene Documentation", "Syrus Akbary", "manual") ] # The name of an image file (relative to this directory) to place at the top of @@ -318,7 +318,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "graphene", u"Graphene Documentation", [author], 1)] +man_pages = [(master_doc, "graphene", "Graphene Documentation", [author], 1)] # If true, show URL addresses after external links. # @@ -334,7 +334,7 @@ ( master_doc, "Graphene", - u"Graphene Documentation", + "Graphene Documentation", author, "Graphene", "One line description of project.", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/execution/dataloader.rst new/graphene-3.1.0/docs/execution/dataloader.rst --- old/graphene-3.0.0/docs/execution/dataloader.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/execution/dataloader.rst 2022-05-30 14:57:16.000000000 +0200 @@ -28,10 +28,9 @@ A batch loading function accepts a list of keys, and returns a ``Promise`` which resolves to a list of ``values``. -Then load individual values from the loader. ``DataLoader`` will coalesce all -individual loads which occur within a single frame of execution (executed once -the wrapping promise is resolved) and then call your batch function with all -requested keys. +``DataLoader`` will coalesce all individual loads which occur within a +single frame of execution (executed once the wrapping promise is resolved) +and then call your batch function with all requested keys. .. code:: python @@ -96,7 +95,7 @@ } -Naively, if ``me``, ``bestFriend`` and ``friends`` each need to request the backend, +If ``me``, ``bestFriend`` and ``friends`` each need to send a request to the backend, there could be at most 13 database requests! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/execution/middleware.rst new/graphene-3.1.0/docs/execution/middleware.rst --- old/graphene-3.0.0/docs/execution/middleware.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/execution/middleware.rst 2022-05-30 14:57:16.000000000 +0200 @@ -46,7 +46,7 @@ ------------------ Middleware can also be defined as a function. Here we define a middleware that -logs the time it takes to resolve each field +logs the time it takes to resolve each field: .. code:: python diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/types/interfaces.rst new/graphene-3.1.0/docs/types/interfaces.rst --- old/graphene-3.0.0/docs/types/interfaces.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/types/interfaces.rst 2022-05-30 14:57:16.000000000 +0200 @@ -44,7 +44,7 @@ but also bring in extra fields, ``home_planet``, ``starships`` and ``primary_function``, that are specific to that particular type of character. -The full GraphQL schema defition will look like this: +The full GraphQL schema definition will look like this: .. code:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/types/mutations.rst new/graphene-3.1.0/docs/types/mutations.rst --- old/graphene-3.0.0/docs/types/mutations.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/types/mutations.rst 2022-05-30 14:57:16.000000000 +0200 @@ -85,9 +85,9 @@ InputFields and InputObjectTypes ---------------------------------- -InputFields are used in mutations to allow nested input data for mutations +InputFields are used in mutations to allow nested input data for mutations. -To use an InputField you define an InputObjectType that specifies the structure of your input data +To use an InputField you define an InputObjectType that specifies the structure of your input data: .. code:: python @@ -112,7 +112,7 @@ return CreatePerson(person=person) -Note that **name** and **age** are part of **person_data** now +Note that **name** and **age** are part of **person_data** now. Using the above mutation your new query would look like this: @@ -128,7 +128,7 @@ } InputObjectTypes can also be fields of InputObjectTypes allowing you to have -as complex of input data as you need +as complex of input data as you need: .. code:: python @@ -160,7 +160,7 @@ def mutate(root, info, name): return Person(name=name) -Then, if we query (``schema.execute(query_str)``) the following: +Then, if we query (``schema.execute(query_str)``) with the following: .. code:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/types/schema.rst new/graphene-3.1.0/docs/types/schema.rst --- old/graphene-3.0.0/docs/types/schema.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/types/schema.rst 2022-05-30 14:57:16.000000000 +0200 @@ -44,7 +44,7 @@ For example, when a field returns an ``Interface``, the schema doesn't know about any of the implementations. -In this case, we need to use the ``types`` argument when creating the Schema. +In this case, we need to use the ``types`` argument when creating the Schema: .. code:: python @@ -63,7 +63,7 @@ explicitly set with the ``name`` arg) will be converted from ``snake_case`` to ``camelCase`` (as the API is usually being consumed by a js/mobile client) -For example with the ObjectType +For example with the ObjectType the ``last_name`` field name is converted to ``lastName``: .. code:: python @@ -71,12 +71,10 @@ last_name = graphene.String() other_name = graphene.String(name='_other_Name') -the ``last_name`` field name is converted to ``lastName``. - In case you don't want to apply this transformation, provide a ``name`` argument to the field constructor. ``other_name`` converts to ``_other_Name`` (without further transformations). -Your query should look like +Your query should look like: .. code:: @@ -86,7 +84,7 @@ } -To disable this behavior, set the ``auto_camelcase`` to ``False`` upon schema instantiation. +To disable this behavior, set the ``auto_camelcase`` to ``False`` upon schema instantiation: .. code:: python diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/docs/types/unions.rst new/graphene-3.1.0/docs/types/unions.rst --- old/graphene-3.0.0/docs/types/unions.rst 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/docs/types/unions.rst 2022-05-30 14:57:16.000000000 +0200 @@ -7,7 +7,7 @@ The basics: - Each Union is a Python class that inherits from ``graphene.Union``. -- Unions don't have any fields on it, just links to the possible objecttypes. +- Unions don't have any fields on it, just links to the possible ObjectTypes. Quick example ------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/examples/starwars_relay/tests/snapshots/snap_test_objectidentification.py new/graphene-3.1.0/examples/starwars_relay/tests/snapshots/snap_test_objectidentification.py --- old/graphene-3.0.0/examples/starwars_relay/tests/snapshots/snap_test_objectidentification.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/examples/starwars_relay/tests/snapshots/snap_test_objectidentification.py 2022-05-30 14:57:16.000000000 +0200 @@ -49,7 +49,7 @@ name: String """The ships used by the faction.""" - ships(before: String = null, after: String = null, first: Int = null, last: Int = null): ShipConnection + ships(before: String, after: String, first: Int, last: Int): ShipConnection } """An object with an ID""" @@ -115,5 +115,4 @@ shipName: String! factionId: String! clientMutationId: String -} -''' +}''' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/examples/starwars_relay/tests/test_objectidentification.py new/graphene-3.1.0/examples/starwars_relay/tests/test_objectidentification.py --- old/graphene-3.0.0/examples/starwars_relay/tests/test_objectidentification.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/examples/starwars_relay/tests/test_objectidentification.py 2022-05-30 14:57:16.000000000 +0200 @@ -9,7 +9,7 @@ def test_str_schema(snapshot): - snapshot.assert_match(str(schema)) + snapshot.assert_match(str(schema).strip()) def test_correctly_fetches_id_name_rebels(snapshot): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/__init__.py new/graphene-3.1.0/graphene/__init__.py --- old/graphene-3.0.0/graphene/__init__.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/__init__.py 2022-05-30 14:57:16.000000000 +0200 @@ -41,7 +41,7 @@ from .utils.module_loading import lazy_import from .utils.resolve_only_args import resolve_only_args -VERSION = (3, 0, 0, "final", 0) +VERSION = (3, 1, 0, "final", 0) __version__ = get_version(VERSION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/pyutils/version.py new/graphene-3.1.0/graphene/pyutils/version.py --- old/graphene-3.0.0/graphene/pyutils/version.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/pyutils/version.py 2022-05-30 14:57:16.000000000 +0200 @@ -19,10 +19,7 @@ sub = "" if version[3] == "alpha" and version[4] == 0: git_changeset = get_git_changeset() - if git_changeset: - sub = ".dev%s" % git_changeset - else: - sub = ".dev" + sub = ".dev%s" % git_changeset if git_changeset else ".dev" elif version[3] != "final": mapping = {"alpha": "a", "beta": "b", "rc": "rc"} sub = mapping[version[3]] + str(version[4]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/relay/node.py new/graphene-3.1.0/graphene/relay/node.py --- old/graphene-3.0.0/graphene/relay/node.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/relay/node.py 2022-05-30 14:57:16.000000000 +0200 @@ -18,11 +18,7 @@ if not issubclass(objecttype, ObjectType): return False - for i in objecttype._meta.interfaces: - if issubclass(i, Node): - return True - - return False + return any(issubclass(i, Node) for i in objecttype._meta.interfaces) class GlobalID(Field): @@ -90,11 +86,13 @@ def get_node_from_global_id(cls, info, global_id, only_type=None): try: _type, _id = cls.from_global_id(global_id) + if not _type: + raise ValueError("Invalid Global ID") except Exception as e: raise Exception( f'Unable to parse global ID "{global_id}". ' 'Make sure it is a base64 encoded string in the format: "TypeName:id". ' - f"Exception message: {str(e)}" + f"Exception message: {e}" ) graphene_type = info.schema.get_type(_type) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/relay/tests/test_node.py new/graphene-3.1.0/graphene/relay/tests/test_node.py --- old/graphene-3.0.0/graphene/relay/tests/test_node.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/relay/tests/test_node.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,7 +1,7 @@ import re -from graphql_relay import to_global_id +from textwrap import dedent -from graphene.tests.utils import dedent +from graphql_relay import to_global_id from ...types import ObjectType, Schema, String from ..node import Node, is_node @@ -171,8 +171,10 @@ def test_str_schema(): - assert str(schema) == dedent( - ''' + assert ( + str(schema).strip() + == dedent( + ''' schema { query: RootQuery } @@ -213,4 +215,5 @@ ): MyNode } ''' + ).strip() ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/relay/tests/test_node_custom.py new/graphene-3.1.0/graphene/relay/tests/test_node_custom.py --- old/graphene-3.0.0/graphene/relay/tests/test_node_custom.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/relay/tests/test_node_custom.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,6 +1,6 @@ -from graphql import graphql_sync +from textwrap import dedent -from graphene.tests.utils import dedent +from graphql import graphql_sync from ...types import Interface, ObjectType, Schema from ...types.scalars import Int, String @@ -54,8 +54,10 @@ def test_str_schema_correct(): - assert str(schema) == dedent( - ''' + assert ( + str(schema).strip() + == dedent( + ''' schema { query: RootQuery } @@ -93,6 +95,7 @@ ): Node } ''' + ).strip() ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/test/__init__.py new/graphene-3.1.0/graphene/test/__init__.py --- old/graphene-3.0.0/graphene/test/__init__.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/test/__init__.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,5 +1,4 @@ from promise import Promise, is_thenable -from graphql.error import format_error as format_graphql_error from graphql.error import GraphQLError from graphene.types.schema import Schema @@ -7,7 +6,7 @@ def default_format_error(error): if isinstance(error, GraphQLError): - return format_graphql_error(error) + return error.formatted return {"message": str(error)} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/tests/issues/test_1394.py new/graphene-3.1.0/graphene/tests/issues/test_1394.py --- old/graphene-3.0.0/graphene/tests/issues/test_1394.py 1970-01-01 01:00:00.000000000 +0100 +++ new/graphene-3.1.0/graphene/tests/issues/test_1394.py 2022-05-30 14:57:16.000000000 +0200 @@ -0,0 +1,36 @@ +from ...types import ObjectType, Schema, String, NonNull + + +class Query(ObjectType): + hello = String(input=NonNull(String)) + + def resolve_hello(self, info, input): + if input == "nothing": + return None + return f"Hello {input}!" + + +schema = Schema(query=Query) + + +def test_required_input_provided(): + """ + Test that a required argument works when provided. + """ + input_value = "Potato" + result = schema.execute('{ hello(input: "%s") }' % input_value) + assert not result.errors + assert result.data == {"hello": "Hello Potato!"} + + +def test_required_input_missing(): + """ + Test that a required argument raised an error if not provided. + """ + result = schema.execute("{ hello }") + assert result.errors + assert len(result.errors) == 1 + assert ( + result.errors[0].message + == "Field 'hello' argument 'input' of type 'String!' is required, but it was not provided." + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/tests/issues/test_1419.py new/graphene-3.1.0/graphene/tests/issues/test_1419.py --- old/graphene-3.0.0/graphene/tests/issues/test_1419.py 1970-01-01 01:00:00.000000000 +0100 +++ new/graphene-3.1.0/graphene/tests/issues/test_1419.py 2022-05-30 14:57:16.000000000 +0200 @@ -0,0 +1,53 @@ +import pytest + +from ...types.base64 import Base64 +from ...types.datetime import Date, DateTime +from ...types.decimal import Decimal +from ...types.generic import GenericScalar +from ...types.json import JSONString +from ...types.objecttype import ObjectType +from ...types.scalars import ID, BigInt, Boolean, Float, Int, String +from ...types.schema import Schema +from ...types.uuid import UUID + + +@pytest.mark.parametrize( + "input_type,input_value", + [ + (Date, '"2022-02-02"'), + (GenericScalar, '"foo"'), + (Int, "1"), + (BigInt, "12345678901234567890"), + (Float, "1.1"), + (String, '"foo"'), + (Boolean, "true"), + (ID, "1"), + (DateTime, '"2022-02-02T11:11:11"'), + (UUID, '"cbebbc62-758e-4f75-a890-bc73b5017d81"'), + (Decimal, "1.1"), + (JSONString, '{key:"foo",value:"bar"}'), + (Base64, '"Q2hlbG8gd29ycmxkCg=="'), + ], +) +def test_parse_literal_with_variables(input_type, input_value): + # input_b needs to be evaluated as literal while the variable dict for + # input_a is passed along. + + class Query(ObjectType): + generic = GenericScalar(input_a=GenericScalar(), input_b=input_type()) + + def resolve_generic(self, info, input_a=None, input_b=None): + return input + + schema = Schema(query=Query) + + query = f""" + query Test($a: GenericScalar){{ + generic(inputA: $a, inputB: {input_value}) + }} + """ + result = schema.execute( + query, + variables={"a": "bar"}, + ) + assert not result.errors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/tests/utils.py new/graphene-3.1.0/graphene/tests/utils.py --- old/graphene-3.0.0/graphene/tests/utils.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/tests/utils.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -from textwrap import dedent as _dedent - - -def dedent(text: str) -> str: - """Fix indentation of given text by removing leading spaces and tabs. - Also removes leading newlines and trailing spaces and tabs, but keeps trailing - newlines. - """ - return _dedent(text.lstrip("\n").rstrip(" \t")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/argument.py new/graphene-3.1.0/graphene/types/argument.py --- old/graphene-3.0.0/graphene/types/argument.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/argument.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,4 +1,5 @@ from itertools import chain +from graphql import Undefined from .dynamic import Dynamic from .mountedtype import MountedType @@ -41,7 +42,7 @@ def __init__( self, type_, - default_value=None, + default_value=Undefined, description=None, name=None, required=False, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/base64.py new/graphene-3.1.0/graphene/types/base64.py --- old/graphene-3.0.0/graphene/types/base64.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/base64.py 2022-05-30 14:57:16.000000000 +0200 @@ -22,7 +22,7 @@ return b64encode(value).decode("utf-8") @classmethod - def parse_literal(cls, node): + def parse_literal(cls, node, _variables=None): if not isinstance(node, StringValueNode): raise GraphQLError( f"Base64 cannot represent non-string value: {print_ast(node)}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/decimal.py new/graphene-3.1.0/graphene/types/decimal.py --- old/graphene-3.0.0/graphene/types/decimal.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/decimal.py 2022-05-30 14:57:16.000000000 +0200 @@ -22,7 +22,7 @@ return str(dec) @classmethod - def parse_literal(cls, node): + def parse_literal(cls, node, _variables=None): if isinstance(node, (StringValueNode, IntValueNode)): return cls.parse_value(node.value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/definitions.py new/graphene-3.1.0/graphene/types/definitions.py --- old/graphene-3.0.0/graphene/types/definitions.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/definitions.py 2022-05-30 14:57:16.000000000 +0200 @@ -7,7 +7,6 @@ GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, - Undefined, ) @@ -50,7 +49,7 @@ try: value = enum[value] except KeyError: - return Undefined + pass return super(GrapheneEnumType, self).serialize(value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/generic.py new/graphene-3.1.0/graphene/types/generic.py --- old/graphene-3.0.0/graphene/types/generic.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/generic.py 2022-05-30 14:57:16.000000000 +0200 @@ -29,7 +29,7 @@ parse_value = identity @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, (StringValueNode, BooleanValueNode)): return ast.value elif isinstance(ast, IntValueNode): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/json.py new/graphene-3.1.0/graphene/types/json.py --- old/graphene-3.0.0/graphene/types/json.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/json.py 2022-05-30 14:57:16.000000000 +0200 @@ -20,7 +20,7 @@ return json.dumps(dt) @staticmethod - def parse_literal(node): + def parse_literal(node, _variables=None): if isinstance(node, StringValueNode): return json.loads(node.value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/mutation.py new/graphene-3.1.0/graphene/types/mutation.py --- old/graphene-3.0.0/graphene/types/mutation.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/mutation.py 2022-05-30 14:57:16.000000000 +0200 @@ -101,10 +101,7 @@ "Read more:" " https://github.com/graphql-python/graphene/blob/v2.0.0/UPGRADE-v2.0.md#mutation-input" ) - if input_class: - arguments = props(input_class) - else: - arguments = {} + arguments = props(input_class) if input_class else {} if not resolver: mutate = getattr(cls, "mutate", None) assert mutate, "All mutations must define a mutate method in it" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/resolver.py new/graphene-3.1.0/graphene/types/resolver.py --- old/graphene-3.0.0/graphene/types/resolver.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/resolver.py 2022-05-30 14:57:16.000000000 +0200 @@ -7,9 +7,7 @@ def dict_or_attr_resolver(attname, default_value, root, info, **args): - resolver = attr_resolver - if isinstance(root, dict): - resolver = dict_resolver + resolver = dict_resolver if isinstance(root, dict) else attr_resolver return resolver(attname, default_value, root, info, **args) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/scalars.py new/graphene-3.1.0/graphene/types/scalars.py --- old/graphene-3.0.0/graphene/types/scalars.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/scalars.py 2022-05-30 14:57:16.000000000 +0200 @@ -75,7 +75,7 @@ parse_value = coerce_int @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, IntValueNode): num = int(ast.value) if MIN_INT <= num <= MAX_INT: @@ -104,7 +104,7 @@ parse_value = coerce_int @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, IntValueNode): return int(ast.value) @@ -128,7 +128,7 @@ parse_value = coerce_float @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, (FloatValueNode, IntValueNode)): return float(ast.value) @@ -143,14 +143,14 @@ @staticmethod def coerce_string(value): if isinstance(value, bool): - return u"true" if value else u"false" + return "true" if value else "false" return str(value) serialize = coerce_string parse_value = coerce_string @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, StringValueNode): return ast.value @@ -164,7 +164,7 @@ parse_value = bool @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, BooleanValueNode): return ast.value @@ -182,6 +182,6 @@ parse_value = str @staticmethod - def parse_literal(ast): + def parse_literal(ast, _variables=None): if isinstance(ast, (StringValueNode, IntValueNode)): return ast.value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/schema.py new/graphene-3.1.0/graphene/types/schema.py --- old/graphene-3.0.0/graphene/types/schema.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/schema.py 2022-05-30 14:57:16.000000000 +0200 @@ -376,19 +376,11 @@ def resolve_type(self, resolve_type_func, type_name, root, info, _type): type_ = resolve_type_func(root, info) - if not type_: - return_type = self[type_name] - return default_type_resolver(root, info, return_type) - if inspect.isclass(type_) and issubclass(type_, ObjectType): - graphql_type = self.get(type_._meta.name) - assert graphql_type, f"Can't find type {type_._meta.name} in schema" - assert ( - graphql_type.graphene_type == type_ - ), f"The type {type_} does not match with the associated graphene type {graphql_type.graphene_type}." - return graphql_type + return type_._meta.name - return type_ + return_type = self[type_name] + return default_type_resolver(root, info, return_type) class Schema: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_enum.py new/graphene-3.1.0/graphene/types/tests/test_enum.py --- old/graphene-3.0.0/graphene/types/tests/test_enum.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_enum.py 2022-05-30 14:57:16.000000000 +0200 @@ -251,19 +251,22 @@ schema = Schema(query=Query) - assert str(schema) == dedent( - '''\ - type Query { - color: Color! - } + assert ( + str(schema).strip() + == dedent( + ''' + type Query { + color: Color! + } - """Primary colors""" - enum Color { - RED - YELLOW - BLUE - } - ''' + """Primary colors""" + enum Color { + RED + YELLOW + BLUE + } + ''' + ).strip() ) @@ -345,10 +348,7 @@ results = schema.execute("query { color }") assert results.errors - assert ( - results.errors[0].message - == "Expected a value of type 'Color' but received: 'BLACK'" - ) + assert results.errors[0].message == "Enum 'Color' cannot represent value: 'BLACK'" def test_field_enum_argument(): @@ -460,12 +460,13 @@ schema = Schema(query=Query, mutation=MyMutation) result = schema.execute( - """ mutation MyMutation { - createPaint(colorInput: { color: RED }) { - color + """ + mutation MyMutation { + createPaint(colorInput: { color: RED }) { + color + } } - } - """ + """ ) assert not result.errors assert result.data == {"createPaint": {"color": "RED"}} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_objecttype.py new/graphene-3.1.0/graphene/types/tests/test_objecttype.py --- old/graphene-3.0.0/graphene/types/tests/test_objecttype.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_objecttype.py 2022-05-30 14:57:16.000000000 +0200 @@ -191,21 +191,15 @@ def test_objecttype_as_container_extra_args(): - with raises(TypeError) as excinfo: - Container("1", "2", "3") - - assert "__init__() takes from 1 to 3 positional arguments but 4 were given" == str( - excinfo.value - ) + msg = r"__init__\(\) takes from 1 to 3 positional arguments but 4 were given" + with raises(TypeError, match=msg): + Container("1", "2", "3") # type: ignore def test_objecttype_as_container_invalid_kwargs(): - with raises(TypeError) as excinfo: - Container(unexisting_field="3") - - assert "__init__() got an unexpected keyword argument 'unexisting_field'" == str( - excinfo.value - ) + msg = r"__init__\(\) got an unexpected keyword argument 'unexisting_field'" + with raises(TypeError, match=msg): + Container(unexisting_field="3") # type: ignore def test_objecttype_container_benchmark(benchmark): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_query.py new/graphene-3.1.0/graphene/types/tests/test_query.py --- old/graphene-3.0.0/graphene/types/tests/test_query.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_query.py 2022-05-30 14:57:16.000000000 +0200 @@ -229,11 +229,11 @@ result = test_schema.execute("{ test }", None) assert not result.errors - assert result.data == {"test": '[null,{"a_str":null,"a_int":null}]'} + assert result.data == {"test": "[null,{}]"} result = test_schema.execute('{ test(aStr: "String!") }', "Source!") assert not result.errors - assert result.data == {"test": '["Source!",{"a_str":"String!","a_int":null}]'} + assert result.data == {"test": '["Source!",{"a_str":"String!"}]'} result = test_schema.execute('{ test(aInt: -123, aStr: "String!") }', "Source!") assert not result.errors @@ -258,7 +258,7 @@ result = test_schema.execute("{ test }", None) assert not result.errors - assert result.data == {"test": '[null,{"a_input":null}]'} + assert result.data == {"test": "[null,{}]"} result = test_schema.execute('{ test(aInput: {aField: "String!"} ) }', "Source!") assert not result.errors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_scalar.py new/graphene-3.1.0/graphene/types/tests/test_scalar.py --- old/graphene-3.0.0/graphene/types/tests/test_scalar.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_scalar.py 2022-05-30 14:57:16.000000000 +0200 @@ -11,19 +11,19 @@ def test_ints(): - assert Int.parse_value(2 ** 31 - 1) is not None + assert Int.parse_value(2**31 - 1) is not None assert Int.parse_value("2.0") is not None - assert Int.parse_value(2 ** 31) is None + assert Int.parse_value(2**31) is None - assert Int.parse_literal(IntValueNode(value=str(2 ** 31 - 1))) == 2 ** 31 - 1 - assert Int.parse_literal(IntValueNode(value=str(2 ** 31))) is None + assert Int.parse_literal(IntValueNode(value=str(2**31 - 1))) == 2**31 - 1 + assert Int.parse_literal(IntValueNode(value=str(2**31))) is None - assert Int.parse_value(-(2 ** 31)) is not None - assert Int.parse_value(-(2 ** 31) - 1) is None + assert Int.parse_value(-(2**31)) is not None + assert Int.parse_value(-(2**31) - 1) is None - assert BigInt.parse_value(2 ** 31) is not None + assert BigInt.parse_value(2**31) is not None assert BigInt.parse_value("2.0") is not None - assert BigInt.parse_value(-(2 ** 31) - 1) is not None + assert BigInt.parse_value(-(2**31) - 1) is not None - assert BigInt.parse_literal(IntValueNode(value=str(2 ** 31 - 1))) == 2 ** 31 - 1 - assert BigInt.parse_literal(IntValueNode(value=str(2 ** 31))) == 2 ** 31 + assert BigInt.parse_literal(IntValueNode(value=str(2**31 - 1))) == 2**31 - 1 + assert BigInt.parse_literal(IntValueNode(value=str(2**31))) == 2**31 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_scalars_serialization.py new/graphene-3.1.0/graphene/types/tests/test_scalars_serialization.py --- old/graphene-3.0.0/graphene/types/tests/test_scalars_serialization.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_scalars_serialization.py 2022-05-30 14:57:16.000000000 +0200 @@ -38,7 +38,7 @@ assert String.serialize(-1.1) == "-1.1" assert String.serialize(True) == "true" assert String.serialize(False) == "false" - assert String.serialize(u"\U0001F601") == u"\U0001F601" + assert String.serialize("\U0001F601") == "\U0001F601" def test_serializes_output_boolean(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_schema.py new/graphene-3.1.0/graphene/types/tests/test_schema.py --- old/graphene-3.0.0/graphene/types/tests/test_schema.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_schema.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,7 +1,8 @@ -from graphql.type import GraphQLObjectType, GraphQLSchema +from textwrap import dedent + from pytest import raises -from graphene.tests.utils import dedent +from graphql.type import GraphQLObjectType, GraphQLSchema from ..field import Field from ..objecttype import ObjectType @@ -43,8 +44,10 @@ def test_schema_str(): schema = Schema(Query) - assert str(schema) == dedent( - """ + assert ( + str(schema).strip() + == dedent( + """ type Query { inner: MyOtherType } @@ -53,6 +56,7 @@ field: String } """ + ).strip() ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_subscribe_async.py new/graphene-3.1.0/graphene/types/tests/test_subscribe_async.py --- old/graphene-3.0.0/graphene/types/tests/test_subscribe_async.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_subscribe_async.py 2022-05-30 14:57:16.000000000 +0200 @@ -14,9 +14,7 @@ count_to_ten = Field(Int) async def subscribe_count_to_ten(root, info): - count = 0 - while count < 10: - count += 1 + for count in range(1, 11): yield count diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/tests/test_type_map.py new/graphene-3.1.0/graphene/types/tests/test_type_map.py --- old/graphene-3.0.0/graphene/types/tests/test_type_map.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/tests/test_type_map.py 2022-05-30 14:57:16.000000000 +0200 @@ -1,3 +1,4 @@ +from graphql import Undefined from graphql.type import ( GraphQLArgument, GraphQLEnumType, @@ -244,7 +245,9 @@ foo_field = fields["fooBar"] assert isinstance(foo_field, GraphQLField) assert foo_field.args == { - "barFoo": GraphQLArgument(GraphQLString, default_value=None, out_name="bar_foo") + "barFoo": GraphQLArgument( + GraphQLString, default_value=Undefined, out_name="bar_foo" + ) } @@ -267,7 +270,7 @@ assert isinstance(foo_field, GraphQLField) assert foo_field.args == { "bar_foo": GraphQLArgument( - GraphQLString, default_value=None, out_name="bar_foo" + GraphQLString, default_value=Undefined, out_name="bar_foo" ) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/types/uuid.py new/graphene-3.1.0/graphene/types/uuid.py --- old/graphene-3.0.0/graphene/types/uuid.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/types/uuid.py 2022-05-30 14:57:16.000000000 +0200 @@ -21,7 +21,7 @@ return str(uuid) @staticmethod - def parse_literal(node): + def parse_literal(node, _variables=None): if isinstance(node, StringValueNode): return _UUID(node.value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/utils/module_loading.py new/graphene-3.1.0/graphene/utils/module_loading.py --- old/graphene-3.0.0/graphene/utils/module_loading.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/utils/module_loading.py 2022-05-30 14:57:16.000000000 +0200 @@ -27,19 +27,18 @@ if not dotted_attributes: return result - else: - attributes = dotted_attributes.split(".") - traveled_attributes = [] - try: - for attribute in attributes: - traveled_attributes.append(attribute) - result = getattr(result, attribute) - return result - except AttributeError: - raise ImportError( - 'Module "%s" does not define a "%s" attribute inside attribute/class "%s"' - % (module_path, ".".join(traveled_attributes), class_name) - ) + attributes = dotted_attributes.split(".") + traveled_attributes = [] + try: + for attribute in attributes: + traveled_attributes.append(attribute) + result = getattr(result, attribute) + return result + except AttributeError: + raise ImportError( + 'Module "%s" does not define a "%s" attribute inside attribute/class "%s"' + % (module_path, ".".join(traveled_attributes), class_name) + ) def lazy_import(dotted_path, dotted_attributes=None): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/utils/tests/test_deduplicator.py new/graphene-3.1.0/graphene/utils/tests/test_deduplicator.py --- old/graphene-3.0.0/graphene/utils/tests/test_deduplicator.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/utils/tests/test_deduplicator.py 2022-05-30 14:57:16.000000000 +0200 @@ -94,6 +94,7 @@ ], "movies": { "1198359": { + "id": "1198359", "name": "King Arthur: Legend of the Sword", "synopsis": ( "When the child Arthur's father is murdered, Vortigern, " @@ -159,7 +160,7 @@ "date": "2017-05-19", "movie": { "__typename": "Movie", - "id": "TW92aWU6Tm9uZQ==", + "id": "TW92aWU6MTE5ODM1OQ==", "name": "King Arthur: Legend of the Sword", "synopsis": ( "When the child Arthur's father is murdered, Vortigern, " @@ -172,7 +173,7 @@ "__typename": "Event", "id": "RXZlbnQ6MjM0", "date": "2017-05-20", - "movie": {"__typename": "Movie", "id": "TW92aWU6Tm9uZQ=="}, + "movie": {"__typename": "Movie", "id": "TW92aWU6MTE5ODM1OQ=="}, }, ] } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/utils/tests/test_orderedtype.py new/graphene-3.1.0/graphene/utils/tests/test_orderedtype.py --- old/graphene-3.0.0/graphene/utils/tests/test_orderedtype.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/utils/tests/test_orderedtype.py 2022-05-30 14:57:16.000000000 +0200 @@ -38,4 +38,4 @@ assert one.__lt__(1) == NotImplemented assert one.__gt__(1) == NotImplemented - assert not one == 1 + assert one != 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/graphene/validation/tests/test_disable_introspection.py new/graphene-3.1.0/graphene/validation/tests/test_disable_introspection.py --- old/graphene-3.0.0/graphene/validation/tests/test_disable_introspection.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/graphene/validation/tests/test_disable_introspection.py 2022-05-30 14:57:16.000000000 +0200 @@ -18,14 +18,12 @@ def run_query(query: str): document = parse(query) - errors = validate( + return validate( schema=schema.graphql_schema, document_ast=document, rules=(DisableIntrospection,), ) - return errors - def test_disallows_introspection_queries(): errors = run_query("{ __schema { queryType { name } } }") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/setup.py new/graphene-3.1.0/setup.py --- old/graphene-3.0.0/setup.py 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/setup.py 2022-05-30 14:57:16.000000000 +0200 @@ -45,20 +45,20 @@ tests_require = [ - "pytest>=5.3,<6", - "pytest-benchmark>=3.2,<4", - "pytest-cov>=2.8,<3", - "pytest-mock>=2,<3", - "pytest-asyncio>=0.10,<2", - "snapshottest>=0.5,<1", - "coveralls>=1.11,<2", + "pytest>=6,<7", + "pytest-benchmark>=3.4,<4", + "pytest-cov>=3,<4", + "pytest-mock>=3,<4", + "pytest-asyncio>=0.16,<2", + "snapshottest>=0.6,<1", + "coveralls>=3.3,<4", "promise>=2.3,<3", - "mock>=4.0,<5", - "pytz==2021.1", - "iso8601>=0.1,<2", + "mock>=4,<5", + "pytz==2022.1", + "iso8601>=1,<2", ] -dev_requires = ["black==19.10b0", "flake8>=3.7,<4"] + tests_require +dev_requires = ["black==22.3.0", "flake8>=4,<5"] + tests_require setup( name="graphene", @@ -78,12 +78,14 @@ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", ], keywords="api graphql protocol rest relay graphene", packages=find_packages(exclude=["examples*"]), install_requires=[ - "graphql-core~=3.1.2", - "graphql-relay>=3.0,<4", + "graphql-core>=3.1,<3.3", + "graphql-relay>=3.1,<3.3", "aniso8601>=8,<10", ], tests_require=tests_require, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-3.0.0/tox.ini new/graphene-3.1.0/tox.ini --- old/graphene-3.0.0/tox.ini 2021-11-13 23:15:18.000000000 +0100 +++ new/graphene-3.1.0/tox.ini 2022-05-30 14:57:16.000000000 +0200 @@ -1,5 +1,5 @@ [tox] -envlist = flake8,py36,py37,py38,pre-commit,mypy +envlist = py3{6,7,8,9,10}, flake8, mypy, pre-commit skipsdist = true [testenv] @@ -8,28 +8,28 @@ setenv = PYTHONPATH = .:{envdir} commands = - py{36,37,38}: pytest --cov=graphene graphene examples {posargs} + py{36,37,38,39,310}: pytest --cov=graphene graphene examples {posargs} [testenv:pre-commit] -basepython=python3.8 +basepython = python3.9 deps = - pre-commit>=2,<3 + pre-commit>=2.16,<3 setenv = LC_CTYPE=en_US.UTF-8 commands = pre-commit run --all-files --show-diff-on-failure [testenv:mypy] -basepython=python3.8 +basepython = python3.9 deps = - mypy>=0.761,<1 + mypy>=0.950,<1 commands = mypy graphene [testenv:flake8] -basepython=python3.8 +basepython = python3.9 deps = - flake8>=3.8,<4 + flake8>=4,<5 commands = pip install --pre -e . flake8 graphene