From 8943a02d4d3721408dd3952ecce7b4fde429938d Mon Sep 17 00:00:00 2001 From: David Paul Graham Date: Thu, 3 Oct 2024 21:31:03 -0400 Subject: [PATCH 1/4] modify ruff configs to ignore migrations for linting and formatting --- server/haztrak/__init__.py | 1 + server/pyproject.toml | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/server/haztrak/__init__.py b/server/haztrak/__init__.py index 073dcd237..9f1df37a3 100644 --- a/server/haztrak/__init__.py +++ b/server/haztrak/__init__.py @@ -1,6 +1,7 @@ """ Haztrak application level settings. """ + from .celery import app as celery_app __all__ = ("celery_app",) diff --git a/server/pyproject.toml b/server/pyproject.toml index 931731744..f64a98264 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -25,11 +25,26 @@ repository = "https://github.com/USEPA/haztrak" [tool.ruff] line-length = 99 +exclude = [ + "**/migrations/*.py", + ".venv", + ".eggs", + ".git", + ".mypy_cache", + ".pytest_cache", + ".ruff_cache", + ".venv", + ".vscode", + "__pypackages__", + "dist", + "node_modules", + "site-packages", + "venv", +] [tool.ruff.lint] select = ["F", "E", "W", "Q", "I001"] ignore = ["F401"] -exclude = ["**/migrations/*.py"] [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "haztrak.settings.test" From 771c69d89c1182cfc4847d3428fe11907c3beef1 Mon Sep 17 00:00:00 2001 From: David Paul Graham Date: Thu, 3 Oct 2024 22:36:23 -0400 Subject: [PATCH 2/4] implement ruff based workflow to check all python files are linted and formatted --- .github/workflows/lint_server.yaml | 31 ++++++++++++++++++++++++++++++ .pre-commit-config.yaml | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/lint_server.yaml diff --git a/.github/workflows/lint_server.yaml b/.github/workflows/lint_server.yaml new file mode 100644 index 000000000..0f2980633 --- /dev/null +++ b/.github/workflows/lint_server.yaml @@ -0,0 +1,31 @@ +name: Lint Python files +on: + pull_request: + paths: + - "server/**" + - ".github/workflows/*" + push: + paths: + - "server/**" + - ".github/workflows/*" + workflow_call: + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./server + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install -r requirements_dev.txt + - name: Lint Python files + run: | + ruff check . -e + - name: Format Python files + run: | + ruff format . --check diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 67b93ea91..87ed53372 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,7 +26,7 @@ repos: rev: v0.5.6 hooks: - id: ruff - args: [--fix, --exit-non-zero-on-fix, --config, ./server/pyproject.toml] + args: [--fix, --config, ./server/pyproject.toml] - id: ruff-format args: [--config, ./server/pyproject.toml] # Check django migrations From c21aec2aff35c7a94fd5fa4391dad2355e914bc3 Mon Sep 17 00:00:00 2001 From: David Paul Graham Date: Thu, 3 Oct 2024 22:47:26 -0400 Subject: [PATCH 3/4] upgrade ruff pre-commit hook version --- .pre-commit-config.yaml | 2 +- server/conftest.py | 9 ++++----- server/core/management/commands/celery_beat.py | 1 - server/core/services/rcrainfo_service.py | 1 - server/core/tests/conftest.py | 1 - server/manifest/services/manifest.py | 2 +- server/manifest/tasks.py | 6 ++++-- server/org/serializers.py | 2 +- server/org/tests/conftest.py | 2 +- server/profile/tests/conftest.py | 3 +-- server/pyproject.toml | 2 +- server/rcrasite/admin.py | 2 +- server/rcrasite/services/rcra_site.py | 2 +- server/rcrasite/services/rcra_site_search.py | 3 +-- server/rcrasite/tests/test_site_search.py | 2 +- server/wasteline/tests/conftest.py | 2 +- 16 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 87ed53372..11856edc8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: exclude: (?x)^(\.idea\/.*|\.vscode\/.*)$ # Ruff - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.5.6 + rev: v0.6.8 hooks: - id: ruff args: [--fix, --config, ./server/pyproject.toml] diff --git a/server/conftest.py b/server/conftest.py index 39195cb52..5f5775c2d 100644 --- a/server/conftest.py +++ b/server/conftest.py @@ -10,16 +10,14 @@ import pytest import pytest_mock import responses +from core.models import ( + TrakUser, +) from django.contrib.auth.models import User from django.db import IntegrityError from faker import Faker from faker.providers import BaseProvider from guardian.shortcuts import assign_perm -from rest_framework.test import APIClient - -from core.models import ( - TrakUser, -) from org.models import Org, Site from rcrasite.models import ( Address, @@ -27,6 +25,7 @@ RcraPhone, RcraSite, ) +from rest_framework.test import APIClient class SiteIDProvider(BaseProvider): diff --git a/server/core/management/commands/celery_beat.py b/server/core/management/commands/celery_beat.py index 651909eb8..433598482 100644 --- a/server/core/management/commands/celery_beat.py +++ b/server/core/management/commands/celery_beat.py @@ -7,7 +7,6 @@ from django.core.management.base import BaseCommand from django.utils import autoreload from django_celery_beat.models import CrontabSchedule, IntervalSchedule, PeriodicTask - from wasteline.tasks import pull_federal_codes CELERY_LOG_LEVEL = os.getenv("CELERY_LOG_LEVEL", "INFO") diff --git a/server/core/services/rcrainfo_service.py b/server/core/services/rcrainfo_service.py index 4d6b35004..ee5475b7d 100644 --- a/server/core/services/rcrainfo_service.py +++ b/server/core/services/rcrainfo_service.py @@ -5,7 +5,6 @@ import emanifest from django.db import IntegrityError from emanifest import RcrainfoClient, RcrainfoResponse - from org.models import Org from wasteline.models import WasteCode diff --git a/server/core/tests/conftest.py b/server/core/tests/conftest.py index e5a7b04cf..7464656ca 100644 --- a/server/core/tests/conftest.py +++ b/server/core/tests/conftest.py @@ -3,7 +3,6 @@ import pytest from faker import Faker - from rcrasite.models import RcraSiteType diff --git a/server/manifest/services/manifest.py b/server/manifest/services/manifest.py index 4908d565c..81c155b0f 100644 --- a/server/manifest/services/manifest.py +++ b/server/manifest/services/manifest.py @@ -3,11 +3,11 @@ from django.db import transaction from django.db.models import Q, QuerySet +from org.models import Site from manifest.models import Manifest from manifest.services import EManifest, EManifestError, TaskResponse from manifest.tasks import save_to_emanifest as save_to_emanifest_task -from org.models import Site logger = logging.getLogger(__name__) diff --git a/server/manifest/tasks.py b/server/manifest/tasks.py index 5e022ff83..0a0590e4d 100644 --- a/server/manifest/tasks.py +++ b/server/manifest/tasks.py @@ -3,7 +3,6 @@ from celery import Task, shared_task, states from celery.exceptions import Ignore, Reject - from core.services import get_rcra_client logger = logging.getLogger(__name__) @@ -16,6 +15,7 @@ def pull_manifest(self: Task, *, mtn: List[str], username: str) -> dict: """ from core.services import TaskService + from manifest.services import EManifest logger.info(f"start task {self.name}, manifest {mtn}") @@ -60,9 +60,10 @@ def sign_manifest( def sync_site_manifests(self, *, site_id: str, username: str): """asynchronous task to sync an EPA site's manifests""" - from manifest.services.emanifest import sync_manifests from org.services import get_user_site, update_emanifest_sync_date + from manifest.services.emanifest import sync_manifests + try: client = get_rcra_client(username=username) site = get_user_site(username=username, epa_id=site_id) @@ -85,6 +86,7 @@ def save_to_emanifest(self, *, manifest_data: dict, username: str): user who is creating the manifest """ from core.services import TaskService + from manifest.services import EManifest, EManifestError logger.info(f"start task: {self.name}") diff --git a/server/org/serializers.py b/server/org/serializers.py index 2ffdfe41f..abe1a435e 100644 --- a/server/org/serializers.py +++ b/server/org/serializers.py @@ -1,8 +1,8 @@ +from rcrasite.serializers import RcraSiteSerializer from rest_framework import serializers from rest_framework.serializers import ModelSerializer from org.models import Org, Site -from rcrasite.serializers import RcraSiteSerializer class OrgSerializer(ModelSerializer): diff --git a/server/org/tests/conftest.py b/server/org/tests/conftest.py index 82587653b..7b357e380 100644 --- a/server/org/tests/conftest.py +++ b/server/org/tests/conftest.py @@ -1,9 +1,9 @@ from typing import Optional import pytest +from rcrasite.models import RcraSite from org.models import Org, Site -from rcrasite.models import RcraSite @pytest.fixture diff --git a/server/profile/tests/conftest.py b/server/profile/tests/conftest.py index 2d3bf8f45..d23c6b654 100644 --- a/server/profile/tests/conftest.py +++ b/server/profile/tests/conftest.py @@ -2,9 +2,8 @@ from typing import Optional import pytest -from faker import Faker - from conftest import SiteIDProvider +from faker import Faker @pytest.fixture diff --git a/server/pyproject.toml b/server/pyproject.toml index f64a98264..f095cdfd9 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -43,7 +43,7 @@ exclude = [ ] [tool.ruff.lint] -select = ["F", "E", "W", "Q", "I001"] +select = ["F", "E", "W", "Q"] ignore = ["F401"] [tool.pytest.ini_options] diff --git a/server/rcrasite/admin.py b/server/rcrasite/admin.py index d424e10be..6bed924fe 100644 --- a/server/rcrasite/admin.py +++ b/server/rcrasite/admin.py @@ -1,6 +1,6 @@ +from core.admin import HiddenListView from django.contrib import admin -from core.admin import HiddenListView from rcrasite.models import ( Address, Contact, diff --git a/server/rcrasite/services/rcra_site.py b/server/rcrasite/services/rcra_site.py index 6fa7733ac..f4b5241d9 100644 --- a/server/rcrasite/services/rcra_site.py +++ b/server/rcrasite/services/rcra_site.py @@ -1,12 +1,12 @@ import logging from typing import Dict, Optional, TypedDict +from core.services import RcraClient, get_rcra_client from django.core.cache import CacheKeyWarning, cache from django.db import transaction from django.db.models import QuerySet from rest_framework.exceptions import ValidationError -from core.services import RcraClient, get_rcra_client from rcrasite.models import RcraSite from rcrasite.serializers import RcraSiteSerializer diff --git a/server/rcrasite/services/rcra_site_search.py b/server/rcrasite/services/rcra_site_search.py index fe6876869..da1702127 100644 --- a/server/rcrasite/services/rcra_site_search.py +++ b/server/rcrasite/services/rcra_site_search.py @@ -1,8 +1,7 @@ from typing import Literal, Optional -from emanifest import RcrainfoResponse - from core.services import RcraClient +from emanifest import RcrainfoResponse SiteType = Literal["Generator", "Tsdf", "Transporter", "Broker"] diff --git a/server/rcrasite/tests/test_site_search.py b/server/rcrasite/tests/test_site_search.py index 9b806ee15..4c26ee635 100644 --- a/server/rcrasite/tests/test_site_search.py +++ b/server/rcrasite/tests/test_site_search.py @@ -1,8 +1,8 @@ import json import pytest - from core.services import RcraClient + from rcrasite.services import RcraSiteSearch diff --git a/server/wasteline/tests/conftest.py b/server/wasteline/tests/conftest.py index 1c77e2a07..1a41fddeb 100644 --- a/server/wasteline/tests/conftest.py +++ b/server/wasteline/tests/conftest.py @@ -2,8 +2,8 @@ import pytest from faker import Faker - from manifest.models import Manifest + from wasteline.models import DotLookup, DotLookupType, WasteCode, WasteLine From ad182cf89074ced279c7c613dc5494e76a8b271d Mon Sep 17 00:00:00 2001 From: David Paul Graham Date: Thu, 3 Oct 2024 23:11:39 -0400 Subject: [PATCH 4/4] update production dependencies --- server/requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/requirements.txt b/server/requirements.txt index 18cd40036..e27a994a5 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -1,18 +1,18 @@ -Django==5.0.8 +Django==5.1.1 django-celery-results==2.5.1 django-cors-headers==4.4.0 django-extensions==3.2.3 -django-celery-beat==2.6.0 +django-celery-beat==2.7.0 djangorestframework==3.15.2 gunicorn==22.0.0 emanifest==4.0.3 psycopg[binary]==3.2.1 -pytz==2024.1 +pytz==2024.2 sqlparse==0.5.1 -tzdata==2024.1 -whitenoise==6.6.0 +tzdata==2024.2 +whitenoise==6.7.0 celery==5.4.0 -redis==5.0.8 +redis==5.1.0 drf-spectacular==0.27.2 django-health-check==3.18.3 dj-rest-auth[with_social]==6.0.0