mirror of
				https://github.com/graphql-python/graphene-django.git
				synced 2025-11-04 01:47:57 +03:00 
			
		
		
		
	Use ruff in pre-commit (#1441)
* Use ruff in pre-commit * Add pyupgrade * Add isort * Add bugbear * Fix B015 Pointless comparison * Fix B026 * B018 false positive * Remove flake8 and isort config from setup.cfg * Remove black and flake8 from dev dependencies * Update black * Show list of fixes applied with autofix on * Fix typo * Add C4 flake8-comprehensions * Add ruff to dev dependencies * Fix up
This commit is contained in:
		
							parent
							
								
									45a732f1db
								
							
						
					
					
						commit
						9a773b9d7b
					
				| 
						 | 
				
			
			@ -15,16 +15,12 @@ repos:
 | 
			
		|||
        - --autofix
 | 
			
		||||
    -   id: trailing-whitespace
 | 
			
		||||
        exclude: README.md
 | 
			
		||||
-   repo: https://github.com/asottile/pyupgrade
 | 
			
		||||
    rev: v3.3.2
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: pyupgrade
 | 
			
		||||
        args: [--py38-plus]
 | 
			
		||||
-   repo: https://github.com/psf/black
 | 
			
		||||
    rev: 23.3.0
 | 
			
		||||
    rev: 23.7.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: black
 | 
			
		||||
-   repo: https://github.com/PyCQA/flake8
 | 
			
		||||
    rev: 6.0.0
 | 
			
		||||
-   repo: https://github.com/astral-sh/ruff-pre-commit
 | 
			
		||||
    rev: v0.0.282
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: flake8
 | 
			
		||||
    -   id: ruff
 | 
			
		||||
        args: [--fix, --exit-non-zero-on-fix, --show-fixes]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								.ruff.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.ruff.toml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
select = [
 | 
			
		||||
    "E",    # pycodestyle
 | 
			
		||||
    "W",    # pycodestyle
 | 
			
		||||
    "F",    # pyflake
 | 
			
		||||
    "I",    # isort
 | 
			
		||||
    "B",    # flake8-bugbear
 | 
			
		||||
    "C4",   # flake8-comprehensions
 | 
			
		||||
    "UP",   # pyupgrade
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ignore = [
 | 
			
		||||
    "E501",  # line-too-long
 | 
			
		||||
    "B017",  # pytest.raises(Exception) should be considered evil
 | 
			
		||||
    "B028",  # warnings.warn called without an explicit stacklevel keyword argument
 | 
			
		||||
    "B904",  # check for raise statements in exception handlers that lack a from clause
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
exclude = [
 | 
			
		||||
    "**/docs",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
target-version = "py38"
 | 
			
		||||
 | 
			
		||||
[per-file-ignores]
 | 
			
		||||
# Ignore unused imports (F401) in these files
 | 
			
		||||
"__init__.py" = ["F401"]
 | 
			
		||||
"graphene_django/compat.py" = ["F401"]
 | 
			
		||||
 | 
			
		||||
[isort]
 | 
			
		||||
known-first-party = ["graphene", "graphene-django"]
 | 
			
		||||
known-local-folder = ["cookbook"]
 | 
			
		||||
force-wrap-aliases = true
 | 
			
		||||
combine-as-imports = true
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
import graphene
 | 
			
		||||
from graphene_django.debug import DjangoDebug
 | 
			
		||||
 | 
			
		||||
import cookbook.ingredients.schema
 | 
			
		||||
import cookbook.recipes.schema
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from graphene_django.debug import DjangoDebug
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Query(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,8 @@
 | 
			
		|||
from django.urls import path
 | 
			
		||||
from django.contrib import admin
 | 
			
		||||
from django.urls import path
 | 
			
		||||
 | 
			
		||||
from graphene_django.views import GraphQLView
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    path("admin/", admin.site.urls),
 | 
			
		||||
    path("graphql/", GraphQLView.as_view(graphiql=True)),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
from cookbook.ingredients.models import Category, Ingredient
 | 
			
		||||
from graphene import Node
 | 
			
		||||
from graphene_django.filter import DjangoFilterConnectionField
 | 
			
		||||
from graphene_django.types import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
from cookbook.ingredients.models import Category, Ingredient
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Graphene will automatically map the Category model's fields onto the CategoryNode.
 | 
			
		||||
# This is configured in the CategoryNode's Meta class (as you can see below)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,9 @@ from cookbook.ingredients.models import Ingredient
 | 
			
		|||
class Recipe(models.Model):
 | 
			
		||||
    title = models.CharField(max_length=100)
 | 
			
		||||
    instructions = models.TextField()
 | 
			
		||||
    __unicode__ = lambda self: self.title
 | 
			
		||||
 | 
			
		||||
    def __unicode__(self):
 | 
			
		||||
        return self.title
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RecipeIngredient(models.Model):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
from cookbook.recipes.models import Recipe, RecipeIngredient
 | 
			
		||||
from graphene import Node
 | 
			
		||||
from graphene_django.filter import DjangoFilterConnectionField
 | 
			
		||||
from graphene_django.types import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
from cookbook.recipes.models import Recipe, RecipeIngredient
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RecipeNode(DjangoObjectType):
 | 
			
		||||
    class Meta:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
import graphene
 | 
			
		||||
from graphene_django.debug import DjangoDebug
 | 
			
		||||
 | 
			
		||||
import cookbook.ingredients.schema
 | 
			
		||||
import cookbook.recipes.schema
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from graphene_django.debug import DjangoDebug
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Query(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ from django.contrib import admin
 | 
			
		|||
 | 
			
		||||
from graphene_django.views import GraphQLView
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    url(r"^admin/", admin.site.urls),
 | 
			
		||||
    url(r"^graphql$", GraphQLView.as_view(graphiql=True)),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
 | 
			
		||||
sys.path.insert(0, ROOT_PATH + "/examples/")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,9 +3,11 @@ from graphene import Schema, relay, resolve_only_args
 | 
			
		|||
from graphene_django import DjangoConnectionField, DjangoObjectType
 | 
			
		||||
 | 
			
		||||
from .data import create_ship, get_empire, get_faction, get_rebels, get_ship, get_ships
 | 
			
		||||
from .models import Character as CharacterModel
 | 
			
		||||
from .models import Faction as FactionModel
 | 
			
		||||
from .models import Ship as ShipModel
 | 
			
		||||
from .models import (
 | 
			
		||||
    Character as CharacterModel,
 | 
			
		||||
    Faction as FactionModel,
 | 
			
		||||
    Ship as ShipModel,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Ship(DjangoObjectType):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,9 +13,9 @@ try:
 | 
			
		|||
    # Postgres fields are only available in Django with psycopg2 installed
 | 
			
		||||
    # and we cannot have psycopg2 on PyPy
 | 
			
		||||
    from django.contrib.postgres.fields import (
 | 
			
		||||
        IntegerRangeField,
 | 
			
		||||
        ArrayField,
 | 
			
		||||
        HStoreField,
 | 
			
		||||
        IntegerRangeField,
 | 
			
		||||
        RangeField,
 | 
			
		||||
    )
 | 
			
		||||
except ImportError:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ from django.db import models
 | 
			
		|||
from django.utils.encoding import force_str
 | 
			
		||||
from django.utils.functional import Promise
 | 
			
		||||
from django.utils.module_loading import import_string
 | 
			
		||||
from graphql import GraphQLError
 | 
			
		||||
 | 
			
		||||
from graphene import (
 | 
			
		||||
    ID,
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +14,7 @@ from graphene import (
 | 
			
		|||
    Boolean,
 | 
			
		||||
    Date,
 | 
			
		||||
    DateTime,
 | 
			
		||||
    Decimal,
 | 
			
		||||
    Dynamic,
 | 
			
		||||
    Enum,
 | 
			
		||||
    Field,
 | 
			
		||||
| 
						 | 
				
			
			@ -22,13 +24,11 @@ from graphene import (
 | 
			
		|||
    NonNull,
 | 
			
		||||
    String,
 | 
			
		||||
    Time,
 | 
			
		||||
    Decimal,
 | 
			
		||||
)
 | 
			
		||||
from graphene.types.json import JSONString
 | 
			
		||||
from graphene.types.scalars import BigInt
 | 
			
		||||
from graphene.types.resolver import get_default_resolver
 | 
			
		||||
from graphene.types.scalars import BigInt
 | 
			
		||||
from graphene.utils.str_converters import to_camel_case
 | 
			
		||||
from graphql import GraphQLError
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    from graphql import assert_name
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ except ImportError:
 | 
			
		|||
from graphql.pyutils import register_description
 | 
			
		||||
 | 
			
		||||
from .compat import ArrayField, HStoreField, RangeField
 | 
			
		||||
from .fields import DjangoListField, DjangoConnectionField
 | 
			
		||||
from .fields import DjangoConnectionField, DjangoListField
 | 
			
		||||
from .settings import graphene_settings
 | 
			
		||||
from .utils.str_converters import to_const
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,9 +161,7 @@ def get_django_field_description(field):
 | 
			
		|||
@singledispatch
 | 
			
		||||
def convert_django_field(field, registry=None):
 | 
			
		||||
    raise Exception(
 | 
			
		||||
        "Don't know how to convert the Django field {} ({})".format(
 | 
			
		||||
            field, field.__class__
 | 
			
		||||
        )
 | 
			
		||||
        f"Don't know how to convert the Django field {field} ({field.__class__})"
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -261,6 +259,7 @@ def convert_time_to_string(field, registry=None):
 | 
			
		|||
@convert_django_field.register(models.OneToOneRel)
 | 
			
		||||
def convert_onetoone_field_to_djangomodel(field, registry=None):
 | 
			
		||||
    from graphene.utils.str_converters import to_snake_case
 | 
			
		||||
 | 
			
		||||
    from .types import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
    model = field.related_model
 | 
			
		||||
| 
						 | 
				
			
			@ -364,6 +363,7 @@ def convert_field_to_list_or_connection(field, registry=None):
 | 
			
		|||
@convert_django_field.register(models.ForeignKey)
 | 
			
		||||
def convert_field_to_djangomodel(field, registry=None):
 | 
			
		||||
    from graphene.utils.str_converters import to_snake_case
 | 
			
		||||
 | 
			
		||||
    from .types import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
    model = field.related_model
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,7 @@
 | 
			
		|||
from django.db import connections
 | 
			
		||||
 | 
			
		||||
from promise import Promise
 | 
			
		||||
 | 
			
		||||
from .sql.tracking import unwrap_cursor, wrap_cursor
 | 
			
		||||
from .exception.formating import wrap_exception
 | 
			
		||||
from .sql.tracking import unwrap_cursor, wrap_cursor
 | 
			
		||||
from .types import DjangoDebug
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import graphene
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
from graphene_django import DjangoConnectionField, DjangoObjectType
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
from graphene import List, ObjectType
 | 
			
		||||
 | 
			
		||||
from .sql.types import DjangoDebugSQL
 | 
			
		||||
from .exception.types import DjangoDebugException
 | 
			
		||||
from .sql.types import DjangoDebugSQL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DjangoDebug(ObjectType):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,12 @@
 | 
			
		|||
from functools import partial
 | 
			
		||||
 | 
			
		||||
from django.db.models.query import QuerySet
 | 
			
		||||
 | 
			
		||||
from graphql_relay import (
 | 
			
		||||
    connection_from_array_slice,
 | 
			
		||||
    cursor_to_offset,
 | 
			
		||||
    get_offset_with_default,
 | 
			
		||||
    offset_to_cursor,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from promise import Promise
 | 
			
		||||
 | 
			
		||||
from graphene import Int, NonNull
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import warnings
 | 
			
		||||
 | 
			
		||||
from ..utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
 | 
			
		||||
if not DJANGO_FILTER_INSTALLED:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,8 @@ from functools import partial
 | 
			
		|||
 | 
			
		||||
from django.core.exceptions import ValidationError
 | 
			
		||||
 | 
			
		||||
from graphene.types.enum import EnumType
 | 
			
		||||
from graphene.types.argument import to_arguments
 | 
			
		||||
from graphene.types.enum import EnumType
 | 
			
		||||
from graphene.utils.str_converters import to_snake_case
 | 
			
		||||
 | 
			
		||||
from ..fields import DjangoConnectionField
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ class DjangoFilterConnectionField(DjangoConnectionField):
 | 
			
		|||
    def filterset_class(self):
 | 
			
		||||
        if not self._filterset_class:
 | 
			
		||||
            fields = self._fields or self.node_type._meta.filter_fields
 | 
			
		||||
            meta = dict(model=self.model, fields=fields)
 | 
			
		||||
            meta = {"model": self.model, "fields": fields}
 | 
			
		||||
            if self._extra_filter_meta:
 | 
			
		||||
                meta.update(self._extra_filter_meta)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import warnings
 | 
			
		||||
 | 
			
		||||
from ...utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
 | 
			
		||||
if not DJANGO_FILTER_INSTALLED:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
from django_filters import Filter, MultipleChoiceFilter
 | 
			
		||||
 | 
			
		||||
from graphql_relay.node.node import from_global_id
 | 
			
		||||
 | 
			
		||||
from ...forms import GlobalIDFormField, GlobalIDMultipleChoiceField
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,14 @@
 | 
			
		|||
import itertools
 | 
			
		||||
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django_filters.filterset import BaseFilterSet, FilterSet
 | 
			
		||||
from django_filters.filterset import FILTER_FOR_DBFIELD_DEFAULTS
 | 
			
		||||
from django_filters.filterset import (
 | 
			
		||||
    FILTER_FOR_DBFIELD_DEFAULTS,
 | 
			
		||||
    BaseFilterSet,
 | 
			
		||||
    FilterSet,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from .filters import GlobalIDFilter, GlobalIDMultipleChoiceFilter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GRAPHENE_FILTER_SET_OVERRIDES = {
 | 
			
		||||
    models.AutoField: {"filter_class": GlobalIDFilter},
 | 
			
		||||
    models.OneToOneField: {"filter_class": GlobalIDFilter},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,15 @@
 | 
			
		|||
from unittest.mock import MagicMock
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.db.models.query import QuerySet
 | 
			
		||||
from django_filters import filters
 | 
			
		||||
from django_filters import FilterSet
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
from graphene_django import DjangoObjectType
 | 
			
		||||
from graphene_django.filter import ArrayFilter
 | 
			
		||||
from graphene_django.utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
from graphene_django.filter import ArrayFilter, ListFilter
 | 
			
		||||
 | 
			
		||||
from ...compat import ArrayField
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,7 @@ import pytest
 | 
			
		|||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
 | 
			
		||||
from graphene_django import DjangoObjectType, DjangoConnectionField
 | 
			
		||||
from graphene_django import DjangoConnectionField, DjangoObjectType
 | 
			
		||||
from graphene_django.tests.models import Article, Reporter
 | 
			
		||||
from graphene_django.utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,8 @@ if DJANGO_FILTER_INSTALLED:
 | 
			
		|||
    from django_filters import FilterSet, NumberFilter, OrderingFilter
 | 
			
		||||
 | 
			
		||||
    from graphene_django.filter import (
 | 
			
		||||
        GlobalIDFilter,
 | 
			
		||||
        DjangoFilterConnectionField,
 | 
			
		||||
        GlobalIDFilter,
 | 
			
		||||
        GlobalIDMultipleChoiceFilter,
 | 
			
		||||
    )
 | 
			
		||||
    from graphene_django.filter.tests.filters import (
 | 
			
		||||
| 
						 | 
				
			
			@ -222,7 +222,7 @@ def test_filter_filterset_information_on_meta_related():
 | 
			
		|||
        reporter = Field(ReporterFilterNode)
 | 
			
		||||
        article = Field(ArticleFilterNode)
 | 
			
		||||
 | 
			
		||||
    schema = Schema(query=Query)
 | 
			
		||||
    Schema(query=Query)
 | 
			
		||||
    articles_field = ReporterFilterNode._meta.fields["articles"].get_type()
 | 
			
		||||
    assert_arguments(articles_field, "headline", "reporter")
 | 
			
		||||
    assert_not_orderable(articles_field)
 | 
			
		||||
| 
						 | 
				
			
			@ -294,7 +294,7 @@ def test_filter_filterset_class_information_on_meta_related():
 | 
			
		|||
        reporter = Field(ReporterFilterNode)
 | 
			
		||||
        article = Field(ArticleFilterNode)
 | 
			
		||||
 | 
			
		||||
    schema = Schema(query=Query)
 | 
			
		||||
    Schema(query=Query)
 | 
			
		||||
    articles_field = ReporterFilterNode._meta.fields["articles"].get_type()
 | 
			
		||||
    assert_arguments(articles_field, "headline", "reporter")
 | 
			
		||||
    assert_not_orderable(articles_field)
 | 
			
		||||
| 
						 | 
				
			
			@ -1186,7 +1186,7 @@ def test_filter_filterset_based_on_mixin():
 | 
			
		|||
        first_name="Adam", last_name="Doe", email="adam@doe.com"
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    article_2 = Article.objects.create(
 | 
			
		||||
    Article.objects.create(
 | 
			
		||||
        headline="Good Bye",
 | 
			
		||||
        reporter=reporter_2,
 | 
			
		||||
        editor=reporter_2,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,16 @@
 | 
			
		|||
from datetime import datetime
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django_filters import (
 | 
			
		||||
    FilterSet,
 | 
			
		||||
    rest_framework as filters,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from django_filters import FilterSet
 | 
			
		||||
from django_filters import rest_framework as filters
 | 
			
		||||
from graphene import ObjectType, Schema
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
from graphene_django import DjangoObjectType
 | 
			
		||||
from graphene_django.tests.models import Pet, Person, Reporter, Article, Film
 | 
			
		||||
from graphene_django.filter.tests.filters import ArticleFilter
 | 
			
		||||
from graphene_django.tests.models import Article, Film, Person, Pet, Reporter
 | 
			
		||||
from graphene_django.utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
 | 
			
		||||
pytestmark = []
 | 
			
		||||
| 
						 | 
				
			
			@ -348,9 +350,9 @@ def test_fk_id_in_filter(query):
 | 
			
		|||
 | 
			
		||||
    schema = Schema(query=query)
 | 
			
		||||
 | 
			
		||||
    query = """
 | 
			
		||||
    query = f"""
 | 
			
		||||
    query {{
 | 
			
		||||
        articles (reporter_In: [{}, {}]) {{
 | 
			
		||||
        articles (reporter_In: [{john_doe.id}, {jean_bon.id}]) {{
 | 
			
		||||
            edges {{
 | 
			
		||||
                node {{
 | 
			
		||||
                    headline
 | 
			
		||||
| 
						 | 
				
			
			@ -361,10 +363,7 @@ def test_fk_id_in_filter(query):
 | 
			
		|||
            }}
 | 
			
		||||
        }}
 | 
			
		||||
    }}
 | 
			
		||||
    """.format(
 | 
			
		||||
        john_doe.id,
 | 
			
		||||
        jean_bon.id,
 | 
			
		||||
    )
 | 
			
		||||
    """
 | 
			
		||||
    result = schema.execute(query)
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    assert result.data["articles"]["edges"] == [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,7 @@
 | 
			
		|||
import json
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from django_filters import FilterSet
 | 
			
		||||
from django_filters import rest_framework as filters
 | 
			
		||||
from graphene import ObjectType, Schema
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
from graphene_django import DjangoObjectType
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,8 @@
 | 
			
		|||
import pytest
 | 
			
		||||
 | 
			
		||||
from django_filters import FilterSet
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
 | 
			
		||||
from graphene_django import DjangoObjectType
 | 
			
		||||
from graphene_django.tests.models import Article, Reporter
 | 
			
		||||
from graphene_django.utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
| 
						 | 
				
			
			@ -14,8 +12,8 @@ pytestmark = []
 | 
			
		|||
if DJANGO_FILTER_INSTALLED:
 | 
			
		||||
    from graphene_django.filter import (
 | 
			
		||||
        DjangoFilterConnectionField,
 | 
			
		||||
        TypedFilter,
 | 
			
		||||
        ListFilter,
 | 
			
		||||
        TypedFilter,
 | 
			
		||||
    )
 | 
			
		||||
else:
 | 
			
		||||
    pytestmark.append(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,11 @@
 | 
			
		|||
import graphene
 | 
			
		||||
from django import forms
 | 
			
		||||
from django_filters.utils import get_model_field, get_field_parts
 | 
			
		||||
from django_filters.filters import Filter, BaseCSVFilter
 | 
			
		||||
from .filters import ArrayFilter, ListFilter, RangeFilter, TypedFilter
 | 
			
		||||
from .filterset import custom_filterset_factory, setup_filterset
 | 
			
		||||
from django_filters.utils import get_model_field
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from ..forms import GlobalIDFormField, GlobalIDMultipleChoiceField
 | 
			
		||||
from .filters import ListFilter, RangeFilter, TypedFilter
 | 
			
		||||
from .filterset import custom_filterset_factory, setup_filterset
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_field_type(registry, model, field_name):
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +51,7 @@ def get_filtering_args_from_filterset(filterset_class, type):
 | 
			
		|||
            ):
 | 
			
		||||
                # Get the filter field for filters that are no explicitly declared.
 | 
			
		||||
                if filter_type == "isnull":
 | 
			
		||||
                    field = graphene.Boolean(required=required)
 | 
			
		||||
                    field_type = graphene.Boolean
 | 
			
		||||
                else:
 | 
			
		||||
                    model_field = get_model_field(model, filter_field.field_name)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,15 +5,15 @@ from django.core.exceptions import ImproperlyConfigured
 | 
			
		|||
 | 
			
		||||
from graphene import (
 | 
			
		||||
    ID,
 | 
			
		||||
    UUID,
 | 
			
		||||
    Boolean,
 | 
			
		||||
    Date,
 | 
			
		||||
    DateTime,
 | 
			
		||||
    Decimal,
 | 
			
		||||
    Float,
 | 
			
		||||
    Int,
 | 
			
		||||
    List,
 | 
			
		||||
    String,
 | 
			
		||||
    UUID,
 | 
			
		||||
    Date,
 | 
			
		||||
    DateTime,
 | 
			
		||||
    Time,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ def get_form_field_description(field):
 | 
			
		|||
@singledispatch
 | 
			
		||||
def convert_form_field(field):
 | 
			
		||||
    raise ImproperlyConfigured(
 | 
			
		||||
        "Don't know how to convert the Django form field %s (%s) "
 | 
			
		||||
        "to Graphene type" % (field, field.__class__)
 | 
			
		||||
        "Don't know how to convert the Django form field {} ({}) "
 | 
			
		||||
        "to Graphene type".format(field, field.__class__)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ import binascii
 | 
			
		|||
from django.core.exceptions import ValidationError
 | 
			
		||||
from django.forms import CharField, Field, MultipleChoiceField
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from graphql_relay import from_global_id
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,18 @@
 | 
			
		|||
from django import forms
 | 
			
		||||
from pytest import raises
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene import (
 | 
			
		||||
    String,
 | 
			
		||||
    Int,
 | 
			
		||||
    Boolean,
 | 
			
		||||
    Decimal,
 | 
			
		||||
    Float,
 | 
			
		||||
    ID,
 | 
			
		||||
    UUID,
 | 
			
		||||
    Boolean,
 | 
			
		||||
    Date,
 | 
			
		||||
    DateTime,
 | 
			
		||||
    Decimal,
 | 
			
		||||
    Float,
 | 
			
		||||
    Int,
 | 
			
		||||
    List,
 | 
			
		||||
    NonNull,
 | 
			
		||||
    DateTime,
 | 
			
		||||
    Date,
 | 
			
		||||
    String,
 | 
			
		||||
    Time,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
import graphene
 | 
			
		||||
 | 
			
		||||
from django import forms
 | 
			
		||||
from pytest import raises
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene_django import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
from ...tests.models import CHOICES, Film, Reporter
 | 
			
		||||
from ..types import DjangoFormInputObjectType
 | 
			
		||||
from ...tests.models import Reporter, Film, CHOICES
 | 
			
		||||
 | 
			
		||||
# Reporter a_choice CHOICES = ((1, "this"), (2, _("that")))
 | 
			
		||||
THIS = CHOICES[0][0]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
import pytest
 | 
			
		||||
from django import forms
 | 
			
		||||
from django.core.exceptions import ValidationError
 | 
			
		||||
from pytest import raises
 | 
			
		||||
| 
						 | 
				
			
			@ -280,7 +279,7 @@ def test_model_form_mutation_mutate_invalid_form():
 | 
			
		|||
    result = PetMutation.mutate_and_get_payload(None, None)
 | 
			
		||||
 | 
			
		||||
    # A pet was not created
 | 
			
		||||
    Pet.objects.count() == 0
 | 
			
		||||
    assert Pet.objects.count() == 0
 | 
			
		||||
 | 
			
		||||
    fields_w_error = [e.field for e in result.errors]
 | 
			
		||||
    assert len(result.errors) == 2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,11 @@
 | 
			
		|||
import graphene
 | 
			
		||||
 | 
			
		||||
from graphene import ID
 | 
			
		||||
from graphene.types.inputobjecttype import InputObjectType
 | 
			
		||||
from graphene.utils.str_converters import to_camel_case
 | 
			
		||||
 | 
			
		||||
from .mutation import fields_for_form
 | 
			
		||||
from ..types import ErrorType  # noqa Import ErrorType for backwards compatability
 | 
			
		||||
from ..converter import BlankValueField
 | 
			
		||||
from ..types import ErrorType  # noqa Import ErrorType for backwards compatability
 | 
			
		||||
from .mutation import fields_for_form
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DjangoFormInputObjectType(InputObjectType):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,12 @@
 | 
			
		|||
import os
 | 
			
		||||
import functools
 | 
			
		||||
import importlib
 | 
			
		||||
import json
 | 
			
		||||
import functools
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
from django.core.management.base import BaseCommand, CommandError
 | 
			
		||||
from django.utils import autoreload
 | 
			
		||||
 | 
			
		||||
from graphql import print_schema
 | 
			
		||||
 | 
			
		||||
from graphene_django.settings import graphene_settings
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,9 +8,7 @@ class Registry:
 | 
			
		|||
 | 
			
		||||
        assert issubclass(
 | 
			
		||||
            cls, DjangoObjectType
 | 
			
		||||
        ), 'Only DjangoObjectTypes can be registered, received "{}"'.format(
 | 
			
		||||
            cls.__name__
 | 
			
		||||
        )
 | 
			
		||||
        ), f'Only DjangoObjectTypes can be registered, received "{cls.__name__}"'
 | 
			
		||||
        assert cls._meta.registry == self, "Registry for a Model have to match."
 | 
			
		||||
        # assert self.get_type_for_model(cls._meta.model) == cls, (
 | 
			
		||||
        #     'Multiple DjangoObjectTypes registered for "{}"'.format(cls._meta.model)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
from enum import Enum
 | 
			
		||||
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
from enum import Enum
 | 
			
		||||
 | 
			
		||||
from django.shortcuts import get_object_or_404
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,16 +5,16 @@ from rest_framework import serializers
 | 
			
		|||
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from ..registry import get_global_registry
 | 
			
		||||
from ..converter import convert_choices_to_named_enum_with_descriptions
 | 
			
		||||
from ..registry import get_global_registry
 | 
			
		||||
from .types import DictType
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@singledispatch
 | 
			
		||||
def get_graphene_type_from_serializer_field(field):
 | 
			
		||||
    raise ImproperlyConfigured(
 | 
			
		||||
        "Don't know how to convert the serializer field %s (%s) "
 | 
			
		||||
        "to Graphene type" % (field, field.__class__)
 | 
			
		||||
        "Don't know how to convert the serializer field {} ({}) "
 | 
			
		||||
        "to Graphene type".format(field, field.__class__)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
import copy
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from django.db import models
 | 
			
		||||
from graphene import InputObjectType
 | 
			
		||||
from pytest import raises
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from ..serializer_converter import convert_serializer_field
 | 
			
		||||
from ..types import DictType
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,9 +9,9 @@ from graphene.types.inputobjecttype import InputObjectType
 | 
			
		|||
from ...types import DjangoObjectType
 | 
			
		||||
from ..models import (
 | 
			
		||||
    MyFakeModel,
 | 
			
		||||
    MyFakeModelWithChoiceField,
 | 
			
		||||
    MyFakeModelWithDate,
 | 
			
		||||
    MyFakeModelWithPassword,
 | 
			
		||||
    MyFakeModelWithChoiceField,
 | 
			
		||||
)
 | 
			
		||||
from ..mutation import SerializerMutation
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -250,7 +250,7 @@ def test_model_invalid_update_mutate_and_get_payload_success():
 | 
			
		|||
            model_operations = ["update"]
 | 
			
		||||
 | 
			
		||||
    with raises(Exception) as exc:
 | 
			
		||||
        result = InvalidModelMutation.mutate_and_get_payload(
 | 
			
		||||
        InvalidModelMutation.mutate_and_get_payload(
 | 
			
		||||
            None, mock_info(), **{"cool_name": "Narf"}
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,11 +12,10 @@ Graphene settings, checking for user settings first, then falling
 | 
			
		|||
back to the defaults.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.test.signals import setting_changed
 | 
			
		||||
 | 
			
		||||
import importlib  # Available in Python 3.1+
 | 
			
		||||
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.test.signals import setting_changed
 | 
			
		||||
 | 
			
		||||
# Copied shamelessly from Django REST Framework
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,21 +1,14 @@
 | 
			
		|||
# https://github.com/graphql-python/graphene-django/issues/520
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
from django import forms
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
 | 
			
		||||
from graphene import Field, ResolveInfo
 | 
			
		||||
from graphene.types.inputobjecttype import InputObjectType
 | 
			
		||||
from pytest import raises
 | 
			
		||||
from pytest import mark
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
from ...types import DjangoObjectType
 | 
			
		||||
from ...forms.mutation import DjangoFormMutation
 | 
			
		||||
from ...rest_framework.models import MyFakeModel
 | 
			
		||||
from ...rest_framework.mutation import SerializerMutation
 | 
			
		||||
from ...forms.mutation import DjangoFormMutation
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MyModelSerializer(serializers.ModelSerializer):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
from graphene import Field
 | 
			
		||||
 | 
			
		||||
from graphene_django.forms.mutation import DjangoFormMutation, DjangoModelFormMutation
 | 
			
		||||
 | 
			
		||||
from .forms import PetForm
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
from io import StringIO
 | 
			
		||||
from textwrap import dedent
 | 
			
		||||
from unittest.mock import mock_open, patch
 | 
			
		||||
 | 
			
		||||
from django.core import management
 | 
			
		||||
from io import StringIO
 | 
			
		||||
from unittest.mock import mock_open, patch
 | 
			
		||||
 | 
			
		||||
from graphene import ObjectType, Schema, String
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,10 +31,10 @@ from .models import Article, Film, FilmDetails, Reporter
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def assert_conversion(django_field, graphene_field, *args, **kwargs):
 | 
			
		||||
    _kwargs = kwargs.copy()
 | 
			
		||||
    _kwargs = {**kwargs, "help_text": "Custom Help Text"}
 | 
			
		||||
    if "null" not in kwargs:
 | 
			
		||||
        _kwargs["null"] = True
 | 
			
		||||
    field = django_field(help_text="Custom Help Text", *args, **_kwargs)
 | 
			
		||||
    field = django_field(*args, **_kwargs)
 | 
			
		||||
    graphene_type = convert_django_field(field)
 | 
			
		||||
    assert isinstance(graphene_type, graphene_field)
 | 
			
		||||
    field = graphene_type.Field()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
import datetime
 | 
			
		||||
import re
 | 
			
		||||
from django.db.models import Count, Prefetch
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.db.models import Count, Prefetch
 | 
			
		||||
 | 
			
		||||
from graphene import List, NonNull, ObjectType, Schema, String
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ class TestDjangoListField:
 | 
			
		|||
            foo = String()
 | 
			
		||||
 | 
			
		||||
        with pytest.raises(AssertionError):
 | 
			
		||||
            list_field = DjangoListField(TestType)
 | 
			
		||||
            DjangoListField(TestType)
 | 
			
		||||
 | 
			
		||||
    def test_only_import_paths(self):
 | 
			
		||||
        list_field = DjangoListField("graphene_django.tests.schema.Human")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ from pytest import raises
 | 
			
		|||
 | 
			
		||||
from ..forms import GlobalIDFormField, GlobalIDMultipleChoiceField
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# 'TXlUeXBlOmFiYw==' -> 'MyType', 'abc'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,11 @@
 | 
			
		|||
import pytest
 | 
			
		||||
from graphql_relay import to_global_id
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
 | 
			
		||||
from graphql_relay import to_global_id
 | 
			
		||||
 | 
			
		||||
from ..fields import DjangoConnectionField
 | 
			
		||||
from ..types import DjangoObjectType
 | 
			
		||||
 | 
			
		||||
from .models import Article, Reporter, FilmDetails, Film
 | 
			
		||||
from .models import Article, Film, FilmDetails, Reporter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestShouldCallGetQuerySetOnForeignKey:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import datetime
 | 
			
		||||
import base64
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.db import models
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +16,7 @@ from ..fields import DjangoConnectionField
 | 
			
		|||
from ..types import DjangoObjectType
 | 
			
		||||
from ..utils import DJANGO_FILTER_INSTALLED
 | 
			
		||||
from .models import (
 | 
			
		||||
    APNewsReporter,
 | 
			
		||||
    Article,
 | 
			
		||||
    CNNReporter,
 | 
			
		||||
    Film,
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +24,6 @@ from .models import (
 | 
			
		|||
    Person,
 | 
			
		||||
    Pet,
 | 
			
		||||
    Reporter,
 | 
			
		||||
    APNewsReporter,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -126,9 +126,9 @@ def test_should_query_well():
 | 
			
		|||
@pytest.mark.skipif(IntegerRangeField is MissingType, reason="RangeField should exist")
 | 
			
		||||
def test_should_query_postgres_fields():
 | 
			
		||||
    from django.contrib.postgres.fields import (
 | 
			
		||||
        IntegerRangeField,
 | 
			
		||||
        ArrayField,
 | 
			
		||||
        HStoreField,
 | 
			
		||||
        IntegerRangeField,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    class Event(models.Model):
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +355,7 @@ def test_should_query_connectionfields():
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def test_should_keep_annotations():
 | 
			
		||||
    from django.db.models import Count, Avg
 | 
			
		||||
    from django.db.models import Avg, Count
 | 
			
		||||
 | 
			
		||||
    class ReporterType(DjangoObjectType):
 | 
			
		||||
        class Meta:
 | 
			
		||||
| 
						 | 
				
			
			@ -517,7 +517,7 @@ def test_should_query_node_filtering_with_distinct_queryset():
 | 
			
		|||
            ).distinct()
 | 
			
		||||
 | 
			
		||||
    f = Film.objects.create()
 | 
			
		||||
    fd = FilmDetails.objects.create(location="Berlin", film=f)
 | 
			
		||||
    FilmDetails.objects.create(location="Berlin", film=f)
 | 
			
		||||
 | 
			
		||||
    schema = graphene.Schema(query=Query)
 | 
			
		||||
    query = """
 | 
			
		||||
| 
						 | 
				
			
			@ -640,7 +640,7 @@ def test_should_enforce_first_or_last(graphene_settings):
 | 
			
		|||
    class Query(graphene.ObjectType):
 | 
			
		||||
        all_reporters = DjangoConnectionField(ReporterType)
 | 
			
		||||
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -682,7 +682,7 @@ def test_should_error_if_first_is_greater_than_max(graphene_settings):
 | 
			
		|||
 | 
			
		||||
    assert Query.all_reporters.max_limit == 100
 | 
			
		||||
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -724,7 +724,7 @@ def test_should_error_if_last_is_greater_than_max(graphene_settings):
 | 
			
		|||
 | 
			
		||||
    assert Query.all_reporters.max_limit == 100
 | 
			
		||||
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -788,7 +788,7 @@ def test_should_query_promise_connectionfields():
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def test_should_query_connectionfields_with_last():
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -825,11 +825,11 @@ def test_should_query_connectionfields_with_last():
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def test_should_query_connectionfields_with_manager():
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    r = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="NotDoe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1369,10 +1369,10 @@ def test_model_inheritance_support_local_relationships():
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def test_should_resolve_get_queryset_connectionfields():
 | 
			
		||||
    reporter_1 = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
    reporter_2 = CNNReporter.objects.create(
 | 
			
		||||
    CNNReporter.objects.create(
 | 
			
		||||
        first_name="Some",
 | 
			
		||||
        last_name="Guy",
 | 
			
		||||
        email="someguy@cnn.com",
 | 
			
		||||
| 
						 | 
				
			
			@ -1414,10 +1414,10 @@ def test_should_resolve_get_queryset_connectionfields():
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def test_connection_should_limit_after_to_list_length():
 | 
			
		||||
    reporter_1 = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
    reporter_2 = Reporter.objects.create(
 | 
			
		||||
    Reporter.objects.create(
 | 
			
		||||
        first_name="Some", last_name="Guy", email="someguy@cnn.com", a_choice=1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1444,19 +1444,19 @@ def test_connection_should_limit_after_to_list_length():
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
    after = base64.b64encode(b"arrayconnection:10").decode()
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(after=after))
 | 
			
		||||
    result = schema.execute(query, variable_values={"after": after})
 | 
			
		||||
    expected = {"allReporters": {"edges": []}}
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    assert result.data == expected
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
REPORTERS = [
 | 
			
		||||
    dict(
 | 
			
		||||
        first_name=f"First {i}",
 | 
			
		||||
        last_name=f"Last {i}",
 | 
			
		||||
        email=f"johndoe+{i}@example.com",
 | 
			
		||||
        a_choice=1,
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        "first_name": f"First {i}",
 | 
			
		||||
        "last_name": f"Last {i}",
 | 
			
		||||
        "email": f"johndoe+{i}@example.com",
 | 
			
		||||
        "a_choice": 1,
 | 
			
		||||
    }
 | 
			
		||||
    for i in range(6)
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1531,7 +1531,7 @@ def test_should_have_next_page(graphene_settings):
 | 
			
		|||
    assert result.data["allReporters"]["pageInfo"]["hasNextPage"]
 | 
			
		||||
 | 
			
		||||
    last_result = result.data["allReporters"]["pageInfo"]["endCursor"]
 | 
			
		||||
    result2 = schema.execute(query, variable_values=dict(first=4, after=last_result))
 | 
			
		||||
    result2 = schema.execute(query, variable_values={"first": 4, "after": last_result})
 | 
			
		||||
    assert not result2.errors
 | 
			
		||||
    assert len(result2.data["allReporters"]["edges"]) == 2
 | 
			
		||||
    assert not result2.data["allReporters"]["pageInfo"]["hasNextPage"]
 | 
			
		||||
| 
						 | 
				
			
			@ -1622,7 +1622,7 @@ class TestBackwardPagination:
 | 
			
		|||
        after = base64.b64encode(b"arrayconnection:0").decode()
 | 
			
		||||
        result = schema.execute(
 | 
			
		||||
            query_first_last_and_after,
 | 
			
		||||
            variable_values=dict(after=after),
 | 
			
		||||
            variable_values={"after": after},
 | 
			
		||||
        )
 | 
			
		||||
        assert not result.errors
 | 
			
		||||
        assert len(result.data["allReporters"]["edges"]) == 3
 | 
			
		||||
| 
						 | 
				
			
			@ -1654,7 +1654,7 @@ class TestBackwardPagination:
 | 
			
		|||
        before = base64.b64encode(b"arrayconnection:5").decode()
 | 
			
		||||
        result = schema.execute(
 | 
			
		||||
            query_first_last_and_after,
 | 
			
		||||
            variable_values=dict(before=before),
 | 
			
		||||
            variable_values={"before": before},
 | 
			
		||||
        )
 | 
			
		||||
        assert not result.errors
 | 
			
		||||
        assert len(result.data["allReporters"]["edges"]) == 1
 | 
			
		||||
| 
						 | 
				
			
			@ -1710,7 +1710,7 @@ def test_should_preserve_prefetch_related(django_assert_num_queries):
 | 
			
		|||
    """
 | 
			
		||||
    schema = graphene.Schema(query=Query)
 | 
			
		||||
 | 
			
		||||
    with django_assert_num_queries(3) as captured:
 | 
			
		||||
    with django_assert_num_queries(3):
 | 
			
		||||
        result = schema.execute(query)
 | 
			
		||||
        assert not result.errors
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1877,7 +1877,7 @@ def test_connection_should_forbid_offset_filtering_with_before():
 | 
			
		|||
        }
 | 
			
		||||
    """
 | 
			
		||||
    before = base64.b64encode(b"arrayconnection:2").decode()
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(before=before))
 | 
			
		||||
    result = schema.execute(query, variable_values={"before": before})
 | 
			
		||||
    expected_error = "You can't provide a `before` value at the same time as an `offset` value to properly paginate the `allReporters` connection."
 | 
			
		||||
    assert len(result.errors) == 1
 | 
			
		||||
    assert result.errors[0].message == expected_error
 | 
			
		||||
| 
						 | 
				
			
			@ -1913,7 +1913,7 @@ def test_connection_should_allow_offset_filtering_with_after():
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
    after = base64.b64encode(b"arrayconnection:0").decode()
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(after=after))
 | 
			
		||||
    result = schema.execute(query, variable_values={"after": after})
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    expected = {
 | 
			
		||||
        "allReporters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -1949,7 +1949,7 @@ def test_connection_should_succeed_if_last_higher_than_number_of_objects():
 | 
			
		|||
        }
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(last=2))
 | 
			
		||||
    result = schema.execute(query, variable_values={"last": 2})
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    expected = {"allReporters": {"edges": []}}
 | 
			
		||||
    assert result.data == expected
 | 
			
		||||
| 
						 | 
				
			
			@ -1959,7 +1959,7 @@ def test_connection_should_succeed_if_last_higher_than_number_of_objects():
 | 
			
		|||
    Reporter.objects.create(first_name="Jane", last_name="Roe")
 | 
			
		||||
    Reporter.objects.create(first_name="Some", last_name="Lady")
 | 
			
		||||
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(last=2))
 | 
			
		||||
    result = schema.execute(query, variable_values={"last": 2})
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    expected = {
 | 
			
		||||
        "allReporters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -1971,7 +1971,7 @@ def test_connection_should_succeed_if_last_higher_than_number_of_objects():
 | 
			
		|||
    }
 | 
			
		||||
    assert result.data == expected
 | 
			
		||||
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(last=4))
 | 
			
		||||
    result = schema.execute(query, variable_values={"last": 4})
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    expected = {
 | 
			
		||||
        "allReporters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -1985,7 +1985,7 @@ def test_connection_should_succeed_if_last_higher_than_number_of_objects():
 | 
			
		|||
    }
 | 
			
		||||
    assert result.data == expected
 | 
			
		||||
 | 
			
		||||
    result = schema.execute(query, variable_values=dict(last=20))
 | 
			
		||||
    result = schema.execute(query, variable_values={"last": 20})
 | 
			
		||||
    assert not result.errors
 | 
			
		||||
    expected = {
 | 
			
		||||
        "allReporters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -2022,7 +2022,7 @@ def test_should_query_nullable_foreign_key():
 | 
			
		|||
    schema = graphene.Schema(query=Query)
 | 
			
		||||
 | 
			
		||||
    person = Person.objects.create(name="Jane")
 | 
			
		||||
    pets = [
 | 
			
		||||
    [
 | 
			
		||||
        Pet.objects.create(name="Stray dog", age=1),
 | 
			
		||||
        Pet.objects.create(name="Jane's dog", owner=person, age=1),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
from collections import OrderedDict, defaultdict
 | 
			
		||||
from textwrap import dedent
 | 
			
		||||
from unittest.mock import patch
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.db import models
 | 
			
		||||
from unittest.mock import patch
 | 
			
		||||
 | 
			
		||||
from graphene import Connection, Field, Interface, ObjectType, Schema, String
 | 
			
		||||
from graphene.relay import Node
 | 
			
		||||
| 
						 | 
				
			
			@ -11,8 +11,10 @@ from graphene.relay import Node
 | 
			
		|||
from .. import registry
 | 
			
		||||
from ..filter import DjangoFilterConnectionField
 | 
			
		||||
from ..types import DjangoObjectType, DjangoObjectTypeOptions
 | 
			
		||||
from .models import Article as ArticleModel
 | 
			
		||||
from .models import Reporter as ReporterModel
 | 
			
		||||
from .models import (
 | 
			
		||||
    Article as ArticleModel,
 | 
			
		||||
    Reporter as ReporterModel,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Reporter(DjangoObjectType):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,12 @@
 | 
			
		|||
import json
 | 
			
		||||
from unittest.mock import patch
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.utils.translation import gettext_lazy
 | 
			
		||||
from unittest.mock import patch
 | 
			
		||||
 | 
			
		||||
from ..utils import camelize, get_model_fields, get_reverse_fields, GraphQLTestCase
 | 
			
		||||
from .models import Film, Reporter, CNNReporter, APNewsReporter
 | 
			
		||||
from ..utils import GraphQLTestCase, camelize, get_model_fields, get_reverse_fields
 | 
			
		||||
from ..utils.testing import graphql_query
 | 
			
		||||
from .models import APNewsReporter, CNNReporter, Film, Reporter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_get_model_fields_no_duplication():
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,9 @@
 | 
			
		|||
import json
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from unittest.mock import patch
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from django.db import connection
 | 
			
		||||
 | 
			
		||||
from graphene_django.settings import graphene_settings
 | 
			
		||||
 | 
			
		||||
from .models import Pet
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +27,12 @@ def response_json(response):
 | 
			
		|||
    return json.loads(response.content.decode())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
j = lambda **kwargs: json.dumps(kwargs)
 | 
			
		||||
jl = lambda **kwargs: json.dumps([kwargs])
 | 
			
		||||
def j(**kwargs):
 | 
			
		||||
    return json.dumps(kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def jl(**kwargs):
 | 
			
		||||
    return json.dumps([kwargs])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_graphiql_is_enabled(client):
 | 
			
		||||
| 
						 | 
				
			
			@ -229,7 +229,7 @@ def test_allows_sending_a_mutation_via_post(client):
 | 
			
		|||
def test_allows_post_with_url_encoding(client):
 | 
			
		||||
    response = client.post(
 | 
			
		||||
        url_string(),
 | 
			
		||||
        urlencode(dict(query="{test}")),
 | 
			
		||||
        urlencode({"query": "{test}"}),
 | 
			
		||||
        "application/x-www-form-urlencoded",
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -303,10 +303,10 @@ def test_supports_post_url_encoded_query_with_string_variables(client):
 | 
			
		|||
    response = client.post(
 | 
			
		||||
        url_string(),
 | 
			
		||||
        urlencode(
 | 
			
		||||
            dict(
 | 
			
		||||
                query="query helloWho($who: String){ test(who: $who) }",
 | 
			
		||||
                variables=json.dumps({"who": "Dolly"}),
 | 
			
		||||
            )
 | 
			
		||||
            {
 | 
			
		||||
                "query": "query helloWho($who: String){ test(who: $who) }",
 | 
			
		||||
                "variables": json.dumps({"who": "Dolly"}),
 | 
			
		||||
            }
 | 
			
		||||
        ),
 | 
			
		||||
        "application/x-www-form-urlencoded",
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			@ -329,7 +329,7 @@ def test_supports_post_json_quey_with_get_variable_values(client):
 | 
			
		|||
def test_post_url_encoded_query_with_get_variable_values(client):
 | 
			
		||||
    response = client.post(
 | 
			
		||||
        url_string(variables=json.dumps({"who": "Dolly"})),
 | 
			
		||||
        urlencode(dict(query="query helloWho($who: String){ test(who: $who) }")),
 | 
			
		||||
        urlencode({"query": "query helloWho($who: String){ test(who: $who) }"}),
 | 
			
		||||
        "application/x-www-form-urlencoded",
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -511,7 +511,7 @@ def test_handles_django_request_error(client, monkeypatch):
 | 
			
		|||
 | 
			
		||||
    monkeypatch.setattr("django.http.request.HttpRequest.read", mocked_read)
 | 
			
		||||
 | 
			
		||||
    valid_json = json.dumps(dict(foo="bar"))
 | 
			
		||||
    valid_json = json.dumps({"foo": "bar"})
 | 
			
		||||
    response = client.post(url_string(), valid_json, "application/json")
 | 
			
		||||
 | 
			
		||||
    assert response.status_code == 400
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
import warnings
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
from typing import Type
 | 
			
		||||
from typing import Type  # noqa: F401
 | 
			
		||||
 | 
			
		||||
from django.db.models import Model  # noqa: F401
 | 
			
		||||
 | 
			
		||||
import graphene
 | 
			
		||||
from django.db.models import Model
 | 
			
		||||
from graphene.relay import Connection, Node
 | 
			
		||||
from graphene.types.objecttype import ObjectType, ObjectTypeOptions
 | 
			
		||||
from graphene.types.utils import yank_fields_from_attrs
 | 
			
		||||
| 
						 | 
				
			
			@ -149,7 +150,7 @@ class DjangoObjectType(ObjectType):
 | 
			
		|||
        interfaces=(),
 | 
			
		||||
        convert_choices_to_enum=True,
 | 
			
		||||
        _meta=None,
 | 
			
		||||
        **options
 | 
			
		||||
        **options,
 | 
			
		||||
    ):
 | 
			
		||||
        assert is_valid_django_model(model), (
 | 
			
		||||
            'You need to pass a valid Django Model in {}.Meta, received "{}".'
 | 
			
		||||
| 
						 | 
				
			
			@ -239,9 +240,9 @@ class DjangoObjectType(ObjectType):
 | 
			
		|||
            )
 | 
			
		||||
 | 
			
		||||
        if connection is not None:
 | 
			
		||||
            assert issubclass(connection, Connection), (
 | 
			
		||||
                "The connection must be a Connection. Received {}"
 | 
			
		||||
            ).format(connection.__name__)
 | 
			
		||||
            assert issubclass(
 | 
			
		||||
                connection, Connection
 | 
			
		||||
            ), f"The connection must be a Connection. Received {connection.__name__}"
 | 
			
		||||
 | 
			
		||||
        if not _meta:
 | 
			
		||||
            _meta = DjangoObjectTypeOptions(cls)
 | 
			
		||||
| 
						 | 
				
			
			@ -272,7 +273,7 @@ class DjangoObjectType(ObjectType):
 | 
			
		|||
        if isinstance(root, cls):
 | 
			
		||||
            return True
 | 
			
		||||
        if not is_valid_django_model(root.__class__):
 | 
			
		||||
            raise Exception(('Received incompatible instance "{}".').format(root))
 | 
			
		||||
            raise Exception(f'Received incompatible instance "{root}".')
 | 
			
		||||
 | 
			
		||||
        if cls._meta.model._meta.proxy:
 | 
			
		||||
            model = root._meta.model
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,12 @@
 | 
			
		|||
from .testing import GraphQLTestCase
 | 
			
		||||
from .utils import (
 | 
			
		||||
    DJANGO_FILTER_INSTALLED,
 | 
			
		||||
    bypass_get_queryset,
 | 
			
		||||
    camelize,
 | 
			
		||||
    get_model_fields,
 | 
			
		||||
    get_reverse_fields,
 | 
			
		||||
    is_valid_django_model,
 | 
			
		||||
    maybe_queryset,
 | 
			
		||||
    bypass_get_queryset,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
__all__ = [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from text_unidecode import unidecode
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
import pytest
 | 
			
		||||
 | 
			
		||||
from .. import GraphQLTestCase
 | 
			
		||||
from ...tests.test_types import with_local_registry
 | 
			
		||||
from ...settings import graphene_settings
 | 
			
		||||
from django.test import Client
 | 
			
		||||
 | 
			
		||||
from ...settings import graphene_settings
 | 
			
		||||
from ...tests.test_types import with_local_registry
 | 
			
		||||
from .. import GraphQLTestCase
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@with_local_registry
 | 
			
		||||
def test_graphql_test_case_deprecated_client_getter():
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ def test_graphql_test_case_deprecated_client_getter():
 | 
			
		|||
    tc.setUpClass()
 | 
			
		||||
 | 
			
		||||
    with pytest.warns(PendingDeprecationWarning):
 | 
			
		||||
        tc._client
 | 
			
		||||
        tc._client  # noqa: B018
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@with_local_registry
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,10 +12,9 @@ from django.views.generic import View
 | 
			
		|||
from graphql import OperationType, get_operation_ast, parse
 | 
			
		||||
from graphql.error import GraphQLError
 | 
			
		||||
from graphql.execution import ExecutionResult
 | 
			
		||||
 | 
			
		||||
from graphene import Schema
 | 
			
		||||
from graphql.execution.middleware import MiddlewareManager
 | 
			
		||||
 | 
			
		||||
from graphene import Schema
 | 
			
		||||
from graphene_django.constants import MUTATION_ERRORS_FLAG
 | 
			
		||||
from graphene_django.utils.utils import set_rollback
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,9 +39,9 @@ def get_accepted_content_types(request):
 | 
			
		|||
 | 
			
		||||
    raw_content_types = request.META.get("HTTP_ACCEPT", "*/*").split(",")
 | 
			
		||||
    qualified_content_types = map(qualify, raw_content_types)
 | 
			
		||||
    return list(
 | 
			
		||||
    return [
 | 
			
		||||
        x[0] for x in sorted(qualified_content_types, key=lambda x: x[1], reverse=True)
 | 
			
		||||
    )
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def instantiate_middleware(middlewares):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								setup.cfg
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								setup.cfg
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -4,46 +4,9 @@ test=pytest
 | 
			
		|||
[bdist_wheel]
 | 
			
		||||
universal=1
 | 
			
		||||
 | 
			
		||||
[flake8]
 | 
			
		||||
exclude = docs,graphene_django/debug/sql/*
 | 
			
		||||
max-line-length = 120
 | 
			
		||||
select =
 | 
			
		||||
	# Dictionary key repeated
 | 
			
		||||
	F601,
 | 
			
		||||
	# Ensure use of ==/!= to compare with str, bytes and int literals
 | 
			
		||||
	F632,
 | 
			
		||||
	# Redefinition of unused name
 | 
			
		||||
	F811,
 | 
			
		||||
	# Using an undefined variable
 | 
			
		||||
	F821,
 | 
			
		||||
	# Defining an undefined variable in __all__
 | 
			
		||||
	F822,
 | 
			
		||||
	# Using a variable before it is assigned
 | 
			
		||||
	F823,
 | 
			
		||||
	# Duplicate argument in function declaration
 | 
			
		||||
	F831,
 | 
			
		||||
	# Black would format this line
 | 
			
		||||
	BLK,
 | 
			
		||||
	# Do not use bare except
 | 
			
		||||
	B001,
 | 
			
		||||
	# Don't allow ++n. You probably meant n += 1
 | 
			
		||||
	B002,
 | 
			
		||||
	# Do not use mutable structures for argument defaults
 | 
			
		||||
	B006,
 | 
			
		||||
	# Do not perform calls in argument defaults
 | 
			
		||||
	B008
 | 
			
		||||
 | 
			
		||||
[coverage:run]
 | 
			
		||||
omit = */tests/*
 | 
			
		||||
 | 
			
		||||
[isort]
 | 
			
		||||
known_first_party=graphene,graphene_django
 | 
			
		||||
multi_line_output=3
 | 
			
		||||
include_trailing_comma=True
 | 
			
		||||
force_grid_wrap=0
 | 
			
		||||
use_parentheses=True
 | 
			
		||||
line_length=88
 | 
			
		||||
 | 
			
		||||
[tool:pytest]
 | 
			
		||||
DJANGO_SETTINGS_MODULE = examples.django_test_settings
 | 
			
		||||
addopts = --random-order
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user