diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14da2e8..52e9b54 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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 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] diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..aa08a7b --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,20 @@ +select = [ + "E", # pycodestyle + "W", # pycodestyle + "F", # pyflake +] + +ignore = [ + "E501", # line-too-long +] + +exclude = [ + "**/docs", +] + +target-version = "py38" + +[per-file-ignores] +# Ignore unused imports (F401) in these files +"__init__.py" = ["F401"] +"graphene_django/compat.py" = ["F401"] diff --git a/examples/cookbook/cookbook/recipes/models.py b/examples/cookbook/cookbook/recipes/models.py index 0bfb434..03da594 100644 --- a/examples/cookbook/cookbook/recipes/models.py +++ b/examples/cookbook/cookbook/recipes/models.py @@ -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): diff --git a/graphene_django/debug/middleware.py b/graphene_django/debug/middleware.py index d3052a1..8c7df6c 100644 --- a/graphene_django/debug/middleware.py +++ b/graphene_django/debug/middleware.py @@ -1,6 +1,5 @@ from django.db import connections -from promise import Promise from .sql.tracking import unwrap_cursor, wrap_cursor from .exception.formating import wrap_exception diff --git a/graphene_django/filter/tests/conftest.py b/graphene_django/filter/tests/conftest.py index f8a65d7..2669c3d 100644 --- a/graphene_django/filter/tests/conftest.py +++ b/graphene_django/filter/tests/conftest.py @@ -3,13 +3,12 @@ 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.utils import DJANGO_FILTER_INSTALLED -from graphene_django.filter import ArrayFilter, ListFilter +from graphene_django.filter import ArrayFilter from ...compat import ArrayField diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index bee3c6c..7c0fd3b 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -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, diff --git a/graphene_django/filter/tests/test_range_filter.py b/graphene_django/filter/tests/test_range_filter.py index 6227a70..6c770f1 100644 --- a/graphene_django/filter/tests/test_range_filter.py +++ b/graphene_django/filter/tests/test_range_filter.py @@ -1,8 +1,6 @@ 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 diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py index ebd2a00..b48d317 100644 --- a/graphene_django/filter/utils.py +++ b/graphene_django/filter/utils.py @@ -1,8 +1,7 @@ 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 django_filters.utils import get_model_field +from .filters import ListFilter, RangeFilter, TypedFilter from .filterset import custom_filterset_factory, setup_filterset from ..forms import GlobalIDFormField, GlobalIDMultipleChoiceField @@ -50,7 +49,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) + graphene.Boolean(required=required) else: model_field = get_model_field(model, filter_field.field_name) diff --git a/graphene_django/forms/tests/test_converter.py b/graphene_django/forms/tests/test_converter.py index b61227b..f094f85 100644 --- a/graphene_django/forms/tests/test_converter.py +++ b/graphene_django/forms/tests/test_converter.py @@ -1,7 +1,6 @@ from django import forms from pytest import raises -import graphene from graphene import ( String, Int, diff --git a/graphene_django/forms/tests/test_mutation.py b/graphene_django/forms/tests/test_mutation.py index 14c407c..d71328d 100644 --- a/graphene_django/forms/tests/test_mutation.py +++ b/graphene_django/forms/tests/test_mutation.py @@ -1,4 +1,3 @@ -import pytest from django import forms from django.core.exceptions import ValidationError from pytest import raises diff --git a/graphene_django/rest_framework/tests/test_field_converter.py b/graphene_django/rest_framework/tests/test_field_converter.py index 8da8377..92ddb9e 100644 --- a/graphene_django/rest_framework/tests/test_field_converter.py +++ b/graphene_django/rest_framework/tests/test_field_converter.py @@ -2,7 +2,6 @@ import copy import graphene from django.db import models -from graphene import InputObjectType from pytest import raises from rest_framework import serializers diff --git a/graphene_django/rest_framework/tests/test_mutation.py b/graphene_django/rest_framework/tests/test_mutation.py index 98cd11d..fc44e19 100644 --- a/graphene_django/rest_framework/tests/test_mutation.py +++ b/graphene_django/rest_framework/tests/test_mutation.py @@ -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"} ) diff --git a/graphene_django/tests/issues/test_520.py b/graphene_django/tests/issues/test_520.py index 4e55f96..2aed351 100644 --- a/graphene_django/tests/issues/test_520.py +++ b/graphene_django/tests/issues/test_520.py @@ -1,18 +1,12 @@ # https://github.com/graphql-python/graphene-django/issues/520 -import datetime from django import forms 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 ...rest_framework.models import MyFakeModel from ...rest_framework.mutation import SerializerMutation from ...forms.mutation import DjangoFormMutation diff --git a/graphene_django/tests/test_fields.py b/graphene_django/tests/test_fields.py index 8c7b78d..33b565a 100644 --- a/graphene_django/tests/test_fields.py +++ b/graphene_django/tests/test_fields.py @@ -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") diff --git a/graphene_django/tests/test_get_queryset.py b/graphene_django/tests/test_get_queryset.py index 99f50c7..cd1121f 100644 --- a/graphene_django/tests/test_get_queryset.py +++ b/graphene_django/tests/test_get_queryset.py @@ -5,7 +5,6 @@ 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 diff --git a/graphene_django/tests/test_query.py b/graphene_django/tests/test_query.py index 91bacbd..4a75a88 100644 --- a/graphene_django/tests/test_query.py +++ b/graphene_django/tests/test_query.py @@ -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 ) @@ -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 @@ -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), ] diff --git a/graphene_django/tests/test_views.py b/graphene_django/tests/test_views.py index 5cadefe..dcbd739 100644 --- a/graphene_django/tests/test_views.py +++ b/graphene_django/tests/test_views.py @@ -6,7 +6,6 @@ from unittest.mock import patch from django.db import connection -from graphene_django.settings import graphene_settings from .models import Pet @@ -31,8 +30,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): diff --git a/graphene_django/types.py b/graphene_django/types.py index dec8723..5597e27 100644 --- a/graphene_django/types.py +++ b/graphene_django/types.py @@ -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