From 0051161aeb68df1a1b4308d7459c693f720fc60f Mon Sep 17 00:00:00 2001 From: Nick Krichevsky Date: Mon, 10 Jul 2023 12:41:57 -0400 Subject: [PATCH] Add black and isort, run on codebase --- .pre-commit-config.yaml | 15 +++ poetry.lock | 106 +++++++++++++++- printpub/asgi.py | 2 +- printpub/urls.py | 3 +- printpub/user/migrations/0001_initial.py | 117 +++++++++++++++--- .../0002_poster_localuser_poster.py | 2 +- .../migrations/0003_alter_localuser_poster.py | 2 +- printpub/user/models/local_user.py | 3 +- printpub/user/serializers/webfinger_user.py | 1 + printpub/user/urls.py | 1 + printpub/user/views/webfinger.py | 8 +- printpub/wsgi.py | 2 +- pyproject.toml | 2 + tests/user/serializers/webfinger_user_test.py | 3 +- tests/user/views/webfinger_test.py | 2 +- 15 files changed, 233 insertions(+), 36 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..2f7acb4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.4.1 + hooks: + - id: mypy + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + language_version: python3.11 + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) diff --git a/poetry.lock b/poetry.lock index a1f7b12..a231cb3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,6 +14,53 @@ files = [ [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] +[[package]] +name = "black" +version = "23.3.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "certifi" version = "2023.5.7" @@ -109,6 +156,20 @@ files = [ {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] +[[package]] +name = "click" +version = "8.1.4" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, + {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -244,6 +305,23 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + [[package]] name = "markdown" version = "3.4.3" @@ -325,6 +403,32 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "platformdirs" +version = "3.8.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"}, + {file = "platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + [[package]] name = "pluggy" version = "1.2.0" @@ -515,4 +619,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "b2a14e86dc1ca74b4dcab8034a57eb9c51e44d487bdf531261765e9759921ac0" +content-hash = "0a16ad0f92790fe69f796b4b8b8915acf0f4a741c89a7ae494282304fefd3a11" diff --git a/printpub/asgi.py b/printpub/asgi.py index 6db60ac..d85f361 100644 --- a/printpub/asgi.py +++ b/printpub/asgi.py @@ -11,6 +11,6 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'printpub.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "printpub.settings") application = get_asgi_application() diff --git a/printpub/urls.py b/printpub/urls.py index 12cd421..a9cff16 100644 --- a/printpub/urls.py +++ b/printpub/urls.py @@ -15,7 +15,8 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path, include +from django.urls import include, path + import printpub.user.urls urlpatterns = [ diff --git a/printpub/user/migrations/0001_initial.py b/printpub/user/migrations/0001_initial.py index 91a785a..cfec772 100644 --- a/printpub/user/migrations/0001_initial.py +++ b/printpub/user/migrations/0001_initial.py @@ -2,42 +2,119 @@ import django.contrib.auth.models import django.contrib.auth.validators -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): - initial = True dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), + ("auth", "0012_alter_user_first_name_max_length"), ] operations = [ migrations.CreateModel( - name='LocalUser', + name="LocalUser", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('display_name', models.CharField(max_length=128)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, verbose_name="email address" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ("display_name", models.CharField(max_length=128)), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), ], options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, }, managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ("objects", django.contrib.auth.models.UserManager()), ], ), ] diff --git a/printpub/user/migrations/0002_poster_localuser_poster.py b/printpub/user/migrations/0002_poster_localuser_poster.py index 0be6755..696fafa 100644 --- a/printpub/user/migrations/0002_poster_localuser_poster.py +++ b/printpub/user/migrations/0002_poster_localuser_poster.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.3 on 2023-07-07 21:27 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/printpub/user/migrations/0003_alter_localuser_poster.py b/printpub/user/migrations/0003_alter_localuser_poster.py index 43c2806..776ee0b 100644 --- a/printpub/user/migrations/0003_alter_localuser_poster.py +++ b/printpub/user/migrations/0003_alter_localuser_poster.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.3 on 2023-07-07 21:27 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models def create_poster_for_user(apps, _schema_editor): diff --git a/printpub/user/models/local_user.py b/printpub/user/models/local_user.py index 401c2b2..a9eb1b9 100644 --- a/printpub/user/models/local_user.py +++ b/printpub/user/models/local_user.py @@ -1,6 +1,5 @@ -from django.db import models from django.contrib.auth import models as auth_models - +from django.db import models from . import poster diff --git a/printpub/user/serializers/webfinger_user.py b/printpub/user/serializers/webfinger_user.py index ba58c37..68924a6 100644 --- a/printpub/user/serializers/webfinger_user.py +++ b/printpub/user/serializers/webfinger_user.py @@ -1,4 +1,5 @@ from rest_framework import serializers + from printpub.user import models DOMAIN_REQUIRED_MESSAGE = ( diff --git a/printpub/user/urls.py b/printpub/user/urls.py index 49093eb..76ad0b0 100644 --- a/printpub/user/urls.py +++ b/printpub/user/urls.py @@ -1,4 +1,5 @@ from django.urls import path + from printpub.user import views urlpatterns = [path(".well-known/webfinger", views.WebFinger.as_view())] diff --git a/printpub/user/views/webfinger.py b/printpub/user/views/webfinger.py index 7ce8e89..b6a5996 100644 --- a/printpub/user/views/webfinger.py +++ b/printpub/user/views/webfinger.py @@ -1,15 +1,13 @@ import re +from typing import Optional import django.contrib.sites.shortcuts as django_sites -import rest_framework.views import rest_framework.request import rest_framework.response import rest_framework.status +import rest_framework.views -from printpub.user import models -from printpub.user import serializers - -from typing import Optional +from printpub.user import models, serializers class WebFinger(rest_framework.views.APIView): diff --git a/printpub/wsgi.py b/printpub/wsgi.py index 3c370a9..340dbbf 100644 --- a/printpub/wsgi.py +++ b/printpub/wsgi.py @@ -11,6 +11,6 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'printpub.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "printpub.settings") application = get_wsgi_application() diff --git a/pyproject.toml b/pyproject.toml index b17e92a..5c20565 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,8 @@ pytest = "^7.4.0" mypy = "^1.4.1" djangorestframework-stubs = {extras = ["compatible-mypy"], version = "^3.14.2"} django-stubs = {extras = ["compatible-mypy"], version = "^4.2.3"} +black = "^23.3.0" +isort = "^5.12.0" [build-system] requires = ["poetry-core"] diff --git a/tests/user/serializers/webfinger_user_test.py b/tests/user/serializers/webfinger_user_test.py index 29e8f38..c512531 100644 --- a/tests/user/serializers/webfinger_user_test.py +++ b/tests/user/serializers/webfinger_user_test.py @@ -1,7 +1,6 @@ import unittest.mock -from printpub.user import models -from printpub.user import serializers +from printpub.user import models, serializers def test_serializes_user_with_no_links(): diff --git a/tests/user/views/webfinger_test.py b/tests/user/views/webfinger_test.py index af27822..1f86062 100644 --- a/tests/user/views/webfinger_test.py +++ b/tests/user/views/webfinger_test.py @@ -1,8 +1,8 @@ import unittest.mock import django.contrib.sites.models -import rest_framework.test import rest_framework.response +import rest_framework.test from printpub.user import models