diff --git a/.ci/ansible/filter/repr.py b/.ci/ansible/filter/repr.py index 8455c3442f9..c8c1678dd14 100644 --- a/.ci/ansible/filter/repr.py +++ b/.ci/ansible/filter/repr.py @@ -1,4 +1,5 @@ from __future__ import absolute_import, division, print_function + from packaging.version import parse as parse_version __metaclass__ = type diff --git a/.ci/scripts/calc_constraints.py b/.ci/scripts/calc_constraints.py index 29c8dd3f172..1a4880613ba 100755 --- a/.ci/scripts/calc_constraints.py +++ b/.ci/scripts/calc_constraints.py @@ -7,11 +7,12 @@ import argparse import fileinput -import urllib.request import sys +import urllib.request + +import yaml from packaging.requirements import Requirement from packaging.version import Version -import yaml try: import tomllib diff --git a/.ci/scripts/check_gettext.sh b/.ci/scripts/check_gettext.sh deleted file mode 100755 index d11ff4f5041..00000000000 --- a/.ci/scripts/check_gettext.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# WARNING: DO NOT EDIT! -# -# This file was generated by plugin_template, and is managed by it. Please use -# './plugin-template --github pulpcore' to update this file. -# -# For more info visit https://github.com/pulp/plugin_template - -# make sure this script runs at the repo root -cd "$(dirname "$(realpath -e "$0")")"/../.. - -set -uv - -MATCHES=$(grep -n -r --include \*.py "_(f") - -if [ $? -ne 1 ]; then - printf "\nERROR: Detected mix of f-strings and gettext:\n" - echo "$MATCHES" - exit 1 -fi diff --git a/.ci/scripts/check_pulpcore_imports.sh b/.ci/scripts/check_pulpcore_imports.sh index f0990bed8d7..50b6bf0aec6 100755 --- a/.ci/scripts/check_pulpcore_imports.sh +++ b/.ci/scripts/check_pulpcore_imports.sh @@ -10,10 +10,10 @@ # make sure this script runs at the repo root cd "$(dirname "$(realpath -e "$0")")"/../.. -set -uv +set -u # check for imports not from pulpcore.plugin. exclude tests -MATCHES=$(grep -n -r --include \*.py "from pulpcore.*import" . | grep -v "tests\|plugin") +MATCHES="$(grep -n -r --include \*.py "from pulpcore.*import" pulpcore pulp_file pulp_certguard | grep -v "tests\|plugin")" if [ $? -ne 1 ]; then printf "\nERROR: Detected bad imports from pulpcore:\n" diff --git a/.ci/scripts/check_release.py b/.ci/scripts/check_release.py index 6e0799952d5..0825480e209 100755 --- a/.ci/scripts/check_release.py +++ b/.ci/scripts/check_release.py @@ -9,16 +9,16 @@ # /// import argparse -import re import os +import re import sys import tomllib import typing as t from pathlib import Path import yaml -from packaging.version import Version from git import Repo +from packaging.version import Version RELEASE_BRANCH_REGEX = r"^([0-9]+)\.([0-9]+)$" Y_CHANGELOG_EXTS = [".feature"] @@ -157,9 +157,9 @@ def main(options: argparse.Namespace, template_config: dict[str, t.Any]) -> int: if reasons: curr_version = Version(last_tag) - assert curr_version.base_version.startswith( - branch - ), "Current-version has to belong to the current branch!" + assert curr_version.base_version.startswith(branch), ( + "Current-version has to belong to the current branch!" + ) next_version = Version(f"{branch}.{curr_version.micro + 1}") print( f"A Z-release is needed for {branch}, " diff --git a/.ci/scripts/check_requirements.py b/.ci/scripts/check_requirements.py index 396e5ef5ad3..6c7f5225289 100755 --- a/.ci/scripts/check_requirements.py +++ b/.ci/scripts/check_requirements.py @@ -7,12 +7,12 @@ import tomllib import warnings + from packaging.requirements import Requirement CHECK_MATRIX = [ ("pyproject.toml", True, True, True), ("requirements.txt", True, True, True), - ("dev_requirements.txt", False, True, False), ("ci_requirements.txt", False, True, True), ("doc_requirements.txt", False, True, False), ("lint_requirements.txt", False, True, True), diff --git a/.ci/scripts/schema.py b/.ci/scripts/schema.py index 91191c5ed87..9c8e11b2e5e 100644 --- a/.ci/scripts/schema.py +++ b/.ci/scripts/schema.py @@ -9,6 +9,7 @@ """ import json + from drf_spectacular.validation import JSON_SCHEMA_SPEC_PATH with open(JSON_SCHEMA_SPEC_PATH) as fh: diff --git a/.ci/scripts/skip_tests.py b/.ci/scripts/skip_tests.py index a68d000d623..380a3da9f78 100755 --- a/.ci/scripts/skip_tests.py +++ b/.ci/scripts/skip_tests.py @@ -15,12 +15,13 @@ *: Error """ -import sys +import argparse import os import re -import git +import sys import textwrap -import argparse + +import git DOC_PATTERNS = [ r"^docs/", diff --git a/.ci/scripts/update_github.py b/.ci/scripts/update_github.py index ffc22897a31..4cc565f0493 100755 --- a/.ci/scripts/update_github.py +++ b/.ci/scripts/update_github.py @@ -6,6 +6,7 @@ # For more info visit https://github.com/pulp/plugin_template import os + from github import Github g = Github(os.environ.get("GITHUB_TOKEN")) diff --git a/.ci/scripts/validate_commit_message.py b/.ci/scripts/validate_commit_message.py index a4dc9004a69..2aab908556c 100644 --- a/.ci/scripts/validate_commit_message.py +++ b/.ci/scripts/validate_commit_message.py @@ -6,9 +6,9 @@ import subprocess import sys import tomllib -import yaml from pathlib import Path +import yaml from github import Github diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 72c3fa0f648..00000000000 --- a/.flake8 +++ /dev/null @@ -1,34 +0,0 @@ -# WARNING: DO NOT EDIT! -# -# This file was generated by plugin_template, and is managed by it. Please use -# './plugin-template --github pulpcore' to update this file. -# -# For more info visit https://github.com/pulp/plugin_template -[flake8] -exclude = ./docs/*,*/migrations/*,./pulpcore/app/protobuf/* -per-file-ignores = */__init__.py: F401 - -ignore = E203,W503,Q000,Q003,D100,D104,D106,D200,D205,D400,D401,D402,F824 -max-line-length = 100 - -# Flake8 builtin codes -# -------------------- -# E203: no whitespace around ':'. disabled until https://github.com/PyCQA/pycodestyle/issues/373 is fixed -# W503: This enforces operators before line breaks which is not pep8 or black compatible. -# F824: 'nonlocal' is unused: name is never assigned in scope - -# Flake8-quotes extension codes -# ----------------------------- -# Q000: double or single quotes only, default is double (don't want to enforce this) -# Q003: Change outer quotes to avoid escaping inner quotes - -# Flake8-docstring extension codes -# -------------------------------- -# D100: missing docstring in public module -# D104: missing docstring in public package -# D106: missing docstring in public nested class (complains about "class Meta:" and documenting those is silly) -# D200: one-line docstring should fit on one line with quotes -# D205: 1 blank line required between summary line and description -# D400: First line should end with a period -# D401: first line should be imperative (nitpicky) -# D402: first line should not be the function’s “signature” (false positives) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index cc7146d739e..c1a3bbbf860 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -36,20 +36,13 @@ jobs: run: | yamllint -s -d '{extends: relaxed, rules: {line-length: disable}}' .github/workflows - # run black separately from flake8 to get a diff - - name: "Run black" + - name: "Check formating" run: | - black --version - black --check --diff . + ruff format --check --diff - # Lint code. - - name: "Run flake8" + - name: "Lint code" run: | - flake8 - - - name: "Check for common gettext problems" - run: | - sh .ci/scripts/check_gettext.sh + ruff check - name: "Run extra lint checks" run: | diff --git a/.github/workflows/scripts/stage-changelog-for-default-branch.py b/.github/workflows/scripts/stage-changelog-for-default-branch.py index d175331e7f4..9da33078e75 100755 --- a/.github/workflows/scripts/stage-changelog-for-default-branch.py +++ b/.github/workflows/scripts/stage-changelog-for-default-branch.py @@ -12,13 +12,15 @@ from git import Repo from git.exc import GitCommandError -helper = textwrap.dedent("""\ +helper = textwrap.dedent( + """\ Stage the changelog for a release on main branch. Example: $ python .github/workflows/scripts/stage-changelog-for-default-branch.py 3.4.0 - """) + """ +) parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter, description=helper) diff --git a/.github/workflows/scripts/update_backport_labels.py b/.github/workflows/scripts/update_backport_labels.py index 010e49e4449..be1a81c8991 100755 --- a/.github/workflows/scripts/update_backport_labels.py +++ b/.github/workflows/scripts/update_backport_labels.py @@ -5,10 +5,11 @@ # # For more info visit https://github.com/pulp/plugin_template +import os +import random + import requests import yaml -import random -import os def random_color(): diff --git a/dev_requirements.txt b/dev_requirements.txt deleted file mode 100644 index 89a15892024..00000000000 --- a/dev_requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -# python packages handy for developers, but not required by pulp -black -django-crispy-forms -django-extensions -ipython -check-manifest -codecov -coverage -flake8 -flake8-black -pyinstrument diff --git a/lint_requirements.txt b/lint_requirements.txt index 37f19ccb4c4..fabd285548d 100644 --- a/lint_requirements.txt +++ b/lint_requirements.txt @@ -5,10 +5,8 @@ # # For more info visit https://github.com/pulp/plugin_template -black~=26.3 # Pin style to the year. https://black.readthedocs.io/en/stable/faq.html#how-stable-is-black-s-style bump-my-version check-manifest -flake8 -flake8-black packaging +ruff yamllint diff --git a/pulp_certguard/app/models.py b/pulp_certguard/app/models.py index 47ce0713625..010c1de5086 100644 --- a/pulp_certguard/app/models.py +++ b/pulp_certguard/app/models.py @@ -1,12 +1,11 @@ -from logging import getLogger -from gettext import gettext as _ import re +from gettext import gettext as _ +from logging import getLogger from urllib.parse import unquote +from cryptography import x509 from django.conf import settings from django.db import models - -from cryptography import x509 from OpenSSL import crypto as openssl from pulpcore.plugin.models import ContentGuard diff --git a/pulp_certguard/app/serializers.py b/pulp_certguard/app/serializers.py index 8d8000ee329..83aba036dac 100644 --- a/pulp_certguard/app/serializers.py +++ b/pulp_certguard/app/serializers.py @@ -1,11 +1,10 @@ from gettext import gettext as _ from OpenSSL import crypto as openssl +from rest_framework import serializers from pulpcore.plugin.serializers import ContentGuardSerializer -from rest_framework import serializers - from .models import RHSMCertGuard, X509CertGuard diff --git a/pulp_certguard/rhsm/rhsm_check_path.py b/pulp_certguard/rhsm/rhsm_check_path.py index 505bcfd2299..f5b6f6668c0 100644 --- a/pulp_certguard/rhsm/rhsm_check_path.py +++ b/pulp_certguard/rhsm/rhsm_check_path.py @@ -1,9 +1,10 @@ -import typing as t -from cryptography import x509 -from heapq import heappush, heappop import itertools import re +import typing as t import zlib +from heapq import heappop, heappush + +from cryptography import x509 RH_OID = "1.3.6.1.4.1.2312.9" RH_ORDER_NAME_OID = RH_OID + ".4.1" diff --git a/pulp_certguard/tests/functional/api/test_rhsm_certguard.py b/pulp_certguard/tests/functional/api/test_rhsm_certguard.py index dd4c2ef366c..6116e362c0b 100644 --- a/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +++ b/pulp_certguard/tests/functional/api/test_rhsm_certguard.py @@ -1,29 +1,29 @@ -import pytest import uuid +from urllib.parse import quote, urljoin +import pytest import requests -from urllib.parse import urljoin, quote from django.conf import settings from pulp_certguard.tests.functional.constants import ( RHSM_CA_CERT_FILE_PATH, RHSM_CLIENT_CERT_FROM_UNTRUSTED_CA, RHSM_CLIENT_CERT_TRUSTED_BUT_EXPIRED, - THIRDPARTY_CA_CERT_FILE_PATH, RHSM_UBER_CERT_BASE_PATH_ONE, RHSM_UBER_CERT_BASE_PATH_TWO, RHSM_UBER_CLIENT_CERT, RHSM_V1_ONE_AND_TWO_VAR_CLIENT_CERT, RHSM_V1_ONE_VAR_BASE_PATH, RHSM_V1_TWO_VAR_BASE_PATH, - RHSM_V1_ZERO_VAR_CLIENT_CERT, RHSM_V1_ZERO_VAR_BASE_PATH, + RHSM_V1_ZERO_VAR_CLIENT_CERT, RHSM_V3_INVALID_BASE_PATH, RHSM_V3_ONE_AND_TWO_VAR_CLIENT_CERT, RHSM_V3_ONE_VAR_BASE_PATH, RHSM_V3_TWO_VAR_BASE_PATH, - RHSM_V3_ZERO_VAR_CLIENT_CERT, RHSM_V3_ZERO_VAR_BASE_PATH, + RHSM_V3_ZERO_VAR_CLIENT_CERT, + THIRDPARTY_CA_CERT_FILE_PATH, ) if settings.DOMAIN_ENABLED: diff --git a/pulp_certguard/tests/functional/api/test_x509_certguard.py b/pulp_certguard/tests/functional/api/test_x509_certguard.py index 170c71af95e..bff81b03f67 100644 --- a/pulp_certguard/tests/functional/api/test_x509_certguard.py +++ b/pulp_certguard/tests/functional/api/test_x509_certguard.py @@ -1,15 +1,15 @@ -import pytest import uuid +from urllib.parse import quote, urljoin +import pytest import requests -from urllib.parse import urljoin, quote from pulp_certguard.tests.functional.constants import ( X509_BASE_PATH, X509_CA_CERT_FILE_PATH, X509_CLIENT_CERT_FILE_PATH, - X509_UNTRUSTED_CLIENT_CERT_FILE_PATH, X509_UN_URLENCODED_CLIENT_CERT_FILE_PATH, + X509_UNTRUSTED_CLIENT_CERT_FILE_PATH, ) diff --git a/pulp_certguard/tests/unit/test_rhsm_check_path.py b/pulp_certguard/tests/unit/test_rhsm_check_path.py index 6666b5fc9e3..cf5f63fa836 100644 --- a/pulp_certguard/tests/unit/test_rhsm_check_path.py +++ b/pulp_certguard/tests/unit/test_rhsm_check_path.py @@ -1,18 +1,18 @@ -from cryptography import x509 import pytest - -from . import certdata +from cryptography import x509 from pulp_certguard.rhsm import check_path from pulp_certguard.rhsm.rhsm_check_path import ( - bitstream, + V1_PATH_OID_REGEX, Entitlement, HuffmannNode, + bitstream, cert_version, split_count, - V1_PATH_OID_REGEX, ) +from . import certdata + @pytest.fixture(scope="session") def ent_v1() -> x509.Certificate: diff --git a/pulp_file/app/modelresource.py b/pulp_file/app/modelresource.py index 75d12a41c62..41cdec693e1 100644 --- a/pulp_file/app/modelresource.py +++ b/pulp_file/app/modelresource.py @@ -1,5 +1,6 @@ from pulpcore.plugin.importexport import BaseContentResource from pulpcore.plugin.modelresources import RepositoryResource + from pulp_file.app.models import FileContent, FileRepository diff --git a/pulp_file/app/replica.py b/pulp_file/app/replica.py index e9298ea1ac6..e44cf8a31af 100644 --- a/pulp_file/app/replica.py +++ b/pulp_file/app/replica.py @@ -1,11 +1,11 @@ -from pulpcore.plugin.replica import Replicator - from pulp_glue.file.context import ( PulpFileDistributionContext, PulpFilePublicationContext, PulpFileRepositoryContext, ) +from pulpcore.plugin.replica import Replicator + from pulp_file.app.models import FileDistribution, FileRemote, FileRepository from pulp_file.app.tasks import synchronize as file_synchronize diff --git a/pulp_file/app/serializers.py b/pulp_file/app/serializers.py index bb7fb49dbf9..567634417df 100644 --- a/pulp_file/app/serializers.py +++ b/pulp_file/app/serializers.py @@ -5,8 +5,8 @@ from django.db import DatabaseError from rest_framework import serializers -from pulpcore.plugin.files import PulpTemporaryUploadedFile from pulpcore.plugin import models +from pulpcore.plugin.files import PulpTemporaryUploadedFile from pulpcore.plugin.serializers import ( AlternateContentSourceSerializer, ArtifactSerializer, @@ -25,9 +25,9 @@ FileContent, FileDistribution, FileGitRemote, + FilePublication, FileRemote, FileRepository, - FilePublication, ) diff --git a/pulp_file/app/tasks/publishing.py b/pulp_file/app/tasks/publishing.py index 6fbe1d4f908..b3a3830bf56 100644 --- a/pulp_file/app/tasks/publishing.py +++ b/pulp_file/app/tasks/publishing.py @@ -1,15 +1,14 @@ import logging import tempfile - from gettext import gettext as _ from django.core.files import File from pulpcore.plugin.models import ( ContentArtifact, - RepositoryVersion, PublishedMetadata, RemoteArtifact, + RepositoryVersion, ) from pulp_file.app.models import FilePublication diff --git a/pulp_file/app/tasks/synchronizing.py b/pulp_file/app/tasks/synchronizing.py index 091252b01b2..295f7a8c327 100644 --- a/pulp_file/app/tasks/synchronizing.py +++ b/pulp_file/app/tasks/synchronizing.py @@ -3,18 +3,17 @@ import re import shutil import tempfile -from hashlib import sha256 - from gettext import gettext as _ +from hashlib import sha256 from urllib.parse import quote, urlparse, urlunparse import git as gitpython -from gitdb.exc import BadName, BadObject -from django.core.files import File from django.conf import settings +from django.core.files import File +from gitdb.exc import BadName, BadObject from pulpcore.plugin.exceptions import SyncError -from pulpcore.plugin.models import Artifact, ProgressReport, Remote, PublishedMetadata +from pulpcore.plugin.models import Artifact, ProgressReport, PublishedMetadata, Remote from pulpcore.plugin.serializers import RepositoryVersionSerializer from pulpcore.plugin.stages import ( DeclarativeArtifact, @@ -27,8 +26,8 @@ from pulp_file.app.models import ( FileContent, FileGitRemote, - FileRepository, FilePublication, + FileRepository, ) from pulp_file.manifest import Manifest diff --git a/pulp_file/app/viewsets.py b/pulp_file/app/viewsets.py index 75fa2acb626..23c063ad0b6 100644 --- a/pulp_file/app/viewsets.py +++ b/pulp_file/app/viewsets.py @@ -3,11 +3,11 @@ from django.db import transaction from django_filters import CharFilter from drf_spectacular.utils import extend_schema -from rest_framework.decorators import action from rest_framework import status +from rest_framework.decorators import action +from rest_framework.exceptions import ValidationError from rest_framework.generics import get_object_or_404 from rest_framework.response import Response -from rest_framework.exceptions import ValidationError from pulpcore.plugin.actions import ModifyRepositoryActionMixin from pulpcore.plugin.models import ( @@ -28,8 +28,8 @@ OperationPostponedResponse, PublicationViewSet, RemoteViewSet, - RepositoryViewSet, RepositoryVersionViewSet, + RepositoryViewSet, RolesMixin, SingleArtifactContentUploadViewSet, TaskGroupOperationResponse, @@ -41,9 +41,9 @@ FileContent, FileDistribution, FileGitRemote, + FilePublication, FileRemote, FileRepository, - FilePublication, ) from .serializers import ( FileAlternateContentSourceSerializer, @@ -51,9 +51,9 @@ FileContentUploadSerializer, FileDistributionSerializer, FileGitRemoteSerializer, + FilePublicationSerializer, FileRemoteSerializer, FileRepositorySerializer, - FilePublicationSerializer, ) diff --git a/pulp_file/manifest.py b/pulp_file/manifest.py index 4a6ce145e97..6b81811dd8c 100644 --- a/pulp_file/manifest.py +++ b/pulp_file/manifest.py @@ -1,7 +1,5 @@ from collections import namedtuple - from gettext import gettext as _ - from re import fullmatch Line = namedtuple("Line", ("number", "content")) diff --git a/pulp_file/tests/functional/api/test_acs.py b/pulp_file/tests/functional/api/test_acs.py index 9fd3fce6125..7eb47003bcf 100644 --- a/pulp_file/tests/functional/api/test_acs.py +++ b/pulp_file/tests/functional/api/test_acs.py @@ -1,11 +1,11 @@ import hashlib -import pytest import uuid from urllib.parse import urljoin +import pytest + from pulpcore.client.pulp_file import RepositorySyncURL from pulpcore.client.pulp_file.exceptions import ApiException - from pulpcore.tests.functional.utils import ( download_file, get_files_in_manifest, diff --git a/pulp_file/tests/functional/api/test_auto_publish.py b/pulp_file/tests/functional/api/test_auto_publish.py index 96d44401155..f4bdbf420c8 100644 --- a/pulp_file/tests/functional/api/test_auto_publish.py +++ b/pulp_file/tests/functional/api/test_auto_publish.py @@ -2,11 +2,10 @@ import pytest -from pulpcore.tests.functional.utils import get_files_in_manifest - from pulpcore.client.pulp_file import ( RepositorySyncURL, ) +from pulpcore.tests.functional.utils import get_files_in_manifest @pytest.fixture diff --git a/pulp_file/tests/functional/api/test_bad_sync.py b/pulp_file/tests/functional/api/test_bad_sync.py index 0375b8060c2..f4cf99af248 100644 --- a/pulp_file/tests/functional/api/test_bad_sync.py +++ b/pulp_file/tests/functional/api/test_bad_sync.py @@ -1,8 +1,8 @@ +import uuid from collections import defaultdict -import pytest -import uuid import aiofiles +import pytest from aiohttp import web from pulpcore.client.pulp_file import RepositorySyncURL diff --git a/pulp_file/tests/functional/api/test_content_labels.py b/pulp_file/tests/functional/api/test_content_labels.py index ff0507c9934..b97c588b8b4 100644 --- a/pulp_file/tests/functional/api/test_content_labels.py +++ b/pulp_file/tests/functional/api/test_content_labels.py @@ -1,11 +1,11 @@ +import os +import uuid from uuid import uuid4 -import os import pytest -import uuid +from pulpcore.client.pulp_file.exceptions import BadRequestException, ForbiddenException from pulpcore.client.pulp_file.models import SetLabel, UnsetLabel -from pulpcore.client.pulp_file.exceptions import ForbiddenException, BadRequestException @pytest.mark.parallel diff --git a/pulp_file/tests/functional/api/test_crud_content_unit.py b/pulp_file/tests/functional/api/test_crud_content_unit.py index 1362b78c06c..7e706a3ab27 100644 --- a/pulp_file/tests/functional/api/test_crud_content_unit.py +++ b/pulp_file/tests/functional/api/test_crud_content_unit.py @@ -2,10 +2,11 @@ import hashlib import os -import pytest import uuid -from pulpcore.tests.functional.utils import generate_iso, PulpTaskError +import pytest + +from pulpcore.tests.functional.utils import PulpTaskError, generate_iso @pytest.mark.parallel diff --git a/pulp_file/tests/functional/api/test_distributed_publication.py b/pulp_file/tests/functional/api/test_distributed_publication.py index 0911dcc7db9..e5f050983a4 100644 --- a/pulp_file/tests/functional/api/test_distributed_publication.py +++ b/pulp_file/tests/functional/api/test_distributed_publication.py @@ -1,16 +1,15 @@ """Tests for the distributed publication grace-period feature.""" +import time from dataclasses import dataclass from urllib.parse import urljoin import pytest import requests -from pulpcore.client.pulp_file import FileFilePublication, FileFileDistribution -from pulpcore.client.pulp_file import RepositorySyncURL - -import time from django.conf import settings +from pulpcore.client.pulp_file import FileFileDistribution, FileFilePublication, RepositorySyncURL + @dataclass class DistributionPublicationContext: @@ -30,9 +29,9 @@ def clear_dist_cache(self, dist: FileFileDistribution) -> None: raise NotImplementedError def wait_retention_period(self): - assert ( - settings.DISTRIBUTED_PUBLICATION_RETENTION_PERIOD <= 5 - ), "DISTRIBUTED_PUBLICATION_RETENTION_PERIOD is too long for testing." + assert settings.DISTRIBUTED_PUBLICATION_RETENTION_PERIOD <= 5, ( + "DISTRIBUTED_PUBLICATION_RETENTION_PERIOD is too long for testing." + ) time.sleep(settings.DISTRIBUTED_PUBLICATION_RETENTION_PERIOD + 1) diff --git a/pulp_file/tests/functional/api/test_domains.py b/pulp_file/tests/functional/api/test_domains.py index 12e2d987bc9..51869b8114e 100644 --- a/pulp_file/tests/functional/api/test_domains.py +++ b/pulp_file/tests/functional/api/test_domains.py @@ -1,9 +1,10 @@ -import pytest -import uuid import json +import uuid + +import pytest from pulpcore.app import settings -from pulpcore.tests.functional.utils import generate_iso, download_file +from pulpcore.tests.functional.utils import download_file, generate_iso pytestmark = pytest.mark.skipif(not settings.DOMAIN_ENABLED, reason="Domains not enabled.") diff --git a/pulp_file/tests/functional/api/test_download_policies.py b/pulp_file/tests/functional/api/test_download_policies.py index 11bf60eb4fb..068044a3564 100644 --- a/pulp_file/tests/functional/api/test_download_policies.py +++ b/pulp_file/tests/functional/api/test_download_policies.py @@ -1,17 +1,17 @@ """Tests for Pulp`s download policies.""" -from aiohttp.client_exceptions import ClientResponseError -from bs4 import BeautifulSoup import hashlib import os -import pytest import subprocess import uuid from urllib.parse import urljoin -from pulpcore.tests.functional.utils import get_files_in_manifest, download_file +import pytest +from aiohttp.client_exceptions import ClientResponseError +from bs4 import BeautifulSoup from pulpcore.client.pulp_file import FileFilePublication, RepositorySyncURL +from pulpcore.tests.functional.utils import download_file, get_files_in_manifest OBJECT_STORAGES = ( "storages.backends.s3boto3.S3Boto3Storage", diff --git a/pulp_file/tests/functional/api/test_filesystem_export.py b/pulp_file/tests/functional/api/test_filesystem_export.py index 066ed1f2208..5720840ca5a 100644 --- a/pulp_file/tests/functional/api/test_filesystem_export.py +++ b/pulp_file/tests/functional/api/test_filesystem_export.py @@ -1,9 +1,10 @@ import json -import pytest import uuid -from pulpcore.client.pulpcore.exceptions import ApiException, BadRequestException +import pytest + from pulpcore.app import settings +from pulpcore.client.pulpcore.exceptions import ApiException, BadRequestException from pulpcore.constants import TASK_STATES pytestmark = [ diff --git a/pulp_file/tests/functional/api/test_git_sync.py b/pulp_file/tests/functional/api/test_git_sync.py index 055aab8facd..a1d1eedaa27 100644 --- a/pulp_file/tests/functional/api/test_git_sync.py +++ b/pulp_file/tests/functional/api/test_git_sync.py @@ -1,9 +1,9 @@ -import pytest import uuid -from pulpcore.tests.functional.utils import PulpTaskError +import pytest from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.tests.functional.utils import PulpTaskError GIT_REMOTE_URL = "https://github.com/pulp/pulp-smash.git" FILE_COUNT = { diff --git a/pulp_file/tests/functional/api/test_mime_types.py b/pulp_file/tests/functional/api/test_mime_types.py index 72793bb26fa..d44ba9f5b7f 100644 --- a/pulp_file/tests/functional/api/test_mime_types.py +++ b/pulp_file/tests/functional/api/test_mime_types.py @@ -1,10 +1,10 @@ -import aiohttp import asyncio -import pytest import uuid - from urllib.parse import urljoin +import aiohttp +import pytest + from pulpcore.client.pulp_file import FileFileDistribution, RepositoryAddRemoveContent diff --git a/pulp_file/tests/functional/api/test_publish.py b/pulp_file/tests/functional/api/test_publish.py index 84e6fcc5c45..41b8c1f0ed2 100644 --- a/pulp_file/tests/functional/api/test_publish.py +++ b/pulp_file/tests/functional/api/test_publish.py @@ -1,13 +1,14 @@ """Tests that publish file plugin repositories.""" -from aiohttp import BasicAuth import json -import pytest from urllib.parse import urljoin +import pytest +from aiohttp import BasicAuth + from pulpcore.client.pulp_file import ( - RepositorySyncURL, FileFilePublication, + RepositorySyncURL, ) from pulpcore.client.pulp_file.exceptions import ApiException from pulpcore.tests.functional.utils import download_file diff --git a/pulp_file/tests/functional/api/test_pulp_export.py b/pulp_file/tests/functional/api/test_pulp_export.py index 418dfa5ccb2..7a1078eede1 100644 --- a/pulp_file/tests/functional/api/test_pulp_export.py +++ b/pulp_file/tests/functional/api/test_pulp_export.py @@ -1,12 +1,11 @@ import json +import uuid from pathlib import Path import pytest -import uuid -from pulpcore.client.pulpcore.exceptions import ApiException -from pulpcore.client.pulpcore.exceptions import BadRequestException from pulpcore.app import settings +from pulpcore.client.pulpcore.exceptions import ApiException, BadRequestException from pulpcore.constants import TASK_STATES pytestmark = [ @@ -455,9 +454,9 @@ def test_export_chunk_ordering_and_naming( toc_filenames = list(toc_data["files"].keys()) expected_filenames = [p.name for p in tar_chunks] - assert ( - toc_filenames == expected_filenames - ), f"TOC order mismatch.\nExpected: {expected_filenames}\nActual: {toc_filenames}" + assert toc_filenames == expected_filenames, ( + f"TOC order mismatch.\nExpected: {expected_filenames}\nActual: {toc_filenames}" + ) assert toc_data["meta"]["chunk_size"] == chunk_size_bytes assert toc_data["meta"]["checksum_type"] == "crc32" diff --git a/pulp_file/tests/functional/api/test_rbac.py b/pulp_file/tests/functional/api/test_rbac.py index 8592721797b..2a38372ed75 100644 --- a/pulp_file/tests/functional/api/test_rbac.py +++ b/pulp_file/tests/functional/api/test_rbac.py @@ -1,6 +1,7 @@ -import pytest import uuid +import pytest + @pytest.fixture() def gen_users(gen_user): @@ -38,9 +39,9 @@ def _try_action(user, client, action, outcome, *args, **kwargs): except file_bindings.module.ApiException as e: assert e.status == outcome, f"{e}" else: - assert ( - status_code == outcome - ), f"User performed {action} when they shouldn't been able to" + assert status_code == outcome, ( + f"User performed {action} when they shouldn't been able to" + ) return data return _try_action diff --git a/pulp_file/tests/functional/api/test_remote_settings.py b/pulp_file/tests/functional/api/test_remote_settings.py index ebe677e04ad..d4d37ff2525 100644 --- a/pulp_file/tests/functional/api/test_remote_settings.py +++ b/pulp_file/tests/functional/api/test_remote_settings.py @@ -1,6 +1,7 @@ -import pytest import uuid +import pytest + from pulpcore.client.pulp_file import ( RepositorySyncURL, ) diff --git a/pulp_file/tests/functional/api/test_sync.py b/pulp_file/tests/functional/api/test_sync.py index 6bba4f4c934..6511bbf139d 100644 --- a/pulp_file/tests/functional/api/test_sync.py +++ b/pulp_file/tests/functional/api/test_sync.py @@ -2,14 +2,12 @@ import os import uuid - -import pytest - from urllib.parse import urljoin -from pulpcore.tests.functional.utils import PulpTaskError +import pytest from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.tests.functional.utils import PulpTaskError def test_sync_file_protocol_handler( diff --git a/pulp_file/tests/unit/test_git_sync.py b/pulp_file/tests/unit/test_git_sync.py index 753aa37221f..8364b7960ca 100644 --- a/pulp_file/tests/unit/test_git_sync.py +++ b/pulp_file/tests/unit/test_git_sync.py @@ -1,10 +1,9 @@ """Unit tests for Git sync helper functions.""" import os - from unittest import mock -from pulp_file.app.tasks.synchronizing import _build_clone_url, _build_clone_env +from pulp_file.app.tasks.synchronizing import _build_clone_env, _build_clone_url class TestBuildCloneUrl: diff --git a/pulp_file/tests/unit/test_safe_paths.py b/pulp_file/tests/unit/test_safe_paths.py index 36b05a20733..349e77198b2 100644 --- a/pulp_file/tests/unit/test_safe_paths.py +++ b/pulp_file/tests/unit/test_safe_paths.py @@ -1,5 +1,7 @@ -import pytest from unittest import mock + +import pytest + from pulp_file.app.tasks.synchronizing import _get_safe_path diff --git a/pulp_file/tests/unit/test_serializers.py b/pulp_file/tests/unit/test_serializers.py index aecbdcde533..dfee34ac9cb 100644 --- a/pulp_file/tests/unit/test_serializers.py +++ b/pulp_file/tests/unit/test_serializers.py @@ -1,12 +1,12 @@ +from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase -from django.conf import settings - -from pulp_file.app.serializers import FileContentSerializer -from pulp_file.app.models import FileContent -from pulpcore.plugin.models import Artifact from pulpcore.plugin.find_url import find_api_root +from pulpcore.plugin.models import Artifact + +from pulp_file.app.models import FileContent +from pulp_file.app.serializers import FileContentSerializer _, V3_API_ROOT = find_api_root(domain="default") diff --git a/pulpcore/app/apps.py b/pulpcore/app/apps.py index 862f6a8a648..61fa1933cb7 100644 --- a/pulpcore/app/apps.py +++ b/pulpcore/app/apps.py @@ -1,5 +1,4 @@ import random - from collections import defaultdict from gettext import gettext as _ from importlib import import_module @@ -159,8 +158,8 @@ def import_serializers(self): def import_viewsets(self): # TODO do not include imported ViewSets # circular import avoidance + from pulpcore.app.models import Content, Repository from pulpcore.app.viewsets import NamedModelViewSet - from pulpcore.app.models import Repository, Content self.named_viewsets = defaultdict(list) if module_has_submodule(self.module, VIEWSETS_MODULE_NAME): diff --git a/pulpcore/app/authentication.py b/pulpcore/app/authentication.py index 1c2d0a209a0..0e42ec0871d 100644 --- a/pulpcore/app/authentication.py +++ b/pulpcore/app/authentication.py @@ -1,16 +1,17 @@ import json -import jq import logging - from base64 import b64decode from binascii import Error as Base64DecodeError from gettext import gettext as _ +import jq from django.contrib.auth import authenticate from django.contrib.auth.backends import RemoteUserBackend from rest_framework.authentication import ( BaseAuthentication, RemoteUserAuthentication, +) +from rest_framework.authentication import ( BasicAuthentication as OrigBasicAuthentication, ) from rest_framework.exceptions import AuthenticationFailed diff --git a/pulpcore/app/checks.py b/pulpcore/app/checks.py index 8e838054f1e..f2a4a3b890b 100644 --- a/pulpcore/app/checks.py +++ b/pulpcore/app/checks.py @@ -3,11 +3,17 @@ from django.conf import settings from django.core.checks import ( Debug as CheckDebug, +) +from django.core.checks import ( Error as CheckError, - Warning as CheckWarning, +) +from django.core.checks import ( Tags, register, ) +from django.core.checks import ( + Warning as CheckWarning, +) from django.db.models import Q from pulpcore import constants diff --git a/pulpcore/app/contexts.py b/pulpcore/app/contexts.py index 426047fffcb..9e2d6fd1657 100644 --- a/pulpcore/app/contexts.py +++ b/pulpcore/app/contexts.py @@ -1,8 +1,8 @@ -from contextlib import contextmanager, asynccontextmanager +from contextlib import asynccontextmanager, contextmanager from contextvars import ContextVar from asgiref.sync import sync_to_async -from django_guid import get_guid, set_guid, clear_guid +from django_guid import clear_guid, get_guid, set_guid _current_task = ContextVar("current_task", default=None) _current_user_func = ContextVar("current_user", default=lambda: None) diff --git a/pulpcore/app/entrypoint.py b/pulpcore/app/entrypoint.py index 939cabc4969..ab76e7e0fec 100644 --- a/pulpcore/app/entrypoint.py +++ b/pulpcore/app/entrypoint.py @@ -1,22 +1,22 @@ -from contextvars import ContextVar -from logging import getLogger import os import sys import threading import time +from contextvars import ContextVar +from logging import getLogger import click import django from django.db import connection -from django.db.utils import IntegrityError, InterfaceError, DatabaseError +from django.db.utils import DatabaseError, IntegrityError, InterfaceError from gunicorn.arbiter import Arbiter from gunicorn.workers.sync import SyncWorker from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app.netutil import has_ipv6 from pulpcore.app.pulpcore_gunicorn_application import ( - handle_control_interface_feature, PulpcoreGunicornApplication, + handle_control_interface_feature, ) logger = getLogger(__name__) @@ -69,6 +69,7 @@ def init_process(self): django.setup() from django.conf import settings + from pulpcore.app.models import AppStatus from pulpcore.app.util import get_worker_name @@ -167,8 +168,7 @@ def load(self): "--access-logformat", "access_log_format", default=( - "pulp [%({correlation-id}o)s]: " - '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"', + 'pulp [%({correlation-id}o)s]: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"', ), ) @click.option("--error-logfile", "--log-file", "errorlog") diff --git a/pulpcore/app/files.py b/pulpcore/app/files.py index 630607ecac0..38f6bb52877 100644 --- a/pulpcore/app/files.py +++ b/pulpcore/app/files.py @@ -1,14 +1,13 @@ -import os import concurrent.futures -from concurrent.futures import ThreadPoolExecutor, ALL_COMPLETED +import os +from concurrent.futures import ALL_COMPLETED, ThreadPoolExecutor from gettext import gettext as _ from django.core.files.uploadedfile import TemporaryUploadedFile from django.core.files.uploadhandler import TemporaryFileUploadHandler from pygtrie import StringTrie -from pulpcore.app import models -from pulpcore.app import pulp_hashlib +from pulpcore.app import models, pulp_hashlib class PulpTemporaryUploadedFile(TemporaryUploadedFile): diff --git a/pulpcore/app/importexport.py b/pulpcore/app/importexport.py index 7d1e798aa67..68591a180b7 100644 --- a/pulpcore/app/importexport.py +++ b/pulpcore/app/importexport.py @@ -1,23 +1,23 @@ -import os import io import json +import logging +import os import tarfile import tempfile -import logging from django.conf import settings from django.db.models.query import QuerySet from pulpcore.app.apps import get_plugin_config -from pulpcore.app.models.content import Artifact -from pulpcore.app.models.progress import ProgressReport -from pulpcore.app.models.repository import Repository from pulpcore.app.modelresource import ( ArtifactResource, ContentArtifactResource, RepositoryResource, ) -from pulpcore.constants import TASK_STATES, EXPORT_BATCH_SIZE +from pulpcore.app.models.content import Artifact +from pulpcore.app.models.progress import ProgressReport +from pulpcore.app.models.repository import Repository +from pulpcore.constants import EXPORT_BATCH_SIZE, TASK_STATES log = logging.getLogger(__name__) diff --git a/pulpcore/app/management/commands/add-signing-service.py b/pulpcore/app/management/commands/add-signing-service.py index 70a611ce22c..5c463da49c0 100644 --- a/pulpcore/app/management/commands/add-signing-service.py +++ b/pulpcore/app/management/commands/add-signing-service.py @@ -1,13 +1,10 @@ import os import subprocess - -from pathlib import Path - from gettext import gettext as _ - -from django.core.management import BaseCommand, CommandError +from pathlib import Path from django.apps import apps +from django.core.management import BaseCommand, CommandError from django.db.utils import IntegrityError from pulpcore.app.models.content import SigningService as BaseSigningService diff --git a/pulpcore/app/management/commands/analyze-publication.py b/pulpcore/app/management/commands/analyze-publication.py index 21e897e65ae..07252c96e2d 100644 --- a/pulpcore/app/management/commands/analyze-publication.py +++ b/pulpcore/app/management/commands/analyze-publication.py @@ -3,7 +3,7 @@ from django.core.management import BaseCommand, CommandError from django.urls import reverse -from pulpcore.app.models import Publication, Artifact, Distribution +from pulpcore.app.models import Artifact, Distribution, Publication from pulpcore.app.util import get_view_name_for_model diff --git a/pulpcore/app/management/commands/datarepair-2327.py b/pulpcore/app/management/commands/datarepair-2327.py index 99475e8ebad..56a59bab969 100644 --- a/pulpcore/app/management/commands/datarepair-2327.py +++ b/pulpcore/app/management/commands/datarepair-2327.py @@ -1,13 +1,12 @@ from gettext import gettext as _ -from django.db import connection +import cryptography from django.conf import settings from django.core.management import BaseCommand +from django.db import connection from django.db.models import Q from django.utils.encoding import force_bytes, force_str -import cryptography - from pulpcore.app.models import Remote diff --git a/pulpcore/app/management/commands/datarepair.py b/pulpcore/app/management/commands/datarepair.py index d92b000fd47..ab998f45752 100644 --- a/pulpcore/app/management/commands/datarepair.py +++ b/pulpcore/app/management/commands/datarepair.py @@ -1,13 +1,12 @@ from gettext import gettext as _ -from django.db import connection +import cryptography from django.conf import settings from django.core.management import BaseCommand, CommandError +from django.db import connection from django.db.models import Q from django.utils.encoding import force_bytes, force_str -import cryptography - from pulpcore.app import models diff --git a/pulpcore/app/management/commands/dump-permissions.py b/pulpcore/app/management/commands/dump-permissions.py index cb2cf4e7432..0ba185cd7d6 100644 --- a/pulpcore/app/management/commands/dump-permissions.py +++ b/pulpcore/app/management/commands/dump-permissions.py @@ -1,11 +1,11 @@ -from gettext import gettext as _ -from functools import lru_cache import json import sys +from functools import lru_cache +from gettext import gettext as _ -from django.db import connection -from django.core.management import BaseCommand, CommandError from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand, CommandError +from django.db import connection from pulpcore.app.util import get_url diff --git a/pulpcore/app/management/commands/dump-publications-to-fs.py b/pulpcore/app/management/commands/dump-publications-to-fs.py index c6e0eb7be24..299b0c085b3 100644 --- a/pulpcore/app/management/commands/dump-publications-to-fs.py +++ b/pulpcore/app/management/commands/dump-publications-to-fs.py @@ -1,15 +1,15 @@ -from gettext import gettext as _ import logging import os +from gettext import gettext as _ from django.core.exceptions import ObjectDoesNotExist from django.core.management import BaseCommand, CommandError -from pulpcore.app.models import Publication, Distribution +from pulpcore.app.models import Distribution, Publication from pulpcore.app.tasks.export import ( - _export_publication_to_file_system, - _export_location_is_clean, UnexportableArtifactException, + _export_location_is_clean, + _export_publication_to_file_system, ) from pulpcore.app.viewsets.base import NamedModelViewSet from pulpcore.constants import FS_EXPORT_METHODS diff --git a/pulpcore/app/management/commands/handle-artifact-checksums.py b/pulpcore/app/management/commands/handle-artifact-checksums.py index 41a1a29fbbd..11c3ba72233 100644 --- a/pulpcore/app/management/commands/handle-artifact-checksums.py +++ b/pulpcore/app/management/commands/handle-artifact-checksums.py @@ -1,10 +1,11 @@ +import logging import os - from gettext import gettext as _ from django.conf import settings from django.core.management import BaseCommand, CommandError from django.db.models import Q, Sum + from pulpcore import constants from pulpcore.app import pulp_hashlib from pulpcore.plugin.models import ( @@ -15,8 +16,6 @@ RepositoryVersion, ) -import logging - log = logging.getLogger("") CHUNK_SIZE = 1024 * 1024 # 1 Mb @@ -136,7 +135,7 @@ def _download_artifact(self, artifact, checksum, file_path): restored = True break if not restored: - self.stdout.write(_("Deleting unrepairable file {}".format(file_path))) + self.stdout.write(_("Deleting unrepairable file {}").format(file_path)) artifact.file.delete(save=False) else: break diff --git a/pulpcore/app/management/commands/migrationstat.py b/pulpcore/app/management/commands/migrationstat.py index 00a49b6f4b9..ea253e7c882 100644 --- a/pulpcore/app/management/commands/migrationstat.py +++ b/pulpcore/app/management/commands/migrationstat.py @@ -1,8 +1,8 @@ from gettext import gettext as _ +from django.core.management import BaseCommand from django.db import connection from django.db.migrations.loader import MigrationLoader -from django.core.management import BaseCommand class Command(BaseCommand): diff --git a/pulpcore/app/management/commands/openapi.py b/pulpcore/app/management/commands/openapi.py index 7286dd8b05a..3186f011fb6 100644 --- a/pulpcore/app/management/commands/openapi.py +++ b/pulpcore/app/management/commands/openapi.py @@ -4,12 +4,10 @@ from django.http import HttpRequest from django.utils import translation from django.utils.module_loading import import_string - -from rest_framework.request import Request - from drf_spectacular.renderers import OpenApiJsonRenderer, OpenApiYamlRenderer from drf_spectacular.settings import patched_settings from drf_spectacular.validation import validate_schema +from rest_framework.request import Request from pulpcore.openapi import PulpSchemaGenerator diff --git a/pulpcore/app/management/commands/optimizemigration.py b/pulpcore/app/management/commands/optimizemigration.py index d31a3c5ae4c..e5a8c842174 100644 --- a/pulpcore/app/management/commands/optimizemigration.py +++ b/pulpcore/app/management/commands/optimizemigration.py @@ -1,13 +1,13 @@ from collections import defaultdict from gettext import gettext as _ +from django.conf import settings +from django.core.management import BaseCommand from django.db import connection from django.db.migrations.loader import MigrationLoader from django.db.migrations.migration import SwappableTuple from django.db.migrations.optimizer import MigrationOptimizer from django.db.migrations.writer import MigrationWriter -from django.conf import settings -from django.core.management import BaseCommand def print_stats(migration): diff --git a/pulpcore/app/management/commands/rebasemigrations.py b/pulpcore/app/management/commands/rebasemigrations.py index 8c289ab9a08..54e12be2cf1 100644 --- a/pulpcore/app/management/commands/rebasemigrations.py +++ b/pulpcore/app/management/commands/rebasemigrations.py @@ -1,9 +1,9 @@ from gettext import gettext as _ +from django.core.management import BaseCommand from django.db import connection from django.db.migrations.loader import MigrationLoader from django.db.migrations.writer import MigrationWriter -from django.core.management import BaseCommand class Command(BaseCommand): diff --git a/pulpcore/app/management/commands/remove-plugin.py b/pulpcore/app/management/commands/remove-plugin.py index a75459991a3..7531670b03e 100644 --- a/pulpcore/app/management/commands/remove-plugin.py +++ b/pulpcore/app/management/commands/remove-plugin.py @@ -1,14 +1,13 @@ import time - from gettext import gettext as _ from django.apps import apps -from django.db import connection, IntegrityError -from django.db.migrations.exceptions import IrreversibleError -from django.db.models.signals import post_migrate from django.conf import settings from django.contrib.contenttypes.models import ContentType -from django.core.management import BaseCommand, call_command, CommandError +from django.core.management import BaseCommand, CommandError, call_command +from django.db import IntegrityError, connection +from django.db.migrations.exceptions import IrreversibleError +from django.db.models.signals import post_migrate from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app.models import AccessPolicy, AppStatus diff --git a/pulpcore/app/management/commands/remove-signing-service.py b/pulpcore/app/management/commands/remove-signing-service.py index 1e420e7ba1c..524774294ab 100644 --- a/pulpcore/app/management/commands/remove-signing-service.py +++ b/pulpcore/app/management/commands/remove-signing-service.py @@ -1,10 +1,8 @@ from gettext import gettext as _ -from django.core.management import BaseCommand, CommandError - -from django.core.exceptions import ObjectDoesNotExist - from django.apps import apps +from django.core.exceptions import ObjectDoesNotExist +from django.core.management import BaseCommand, CommandError from django.db.utils import IntegrityError from pulpcore.app.models.content import SigningService as BaseSigningService diff --git a/pulpcore/app/management/commands/repository-size.py b/pulpcore/app/management/commands/repository-size.py index 462f7bf376a..a8ab13f7705 100644 --- a/pulpcore/app/management/commands/repository-size.py +++ b/pulpcore/app/management/commands/repository-size.py @@ -1,14 +1,14 @@ import json import re import sys +from argparse import RawDescriptionHelpFormatter from gettext import gettext as _ -from argparse import RawDescriptionHelpFormatter -from django.core.management import BaseCommand, CommandError from django.conf import settings +from django.core.management import BaseCommand, CommandError from pulpcore.app.models import Repository -from pulpcore.app.util import get_url, extract_pk +from pulpcore.app.util import extract_pk, get_url def gather_repository_sizes(repositories, include_versions=False, include_on_demand=False): diff --git a/pulpcore/app/management/commands/reset-admin-password.py b/pulpcore/app/management/commands/reset-admin-password.py index 0094392ed87..6393259c6eb 100644 --- a/pulpcore/app/management/commands/reset-admin-password.py +++ b/pulpcore/app/management/commands/reset-admin-password.py @@ -1,6 +1,5 @@ -import string import secrets - +import string from getpass import getpass from gettext import gettext as _ diff --git a/pulpcore/app/management/commands/rotate-db-key.py b/pulpcore/app/management/commands/rotate-db-key.py index b4885f6e1ae..6bbec206e10 100644 --- a/pulpcore/app/management/commands/rotate-db-key.py +++ b/pulpcore/app/management/commands/rotate-db-key.py @@ -6,7 +6,7 @@ from django.db import connection, transaction from pulpcore.app.models import MasterModel -from pulpcore.app.models.fields import EncryptedTextField, EncryptedJSONField +from pulpcore.app.models.fields import EncryptedJSONField, EncryptedTextField class DryRun(Exception): diff --git a/pulpcore/app/modelresource.py b/pulpcore/app/modelresource.py index e7fd0e8a17e..47d5a9c5759 100644 --- a/pulpcore/app/modelresource.py +++ b/pulpcore/app/modelresource.py @@ -1,9 +1,9 @@ import re +from logging import getLogger from django.conf import settings from import_export import fields from import_export.widgets import ForeignKeyWidget -from logging import getLogger from pulpcore.app.models.content import ( Artifact, @@ -11,7 +11,7 @@ ContentArtifact, ) from pulpcore.app.models.repository import Repository -from pulpcore.app.util import get_domain_pk, get_domain +from pulpcore.app.util import get_domain, get_domain_pk from pulpcore.constants import ALL_KNOWN_CONTENT_CHECKSUMS from pulpcore.plugin.importexport import QueryModelResource @@ -55,7 +55,7 @@ def before_import_row(self, row, **kwargs): row["file"] = row["file"].replace("artifact", f"artifact/{domain}") else: # Strip domain-id out of the artifact-file *if there is one there* if upstream_domain_enabled: - row["file"] = row["file"].replace(f'artifact/{row["pulp_domain"]}/', "artifact/") + row["file"] = row["file"].replace(f"artifact/{row['pulp_domain']}/", "artifact/") super().before_import_row(row, **kwargs) @@ -81,7 +81,6 @@ class Meta: class RepositoryResource(QueryModelResource): - def set_up_queryset(self): """ :return: Repositories for a specific domain diff --git a/pulpcore/app/models/__init__.py b/pulpcore/app/models/__init__.py index 6f085af768b..a1bf1ca1147 100644 --- a/pulpcore/app/models/__init__.py +++ b/pulpcore/app/models/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file # https://docs.djangoproject.com/en/3.2/topics/db/models/#organizing-models-in-a-package # Must be imported first as other models depend on it diff --git a/pulpcore/app/models/access_policy.py b/pulpcore/app/models/access_policy.py index c3087a56cbd..fc61a454275 100644 --- a/pulpcore/app/models/access_policy.py +++ b/pulpcore/app/models/access_policy.py @@ -1,10 +1,10 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group as BaseGroup from django.db import models -from django_lifecycle import hook, LifecycleModelMixin +from django_lifecycle import LifecycleModelMixin, hook from pulpcore.app.models import BaseModel -from pulpcore.app.util import get_viewset_for_model, get_current_authenticated_user +from pulpcore.app.util import get_current_authenticated_user, get_viewset_for_model def _ensure_iterable(obj): diff --git a/pulpcore/app/models/acs.py b/pulpcore/app/models/acs.py index 54d6608b08b..5fed96d0803 100644 --- a/pulpcore/app/models/acs.py +++ b/pulpcore/app/models/acs.py @@ -4,9 +4,10 @@ from django.db import models -from .base import MasterModel, BaseModel from pulpcore.app.util import get_domain_pk +from .base import BaseModel, MasterModel + class AlternateContentSource(MasterModel): """ diff --git a/pulpcore/app/models/analytics.py b/pulpcore/app/models/analytics.py index 74e3e212d07..148f2a67051 100644 --- a/pulpcore/app/models/analytics.py +++ b/pulpcore/app/models/analytics.py @@ -1,8 +1,7 @@ from functools import lru_cache from django.db import models - -from django_lifecycle import hook, LifecycleModel +from django_lifecycle import LifecycleModel, hook from pulpcore.app.models import pulp_uuid diff --git a/pulpcore/app/models/base.py b/pulpcore/app/models/base.py index 8d6203e78b4..19e0d159989 100644 --- a/pulpcore/app/models/base.py +++ b/pulpcore/app/models/base.py @@ -1,3 +1,4 @@ +from functools import lru_cache from gettext import gettext as _ from django.contrib.contenttypes.fields import GenericRelation @@ -5,7 +6,6 @@ from django.db.models import options from django.db.models.base import ModelBase from django_lifecycle import LifecycleModel -from functools import lru_cache from uuid6 import uuid7 diff --git a/pulpcore/app/models/content.py b/pulpcore/app/models/content.py index 001e9d2f8ac..e73d4b480ed 100644 --- a/pulpcore/app/models/content.py +++ b/pulpcore/app/models/content.py @@ -2,18 +2,16 @@ Content related Django models. """ -from gettext import gettext as _ - import asyncio import datetime import json import os -import tempfile import shutil import subprocess - +import tempfile from collections import defaultdict from functools import lru_cache, partial +from gettext import gettext as _ from itertools import chain from django.conf import settings @@ -24,16 +22,16 @@ from django.forms.models import model_to_dict from django.utils.timezone import now from django_guid import get_guid -from django_lifecycle import BEFORE_UPDATE, BEFORE_SAVE, hook +from django_lifecycle import BEFORE_SAVE, BEFORE_UPDATE, hook -from pulpcore.constants import ALL_KNOWN_CONTENT_CHECKSUMS from pulpcore.app import pulp_hashlib -from pulpcore.app.util import gpg_verify, get_domain_pk -from pulpcore.app.models import MasterModel, BaseModel, fields, storage +from pulpcore.app.models import BaseModel, MasterModel, fields, storage +from pulpcore.app.util import get_domain_pk, gpg_verify +from pulpcore.constants import ALL_KNOWN_CONTENT_CHECKSUMS from pulpcore.exceptions import ( DigestValidationError, - SizeValidationError, MissingDigestValidationError, + SizeValidationError, UnsupportedDigestValidationError, ) diff --git a/pulpcore/app/models/domain.py b/pulpcore/app/models/domain.py index 18dd3e8921b..aff0dc4b22e 100644 --- a/pulpcore/app/models/domain.py +++ b/pulpcore/app/models/domain.py @@ -1,9 +1,9 @@ +from django.contrib.postgres.fields import HStoreField from django.core.files.storage import default_storage from django.db import models -from django.contrib.postgres.fields import HStoreField -from django_lifecycle import hook, BEFORE_DELETE, BEFORE_UPDATE +from django_lifecycle import BEFORE_DELETE, BEFORE_UPDATE, hook -from pulpcore.app.models import BaseModel, AutoAddObjPermsMixin +from pulpcore.app.models import AutoAddObjPermsMixin, BaseModel from pulpcore.exceptions import DomainProtectedError from .fields import EncryptedJSONField diff --git a/pulpcore/app/models/fields.py b/pulpcore/app/models/fields.py index 11bc393056d..d711559344d 100644 --- a/pulpcore/app/models/fields.py +++ b/pulpcore/app/models/fields.py @@ -10,6 +10,7 @@ from django.db.models import FileField, JSONField, Lookup from django.db.models.fields import Field, TextField from django.utils.encoding import force_bytes, force_str + from pulpcore.app.files import TemporaryDownloadedFile _logger = logging.getLogger(__name__) diff --git a/pulpcore/app/models/openpgp.py b/pulpcore/app/models/openpgp.py index b215d822e75..3c96e03e8f0 100644 --- a/pulpcore/app/models/openpgp.py +++ b/pulpcore/app/models/openpgp.py @@ -3,7 +3,7 @@ from aiohttp.web_response import Response from django.db import models from django.utils import timezone -from pysequoia import armor, ArmorKind +from pysequoia import ArmorKind, armor from pulpcore.app.models import AutoAddObjPermsMixin, Content, Distribution, Repository from pulpcore.app.util import get_domain_pk, gpg_verify diff --git a/pulpcore/app/models/publication.py b/pulpcore/app/models/publication.py index 12e75d49b6a..b953be30db9 100644 --- a/pulpcore/app/models/publication.py +++ b/pulpcore/app/models/publication.py @@ -1,35 +1,34 @@ import hashlib import json -import jq import logging import os import re - from base64 import b64decode from binascii import Error as Base64DecodeError from datetime import timedelta from gettext import gettext as _ -from url_normalize import url_normalize -from urllib.parse import urlparse, urljoin +from urllib.parse import urljoin, urlparse +import jq from aiohttp.web_exceptions import HTTPNotFound - from django.conf import settings from django.contrib.postgres.fields import HStoreField from django.db import DatabaseError, IntegrityError, models, transaction from django.utils import timezone -from django_lifecycle import hook, AFTER_CREATE, AFTER_UPDATE, BEFORE_DELETE +from django_lifecycle import AFTER_CREATE, AFTER_UPDATE, BEFORE_DELETE, hook +from rest_framework.exceptions import APIException +from url_normalize import url_normalize -from .base import MasterModel, BaseModel -from .content import Artifact, Content, ContentArtifact -from .repository import Remote, Repository, RepositoryVersion -from .task import CreatedResource from pulpcore.app.files import PulpTemporaryUploadedFile -from pulpcore.cache import Cache -from rest_framework.exceptions import APIException from pulpcore.app.models import AutoAddObjPermsMixin +from pulpcore.app.util import cache_key, get_domain_pk, get_url, retain_distributed_pub_enabled +from pulpcore.cache import Cache from pulpcore.responses import ArtifactResponse -from pulpcore.app.util import get_domain_pk, cache_key, get_url, retain_distributed_pub_enabled + +from .base import BaseModel, MasterModel +from .content import Artifact, Content, ContentArtifact +from .repository import Remote, Repository, RepositoryVersion +from .task import CreatedResource _logger = logging.getLogger(__name__) diff --git a/pulpcore/app/models/replica.py b/pulpcore/app/models/replica.py index aeac71a7fe2..ed6664157ce 100644 --- a/pulpcore/app/models/replica.py +++ b/pulpcore/app/models/replica.py @@ -6,8 +6,9 @@ """ from django.db import models -from pulpcore.plugin.models import BaseModel, EncryptedTextField, AutoAddObjPermsMixin + from pulpcore.app.util import get_domain_pk +from pulpcore.plugin.models import AutoAddObjPermsMixin, BaseModel, EncryptedTextField class UpstreamPulp(BaseModel, AutoAddObjPermsMixin): diff --git a/pulpcore/app/models/repository.py b/pulpcore/app/models/repository.py index c07ba74ec20..b9f4b898584 100644 --- a/pulpcore/app/models/repository.py +++ b/pulpcore/app/models/repository.py @@ -2,16 +2,16 @@ Repository related Django models. """ +import logging +from collections import defaultdict from contextlib import suppress from gettext import gettext as _ from os import path -from collections import defaultdict -import logging import django from asyncio_throttle import Throttler from django.conf import settings -from django.contrib.postgres.fields import HStoreField, ArrayField +from django.contrib.postgres.fields import ArrayField, HStoreField from django.core.validators import MinValueValidator from django.db import models, transaction from django.db.models import F, Func, Q, Value @@ -20,19 +20,18 @@ from pulpcore.app.util import ( batch_qs, + cache_key, + get_domain_pk, get_prn, get_view_name_for_model, - get_domain_pk, - cache_key, reverse, ) +from pulpcore.cache import Cache from pulpcore.constants import ALL_KNOWN_CONTENT_CHECKSUMS, PROTECTED_REPO_VERSION_MESSAGE from pulpcore.download.factory import DownloaderFactory from pulpcore.exceptions import ResourceImmutableError -from pulpcore.cache import Cache - -from .base import MasterModel, BaseModel +from .base import BaseModel, MasterModel from .content import Artifact, Content, ContentArtifact, RemoteArtifact from .fields import EncryptedTextField from .task import CreatedResource, Task @@ -392,7 +391,7 @@ def pull_through_add_content(self, content_artifact): if not cpk or already_present.exists(): return None - from pulpcore.plugin.tasking import dispatch, aadd_and_remove + from pulpcore.plugin.tasking import aadd_and_remove, dispatch body = {"repository_pk": self.pk, "add_content_units": [cpk], "remove_content_units": []} return dispatch(aadd_and_remove, kwargs=body, exclusive_resources=[self], immediate=True) @@ -405,7 +404,7 @@ async def async_pull_through_add_content(self, content_artifact): if not cpk or await already_present.aexists(): return None - from pulpcore.plugin.tasking import adispatch, aadd_and_remove + from pulpcore.plugin.tasking import aadd_and_remove, adispatch body = {"repository_pk": self.pk, "add_content_units": [cpk], "remove_content_units": []} return await adispatch( diff --git a/pulpcore/app/models/storage.py b/pulpcore/app/models/storage.py index 8a87c7ac250..93698616fb6 100644 --- a/pulpcore/app/models/storage.py +++ b/pulpcore/app/models/storage.py @@ -4,7 +4,7 @@ from django.conf import settings from django.core.files import locks from django.core.files.move import file_move_safe -from django.core.files.storage import Storage, FileSystemStorage +from django.core.files.storage import FileSystemStorage, Storage from pulpcore.app.util import get_domain diff --git a/pulpcore/app/models/task.py b/pulpcore/app/models/task.py index 924f360ff90..a24d1870163 100644 --- a/pulpcore/app/models/task.py +++ b/pulpcore/app/models/task.py @@ -11,21 +11,21 @@ from django.core.serializers.json import DjangoJSONEncoder from django.db import models from django.utils import timezone -from django_lifecycle import hook, AFTER_CREATE +from django_lifecycle import AFTER_CREATE, hook +from pulpcore.app.contexts import _current_task +from pulpcore.app.loggers import deprecation_logger from pulpcore.app.models import ( AutoAddObjPermsMixin, BaseModel, GenericRelationModel, ) -from pulpcore.app.models.status import AppStatus from pulpcore.app.models.fields import EncryptedJSONField +from pulpcore.app.models.status import AppStatus +from pulpcore.app.role_util import get_users_with_perms +from pulpcore.app.util import get_domain_pk from pulpcore.constants import TASK_CHOICES, TASK_INCOMPLETE_STATES, TASK_STATES from pulpcore.exceptions import exception_to_dict -from pulpcore.app.util import get_domain_pk -from pulpcore.app.contexts import _current_task -from pulpcore.app.role_util import get_users_with_perms -from pulpcore.app.loggers import deprecation_logger _logger = logging.getLogger(__name__) diff --git a/pulpcore/app/models/upload.py b/pulpcore/app/models/upload.py index 50dca8209d3..5483a0c8bdd 100644 --- a/pulpcore/app/models/upload.py +++ b/pulpcore/app/models/upload.py @@ -1,6 +1,5 @@ import hashlib import os - from gettext import gettext as _ from django.core.files.base import ContentFile @@ -9,7 +8,7 @@ from django.dispatch import receiver from rest_framework import serializers -from pulpcore.app.models import BaseModel, fields, storage, AutoAddObjPermsMixin +from pulpcore.app.models import AutoAddObjPermsMixin, BaseModel, fields, storage from pulpcore.app.util import get_domain_pk diff --git a/pulpcore/app/pulp_hashlib.py b/pulpcore/app/pulp_hashlib.py index 604709b4daa..b31c7e6eb8b 100644 --- a/pulpcore/app/pulp_hashlib.py +++ b/pulpcore/app/pulp_hashlib.py @@ -1,7 +1,7 @@ """A wrapper around `hashlib` providing only hashers named in settings.ALLOWED_CONTENT_CHECKSUMS""" -from gettext import gettext as _ import hashlib as the_real_hashlib +from gettext import gettext as _ from django.conf import settings diff --git a/pulpcore/app/replica.py b/pulpcore/app/replica.py index 1a6979bd5ff..aab0968ff0d 100644 --- a/pulpcore/app/replica.py +++ b/pulpcore/app/replica.py @@ -1,18 +1,18 @@ import logging +from urllib.parse import urljoin from django.db.models import Model from django.utils.dateparse import parse_datetime -from urllib.parse import urljoin - from pulp_glue.common.context import PulpContext + from pulpcore.app.models import UpstreamPulp -from pulpcore.tasking.tasks import dispatch from pulpcore.app.tasks.base import ( ageneral_update, general_create, general_multi_delete, ) -from pulpcore.plugin.util import get_url, get_domain +from pulpcore.plugin.util import get_domain, get_url +from pulpcore.tasking.tasks import dispatch _logger = logging.getLogger(__name__) diff --git a/pulpcore/app/response.py b/pulpcore/app/response.py index 7e78310afa3..51216ce1085 100644 --- a/pulpcore/app/response.py +++ b/pulpcore/app/response.py @@ -1,4 +1,5 @@ from rest_framework.response import Response + from pulpcore.app.util import reverse diff --git a/pulpcore/app/role_util.py b/pulpcore/app/role_util.py index 754004c7dd9..103c68541e3 100644 --- a/pulpcore/app/role_util.py +++ b/pulpcore/app/role_util.py @@ -1,15 +1,14 @@ -from gettext import gettext as _ - from collections import defaultdict from functools import lru_cache +from gettext import gettext as _ from django.conf import settings -from django.core.exceptions import BadRequest -from django.db.models import Q, Exists, OuterRef, CharField -from django.db.models.functions import Cast from django.contrib.auth import get_user_model as django_get_user_model from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import BadRequest +from django.db.models import CharField, Exists, OuterRef, Q +from django.db.models.functions import Cast from pulpcore.app.models import Group from pulpcore.app.models.role import GroupRole, Role, UserRole diff --git a/pulpcore/app/serializers/__init__.py b/pulpcore/app/serializers/__init__.py index 9647d603a39..5a1dc1ada78 100644 --- a/pulpcore/app/serializers/__init__.py +++ b/pulpcore/app/serializers/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file # Load order: base, fields, all others. # - fields can import directly from base if needed # - all can import directly from base and fields if needed diff --git a/pulpcore/app/serializers/acs.py b/pulpcore/app/serializers/acs.py index f20eceadb6a..6290ad9fff8 100644 --- a/pulpcore/app/serializers/acs.py +++ b/pulpcore/app/serializers/acs.py @@ -11,7 +11,6 @@ DomainUniqueValidator, ModelSerializer, ) - from pulpcore.app.util import get_url diff --git a/pulpcore/app/serializers/base.py b/pulpcore/app/serializers/base.py index f03b1d433bf..17d26c3b5fd 100644 --- a/pulpcore/app/serializers/base.py +++ b/pulpcore/app/serializers/base.py @@ -1,19 +1,19 @@ -from gettext import gettext as _ -from logging import getLogger import functools import re import traceback from collections import namedtuple +from gettext import gettext as _ +from logging import getLogger from typing import List, TypedDict from urllib.parse import urljoin from cryptography.x509 import load_pem_x509_certificate from django.conf import settings -from django.core.validators import URLValidator from django.core.exceptions import ObjectDoesNotExist -from django.urls.exceptions import NoReverseMatch +from django.core.validators import URLValidator from django.db import IntegrityError from django.db.models import Model +from django.urls.exceptions import NoReverseMatch from drf_queryfields.mixins import QueryFieldsMixin from rest_framework import serializers from rest_framework.validators import UniqueValidator @@ -23,21 +23,21 @@ ) from pulpcore.app.models import ( - Task, - TaskGroup, - MasterModel, GenericRelationModel, + MasterModel, Repository, RepositoryVersion, + Task, + TaskGroup, ) from pulpcore.app.util import ( - get_view_name_for_model, - get_viewset_for_model, - get_request_without_query_params, get_domain, - reverse, get_prn, + get_request_without_query_params, + get_view_name_for_model, + get_viewset_for_model, resolve_prn, + reverse, ) log = getLogger(__name__) diff --git a/pulpcore/app/serializers/content.py b/pulpcore/app/serializers/content.py index c011965ef00..bd138c4ede3 100644 --- a/pulpcore/app/serializers/content.py +++ b/pulpcore/app/serializers/content.py @@ -1,16 +1,16 @@ from gettext import gettext as _ -from django.db import transaction, IntegrityError +from django.db import IntegrityError, transaction from rest_framework import serializers from rest_framework.validators import UniqueValidator from pulpcore.app import models from pulpcore.app.serializers import ( + DetailRelatedField, + RelatedField, base, fields, pulp_labels_validator, - DetailRelatedField, - RelatedField, ) from pulpcore.app.util import get_domain diff --git a/pulpcore/app/serializers/domain.py b/pulpcore/app/serializers/domain.py index 217711ff198..c56380cf2aa 100644 --- a/pulpcore/app/serializers/domain.py +++ b/pulpcore/app/serializers/domain.py @@ -1,20 +1,19 @@ -from gettext import gettext as _ import json +from gettext import gettext as _ from django.conf import settings -from django.utils.module_loading import import_string from django.core.exceptions import ImproperlyConfigured +from django.utils.module_loading import import_string from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema_field - from rest_framework import serializers from rest_framework.validators import UniqueValidator from pulpcore.app.models import Domain from pulpcore.app.serializers import ( + HiddenFieldsMixin, IdentityField, ModelSerializer, - HiddenFieldsMixin, pulp_labels_validator, ) @@ -419,7 +418,7 @@ def _validate_storage_backend(storage_class, storage_settings): except ImproperlyConfigured as e: raise serializers.ValidationError( detail={ - "storage_settings": _("Backend settings contain incorrect values: {}".format(e)) + "storage_settings": _("Backend settings contain incorrect values: {}").format(e) } ) diff --git a/pulpcore/app/serializers/exporter.py b/pulpcore/app/serializers/exporter.py index 3378f455e99..8142853d196 100644 --- a/pulpcore/app/serializers/exporter.py +++ b/pulpcore/app/serializers/exporter.py @@ -1,6 +1,6 @@ import os -from gettext import gettext as _ import re +from gettext import gettext as _ from rest_framework import serializers diff --git a/pulpcore/app/serializers/fields.py b/pulpcore/app/serializers/fields.py index a04baeb64ea..57ec4bba557 100644 --- a/pulpcore/app/serializers/fields.py +++ b/pulpcore/app/serializers/fields.py @@ -5,15 +5,15 @@ from urllib.parse import urljoin from django.conf import settings -from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from rest_framework.fields import empty from pulpcore.app import models -from pulpcore.constants import LABEL_KEY_REGEX from pulpcore.app.serializers import DetailIdentityField, IdentityField, RelatedField from pulpcore.app.util import reverse +from pulpcore.constants import LABEL_KEY_REGEX def relative_path_validator(relative_path): diff --git a/pulpcore/app/serializers/openpgp.py b/pulpcore/app/serializers/openpgp.py index 69e69fa9a12..7858149f97c 100644 --- a/pulpcore/app/serializers/openpgp.py +++ b/pulpcore/app/serializers/openpgp.py @@ -1,5 +1,7 @@ from gettext import gettext as _ +from rest_framework import serializers + from pulpcore.app import models from pulpcore.app.openpgp import read_public_key from pulpcore.app.serializers import ( @@ -11,7 +13,6 @@ ) from pulpcore.app.util import get_domain_pk from pulpcore.plugin.serializers import NoArtifactContentUploadSerializer -from rest_framework import serializers class NestedOpenPGPSignatureSerializer(NoArtifactContentSerializer): diff --git a/pulpcore/app/serializers/publication.py b/pulpcore/app/serializers/publication.py index bc664b8f99d..eeffe7d6072 100644 --- a/pulpcore/app/serializers/publication.py +++ b/pulpcore/app/serializers/publication.py @@ -1,11 +1,11 @@ from gettext import gettext as _ -from pulpcore.app.util import get_prn from django.db.models import Q from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from pulpcore.app import models +from pulpcore.app.role_util import get_groups_with_perms, get_users_with_perms from pulpcore.app.serializers import ( BaseURLField, DetailIdentityField, @@ -16,9 +16,8 @@ RepositoryVersionRelatedField, pulp_labels_validator, ) -from pulpcore.app.serializers.user import GroupUserSerializer, GroupSerializer -from pulpcore.app.role_util import get_users_with_perms, get_groups_with_perms -from pulpcore.app.util import get_domain +from pulpcore.app.serializers.user import GroupSerializer, GroupUserSerializer +from pulpcore.app.util import get_domain, get_prn class PublicationSerializer(ModelSerializer): @@ -65,10 +64,7 @@ def validate(self, data): detail=_("Repository has no version available to create Publication from") ) raise serializers.ValidationError( - _( - "Either the 'repository' or 'repository_version' need to be specified " - "but not both." - ) + _("Either the 'repository' or 'repository_version' need to be specified but not both.") ) class Meta: @@ -208,8 +204,10 @@ class DistributionSerializer(ModelSerializer): pulp_labels = serializers.HStoreField(required=False, validators=[pulp_labels_validator]) base_path = serializers.CharField( - help_text=_('The base (relative) path component of the published url. Avoid paths that \ - overlap with other distribution base paths (e.g. "foo" and "foo/bar")'), + help_text=_( + 'The base (relative) path component of the published url. Avoid paths that \ + overlap with other distribution base paths (e.g. "foo" and "foo/bar")' + ), validators=[DomainUniqueValidator(queryset=models.Distribution.objects.all())], ) base_url = BaseURLField( diff --git a/pulpcore/app/serializers/reclaim.py b/pulpcore/app/serializers/reclaim.py index 65f430cf0d3..984f736e97d 100644 --- a/pulpcore/app/serializers/reclaim.py +++ b/pulpcore/app/serializers/reclaim.py @@ -3,7 +3,6 @@ from rest_framework import fields, serializers from pulpcore.app.models import Repository - from pulpcore.app.serializers import RepositoryVersionRelatedField, ValidateFieldsMixin from pulpcore.app.util import get_domain diff --git a/pulpcore/app/serializers/replica.py b/pulpcore/app/serializers/replica.py index 29ba9dc3e8c..f235c3719a2 100644 --- a/pulpcore/app/serializers/replica.py +++ b/pulpcore/app/serializers/replica.py @@ -3,12 +3,12 @@ from rest_framework import serializers from rest_framework.validators import UniqueValidator -from pulpcore.app.serializers import HiddenFieldsMixin +from pulpcore.app.models import UpstreamPulp from pulpcore.app.serializers import ( + HiddenFieldsMixin, IdentityField, ModelSerializer, ) -from pulpcore.app.models import UpstreamPulp class UpstreamPulpSerializer(ModelSerializer, HiddenFieldsMixin): diff --git a/pulpcore/app/serializers/repository.py b/pulpcore/app/serializers/repository.py index fbcf19b9283..7bb4f6e0823 100644 --- a/pulpcore/app/serializers/repository.py +++ b/pulpcore/app/serializers/repository.py @@ -10,18 +10,17 @@ DetailIdentityField, DetailRelatedField, DomainUniqueValidator, + HiddenFieldsMixin, LatestVersionField, ModelSerializer, RepositoryVersionIdentityField, RepositoryVersionRelatedField, RepositoryVersionsIdentityFromRepositoryField, ValidateFieldsMixin, - HiddenFieldsMixin, pulp_labels_validator, ) from pulpcore.app.serializers.base import RemoteNetworkConfigSerializer -from pulpcore.app.util import extract_pk, raise_for_unknown_content_units -from pulpcore.app.util import get_prn, reverse +from pulpcore.app.util import extract_pk, get_prn, raise_for_unknown_content_units, reverse class RepositorySerializer(ModelSerializer): diff --git a/pulpcore/app/serializers/task.py b/pulpcore/app/serializers/task.py index ef5c16f52e1..8d79bd042a1 100644 --- a/pulpcore/app/serializers/task.py +++ b/pulpcore/app/serializers/task.py @@ -1,9 +1,9 @@ import typing as t from gettext import gettext as _ -from rest_framework import serializers -from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_serializer +from rest_framework import serializers from pulpcore.app import models from pulpcore.app.serializers import ( @@ -16,8 +16,8 @@ TaskGroupStatusCountField, fields, ) -from pulpcore.constants import TASK_STATES from pulpcore.app.util import get_prn, reverse +from pulpcore.constants import TASK_STATES class CreatedResourceField(RelatedResourceField): diff --git a/pulpcore/app/serializers/upload.py b/pulpcore/app/serializers/upload.py index 4c79392bd18..eed907fc83b 100644 --- a/pulpcore/app/serializers/upload.py +++ b/pulpcore/app/serializers/upload.py @@ -1,10 +1,10 @@ import re - from gettext import gettext as _ + from rest_framework import serializers from pulpcore.app import models -from pulpcore.app.serializers import base, ValidateFieldsMixin +from pulpcore.app.serializers import ValidateFieldsMixin, base CONTENT_RANGE_PATTERN = r"^bytes (\d+)-(\d+)/(\d+|[*])$" diff --git a/pulpcore/app/serializers/user.py b/pulpcore/app/serializers/user.py index bcfc9b546b2..375a72cc92a 100644 --- a/pulpcore/app/serializers/user.py +++ b/pulpcore/app/serializers/user.py @@ -1,32 +1,31 @@ import typing - from gettext import gettext as _ from django.contrib.auth import get_user_model from django.contrib.auth import login as auth_login +from django.contrib.auth.hashers import check_password, make_password from django.contrib.auth.models import Permission -from django.contrib.auth.hashers import make_password, check_password from django.contrib.auth.password_validation import validate_password from django.contrib.contenttypes.models import ContentType from rest_framework import serializers from rest_framework.validators import UniqueValidator from rest_framework_nested.serializers import NestedHyperlinkedModelSerializer -from pulpcore.app.models import Group, Domain +from pulpcore.app.models import Domain, Group from pulpcore.app.models.role import GroupRole, Role, UserRole from pulpcore.app.serializers import ( - NestedIdentityField, + HiddenFieldsMixin, IdentityField, - ValidateFieldsMixin, ModelSerializer, - HiddenFieldsMixin, - RelatedField, + NestedIdentityField, PRNField, + RelatedField, + ValidateFieldsMixin, ) from pulpcore.app.util import ( + get_prn, get_request_without_query_params, get_url, - get_prn, resolve_prn, ) diff --git a/pulpcore/app/settings.py b/pulpcore/app/settings.py index d5b13086561..a4411f50eac 100644 --- a/pulpcore/app/settings.py +++ b/pulpcore/app/settings.py @@ -9,7 +9,6 @@ """ import sys - from contextlib import suppress from importlib import import_module from importlib.metadata import entry_points diff --git a/pulpcore/app/tasks/__init__.py b/pulpcore/app/tasks/__init__.py index 43a349eb299..727bb533254 100644 --- a/pulpcore/app/tasks/__init__.py +++ b/pulpcore/app/tasks/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from pulpcore.app.tasks import base, repository, upload from .base import ( diff --git a/pulpcore/app/tasks/analytics.py b/pulpcore/app/tasks/analytics.py index dd193836be9..ea03fc74cf9 100644 --- a/pulpcore/app/tasks/analytics.py +++ b/pulpcore/app/tasks/analytics.py @@ -12,12 +12,12 @@ from asgiref.sync import sync_to_async from django.conf import settings -from django.db import connection from django.contrib.auth import get_user_model +from django.db import connection from google.protobuf.json_format import MessageToJson from pulpcore.app.apps import pulp_plugin_configs -from pulpcore.app.models import SystemID, Group, Domain, AccessPolicy +from pulpcore.app.models import AccessPolicy, Domain, Group, SystemID from pulpcore.app.models.role import Role from pulpcore.app.models.status import AppStatus from pulpcore.app.protobuf.analytics_pb2 import Analytics @@ -128,7 +128,7 @@ async def post_analytics(): async with session.post(url, data=analytics.SerializeToString()) as resp: if resp.status == 200: logger.info( - ("Submitted analytics to %s. " "Information submitted includes %s"), + ("Submitted analytics to %s. Information submitted includes %s"), url, json.loads(MessageToJson(analytics)), ) diff --git a/pulpcore/app/tasks/base.py b/pulpcore/app/tasks/base.py index fda739e4603..23814fe5b06 100644 --- a/pulpcore/app/tasks/base.py +++ b/pulpcore/app/tasks/base.py @@ -1,12 +1,11 @@ +from asgiref.sync import sync_to_async from django.db import transaction from pulpcore.app.apps import get_plugin_config -from pulpcore.app.models import CreatedResource from pulpcore.app.loggers import deprecation_logger +from pulpcore.app.models import CreatedResource from pulpcore.plugin.models import MasterModel -from asgiref.sync import sync_to_async - def general_create_from_temp_file(app_label, serializer_name, temp_file_pk, *args, **kwargs): """ diff --git a/pulpcore/app/tasks/datarepair.py b/pulpcore/app/tasks/datarepair.py index 27998bb210f..555c3147594 100644 --- a/pulpcore/app/tasks/datarepair.py +++ b/pulpcore/app/tasks/datarepair.py @@ -30,18 +30,22 @@ def repair_7272(dry_run=False): repos = models.Repository.objects.filter(pulp_domain=domain) total_versions = models.RepositoryVersion.objects.filter(repository__in=repos).count() - with ProgressReport( - message="Repositories checked", - code="repair.7272.repos_checked", - total=repos.count(), - ) as repos_progress, ProgressReport( - message="Repository versions checked", - code="repair.7272.versions_checked", - total=total_versions, - ) as versions_progress, ProgressReport( - message="Repository versions fixed", - code="repair.7272.versions_fixed", - ) as fixed_progress: + with ( + ProgressReport( + message="Repositories checked", + code="repair.7272.repos_checked", + total=repos.count(), + ) as repos_progress, + ProgressReport( + message="Repository versions checked", + code="repair.7272.versions_checked", + total=total_versions, + ) as versions_progress, + ProgressReport( + message="Repository versions fixed", + code="repair.7272.versions_fixed", + ) as fixed_progress, + ): for repo in repos: for rv in models.RepositoryVersion.objects.filter(repository=repo): needs_fix = False @@ -122,18 +126,22 @@ def repair_7465(dry_run=False): repos = models.Repository.objects.filter(pulp_domain=domain) total_versions = models.RepositoryVersion.objects.filter(repository__in=repos).count() - with ProgressReport( - message="Repositories checked", - code="repair.7465.repos_checked", - total=repos.count(), - ) as repos_progress, ProgressReport( - message="Repository versions checked", - code="repair.7465.versions_checked", - total=total_versions, - ) as versions_progress, ProgressReport( - message="Repository versions fixed", - code="repair.7465.versions_fixed", - ) as fixed_progress: + with ( + ProgressReport( + message="Repositories checked", + code="repair.7465.repos_checked", + total=repos.count(), + ) as repos_progress, + ProgressReport( + message="Repository versions checked", + code="repair.7465.versions_checked", + total=total_versions, + ) as versions_progress, + ProgressReport( + message="Repository versions fixed", + code="repair.7465.versions_fixed", + ) as fixed_progress, + ): for repo in repos: for rv in models.RepositoryVersion.objects.filter(repository=repo): versions_progress.increment() diff --git a/pulpcore/app/tasks/export.py b/pulpcore/app/tasks/export.py index 4bbca2ca092..53e395d2e51 100644 --- a/pulpcore/app/tasks/export.py +++ b/pulpcore/app/tasks/export.py @@ -3,7 +3,6 @@ import os import os.path import tarfile - from distutils.util import strtobool from gettext import gettext as _ from glob import glob @@ -12,6 +11,11 @@ from django.conf import settings from pulpcore.app.apps import get_plugin_config +from pulpcore.app.importexport import ( + export_artifacts, + export_content, + export_versions, +) from pulpcore.app.models import ( CreatedResource, ExportedResource, @@ -26,13 +30,7 @@ ) from pulpcore.app.models.content import ContentArtifact from pulpcore.app.serializers import PulpExportSerializer - -from pulpcore.app.util import compute_file_hash, Crc32Hasher, HashingFileWriter -from pulpcore.app.importexport import ( - export_versions, - export_artifacts, - export_content, -) +from pulpcore.app.util import Crc32Hasher, HashingFileWriter, compute_file_hash from pulpcore.constants import FS_EXPORT_METHODS log = logging.getLogger(__name__) diff --git a/pulpcore/app/tasks/importer.py b/pulpcore/app/tasks/importer.py index 3480348150c..337d41cbbc6 100644 --- a/pulpcore/app/tasks/importer.py +++ b/pulpcore/app/tasks/importer.py @@ -1,22 +1,26 @@ import json import os import re -import tempfile import tarfile +import tempfile from contextlib import ExitStack, nullcontext from gettext import gettext as _ +from io import StringIO from logging import getLogger import json_stream from django.conf import settings from django.core.files.storage import default_storage from django.db.models import F -from io import StringIO from rest_framework.serializers import ValidationError from tablib import Dataset -from pulpcore.exceptions.plugin import MissingPlugin from pulpcore.app.apps import get_plugin_config +from pulpcore.app.modelresource import ( + ArtifactResource, + ContentArtifactResource, + RepositoryResource, +) from pulpcore.app.models import ( AppStatus, Artifact, @@ -30,21 +34,16 @@ Task, TaskGroup, ) -from pulpcore.app.modelresource import ( - ArtifactResource, - ContentArtifactResource, - RepositoryResource, -) from pulpcore.app.util import ( - compute_file_hash, Crc32Hasher, + compute_file_hash, get_domain, get_domain_pk, ) from pulpcore.constants import TASK_STATES -from pulpcore.tasking.tasks import dispatch - +from pulpcore.exceptions.plugin import MissingPlugin from pulpcore.plugin.importexport import BaseContentResource +from pulpcore.tasking.tasks import dispatch log = getLogger(__name__) @@ -88,9 +87,9 @@ def __init__(self, toc_path): self.chunk_paths = [os.path.join(toc_dir, chunk_name) for chunk_name in self.chunk_names] self.chunk_size = int(self.toc["meta"].get("chunk_size", 0)) if not self.chunk_size: - assert ( - len(self.toc["files"]) == 1 - ), "chunk_size must exist and be non-zero if more than one chunk exists" + assert len(self.toc["files"]) == 1, ( + "chunk_size must exist and be non-zero if more than one chunk exists" + ) self.chunk_size = os.path.getsize(self.chunk_paths[0]) def __enter__(self): @@ -165,10 +164,8 @@ def validate_chunks(self): missing_files.append(chunk_path) if missing_files: raise ValidationError( - _( - "Missing import-chunks named in table-of-contents: {}.".format( - str(missing_files) - ) + _("Missing import-chunks named in table-of-contents: {}.").format( + str(missing_files) ) ) diff --git a/pulpcore/app/tasks/migrate.py b/pulpcore/app/tasks/migrate.py index e556a4185c5..dd15adc1ed8 100644 --- a/pulpcore/app/tasks/migrate.py +++ b/pulpcore/app/tasks/migrate.py @@ -3,7 +3,8 @@ from django.utils.timezone import now from rest_framework.serializers import ValidationError -from pulpcore.app.models import Artifact, storage, ProgressReport + +from pulpcore.app.models import Artifact, ProgressReport, storage from pulpcore.app.serializers import DomainBackendMigratorSerializer from pulpcore.app.util import get_domain diff --git a/pulpcore/app/tasks/orphan.py b/pulpcore/app/tasks/orphan.py index 418a6ed63a7..42a37a572c0 100644 --- a/pulpcore/app/tasks/orphan.py +++ b/pulpcore/app/tasks/orphan.py @@ -1,5 +1,4 @@ import gc - from logging import getLogger from django.conf import settings diff --git a/pulpcore/app/tasks/purge.py b/pulpcore/app/tasks/purge.py index 69263e934e6..68153aaa5c2 100644 --- a/pulpcore/app/tasks/purge.py +++ b/pulpcore/app/tasks/purge.py @@ -2,17 +2,17 @@ from logging import getLogger from django.conf import settings +from django.contrib.auth import get_user_model from django.db.models.deletion import ProtectedError from django.utils import timezone -from django.contrib.auth import get_user_model from pulpcore.app.models import ( ProgressReport, Task, ) from pulpcore.app.role_util import get_objects_for_user -from pulpcore.app.util import get_domain, get_current_authenticated_user -from pulpcore.constants import TASK_STATES, TASK_FINAL_STATES +from pulpcore.app.util import get_current_authenticated_user, get_domain +from pulpcore.constants import TASK_FINAL_STATES, TASK_STATES log = getLogger(__name__) @@ -48,7 +48,7 @@ def _details_reporting(current_reports, current_details, totals_pb): current_reports[key].increase_by(curr_detail) else: pb = ProgressReport( - message=_("Purged task-objects of type {}".format(key)), + message=_("Purged task-objects of type {}").format(key), code="purge.tasks.key.{}".format(key), total=None, done=curr_detail, @@ -127,7 +127,7 @@ def purge(finished_before=None, states=None, **kwargs): expected_total = candidate_qs.count() # Build and save a progress-report for that detail pb = ProgressReport( - message=_("Purged task-objects of type {}".format(TASK_KEY)), + message=_("Purged task-objects of type {}").format(TASK_KEY), total=expected_total, code="purge.tasks.key.{}".format(TASK_KEY), done=0, diff --git a/pulpcore/app/tasks/replica.py b/pulpcore/app/tasks/replica.py index e873c844ccb..272388246c5 100644 --- a/pulpcore/app/tasks/replica.py +++ b/pulpcore/app/tasks/replica.py @@ -5,16 +5,15 @@ from django.db import transaction from django.db.models import Min +from pulp_glue.common import __version__ as pulp_glue_version +from pulp_glue.common.context import PluginRequirement -from pulpcore.constants import TASK_STATES -from pulpcore.app.apps import pulp_plugin_configs, PulpAppConfig -from pulpcore.app.models import Distribution, Repository, UpstreamPulp, Task, TaskGroup +from pulpcore.app.apps import PulpAppConfig, pulp_plugin_configs +from pulpcore.app.models import Distribution, Repository, Task, TaskGroup, UpstreamPulp from pulpcore.app.replica import ReplicaContext +from pulpcore.constants import TASK_STATES from pulpcore.tasking.tasks import dispatch -from pulp_glue.common import __version__ as pulp_glue_version -from pulp_glue.common.context import PluginRequirement - def user_agent(): """ diff --git a/pulpcore/app/tasks/repository.py b/pulpcore/app/tasks/repository.py index b20bf3c7dbd..c989f17f068 100644 --- a/pulpcore/app/tasks/repository.py +++ b/pulpcore/app/tasks/repository.py @@ -1,9 +1,9 @@ +import asyncio +import hashlib from concurrent.futures import ThreadPoolExecutor from contextvars import copy_context from gettext import gettext as _ from logging import getLogger -import asyncio -import hashlib from asgiref.sync import sync_to_async from django.db import transaction @@ -123,13 +123,11 @@ async def _repair_artifacts_for_content(subset=None, verify_checksums=True): query_set = query_set.filter(content__in=subset.values("pk")) - async with ProgressReport( - message="Identify missing units", code="repair.missing" - ) as missing, ProgressReport( - message="Identify corrupted units", code="repair.corrupted" - ) as corrupted, ProgressReport( - message="Repair corrupted units", code="repair.repaired" - ) as repaired: + async with ( + ProgressReport(message="Identify missing units", code="repair.missing") as missing, + ProgressReport(message="Identify corrupted units", code="repair.corrupted") as corrupted, + ProgressReport(message="Repair corrupted units", code="repair.repaired") as repaired, + ): with ThreadPoolExecutor(max_workers=2) as checksum_executor: storage = domain.get_storage() async for content_artifact in query_set.select_related("artifact").aiterator(): diff --git a/pulpcore/app/tasks/telemetry.py b/pulpcore/app/tasks/telemetry.py index 3332d08e602..5b8548efc4d 100644 --- a/pulpcore/app/tasks/telemetry.py +++ b/pulpcore/app/tasks/telemetry.py @@ -1,13 +1,11 @@ from django.db.models import Sum - -from pulpcore.app.models import Artifact - -from opentelemetry.sdk.metrics import MeterProvider - from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter +from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader from opentelemetry.sdk.resources import Resource +from pulpcore.app.models import Artifact + def otel_metrics(): diff --git a/pulpcore/app/tasks/test.py b/pulpcore/app/tasks/test.py index bfca6828337..771a160bb00 100644 --- a/pulpcore/app/tasks/test.py +++ b/pulpcore/app/tasks/test.py @@ -1,12 +1,13 @@ import asyncio -import backoff import os import signal import time -from pulpcore.app.models import TaskGroup -from pulpcore.app.models import Task -from pulpcore.tasking.tasks import dispatch + +import backoff + +from pulpcore.app.models import Task, TaskGroup from pulpcore.constants import TASK_STATES +from pulpcore.tasking.tasks import dispatch def dummy_task(): diff --git a/pulpcore/app/tasks/vulnerability_report.py b/pulpcore/app/tasks/vulnerability_report.py index bcac429a7b7..508b971cc87 100644 --- a/pulpcore/app/tasks/vulnerability_report.py +++ b/pulpcore/app/tasks/vulnerability_report.py @@ -1,13 +1,13 @@ -import aiohttp import asyncio import importlib +import aiohttp from asgiref.sync import sync_to_async from django.conf import settings -from pulpcore.app.util import get_domain from pulpcore.app.models.progress import ProgressReport from pulpcore.app.models.vulnerability_report import VulnerabilityReport +from pulpcore.app.util import get_domain from pulpcore.constants import OSV_QUERY_URL, TASK_STATES diff --git a/pulpcore/app/templatetags/pulp_urls.py b/pulpcore/app/templatetags/pulp_urls.py index 80abb018850..a372581b4e5 100644 --- a/pulpcore/app/templatetags/pulp_urls.py +++ b/pulpcore/app/templatetags/pulp_urls.py @@ -1,4 +1,5 @@ -from django.template.defaultfilters import stringfilter, urlize as orig_urlize, register +from django.template.defaultfilters import register, stringfilter +from django.template.defaultfilters import urlize as orig_urlize from django.utils.safestring import SafeData, mark_safe from pulpcore.app.find_url import find_api_root diff --git a/pulpcore/app/urls.py b/pulpcore/app/urls.py index 193e3c68d8e..47423392483 100644 --- a/pulpcore/app/urls.py +++ b/pulpcore/app/urls.py @@ -1,26 +1,25 @@ """pulp URL Configuration""" from django.conf import settings -from django.urls import path, include +from django.urls import include, path from django.views.decorators.cache import cache_page from drf_spectacular.utils import extend_schema from drf_spectacular.views import ( SpectacularJSONAPIView, - SpectacularYAMLAPIView, SpectacularRedocView, SpectacularSwaggerView, + SpectacularYAMLAPIView, ) -from rest_framework_nested import routers from rest_framework.routers import APIRootView +from rest_framework_nested import routers from pulpcore.app.apps import pulp_plugin_configs -from pulpcore.plugin.find_url import find_api_root from pulpcore.app.views import ( + DataRepair7272View, + DataRepair7465View, LivezView, OrphansView, PulpImporterImportCheckView, - DataRepair7272View, - DataRepair7465View, RepairView, StatusView, ) @@ -30,6 +29,7 @@ OrphansCleanupViewset, ReclaimSpaceViewSet, ) +from pulpcore.plugin.find_url import find_api_root _, PATH_DOMAIN_REWRITE_NOFRONT = find_api_root(lstrip=True, set_domain=True, rewrite_header=True) _, PATH_NODOMAIN_NOREWRITE_NOFRONT = find_api_root( diff --git a/pulpcore/app/util.py b/pulpcore/app/util.py index 1e5543b8cea..237ad50e67a 100644 --- a/pulpcore/app/util.py +++ b/pulpcore/app/util.py @@ -1,32 +1,29 @@ import hashlib -import zlib import os import socket +import zlib +from contextlib import ExitStack +from datetime import timedelta +from functools import lru_cache +from gettext import gettext as _ from io import RawIOBase from pathlib import Path from types import TracebackType -from typing import Self, IO, Any - -from functools import lru_cache -from gettext import gettext as _ +from typing import IO, Any, Self from urllib.parse import urlparse -from contextlib import ExitStack -from datetime import timedelta from uuid import UUID from django.apps import apps from django.conf import settings from django.db import connection from django.db.models import Model, UUIDField - - -from rest_framework.serializers import ValidationError from rest_framework.reverse import reverse as drf_reverse +from rest_framework.serializers import ValidationError -from pulpcore.app.loggers import deprecation_logger -from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app import models +from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app.contexts import _current_domain, _current_user_func +from pulpcore.app.loggers import deprecation_logger from pulpcore.exceptions.validation import InvalidSignatureError # a little cache so viewset_for_model doesn't have to iterate over every app every time @@ -406,8 +403,7 @@ def __init__(self, decrypted): def __repr__(self): return ( - f"" + f"" ) diff --git a/pulpcore/app/views/__init__.py b/pulpcore/app/views/__init__.py index d55b48b8291..0a8214b1cd2 100644 --- a/pulpcore/app/views/__init__.py +++ b/pulpcore/app/views/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from .datarepair import DataRepair7272View, DataRepair7465View from .orphans import OrphansView from .status import LivezView, StatusView diff --git a/pulpcore/app/views/importer.py b/pulpcore/app/views/importer.py index bbe182c557a..5e5f104588a 100644 --- a/pulpcore/app/views/importer.py +++ b/pulpcore/app/views/importer.py @@ -1,9 +1,10 @@ -from gettext import gettext as _ import json import os +from gettext import gettext as _ + from drf_spectacular.utils import extend_schema -from rest_framework.views import APIView from rest_framework.response import Response +from rest_framework.views import APIView from pulpcore.app import settings from pulpcore.app.serializers import PulpImportCheckResponseSerializer, PulpImportCheckSerializer @@ -14,8 +15,8 @@ def _check_allowed_import_path(a_path): for allowed_path in settings.ALLOWED_IMPORT_PATHS: if user_provided_realpath.startswith(allowed_path): return True, None - return False, _( - "{} is not an allowed import path".format(os.path.dirname(os.path.realpath(a_path))) + return False, _("{} is not an allowed import path").format( + os.path.dirname(os.path.realpath(a_path)) ) @@ -60,15 +61,15 @@ def _validate_file(in_param, data): rc = isfile and readable if not isfile: - msgs.append(_("{} is not a file".format(real_file))) + msgs.append(_("{} is not a file").format(real_file)) if not readable: - msgs.append(_("{} exists but cannot be read".format(real_file))) + msgs.append(_("{} exists but cannot be read").format(real_file)) # extra check for toc-dir-write if in_param == "toc": if not os.access(owning_dir, os.W_OK): rc = False - msgs.append(_("directory {} must allow pulp write-access".format(owning_dir))) + msgs.append(_("directory {} must allow pulp write-access").format(owning_dir)) return rc, msgs diff --git a/pulpcore/app/views/status.py b/pulpcore/app/views/status.py index 050f833ef13..77a448693c4 100644 --- a/pulpcore/app/views/status.py +++ b/pulpcore/app/views/status.py @@ -1,5 +1,6 @@ import logging import shutil +from collections import namedtuple from gettext import gettext as _ from django.conf import settings @@ -7,13 +8,12 @@ from drf_spectacular.utils import extend_schema from rest_framework.response import Response from rest_framework.views import APIView -from collections import namedtuple from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app.models.content import Artifact from pulpcore.app.models.status import AppStatus -from pulpcore.app.serializers.status import StatusSerializer from pulpcore.app.redis_connection import get_redis_connection +from pulpcore.app.serializers.status import StatusSerializer from pulpcore.app.util import get_domain _logger = logging.getLogger(__name__) diff --git a/pulpcore/app/viewsets/__init__.py b/pulpcore/app/viewsets/__init__.py index ee2783e8d66..006c8c54d16 100644 --- a/pulpcore/app/viewsets/__init__.py +++ b/pulpcore/app/viewsets/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from .base import ( AsyncCreateMixin, AsyncRemoveMixin, diff --git a/pulpcore/app/viewsets/access_policy.py b/pulpcore/app/viewsets/access_policy.py index 3c758275177..e592123ad97 100644 --- a/pulpcore/app/viewsets/access_policy.py +++ b/pulpcore/app/viewsets/access_policy.py @@ -1,14 +1,14 @@ +from drf_spectacular.utils import extend_schema from rest_framework import mixins from rest_framework.decorators import action from rest_framework.response import Response -from drf_spectacular.utils import extend_schema from pulpcore.app.apps import pulp_plugin_configs from pulpcore.app.models import AccessPolicy from pulpcore.app.serializers import AccessPolicySerializer +from pulpcore.app.util import get_view_urlpattern from pulpcore.app.viewsets import NamedModelViewSet from pulpcore.app.viewsets.base import NAME_FILTER_OPTIONS -from pulpcore.app.util import get_view_urlpattern class AccessPolicyViewSet( diff --git a/pulpcore/app/viewsets/acs.py b/pulpcore/app/viewsets/acs.py index 4c3041d2eb5..2f992014842 100644 --- a/pulpcore/app/viewsets/acs.py +++ b/pulpcore/app/viewsets/acs.py @@ -6,11 +6,11 @@ from pulpcore.app import tasks from pulpcore.app.models import AlternateContentSource +from pulpcore.app.response import OperationPostponedResponse from pulpcore.app.serializers import ( - AsyncOperationResponseSerializer, AlternateContentSourceSerializer, + AsyncOperationResponseSerializer, ) -from pulpcore.app.response import OperationPostponedResponse from pulpcore.app.viewsets import ( AsyncUpdateMixin, NamedModelViewSet, diff --git a/pulpcore/app/viewsets/base.py b/pulpcore/app/viewsets/base.py index 37b3511b848..7e09cc151d6 100644 --- a/pulpcore/app/viewsets/base.py +++ b/pulpcore/app/viewsets/base.py @@ -3,18 +3,18 @@ from urllib.parse import urlparse from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldError, ValidationError from django.db import transaction from django.db.models.expressions import RawSQL -from django.core.exceptions import FieldError, ValidationError from django.urls import Resolver404, resolve -from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema, inline_serializer from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.generics import get_object_or_404 from rest_framework.response import Response -from pulpcore.openapi import PulpAutoSchema, InheritSerializer -from rest_framework.serializers import ValidationError as DRFValidationError, ListField, CharField +from rest_framework.serializers import CharField, ListField +from rest_framework.serializers import ValidationError as DRFValidationError from pulpcore.app import tasks from pulpcore.app.models import MasterModel @@ -28,6 +28,7 @@ UnsetLabelSerializer, ) from pulpcore.app.util import get_viewset_for_model, resolve_prn +from pulpcore.openapi import InheritSerializer, PulpAutoSchema from pulpcore.tasking.tasks import dispatch # These should be used to prevent duplication and keep things consistent @@ -444,7 +445,7 @@ def async_reserved_resources(self, instance): """ assert instance is not None, ( - "'{}' must not use the default `async_reserved_resources` method " "when using create." + "'{}' must not use the default `async_reserved_resources` method when using create." ).format(self.__class__.__name__) return [instance] diff --git a/pulpcore/app/viewsets/content.py b/pulpcore/app/viewsets/content.py index 487b437b4a8..0fd5f7024f6 100644 --- a/pulpcore/app/viewsets/content.py +++ b/pulpcore/app/viewsets/content.py @@ -6,7 +6,6 @@ from rest_framework import mixins, status from rest_framework.response import Response -from pulpcore.filters import BaseFilterSet from pulpcore.app.loggers import deprecation_logger from pulpcore.app.models import Artifact, Content, PublishedMetadata, SigningService from pulpcore.app.serializers import ( @@ -15,8 +14,9 @@ SigningServiceSerializer, ) from pulpcore.app.util import get_viewset_for_model -from pulpcore.app.viewsets.base import NamedModelViewSet, LabelsMixin +from pulpcore.app.viewsets.base import LabelsMixin, NamedModelViewSet from pulpcore.app.viewsets.custom_filters import LabelFilter +from pulpcore.filters import BaseFilterSet from .custom_filters import ( ArtifactRepositoryVersionFilter, diff --git a/pulpcore/app/viewsets/custom_filters.py b/pulpcore/app/viewsets/custom_filters.py index e75caa9f1f6..9367ad1ee4f 100644 --- a/pulpcore/app/viewsets/custom_filters.py +++ b/pulpcore/app/viewsets/custom_filters.py @@ -3,13 +3,11 @@ """ import re - from collections import defaultdict -from itertools import chain from gettext import gettext as _ +from itertools import chain from django.conf import settings -from pulpcore.constants import LABEL_KEY_CHARS from django.db.models import Q from django_filters import BaseInFilter, CharFilter, Filter from drf_spectacular.types import OpenApiTypes @@ -18,8 +16,9 @@ from rest_framework.serializers import ValidationError as DRFValidationError from pulpcore.app.models import Content, ContentArtifact, Repository, RepositoryVersion +from pulpcore.app.util import extract_pk, get_domain_pk, get_prn, raise_for_unknown_content_units from pulpcore.app.viewsets import NamedModelViewSet -from pulpcore.app.util import get_prn, get_domain_pk, extract_pk, raise_for_unknown_content_units +from pulpcore.constants import LABEL_KEY_CHARS # Lookup conversion table from old resource hrefs to new PDRN resource names OLD_RESOURCE_HREFS = { @@ -39,9 +38,9 @@ class ReservedResourcesFilter(Filter): def __init__(self, *args, exclusive=True, shared=True, **kwargs): self.exclusive = exclusive self.shared = shared - assert ( - exclusive or shared - ), "ReservedResourceFilter must have either exclusive or shared set." + assert exclusive or shared, ( + "ReservedResourceFilter must have either exclusive or shared set." + ) super().__init__(*args, **kwargs) def filter(self, qs, value): diff --git a/pulpcore/app/viewsets/domain.py b/pulpcore/app/viewsets/domain.py index c4f08ed7950..8125a1675bd 100644 --- a/pulpcore/app/viewsets/domain.py +++ b/pulpcore/app/viewsets/domain.py @@ -5,18 +5,18 @@ from rest_framework.decorators import action from rest_framework.exceptions import ValidationError -from pulpcore.filters import BaseFilterSet from pulpcore.app.models import Domain from pulpcore.app.response import OperationPostponedResponse from pulpcore.app.serializers import ( - DomainSerializer, - DomainBackendMigratorSerializer, AsyncOperationResponseSerializer, + DomainBackendMigratorSerializer, + DomainSerializer, ) from pulpcore.app.tasks import migrate_backend -from pulpcore.app.viewsets import NamedModelViewSet, AsyncRemoveMixin, AsyncUpdateMixin, LabelsMixin +from pulpcore.app.viewsets import AsyncRemoveMixin, AsyncUpdateMixin, LabelsMixin, NamedModelViewSet from pulpcore.app.viewsets.base import NAME_FILTER_OPTIONS from pulpcore.app.viewsets.custom_filters import LabelFilter +from pulpcore.filters import BaseFilterSet from pulpcore.tasking.tasks import dispatch diff --git a/pulpcore/app/viewsets/exporter.py b/pulpcore/app/viewsets/exporter.py index 4f31de9474b..af2a5b2c824 100644 --- a/pulpcore/app/viewsets/exporter.py +++ b/pulpcore/app/viewsets/exporter.py @@ -11,19 +11,17 @@ PulpExporter, RepositoryVersion, ) - +from pulpcore.app.response import OperationPostponedResponse from pulpcore.app.serializers import ( AsyncOperationResponseSerializer, - ExportSerializer, ExporterSerializer, + ExportSerializer, FilesystemExporterSerializer, FilesystemExportSerializer, PulpExporterSerializer, PulpExportSerializer, ) - from pulpcore.app.tasks.export import fs_publication_export, fs_repo_version_export, pulp_export - from pulpcore.app.viewsets import ( AsyncRemoveMixin, AsyncUpdateMixin, @@ -31,7 +29,6 @@ ) from pulpcore.app.viewsets.base import NAME_FILTER_OPTIONS from pulpcore.plugin.tasking import dispatch -from pulpcore.app.response import OperationPostponedResponse class ExporterViewSet( diff --git a/pulpcore/app/viewsets/importer.py b/pulpcore/app/viewsets/importer.py index d182a85f2d4..a8a61222f86 100644 --- a/pulpcore/app/viewsets/importer.py +++ b/pulpcore/app/viewsets/importer.py @@ -11,8 +11,8 @@ ) from pulpcore.app.response import TaskGroupOperationResponse from pulpcore.app.serializers import ( - ImportSerializer, ImporterSerializer, + ImportSerializer, PulpImporterSerializer, PulpImportSerializer, TaskGroupOperationResponseSerializer, diff --git a/pulpcore/app/viewsets/openpgp.py b/pulpcore/app/viewsets/openpgp.py index 1567bb9f5ce..4da6e9887d7 100644 --- a/pulpcore/app/viewsets/openpgp.py +++ b/pulpcore/app/viewsets/openpgp.py @@ -10,8 +10,8 @@ ) from pulpcore.app.viewsets.base import NAME_FILTER_OPTIONS, RolesMixin from pulpcore.app.viewsets.content import ContentFilter, ReadOnlyContentViewSet -from pulpcore.app.viewsets.repository import RepositoryViewSet from pulpcore.app.viewsets.publication import DistributionFilter, DistributionViewSet +from pulpcore.app.viewsets.repository import RepositoryViewSet from pulpcore.plugin.actions import ModifyRepositoryActionMixin from pulpcore.plugin.viewsets import NoArtifactContentUploadViewSet diff --git a/pulpcore/app/viewsets/orphans.py b/pulpcore/app/viewsets/orphans.py index eb9bc54255c..6d9a72f2e07 100644 --- a/pulpcore/app/viewsets/orphans.py +++ b/pulpcore/app/viewsets/orphans.py @@ -1,5 +1,5 @@ -from drf_spectacular.utils import extend_schema from django.conf import settings +from drf_spectacular.utils import extend_schema from rest_framework.viewsets import ViewSet from pulpcore.app.response import OperationPostponedResponse diff --git a/pulpcore/app/viewsets/publication.py b/pulpcore/app/viewsets/publication.py index 2a811ec7026..ae7e38a8e6d 100644 --- a/pulpcore/app/viewsets/publication.py +++ b/pulpcore/app/viewsets/publication.py @@ -4,28 +4,28 @@ from django_filters import Filter from rest_framework import mixins, serializers -from pulpcore.app.models.publication import CompositeContentGuard -from pulpcore.app.serializers.publication import CompositeContentGuardSerializer -from pulpcore.filters import BaseFilterSet from pulpcore.app.models import ( + ArtifactDistribution, ContentGuard, - RBACContentGuard, ContentRedirectContentGuard, - HeaderContentGuard, Distribution, + HeaderContentGuard, Publication, + RBACContentGuard, Repository, - ArtifactDistribution, ) +from pulpcore.app.models.publication import CompositeContentGuard from pulpcore.app.serializers import ( + ArtifactDistributionSerializer, ContentGuardSerializer, + ContentRedirectContentGuardSerializer, DistributionSerializer, + HeaderContentGuardSerializer, PublicationSerializer, RBACContentGuardSerializer, - ContentRedirectContentGuardSerializer, - HeaderContentGuardSerializer, - ArtifactDistributionSerializer, ) +from pulpcore.app.serializers.publication import CompositeContentGuardSerializer +from pulpcore.app.util import get_domain from pulpcore.app.viewsets import ( AsyncCreateMixin, AsyncRemoveMixin, @@ -42,7 +42,7 @@ WithContentFilter, WithContentInFilter, ) -from pulpcore.app.util import get_domain +from pulpcore.filters import BaseFilterSet class RepositoryThroughVersionFilter(Filter): @@ -440,7 +440,7 @@ class CompositeContentGuardViewSet(ContentGuardViewSet, RolesMixin): "action": ["retrieve", "my_permissions"], "principal": "authenticated", "effect": "allow", - "condition": "has_model_or_domain_or_obj_perms:core." "view_compositecontentguard", + "condition": "has_model_or_domain_or_obj_perms:core.view_compositecontentguard", }, { "action": ["update", "partial_update"], diff --git a/pulpcore/app/viewsets/replica.py b/pulpcore/app/viewsets/replica.py index 1fdb1a5957c..3d1302d281b 100644 --- a/pulpcore/app/viewsets/replica.py +++ b/pulpcore/app/viewsets/replica.py @@ -7,11 +7,11 @@ from rest_framework.decorators import action from pulpcore.app.models import TaskGroup, UpstreamPulp -from pulpcore.app.serializers import TaskGroupOperationResponseSerializer, UpstreamPulpSerializer -from pulpcore.app.viewsets import NamedModelViewSet, RolesMixin from pulpcore.app.response import TaskGroupOperationResponse +from pulpcore.app.serializers import TaskGroupOperationResponseSerializer, UpstreamPulpSerializer from pulpcore.app.tasks import replicate_distributions -from pulpcore.app.viewsets.base import NAME_FILTER_OPTIONS, DATETIME_FILTER_OPTIONS +from pulpcore.app.viewsets import NamedModelViewSet, RolesMixin +from pulpcore.app.viewsets.base import DATETIME_FILTER_OPTIONS, NAME_FILTER_OPTIONS from pulpcore.tasking.tasks import dispatch diff --git a/pulpcore/app/viewsets/repository.py b/pulpcore/app/viewsets/repository.py index d57214d877e..b3e73dfdb53 100644 --- a/pulpcore/app/viewsets/repository.py +++ b/pulpcore/app/viewsets/repository.py @@ -1,17 +1,15 @@ +from collections import defaultdict from gettext import gettext as _ +from urllib.parse import urlparse -from collections import defaultdict -from django.db.models import Q, Max +from django.db.models import Max, Q from django.urls.base import Resolver404, resolve from django_filters import Filter from drf_spectacular.utils import extend_schema from rest_framework import mixins, serializers from rest_framework.decorators import action from rest_framework.viewsets import GenericViewSet -from urllib.parse import urlparse -from pulpcore.constants import PROTECTED_REPO_VERSION_MESSAGE -from pulpcore.filters import BaseFilterSet from pulpcore.app import tasks from pulpcore.app.models import ( Content, @@ -29,6 +27,7 @@ RepositorySerializer, RepositoryVersionSerializer, ) +from pulpcore.app.util import resolve_prn from pulpcore.app.viewsets import ( AsyncRemoveMixin, AsyncUpdateMixin, @@ -41,9 +40,9 @@ NULLABLE_NUMERIC_FILTER_OPTIONS, ) from pulpcore.app.viewsets.custom_filters import LabelFilter, WithContentFilter, WithContentInFilter +from pulpcore.constants import PROTECTED_REPO_VERSION_MESSAGE +from pulpcore.filters import BaseFilterSet, HyperlinkRelatedFilter from pulpcore.tasking.tasks import dispatch -from pulpcore.filters import HyperlinkRelatedFilter -from pulpcore.app.util import resolve_prn class RepositoryContentFilter(Filter): @@ -211,7 +210,7 @@ def filter_pulp_href(self, queryset, name, value): href_match = {} if "repository_pk" not in href_match or "number" not in href_match: raise serializers.ValidationError( - _("Invalid RepositoryVersion HREF: {}".format(uri)) + _("Invalid RepositoryVersion HREF: {}").format(uri) ) repo_versions[href_match["repository_pk"]].append(int(href_match["number"])) diff --git a/pulpcore/app/viewsets/task.py b/pulpcore/app/viewsets/task.py index 9051cd5bd5d..c24131dd250 100644 --- a/pulpcore/app/viewsets/task.py +++ b/pulpcore/app/viewsets/task.py @@ -10,18 +10,18 @@ from rest_framework.response import Response from rest_framework.serializers import DictField, URLField, ValidationError -from pulpcore.filters import BaseFilterSet from pulpcore.app.models import ( AppStatus, + CreatedResource, ProfileArtifact, + RepositoryVersion, Task, TaskGroup, TaskSchedule, - CreatedResource, - RepositoryVersion, ) from pulpcore.app.models.role import UserRole from pulpcore.app.response import OperationPostponedResponse +from pulpcore.app.role_util import get_objects_for_user from pulpcore.app.serializers import ( AsyncOperationResponseSerializer, MinimalTaskSerializer, @@ -33,17 +33,17 @@ WorkerSerializer, ) from pulpcore.app.tasks import purge -from pulpcore.app.util import get_domain, get_artifact_url, get_current_user +from pulpcore.app.util import get_artifact_url, get_current_user, get_domain from pulpcore.app.viewsets import NamedModelViewSet, RolesMixin from pulpcore.app.viewsets.base import DATETIME_FILTER_OPTIONS, NAME_FILTER_OPTIONS from pulpcore.app.viewsets.custom_filters import ( + CreatedResourcesFilter, ReservedResourcesFilter, ReservedResourcesInFilter, - CreatedResourcesFilter, ) from pulpcore.constants import TASK_INCOMPLETE_STATES, TASK_STATES +from pulpcore.filters import BaseFilterSet from pulpcore.tasking.tasks import cancel_task, cancel_task_group, dispatch -from pulpcore.app.role_util import get_objects_for_user class TaskFilter(BaseFilterSet): diff --git a/pulpcore/app/viewsets/upload.py b/pulpcore/app/viewsets/upload.py index a15dc67f2f6..6f1128b706a 100644 --- a/pulpcore/app/viewsets/upload.py +++ b/pulpcore/app/viewsets/upload.py @@ -1,5 +1,4 @@ -from drf_spectacular.utils import extend_schema -from drf_spectacular.utils import OpenApiParameter +from drf_spectacular.utils import OpenApiParameter, extend_schema from rest_framework import mixins from rest_framework.decorators import action from rest_framework.response import Response @@ -11,8 +10,8 @@ AsyncOperationResponseSerializer, UploadChunkSerializer, UploadCommitSerializer, - UploadSerializer, UploadDetailSerializer, + UploadSerializer, ) from pulpcore.app.viewsets import NamedModelViewSet, RolesMixin from pulpcore.tasking.tasks import dispatch diff --git a/pulpcore/app/viewsets/user.py b/pulpcore/app/viewsets/user.py index 33422e02bce..a8a6e4f295f 100644 --- a/pulpcore/app/viewsets/user.py +++ b/pulpcore/app/viewsets/user.py @@ -2,35 +2,33 @@ from django.contrib.auth import get_user_model from django.contrib.auth import logout as auth_logout +from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldError +from django.db.models import Count, Q from django.shortcuts import get_object_or_404 from django_filters.rest_framework import filters -from django.db.models import Q, Count -from django.contrib.auth.models import Permission - +from drf_spectacular.utils import OpenApiParameter, extend_schema, extend_schema_view from rest_framework import generics, mixins, status from rest_framework.exceptions import PermissionDenied from rest_framework.permissions import SAFE_METHODS from rest_framework.response import Response from rest_framework.serializers import ValidationError -from drf_spectacular.utils import OpenApiParameter, extend_schema, extend_schema_view - -from pulpcore.filters import BaseFilterSet, HyperlinkRelatedFilter from pulpcore.app.models import Group from pulpcore.app.models.role import GroupRole, Role, UserRole -from pulpcore.app.viewsets import NamedModelViewSet, RolesMixin, NAME_FILTER_OPTIONS from pulpcore.app.serializers import ( + GroupRoleSerializer, GroupSerializer, GroupUserSerializer, - GroupRoleSerializer, LoginSerializer, LoginUpdateSerializer, RoleSerializer, - UserSerializer, UserRoleSerializer, + UserSerializer, ) +from pulpcore.app.viewsets import NAME_FILTER_OPTIONS, NamedModelViewSet, RolesMixin +from pulpcore.filters import BaseFilterSet, HyperlinkRelatedFilter User = get_user_model() diff --git a/pulpcore/app/viewsets/vulnerability_report.py b/pulpcore/app/viewsets/vulnerability_report.py index c3f9d1fb3dc..f19d1ca82d8 100644 --- a/pulpcore/app/viewsets/vulnerability_report.py +++ b/pulpcore/app/viewsets/vulnerability_report.py @@ -8,7 +8,6 @@ class VulnerabilityReportViewSet( NamedModelViewSet, ListModelMixin, RetrieveModelMixin, DestroyModelMixin ): - endpoint_name = "vuln_report" queryset = VulnerabilityReport.objects.prefetch_related("repo_versions").select_related( "content" diff --git a/pulpcore/backends.py b/pulpcore/backends.py index d7ac19ba8d1..f4f5cae0a56 100644 --- a/pulpcore/backends.py +++ b/pulpcore/backends.py @@ -1,12 +1,12 @@ from gettext import gettext as _ +from itertools import chain -from django.contrib.contenttypes.models import ContentType from django.contrib.auth.backends import BaseBackend from django.contrib.auth.models import Permission -from itertools import chain +from django.contrib.contenttypes.models import ContentType -from pulpcore.app.models.role import GroupRole from pulpcore.app.models import Domain +from pulpcore.app.models.role import GroupRole class ObjectRolePermissionBackend(BaseBackend): diff --git a/pulpcore/cache/__init__.py b/pulpcore/cache/__init__.py index a6c2164b573..a5a4b9d01ed 100644 --- a/pulpcore/cache/__init__.py +++ b/pulpcore/cache/__init__.py @@ -1,3 +1,4 @@ +# ruff: noqa: F401 from .cache import ( AsyncCache, AsyncContentCache, diff --git a/pulpcore/cache/cache.py b/pulpcore/cache/cache.py index cdd407ead8d..e8f9db2442b 100644 --- a/pulpcore/cache/cache.py +++ b/pulpcore/cache/cache.py @@ -1,28 +1,24 @@ import enum import json import time - from functools import wraps -from django.http import HttpResponseRedirect, HttpResponse, FileResponse as ApiFileResponse - -from rest_framework.request import Request as ApiRequest -from rest_framework.response import Response as ApiResponse - -from aiohttp.web import FileResponse, Response, HTTPSuccessful, Request, StreamResponse +from aiohttp.web import FileResponse, HTTPSuccessful, Request, Response, StreamResponse from aiohttp.web_exceptions import HTTPFound - +from django.http import FileResponse as ApiFileResponse +from django.http import HttpResponse, HttpResponseRedirect from redis import ConnectionError from redis.asyncio import ConnectionError as AConnectionError +from rest_framework.request import Request as ApiRequest +from rest_framework.response import Response as ApiResponse -from pulpcore.app.settings import settings from pulpcore.app.redis_connection import ( - get_redis_connection, get_async_redis_connection, + get_redis_connection, ) -from pulpcore.responses import ArtifactResponse - +from pulpcore.app.settings import settings from pulpcore.metrics import artifacts_size_counter +from pulpcore.responses import ArtifactResponse DEFAULT_EXPIRES_TTL = settings.CACHE_SETTINGS["EXPIRES_TTL"] diff --git a/pulpcore/content/__init__.py b/pulpcore/content/__init__.py index 8ddfd62e720..decf0957b0d 100644 --- a/pulpcore/content/__init__.py +++ b/pulpcore/content/__init__.py @@ -1,36 +1,36 @@ import asyncio +import logging +import os from contextlib import suppress from importlib import import_module from importlib.util import find_spec -import logging -import os -from asgiref.sync import sync_to_async +import django from aiohttp import web +from asgiref.sync import sync_to_async from gunicorn.arbiter import Arbiter -import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pulpcore.app.settings") django.setup() -from django.conf import settings # noqa: E402: module level not at top of file -from django.db.utils import ( # noqa: E402: module level not at top of file +from django.conf import settings # noqa: E402 +from django.db.utils import ( # noqa: E402 + DatabaseError, IntegrityError, InterfaceError, - DatabaseError, ) -from pulpcore.app.apps import pulp_plugin_configs # noqa: E402: module level not at top of file -from pulpcore.app.models import AppStatus # noqa: E402: module level not at top of file -from pulpcore.app.util import get_worker_name # noqa: E402: module level not at top of file +from pulpcore.app.apps import pulp_plugin_configs # noqa: E402 +from pulpcore.app.models import AppStatus # noqa: E402 +from pulpcore.app.util import get_worker_name # noqa: E402 -from .handler import Handler # noqa: E402: module level not at top of file -from .authentication import authenticate, guid # noqa: E402: module level not at top of file +from .authentication import authenticate, guid # noqa: E402 +from .handler import Handler # noqa: E402 log = logging.getLogger(__name__) if settings.OTEL_ENABLED: - from .instrumentation import instrumentation # noqa: E402: module level not at top of file + from .instrumentation import instrumentation # noqa: E402 app = web.Application(middlewares=[guid, authenticate, instrumentation()]) else: diff --git a/pulpcore/content/authentication.py b/pulpcore/content/authentication.py index 016c2990c3e..966a238a779 100644 --- a/pulpcore/content/authentication.py +++ b/pulpcore/content/authentication.py @@ -2,20 +2,21 @@ import http.cookies import logging +from aiohttp.web import HTTPBadRequest, middleware from asgiref.sync import sync_to_async -from aiohttp.web import middleware, HTTPBadRequest from django.conf import settings -from django.db.utils import InterfaceError, DatabaseError +from django.db.utils import DatabaseError, InterfaceError from django.http.request import HttpRequest from django_guid import set_guid from django_guid.utils import generate_guid -from rest_framework.views import APIView from rest_framework.exceptions import APIException +from rest_framework.views import APIView -from .handler import Handler, PathNotResolved from pulpcore.app.models import Domain from pulpcore.app.util import set_domain +from .handler import Handler, PathNotResolved + log = logging.getLogger(__name__) _ = gettext.gettext diff --git a/pulpcore/content/entrypoint.py b/pulpcore/content/entrypoint.py index 6d5662f6331..a690d50dced 100644 --- a/pulpcore/content/entrypoint.py +++ b/pulpcore/content/entrypoint.py @@ -1,12 +1,13 @@ import sys import click +from django.conf import settings + from pulpcore.app.netutil import has_ipv6 from pulpcore.app.pulpcore_gunicorn_application import ( - handle_control_interface_feature, PulpcoreGunicornApplication, + handle_control_interface_feature, ) -from django.conf import settings class PulpcoreContentApplication(PulpcoreGunicornApplication): diff --git a/pulpcore/content/handler.py b/pulpcore/content/handler.py index 8a1c0e82f86..56e9addf046 100644 --- a/pulpcore/content/handler.py +++ b/pulpcore/content/handler.py @@ -1,16 +1,16 @@ import asyncio import logging -from multidict import CIMultiDict import os import re import socket import struct -from gettext import gettext as _ from datetime import datetime, timedelta from datetime import timezone as dt_timezone +from gettext import gettext as _ -from aiohttp.client_exceptions import ClientResponseError, ClientConnectionError -from aiohttp.web import FileResponse, StreamResponse, HTTPOk +import django +from aiohttp.client_exceptions import ClientConnectionError, ClientResponseError +from aiohttp.web import FileResponse, HTTPOk, StreamResponse from aiohttp.web_exceptions import ( HTTPError, HTTPForbidden, @@ -19,32 +19,33 @@ HTTPNotFound, HTTPRequestRangeNotSatisfiable, ) -from yarl import URL - from asgiref.sync import sync_to_async - -import django from django.utils import timezone +from multidict import CIMultiDict +from yarl import URL -from pulpcore.constants import STORAGE_RESPONSE_MAP, CHECKPOINT_TS_FORMAT +from pulpcore.constants import CHECKPOINT_TS_FORMAT, STORAGE_RESPONSE_MAP from pulpcore.responses import ArtifactResponse os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pulpcore.app.settings") django.setup() -from django.conf import settings # noqa: E402: module level not at top of file -from django.core.exceptions import ( # noqa: E402: module level not at top of file +from django.conf import settings # noqa: E402 +from django.core.exceptions import ( # noqa: E402 MultipleObjectsReturned, ObjectDoesNotExist, ) -from django.db import ( # noqa: E402: module level not at top of file - connection, +from django.db import ( # noqa: E402 DatabaseError, IntegrityError, + connection, models, transaction, ) -from pulpcore.app.models import ( # noqa: E402: module level not at top of file +from jinja2 import Template # noqa: E402 + +from pulpcore.app import mime_types # noqa: E402 +from pulpcore.app.models import ( # noqa: E402 Artifact, ArtifactDistribution, ContentArtifact, @@ -53,21 +54,17 @@ Remote, RemoteArtifact, ) -from pulpcore.app import mime_types # noqa: E402: module level not at top of file -from pulpcore.app.util import ( # noqa: E402: module level not at top of file - get_domain, +from pulpcore.app.util import ( # noqa: E402 cache_key, + get_domain, ) - +from pulpcore.cache import AsyncContentCache # noqa: E402 from pulpcore.exceptions import ( # noqa: E402 - UnsupportedDigestValidationError, DigestValidationError, + UnsupportedDigestValidationError, ) from pulpcore.metrics import artifacts_size_counter # noqa: E402 -from jinja2 import Template # noqa: E402: module level not at top of file -from pulpcore.cache import AsyncContentCache # noqa: E402 - log = logging.getLogger(__name__) diff --git a/pulpcore/content/instrumentation.py b/pulpcore/content/instrumentation.py index 5b9d95e8440..2da7e6b0304 100644 --- a/pulpcore/content/instrumentation.py +++ b/pulpcore/content/instrumentation.py @@ -2,8 +2,8 @@ from aiohttp import web -from pulpcore.metrics import init_otel_meter from pulpcore.app.util import get_worker_name, normalize_http_status +from pulpcore.metrics import init_otel_meter def instrumentation(exporter=None, reader=None, provider=None): diff --git a/pulpcore/download/__init__.py b/pulpcore/download/__init__.py index d5483943fb5..1e92d034ad9 100644 --- a/pulpcore/download/__init__.py +++ b/pulpcore/download/__init__.py @@ -1,3 +1,4 @@ +# ruff: noqa: F401 from .base import BaseDownloader, DownloadResult from .factory import DownloaderFactory from .file import FileDownloader diff --git a/pulpcore/download/base.py b/pulpcore/download/base.py index b093ad9e462..8900ff81c8d 100644 --- a/pulpcore/download/base.py +++ b/pulpcore/download/base.py @@ -1,16 +1,16 @@ -from gettext import gettext as _ - import asyncio -from collections import namedtuple import concurrent.futures -from concurrent.futures import ThreadPoolExecutor, ALL_COMPLETED import logging import os import tempfile +from collections import namedtuple +from concurrent.futures import ALL_COMPLETED, ThreadPoolExecutor +from gettext import gettext as _ from pathlib import Path from urllib.parse import urlsplit from django.conf import settings + from pulpcore.app import pulp_hashlib from pulpcore.app.models import Artifact from pulpcore.exceptions import ( diff --git a/pulpcore/download/factory.py b/pulpcore/download/factory.py index 41f641020c9..be2c2d7a879 100644 --- a/pulpcore/download/factory.py +++ b/pulpcore/download/factory.py @@ -1,20 +1,21 @@ -from aiohttp import __version__ as aiohttp_version import asyncio import atexit import copy -from gettext import gettext as _ -from multidict import MultiDict import platform import ssl import sys +from gettext import gettext as _ from tempfile import NamedTemporaryFile from urllib.parse import urlparse import aiohttp +from aiohttp import __version__ as aiohttp_version +from multidict import MultiDict from pulpcore.app.apps import PulpAppConfig -from .http import HttpDownloader + from .file import FileDownloader +from .http import HttpDownloader PROTOCOL_MAP = { "http": HttpDownloader, @@ -176,7 +177,7 @@ def build(self, url, **kwargs): builder = self._handler_map[scheme] download_class = self._download_class_map[scheme] except KeyError: - raise ValueError(_("URL: {u} not supported.".format(u=url))) + raise ValueError(_("URL: {u} not supported.").format(u=url)) else: return builder(download_class, url, **kwargs) diff --git a/pulpcore/download/file.py b/pulpcore/download/file.py index 65f618dd9bd..9d9fae0a4b7 100644 --- a/pulpcore/download/file.py +++ b/pulpcore/download/file.py @@ -1,5 +1,4 @@ import os - from urllib.parse import urlparse import aiofiles diff --git a/pulpcore/download/http.py b/pulpcore/download/http.py index 891d7337196..0a714e67eaa 100644 --- a/pulpcore/download/http.py +++ b/pulpcore/download/http.py @@ -1,16 +1,17 @@ +import asyncio import logging import aiohttp -import asyncio import backoff -from .base import BaseDownloader, DownloadResult from pulpcore.exceptions import ( DigestValidationError, SizeValidationError, TimeoutException, ) +from .base import BaseDownloader, DownloadResult + log = logging.getLogger(__name__) diff --git a/pulpcore/exceptions/__init__.py b/pulpcore/exceptions/__init__.py index 4c458e43933..e6b935de6eb 100644 --- a/pulpcore/exceptions/__init__.py +++ b/pulpcore/exceptions/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from .base import ( PulpException, ResourceImmutableError, diff --git a/pulpcore/exceptions/base.py b/pulpcore/exceptions/base.py index 42b9016bfd5..63e805981fa 100644 --- a/pulpcore/exceptions/base.py +++ b/pulpcore/exceptions/base.py @@ -1,5 +1,6 @@ import http.client from gettext import gettext as _ + from pulpcore.app.loggers import deprecation_logger diff --git a/pulpcore/exceptions/validation.py b/pulpcore/exceptions/validation.py index 3d2553a422f..985aad65dec 100644 --- a/pulpcore/exceptions/validation.py +++ b/pulpcore/exceptions/validation.py @@ -1,5 +1,6 @@ -from gettext import gettext as _ import http.client +from gettext import gettext as _ + from pulpcore.exceptions import PulpException @@ -135,5 +136,5 @@ def __init__(self, duplicate_count: int, correlation_id: str): def __str__(self): return f"[{self.error_code}] " + _( "Found {n} duplicate contents in repository version" - "(see the logs (cid={cid}) for details).".format(n=self.dup_count, cid=self.cid) - ) + "(see the logs (cid={cid}) for details)." + ).format(n=self.dup_count, cid=self.cid) diff --git a/pulpcore/filters.py b/pulpcore/filters.py index 32c6cf5f3ff..e225769a5c0 100644 --- a/pulpcore/filters.py +++ b/pulpcore/filters.py @@ -1,27 +1,24 @@ -from gettext import gettext as _ - -import pyparsing as pp - +from collections import namedtuple from functools import lru_cache, partial +from gettext import gettext as _ from urllib.parse import urlparse from uuid import UUID -from collections import namedtuple + +import pyparsing as pp from django import forms +from django.core.exceptions import FieldDoesNotExist from django.db import models from django.forms.utils import ErrorList from django.urls import Resolver404, resolve from django_filters.constants import EMPTY_VALUES -from django_filters.rest_framework import DjangoFilterBackend, filterset, filters, BaseInFilter -from django.core.exceptions import FieldDoesNotExist -from rest_framework import serializers - - -from drf_spectacular.types import OpenApiTypes +from django_filters.rest_framework import BaseInFilter, DjangoFilterBackend, filters, filterset +from drf_spectacular.contrib.django_filters import DjangoFilterExtension from drf_spectacular.plumbing import build_basic_type +from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema_field -from drf_spectacular.contrib.django_filters import DjangoFilterExtension +from rest_framework import serializers -from pulpcore.app.util import extract_pk, resolve_prn, get_domain_pk +from pulpcore.app.util import extract_pk, get_domain_pk, resolve_prn EMPTY_VALUES = (*EMPTY_VALUES, "null") UPMatch = namedtuple("UPMatch", ("model", "pk")) @@ -70,7 +67,7 @@ def _resolve_uri(self, uri): match = resolve(urlparse(uri).path) except Resolver404: raise serializers.ValidationError( - detail=_("URI couldn't be resolved: {uri}".format(uri=uri)) + detail=_("URI couldn't be resolved: {uri}").format(uri=uri) ) match = UPMatch(match.func.cls.queryset.model, match.kwargs.get("pk")) return match diff --git a/pulpcore/metrics.py b/pulpcore/metrics.py index 89225d286de..cc11a355b7f 100644 --- a/pulpcore/metrics.py +++ b/pulpcore/metrics.py @@ -1,10 +1,9 @@ from functools import lru_cache from django.conf import settings - +from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader -from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter from opentelemetry.sdk.resources import Resource from pulpcore.app.util import get_domain, get_worker_name diff --git a/pulpcore/middleware.py b/pulpcore/middleware.py index b1a72a5dad0..0a778f0c077 100644 --- a/pulpcore/middleware.py +++ b/pulpcore/middleware.py @@ -1,21 +1,20 @@ -import time import re - +import time from os import environ -from django.http.response import Http404 from django.conf import settings from django.core.exceptions import MiddlewareNotUsed +from django.http.response import Http404 -from pulpcore.metrics import init_otel_meter -from pulpcore.app.models import Domain from pulpcore.app.contexts import x_task_diagnostics_var +from pulpcore.app.models import Domain from pulpcore.app.util import ( get_worker_name, normalize_http_status, set_current_user_lazy, set_domain, ) +from pulpcore.metrics import init_otel_meter class DomainMiddleware: diff --git a/pulpcore/migrations.py b/pulpcore/migrations.py index efabfcf4784..c56de9e84c8 100644 --- a/pulpcore/migrations.py +++ b/pulpcore/migrations.py @@ -1,8 +1,7 @@ -from packaging.version import parse as parse_version - from django.conf import settings -from django.utils import timezone from django.db.migrations.operations.base import Operation +from django.utils import timezone +from packaging.version import parse as parse_version class RequireVersion(Operation): @@ -63,8 +62,7 @@ def database_forwards(self, app_label, schema_editor, from_state, to_state): present_version = worker.versions.get(self.plugin) if present_version is not None and parse_version(present_version) < needed_version: errors.append( - f" - '{self.plugin}'='{present_version}' " - f"with {class_name} '{worker.name}'" + f" - '{self.plugin}'='{present_version}' with {class_name} '{worker.name}'" ) found_either_table = True @@ -74,8 +72,7 @@ def database_forwards(self, app_label, schema_editor, from_state, to_state): raise RuntimeError( "\n".join( [ - "Incompatible versions detected " - f"({self.plugin} >= {self.version} needed):", + f"Incompatible versions detected ({self.plugin} >= {self.version} needed):", *errors, "Please shutdown or upgrade the outdated components before you " "continue the migration. \n" diff --git a/pulpcore/openapi/__init__.py b/pulpcore/openapi/__init__.py index 6e35f134d7a..29106f6311b 100644 --- a/pulpcore/openapi/__init__.py +++ b/pulpcore/openapi/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from gettext import gettext as _ import re diff --git a/pulpcore/plugin/__init__.py b/pulpcore/plugin/__init__.py index eb6b9a446f9..98984a72555 100644 --- a/pulpcore/plugin/__init__.py +++ b/pulpcore/plugin/__init__.py @@ -1,2 +1,3 @@ +# ruff: noqa: F401 # plugins declare that they are a pulp plugin by subclassing PulpPluginAppConfig from pulpcore.app.apps import PulpPluginAppConfig diff --git a/pulpcore/plugin/access_policy.py b/pulpcore/plugin/access_policy.py index cf2929af20e..a657c969483 100644 --- a/pulpcore/plugin/access_policy.py +++ b/pulpcore/plugin/access_policy.py @@ -1,12 +1,11 @@ -from pulpcore.app.access_policy import DefaultAccessPolicy, AccessPolicyFromSettings # noqa: F401 - # Below this line there is the old version of the AccessPolicyFromDB that we cannot safely change. from rest_access_policy import AccessPolicy from rest_framework.exceptions import APIException +from pulpcore.app.access_policy import AccessPolicyFromSettings, DefaultAccessPolicy # noqa: F401 +from pulpcore.app.loggers import deprecation_logger from pulpcore.app.models import AccessPolicy as AccessPolicyModel from pulpcore.app.util import get_view_urlpattern, get_viewset_for_model -from pulpcore.app.loggers import deprecation_logger class AccessPolicyFromDB(AccessPolicy): diff --git a/pulpcore/plugin/authentication/__init__.py b/pulpcore/plugin/authentication/__init__.py index 75c1e5399cd..64ed5e18b64 100644 --- a/pulpcore/plugin/authentication/__init__.py +++ b/pulpcore/plugin/authentication/__init__.py @@ -1 +1,2 @@ +# ruff: noqa: F401 from pulpcore.app.authentication import PulpRemoteUserAuthentication diff --git a/pulpcore/plugin/cache/__init__.py b/pulpcore/plugin/cache/__init__.py index 097fc4ecdde..6095a18baf4 100644 --- a/pulpcore/plugin/cache/__init__.py +++ b/pulpcore/plugin/cache/__init__.py @@ -1 +1,3 @@ +# ruff: noqa: F401 +# isort: skip_file from pulpcore.cache import CacheKeys, AsyncContentCache, SyncContentCache diff --git a/pulpcore/plugin/constants.py b/pulpcore/plugin/constants.py index 2f37a2d16a6..4f7612d150f 100644 --- a/pulpcore/plugin/constants.py +++ b/pulpcore/plugin/constants.py @@ -1,8 +1,8 @@ from pulpcore.constants import ( # noqa: F401 ALL_KNOWN_CONTENT_CHECKSUMS, - SYNC_MODES, SYNC_CHOICES, - TASK_STATES, + SYNC_MODES, TASK_CHOICES, TASK_FINAL_STATES, + TASK_STATES, ) diff --git a/pulpcore/plugin/download/__init__.py b/pulpcore/plugin/download/__init__.py index b39cb525239..9a126829fe6 100644 --- a/pulpcore/plugin/download/__init__.py +++ b/pulpcore/plugin/download/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from pulpcore.download import ( BaseDownloader, DownloadResult, diff --git a/pulpcore/plugin/exceptions.py b/pulpcore/plugin/exceptions.py index 0406964ecd3..3e7e33852f5 100644 --- a/pulpcore/plugin/exceptions.py +++ b/pulpcore/plugin/exceptions.py @@ -1,17 +1,17 @@ from pulpcore.exceptions import ( - ValidationError, DigestValidationError, + ExternalServiceError, InvalidSignatureError, - PulpException, - SizeValidationError, MissingDigestValidationError, - TimeoutException, - UnsupportedDigestValidationError, PublishError, + PulpException, + ReplicateError, + SizeValidationError, SyncError, - ExternalServiceError, SystemStateError, - ReplicateError, + TimeoutException, + UnsupportedDigestValidationError, + ValidationError, ) __all__ = [ diff --git a/pulpcore/plugin/importexport.py b/pulpcore/plugin/importexport.py index af2cbfb0f3c..a7e4dc17b34 100644 --- a/pulpcore/plugin/importexport.py +++ b/pulpcore/plugin/importexport.py @@ -1,4 +1,5 @@ from import_export import resources + from pulpcore.app.util import get_domain_pk diff --git a/pulpcore/plugin/models/__init__.py b/pulpcore/plugin/models/__init__.py index 5e0a3c55ad3..9bb8ca863ba 100644 --- a/pulpcore/plugin/models/__init__.py +++ b/pulpcore/plugin/models/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file # Models are exposed selectively in the versioned plugin API. # Any models defined in the pulpcore.plugin namespace should probably be proxy models. diff --git a/pulpcore/plugin/publication_utils.py b/pulpcore/plugin/publication_utils.py index 5c6094be8b2..a5e6438a5b7 100644 --- a/pulpcore/plugin/publication_utils.py +++ b/pulpcore/plugin/publication_utils.py @@ -1,7 +1,7 @@ from gettext import gettext as _ -from pulpcore.app.models import ContentArtifact from pulpcore.app.files import validate_file_paths +from pulpcore.app.models import ContentArtifact def validate_publication_paths(publication): diff --git a/pulpcore/plugin/repo_version_utils.py b/pulpcore/plugin/repo_version_utils.py index 08f01573438..a4bd24a8c4c 100644 --- a/pulpcore/plugin/repo_version_utils.py +++ b/pulpcore/plugin/repo_version_utils.py @@ -1,15 +1,15 @@ -from gettext import gettext as _ import logging +from collections import defaultdict +from gettext import gettext as _ +from typing import NamedTuple from django.db.models import Q +from django_guid import get_guid from pulpcore.app.files import validate_file_paths from pulpcore.app.models import Content, ContentArtifact from pulpcore.app.util import batch_qs from pulpcore.exceptions import DuplicateContentInRepositoryError -from collections import defaultdict -from django_guid import get_guid -from typing import NamedTuple _logger = logging.getLogger(__name__) @@ -59,7 +59,7 @@ def remove_duplicates(repository_version): continue if new_content_qs.count() and existing_content.count(): - _logger.debug(_("Removing duplicates for type: {}".format(type_obj.get_pulp_type()))) + _logger.debug(_("Removing duplicates for type: {}").format(type_obj.get_pulp_type())) for batch in batch_qs(new_content_qs): find_dup_qs = Q() diff --git a/pulpcore/plugin/serializers/__init__.py b/pulpcore/plugin/serializers/__init__.py index 5380e583054..450442fea91 100644 --- a/pulpcore/plugin/serializers/__init__.py +++ b/pulpcore/plugin/serializers/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file # Import Serializers in platform that are potentially useful to plugin writers from pulpcore.app.serializers import ( AlternateContentSourceSerializer, diff --git a/pulpcore/plugin/serializers/content.py b/pulpcore/plugin/serializers/content.py index 346747eecd8..96eee818b40 100644 --- a/pulpcore/plugin/serializers/content.py +++ b/pulpcore/plugin/serializers/content.py @@ -7,16 +7,16 @@ from rest_framework.serializers import ( CharField, FileField, - ValidationError, Serializer, + ValidationError, ) from pulpcore.app.files import PulpTemporaryUploadedFile from pulpcore.app.models import Artifact, PulpTemporaryFile, Remote, Upload, UploadChunk from pulpcore.app.serializers import ( - RelatedField, ArtifactSerializer, NoArtifactContentSerializer, + RelatedField, SingleArtifactContentSerializer, ) from pulpcore.app.serializers.base import RemoteNetworkConfigSerializer @@ -232,11 +232,13 @@ def validate(self, data): during initialization (typically due to immutable QueryDict). """ if "pulp_labels" in data and isinstance(data["pulp_labels"], str): - raise ValidationError(_(""" + raise ValidationError( + _(""" Failed to deserialize pulp_labels! This error often occurs when file didn't upload, is incomplete, or when pulp_labels are not in a valid JSON format. - """)) + """) + ) return super().validate(data) def deferred_validate(self, data): diff --git a/pulpcore/plugin/stages/__init__.py b/pulpcore/plugin/stages/__init__.py index 3443ccb19a0..e526b52d8f8 100644 --- a/pulpcore/plugin/stages/__init__.py +++ b/pulpcore/plugin/stages/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from .api import create_pipeline, EndStage, Stage from .artifact_stages import ( ACSArtifactHandler, diff --git a/pulpcore/plugin/stages/api.py b/pulpcore/plugin/stages/api.py index 3f4156978f3..1d8939fd66f 100644 --- a/pulpcore/plugin/stages/api.py +++ b/pulpcore/plugin/stages/api.py @@ -1,6 +1,5 @@ import asyncio import logging - from gettext import gettext as _ from pulpcore.app.util import get_domain diff --git a/pulpcore/plugin/stages/artifact_stages.py b/pulpcore/plugin/stages/artifact_stages.py index f67664ce872..eeff04c2416 100644 --- a/pulpcore/plugin/stages/artifact_stages.py +++ b/pulpcore/plugin/stages/artifact_stages.py @@ -1,12 +1,11 @@ import asyncio +import logging from collections import defaultdict from gettext import gettext as _ -import logging -from django.conf import settings - from aiofiles import os as aos from asgiref.sync import sync_to_async +from django.conf import settings from django.db.models import Prefetch, prefetch_related_objects from pulpcore.plugin.exceptions import UnsupportedDigestValidationError @@ -14,8 +13,8 @@ Artifact, ContentArtifact, ProgressReport, - RemoteArtifact, Remote, + RemoteArtifact, ) from pulpcore.plugin.sync import sync_to_async_iterable diff --git a/pulpcore/plugin/stages/content_stages.py b/pulpcore/plugin/stages/content_stages.py index 5766b4e404a..78962e2bc1f 100644 --- a/pulpcore/plugin/stages/content_stages.py +++ b/pulpcore/plugin/stages/content_stages.py @@ -5,9 +5,8 @@ from django.db import IntegrityError, transaction from django.db.models import Q -from pulpcore.plugin.sync import sync_to_async_iterable - from pulpcore.plugin.models import Content, ContentArtifact, ProgressReport +from pulpcore.plugin.sync import sync_to_async_iterable from .api import Stage diff --git a/pulpcore/plugin/stages/declarative_version.py b/pulpcore/plugin/stages/declarative_version.py index 9ebf1074de2..18022e9ab38 100644 --- a/pulpcore/plugin/stages/declarative_version.py +++ b/pulpcore/plugin/stages/declarative_version.py @@ -2,7 +2,7 @@ import tempfile from pulpcore.plugin.models import AlternateContentSource -from pulpcore.plugin.stages.api import create_pipeline, EndStage +from pulpcore.plugin.stages.api import EndStage, create_pipeline from pulpcore.plugin.stages.artifact_stages import ( ACSArtifactHandler, ArtifactDownloader, diff --git a/pulpcore/plugin/stages/models.py b/pulpcore/plugin/stages/models.py index 849c5e0b84e..b34f7b0fef6 100644 --- a/pulpcore/plugin/stages/models.py +++ b/pulpcore/plugin/stages/models.py @@ -1,6 +1,5 @@ -from gettext import gettext as _ - import asyncio +from gettext import gettext as _ from pulpcore.constants import ALL_KNOWN_CONTENT_CHECKSUMS from pulpcore.plugin.models import Artifact diff --git a/pulpcore/plugin/tasking.py b/pulpcore/plugin/tasking.py index e8a3d435221..906ccc50acd 100644 --- a/pulpcore/plugin/tasking.py +++ b/pulpcore/plugin/tasking.py @@ -1,6 +1,4 @@ # Support plugins dispatching tasks -from pulpcore.tasking.tasks import dispatch, adispatch - from pulpcore.app.tasks import ( ageneral_update, fs_publication_export, @@ -12,8 +10,9 @@ orphan_cleanup, reclaim_space, ) +from pulpcore.app.tasks.repository import aadd_and_remove, add_and_remove from pulpcore.app.tasks.vulnerability_report import check_content -from pulpcore.app.tasks.repository import add_and_remove, aadd_and_remove +from pulpcore.tasking.tasks import adispatch, dispatch __all__ = [ "ageneral_update", diff --git a/pulpcore/plugin/util.py b/pulpcore/plugin/util.py index a322c3b4254..b8e63db206f 100644 --- a/pulpcore/plugin/util.py +++ b/pulpcore/plugin/util.py @@ -11,25 +11,24 @@ get_users_with_perms_attached_roles, remove_role, ) - from pulpcore.app.util import ( batch_qs, cache_key, extract_pk, get_artifact_url, + get_current_authenticated_user, + get_current_user, + get_default_domain, + get_domain, + get_domain_pk, get_prn, get_url, gpg_verify, raise_for_unknown_content_units, - get_default_domain, - get_domain, - get_domain_pk, - set_domain, - get_current_user, - get_current_authenticated_user, + resolve_prn, reverse, set_current_user, - resolve_prn, + set_domain, ) __all__ = [ diff --git a/pulpcore/plugin/viewsets/__init__.py b/pulpcore/plugin/viewsets/__init__.py index c0accda67db..fbb2fe0160b 100644 --- a/pulpcore/plugin/viewsets/__init__.py +++ b/pulpcore/plugin/viewsets/__init__.py @@ -1,3 +1,5 @@ +# ruff: noqa: F401 +# isort: skip_file from pulpcore.filters import BaseFilterSet # Allow plugin viewsets to return 202s diff --git a/pulpcore/plugin/viewsets/content.py b/pulpcore/plugin/viewsets/content.py index 89a5c0e081c..5530f9d5ada 100644 --- a/pulpcore/plugin/viewsets/content.py +++ b/pulpcore/plugin/viewsets/content.py @@ -1,14 +1,13 @@ -from drf_spectacular.utils import extend_schema - from django.db import DatabaseError from django.db.utils import IntegrityError +from drf_spectacular.utils import extend_schema from pulpcore.app import tasks +from pulpcore.plugin.models import Artifact, PulpTemporaryFile from pulpcore.plugin.serializers import ( ArtifactSerializer, AsyncOperationResponseSerializer, ) -from pulpcore.plugin.models import Artifact, PulpTemporaryFile from pulpcore.plugin.tasking import dispatch from pulpcore.plugin.viewsets import ( ContentViewSet, diff --git a/pulpcore/pytest_plugin.py b/pulpcore/pytest_plugin.py index 9633ce15718..dca6230adf6 100644 --- a/pulpcore/pytest_plugin.py +++ b/pulpcore/pytest_plugin.py @@ -1,9 +1,7 @@ -import aiohttp import asyncio import json import os import pathlib -import requests import shutil import socket import ssl @@ -11,16 +9,18 @@ import sys import threading import uuid +from contextlib import suppress +from dataclasses import dataclass +from time import sleep +import aiohttp import pytest - +import requests from aiohttp import web -from contextlib import suppress -from dataclasses import dataclass from packaging.version import parse as parse_version -from time import sleep from yarl import URL +from pulpcore.plugin.find_url import find_api_root from pulpcore.tests.functional.utils import ( SLEEP_TIME, TASK_TIMEOUT, @@ -30,8 +30,6 @@ add_recording_route, ) -from pulpcore.plugin.find_url import find_api_root - try: import pulp_smash # noqa: F401 except ImportError: diff --git a/pulpcore/tasking/_util.py b/pulpcore/tasking/_util.py index 6fb2dcf3395..abfd706cdb9 100644 --- a/pulpcore/tasking/_util.py +++ b/pulpcore/tasking/_util.py @@ -5,18 +5,19 @@ import resource import signal import sys +import tempfile import threading import time -import tempfile from gettext import gettext as _ from django.conf import settings -from django.db import connection, transaction, IntegrityError +from django.db import IntegrityError, connection, transaction from django.db.models import Q from django.utils import timezone from django_guid import set_guid from django_guid.utils import generate_guid -from pulpcore.app.models import Artifact, Content, Task, TaskSchedule, ProfileArtifact + +from pulpcore.app.models import Artifact, Content, ProfileArtifact, Task, TaskSchedule from pulpcore.app.util import ( configure_analytics, configure_cleanup, diff --git a/pulpcore/tasking/entrypoint.py b/pulpcore/tasking/entrypoint.py index e57cb167ced..1845aa7b0c6 100644 --- a/pulpcore/tasking/entrypoint.py +++ b/pulpcore/tasking/entrypoint.py @@ -1,16 +1,17 @@ -import click import logging import os +import click import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pulpcore.app.settings") django.setup() -from django.conf import settings # noqa: E402: module level not at top -from pulpcore.tasking.worker import PulpcoreWorker # noqa: E402: module level not at top -from pulpcore.tasking.redis_worker import RedisWorker # noqa: E402: module level not at top +from django.conf import settings # noqa: E402 + +from pulpcore.tasking.redis_worker import RedisWorker # noqa: E402 +from pulpcore.tasking.worker import PulpcoreWorker # noqa: E402 _logger = logging.getLogger(__name__) diff --git a/pulpcore/tasking/kafka.py b/pulpcore/tasking/kafka.py index e8e5f424213..3f6f0fd447d 100644 --- a/pulpcore/tasking/kafka.py +++ b/pulpcore/tasking/kafka.py @@ -4,7 +4,6 @@ from threading import Thread from typing import Optional - from django.conf import settings _bootstrap_servers = settings.get("KAFKA_BOOTSTRAP_SERVERS") @@ -16,11 +15,11 @@ def send_task_notification(task): pass else: - from confluent_kafka import Producer - # NOTE: in spite of the name, cloudevents.http.CloudEvent is appropriate for other protocols from cloudevents.http import CloudEvent from cloudevents.kafka import to_structured + from confluent_kafka import Producer + from pulpcore.app.serializers.task import TaskStatusMessageSerializer _logger = logging.getLogger(__name__) diff --git a/pulpcore/tasking/redis_locks.py b/pulpcore/tasking/redis_locks.py index bb457082215..7e6231fb08a 100644 --- a/pulpcore/tasking/redis_locks.py +++ b/pulpcore/tasking/redis_locks.py @@ -6,6 +6,7 @@ """ import logging + import redis from asgiref.sync import sync_to_async diff --git a/pulpcore/tasking/redis_tasks.py b/pulpcore/tasking/redis_tasks.py index 24e2623680c..e9a266034b9 100644 --- a/pulpcore/tasking/redis_tasks.py +++ b/pulpcore/tasking/redis_tasks.py @@ -7,28 +7,33 @@ import contextvars import logging + import redis from asgiref.sync import sync_to_async -from pulpcore.app.models import Task, TaskGroup, AppStatus +from pulpcore.app.models import AppStatus, Task, TaskGroup from pulpcore.app.redis_connection import get_redis_connection -from pulpcore.constants import TASK_STATES, TASK_FINAL_STATES +from pulpcore.constants import TASK_FINAL_STATES, TASK_STATES from pulpcore.tasking.redis_locks import ( acquire_locks, + async_safe_release_task_locks, extract_task_resources, get_task_lock_key, safe_release_task_locks, - async_safe_release_task_locks, +) +from pulpcore.tasking.tasks import ( + _aexecute_task as _apulpcoreworker_execute_task, +) +from pulpcore.tasking.tasks import ( + _execute_task as _pulpcoreworker_execute_task, ) from pulpcore.tasking.tasks import ( called_from_content_app, get_function_name, - get_version, get_resources, get_task_payload, + get_version, using_workdir, - _execute_task as _pulpcoreworker_execute_task, - _aexecute_task as _apulpcoreworker_execute_task, ) _logger = logging.getLogger(__name__) diff --git a/pulpcore/tasking/redis_worker.py b/pulpcore/tasking/redis_worker.py index 9885b618e18..d9449a885df 100644 --- a/pulpcore/tasking/redis_worker.py +++ b/pulpcore/tasking/redis_worker.py @@ -6,51 +6,51 @@ for the unblocking mechanism. """ -from gettext import gettext as _ import functools import logging -import redis import os import random import select import signal import time from datetime import timedelta +from gettext import gettext as _ from multiprocessing import Process from tempfile import TemporaryDirectory +import redis from django.conf import settings -from django.db import connection, transaction, DatabaseError, IntegrityError +from django.db import DatabaseError, IntegrityError, connection, transaction from django.utils import timezone +from pulpcore.app.apps import pulp_plugin_configs +from pulpcore.app.models import AppStatus, Task +from pulpcore.app.redis_connection import get_redis_connection +from pulpcore.app.util import get_worker_name from pulpcore.constants import ( - TASK_STATES, - TASK_INCOMPLETE_STATES, TASK_FINAL_STATES, + TASK_INCOMPLETE_STATES, + TASK_METRICS_LOCK, TASK_SCHEDULING_LOCK, + TASK_STATES, WORKER_CLEANUP_LOCK, - TASK_METRICS_LOCK, ) from pulpcore.metrics import init_otel_meter -from pulpcore.app.apps import pulp_plugin_configs -from pulpcore.app.util import get_worker_name -from pulpcore.app.models import Task, AppStatus -from pulpcore.app.redis_connection import get_redis_connection -from pulpcore.tasking.storage import WorkerDirectory from pulpcore.tasking._util import ( dispatch_scheduled_tasks, perform_task, startup_hook, ) from pulpcore.tasking.redis_locks import ( - release_resource_locks, acquire_locks, extract_task_resources, get_task_lock_key, + release_resource_locks, safe_release_task_locks, ) -from pulpcore.tasking.tasks import using_workdir from pulpcore.tasking.redis_tasks import execute_task +from pulpcore.tasking.storage import WorkerDirectory +from pulpcore.tasking.tasks import using_workdir _logger = logging.getLogger(__name__) random.seed() diff --git a/pulpcore/tasking/tasks.py b/pulpcore/tasking/tasks.py index 70b9547290e..b7ca64c27b8 100644 --- a/pulpcore/tasking/tasks.py +++ b/pulpcore/tasking/tasks.py @@ -4,35 +4,36 @@ import logging import os import sys -import traceback import tempfile +import traceback +from contextlib import contextmanager from functools import partial from gettext import gettext as _ -from contextlib import contextmanager -from asgiref.sync import sync_to_async, async_to_sync +from asgiref.sync import async_to_sync, sync_to_async from django.conf import settings from django.db import connection from django.db.models import Model from django_guid import get_guid + from pulpcore.app.apps import MODULE_PLUGIN_VERSIONS -from pulpcore.app.models import Task, TaskGroup, AppStatus +from pulpcore.app.contexts import awith_task_context, with_task_context, x_task_diagnostics_var +from pulpcore.app.loggers import deprecation_logger +from pulpcore.app.models import AppStatus, Task, TaskGroup from pulpcore.app.util import ( get_domain, get_prn, ) -from pulpcore.exceptions import PulpException, InternalErrorException -from pulpcore.app.contexts import with_task_context, awith_task_context, x_task_diagnostics_var from pulpcore.constants import ( + IMMEDIATE_TIMEOUT, TASK_FINAL_STATES, TASK_INCOMPLETE_STATES, TASK_STATES, - IMMEDIATE_TIMEOUT, TASK_WAKEUP_HANDLE, TASK_WAKEUP_UNBLOCK, ) +from pulpcore.exceptions import InternalErrorException, PulpException from pulpcore.tasking.kafka import send_task_notification -from pulpcore.app.loggers import deprecation_logger _logger = logging.getLogger(__name__) diff --git a/pulpcore/tasking/worker.py b/pulpcore/tasking/worker.py index ba9c700bd4d..eae0d248cc7 100644 --- a/pulpcore/tasking/worker.py +++ b/pulpcore/tasking/worker.py @@ -1,5 +1,3 @@ -from gettext import gettext as _ - import functools import logging import os @@ -7,38 +5,38 @@ import select import signal from datetime import datetime, timedelta +from gettext import gettext as _ from multiprocessing import Process from tempfile import TemporaryDirectory -from packaging.version import parse as parse_version from django.conf import settings -from django.db import connection, transaction, DatabaseError, IntegrityError +from django.db import DatabaseError, IntegrityError, connection, transaction from django.db.models import Case, Count, F, Max, Value, When from django.utils import timezone +from packaging.version import parse as parse_version +from pulpcore.app.apps import pulp_plugin_configs +from pulpcore.app.models import AppStatus, Task +from pulpcore.app.util import get_worker_name from pulpcore.constants import ( - TASK_STATES, TASK_INCOMPLETE_STATES, + TASK_METRICS_LOCK, TASK_SCHEDULING_LOCK, + TASK_STATES, TASK_UNBLOCKING_LOCK, - TASK_METRICS_LOCK, - WORKER_CLEANUP_LOCK, - TASK_WAKEUP_UNBLOCK, TASK_WAKEUP_HANDLE, + TASK_WAKEUP_UNBLOCK, + WORKER_CLEANUP_LOCK, ) from pulpcore.metrics import init_otel_meter -from pulpcore.app.apps import pulp_plugin_configs -from pulpcore.app.util import get_worker_name -from pulpcore.app.models import Task, AppStatus - -from pulpcore.tasking.storage import WorkerDirectory from pulpcore.tasking._util import ( delete_incomplete_resources, dispatch_scheduled_tasks, perform_task, startup_hook, ) -from pulpcore.tasking.tasks import using_workdir, execute_task +from pulpcore.tasking.storage import WorkerDirectory +from pulpcore.tasking.tasks import execute_task, using_workdir _logger = logging.getLogger(__name__) random.seed() diff --git a/pulpcore/tests/functional/api/test_api_root_rewrite.py b/pulpcore/tests/functional/api/test_api_root_rewrite.py index d3ec233ee7e..69c8acc17ce 100644 --- a/pulpcore/tests/functional/api/test_api_root_rewrite.py +++ b/pulpcore/tests/functional/api/test_api_root_rewrite.py @@ -1,6 +1,7 @@ -import pytest -import uuid import json +import uuid + +import pytest """ To run these tests: diff --git a/pulpcore/tests/functional/api/test_artifact_distribution.py b/pulpcore/tests/functional/api/test_artifact_distribution.py index aa343a1f6f8..14b6dc7e862 100644 --- a/pulpcore/tests/functional/api/test_artifact_distribution.py +++ b/pulpcore/tests/functional/api/test_artifact_distribution.py @@ -1,7 +1,8 @@ -import requests import subprocess from hashlib import sha256 +import requests + OBJECT_STORAGES = ( "storages.backends.s3boto3.S3Boto3Storage", "storages.backends.s3.S3Storage", diff --git a/pulpcore/tests/functional/api/test_crd_artifacts.py b/pulpcore/tests/functional/api/test_crd_artifacts.py index d5a8a1da5c2..cd667d33ec6 100644 --- a/pulpcore/tests/functional/api/test_crd_artifacts.py +++ b/pulpcore/tests/functional/api/test_crd_artifacts.py @@ -4,6 +4,7 @@ import itertools import os import uuid + import pytest diff --git a/pulpcore/tests/functional/api/test_crud_domains.py b/pulpcore/tests/functional/api/test_crud_domains.py index e9b2599112e..f07bbbf02d7 100644 --- a/pulpcore/tests/functional/api/test_crud_domains.py +++ b/pulpcore/tests/functional/api/test_crud_domains.py @@ -1,11 +1,11 @@ +import json +import random +import string import uuid import pytest -import random -import string -import json -from pulpcore.client.pulpcore import ApiException +from pulpcore.client.pulpcore import ApiException from pulpcore.tests.functional.utils import PulpTaskError diff --git a/pulpcore/tests/functional/api/test_filter.py b/pulpcore/tests/functional/api/test_filter.py index b3053b938d1..d652ff66d90 100644 --- a/pulpcore/tests/functional/api/test_filter.py +++ b/pulpcore/tests/functional/api/test_filter.py @@ -1,7 +1,8 @@ -import pytest import random import uuid +import pytest + # Warning: Do not use HEX digits here! NAMES = ( "GGGG", diff --git a/pulpcore/tests/functional/api/test_login.py b/pulpcore/tests/functional/api/test_login.py index 837e714da9e..bc63eb98033 100644 --- a/pulpcore/tests/functional/api/test_login.py +++ b/pulpcore/tests/functional/api/test_login.py @@ -1,9 +1,9 @@ import http -import pytest import uuid - from urllib.parse import urlparse +import pytest + pytestmark = [pytest.mark.parallel] diff --git a/pulpcore/tests/functional/api/test_openapi_schema.py b/pulpcore/tests/functional/api/test_openapi_schema.py index e763862e933..7e5220affd9 100644 --- a/pulpcore/tests/functional/api/test_openapi_schema.py +++ b/pulpcore/tests/functional/api/test_openapi_schema.py @@ -2,13 +2,12 @@ import copy import json +from collections import defaultdict from pathlib import Path -import pytest import jsonschema - +import pytest from drf_spectacular import validation -from collections import defaultdict @pytest.fixture(scope="session") diff --git a/pulpcore/tests/functional/api/test_replication.py b/pulpcore/tests/functional/api/test_replication.py index 62c9b8c67bc..5669598cf6a 100644 --- a/pulpcore/tests/functional/api/test_replication.py +++ b/pulpcore/tests/functional/api/test_replication.py @@ -1,6 +1,7 @@ -import pytest import uuid +import pytest + from pulpcore.tests.functional.utils import PulpTaskGroupError, generate_iso @@ -624,9 +625,9 @@ def _try_action(user, client, action, outcome, *args, **kwargs): except pulpcore_bindings.module.ApiException as e: assert e.status == outcome, f"{e}" else: - assert ( - status_code == outcome - ), f"User performed {action} when they shouldn't been able to" + assert status_code == outcome, ( + f"User performed {action} when they shouldn't been able to" + ) return response return _try_action diff --git a/pulpcore/tests/functional/api/test_repos.py b/pulpcore/tests/functional/api/test_repos.py index 103419fb64f..ba18e0af1c3 100644 --- a/pulpcore/tests/functional/api/test_repos.py +++ b/pulpcore/tests/functional/api/test_repos.py @@ -1,10 +1,10 @@ """Tests that CRUD repositories.""" +import json +import subprocess from uuid import uuid4 import pytest -import json -import subprocess from pulpcore.client.pulp_file import RepositorySyncURL diff --git a/pulpcore/tests/functional/api/test_role.py b/pulpcore/tests/functional/api/test_role.py index 3a2c1183cc6..c04eb8cfd79 100644 --- a/pulpcore/tests/functional/api/test_role.py +++ b/pulpcore/tests/functional/api/test_role.py @@ -1,4 +1,5 @@ import uuid + import pytest diff --git a/pulpcore/tests/functional/api/test_root_endpoint.py b/pulpcore/tests/functional/api/test_root_endpoint.py index 2fc0683f6f9..1c5980e5a6f 100644 --- a/pulpcore/tests/functional/api/test_root_endpoint.py +++ b/pulpcore/tests/functional/api/test_root_endpoint.py @@ -1,4 +1,5 @@ import asyncio + import pytest from pulpcore.tests.functional.utils import get_response diff --git a/pulpcore/tests/functional/api/test_status.py b/pulpcore/tests/functional/api/test_status.py index c8e28f39904..ae404a5a122 100644 --- a/pulpcore/tests/functional/api/test_status.py +++ b/pulpcore/tests/functional/api/test_status.py @@ -1,7 +1,6 @@ """Test the status page.""" import pytest - from jsonschema import validate STATUS = { diff --git a/pulpcore/tests/functional/api/test_task_purge.py b/pulpcore/tests/functional/api/test_task_purge.py index 2afd07839ab..b81c9682efd 100644 --- a/pulpcore/tests/functional/api/test_task_purge.py +++ b/pulpcore/tests/functional/api/test_task_purge.py @@ -7,7 +7,6 @@ import pytest from pulpcore.constants import TASK_FINAL_STATES - from pulpcore.tests.functional.utils import PulpTaskError TOMORROW_STR = (datetime.now(timezone.utc) + timedelta(days=1)).strftime("%Y-%m-%dT%H:%M") diff --git a/pulpcore/tests/functional/api/test_tasking.py b/pulpcore/tests/functional/api/test_tasking.py index ed2a85a0ad8..92b9afe7381 100644 --- a/pulpcore/tests/functional/api/test_tasking.py +++ b/pulpcore/tests/functional/api/test_tasking.py @@ -1,20 +1,19 @@ """Tests related to the tasking system.""" import json -import pytest import time - -from aiohttp import BasicAuth +from contextlib import contextmanager from datetime import datetime from urllib.parse import urljoin from uuid import uuid4 +import pytest +from aiohttp import BasicAuth + from pulpcore.app import settings from pulpcore.client.pulpcore import ApiException -from contextlib import contextmanager - -from pulpcore.tests.functional.utils import download_file, PulpTaskError from pulpcore.constants import IMMEDIATE_TIMEOUT +from pulpcore.tests.functional.utils import PulpTaskError, download_file @pytest.fixture(scope="module") @@ -484,9 +483,10 @@ def test_cancel_task_group(pulpcore_bindings, dispatch_task_group, gen_user): for task in tgroup.tasks: assert task.state in ["canceled", "canceling"] - with gen_user(model_roles=["core.task_viewer"]), pytest.raises( - pulpcore_bindings.ApiException - ) as e: + with ( + gen_user(model_roles=["core.task_viewer"]), + pytest.raises(pulpcore_bindings.ApiException) as e, + ): pulpcore_bindings.TaskGroupsApi.task_groups_cancel(tgroup_href, {"state": "canceled"}) assert "You do not have permission" in e.value.message @@ -505,7 +505,6 @@ def test_cancel_task_group(pulpcore_bindings, dispatch_task_group, gen_user): class TestImmediateTaskWithNoResource: - @pytest.mark.parallel def test_succeeds_on_api_worker(self, pulpcore_bindings, dispatch_task): """ @@ -667,7 +666,6 @@ def test_immediate_task_with_available_resources(dispatch_task, pulpcore_binding class TestImmediateTaskWithBlockedResource: - @pytest.mark.parallel def test_executes_in_task_worker( self, resource_blocker, dispatch_task, monitor_task, pulpcore_bindings diff --git a/pulpcore/tests/functional/api/test_upload.py b/pulpcore/tests/functional/api/test_upload.py index e211e374ce2..70932086886 100644 --- a/pulpcore/tests/functional/api/test_upload.py +++ b/pulpcore/tests/functional/api/test_upload.py @@ -1,13 +1,14 @@ """Tests related to content upload.""" import hashlib +import os import uuid +from random import shuffle + import pytest -import os -from random import shuffle -from pulpcore.client.pulpcore import ApiException from pulpcore.client.pulp_file import ApiException as FileApiException +from pulpcore.client.pulpcore import ApiException from pulpcore.tests.functional.utils import generate_iso diff --git a/pulpcore/tests/functional/api/test_users_groups.py b/pulpcore/tests/functional/api/test_users_groups.py index 17d2a514ee0..49a9fc231c4 100644 --- a/pulpcore/tests/functional/api/test_users_groups.py +++ b/pulpcore/tests/functional/api/test_users_groups.py @@ -1,5 +1,7 @@ -import pytest import uuid + +import pytest + from pulpcore.client.pulpcore.exceptions import ApiException diff --git a/pulpcore/tests/functional/api/test_workers.py b/pulpcore/tests/functional/api/test_workers.py index cc8dd98ac44..5a94ef1e731 100644 --- a/pulpcore/tests/functional/api/test_workers.py +++ b/pulpcore/tests/functional/api/test_workers.py @@ -1,11 +1,12 @@ """Tests related to the workers.""" -import pytest import subprocess import uuid from datetime import datetime, timedelta from time import sleep +import pytest + _DYNAMIC_WORKER_ATTRS = ("last_heartbeat", "current_task") """Worker attributes that are dynamically set by Pulp, not set by a user.""" diff --git a/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py b/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py index 11854eda50f..b3844d7e699 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +++ b/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py @@ -1,12 +1,14 @@ """Tests for checkpoint distribution and publications.""" -from datetime import datetime, timedelta import re +import uuid +from datetime import datetime, timedelta from time import sleep from urllib.parse import urlparse -import uuid -from aiohttp import ClientResponseError + import pytest +from aiohttp import ClientResponseError + from pulpcore.client.pulp_file import exceptions from pulpcore.content.handler import Handler diff --git a/pulpcore/tests/functional/api/using_plugin/test_content_access.py b/pulpcore/tests/functional/api/using_plugin/test_content_access.py index 03ded62b70a..dfb71d7d76c 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_content_access.py +++ b/pulpcore/tests/functional/api/using_plugin/test_content_access.py @@ -1,12 +1,12 @@ """Tests related to content delivery.""" -import pytest import uuid +import pytest + from pulpcore.client.pulp_file import ( RepositorySyncURL, ) - from pulpcore.tests.functional.utils import ( download_file, ) diff --git a/pulpcore/tests/functional/api/using_plugin/test_content_cache.py b/pulpcore/tests/functional/api/using_plugin/test_content_cache.py index c238b485d36..b5ceb3d5cb5 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +++ b/pulpcore/tests/functional/api/using_plugin/test_content_cache.py @@ -1,15 +1,15 @@ """Tests related to content cache.""" -import pytest from urllib.parse import urljoin +import pytest + from pulpcore.client.pulp_file import ( - RepositoryAddRemoveContent, - RepositorySyncURL, FileFilePublication, PatchedfileFileDistribution, + RepositoryAddRemoveContent, + RepositorySyncURL, ) - from pulpcore.tests.functional.utils import get_from_url diff --git a/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py b/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py index 8ffbfecf3db..0961e4f5350 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +++ b/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py @@ -1,13 +1,13 @@ """Tests related to content delivery.""" import hashlib -import requests import subprocess import uuid from random import sample from urllib.parse import urljoin import pytest +import requests from aiohttp.client_exceptions import ClientPayloadError, ClientResponseError from pulpcore.client.pulp_file import RepositorySyncURL diff --git a/pulpcore/tests/functional/api/using_plugin/test_content_path.py b/pulpcore/tests/functional/api/using_plugin/test_content_path.py index a2533f37372..5b8460dae0e 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_content_path.py +++ b/pulpcore/tests/functional/api/using_plugin/test_content_path.py @@ -1,10 +1,9 @@ """Tests related to content path.""" -import pytest import uuid - from urllib.parse import urljoin +import pytest from pulpcore.tests.functional.utils import get_from_url diff --git a/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py b/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py index a8b0fb67c8e..adec04fb3c9 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +++ b/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py @@ -1,12 +1,12 @@ """Tests related to content promotion.""" import hashlib -import pytest from urllib.parse import urljoin -from pulpcore.tests.functional.utils import download_file, get_files_in_manifest, get_from_url +import pytest from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.tests.functional.utils import download_file, get_files_in_manifest, get_from_url @pytest.mark.parallel diff --git a/pulpcore/tests/functional/api/using_plugin/test_contentguard.py b/pulpcore/tests/functional/api/using_plugin/test_contentguard.py index c148234f39f..585ced47ec9 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +++ b/pulpcore/tests/functional/api/using_plugin/test_contentguard.py @@ -1,12 +1,12 @@ -from aiohttp import BasicAuth -from base64 import b64encode import json -import pytest import uuid +from base64 import b64encode + +import pytest +from aiohttp import BasicAuth from pulpcore.client.pulp_file import PatchedfileFileDistribution from pulpcore.client.pulpcore import PatchedCompositeContentGuard - from pulpcore.tests.functional.utils import get_from_url diff --git a/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py b/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py index 9d21fe0433b..2a3e077c2d6 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +++ b/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py @@ -1,13 +1,13 @@ """Tests that CRUD repositories.""" import json -import pytest import re - -from uuid import uuid4 -from aiohttp import BasicAuth from subprocess import run from urllib.parse import urljoin +from uuid import uuid4 + +import pytest +from aiohttp import BasicAuth from pulpcore.client.pulp_file.exceptions import ApiException from pulpcore.tests.functional.utils import download_file diff --git a/pulpcore/tests/functional/api/using_plugin/test_distributions.py b/pulpcore/tests/functional/api/using_plugin/test_distributions.py index 8056fa9c1a1..4ba33e82f46 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_distributions.py +++ b/pulpcore/tests/functional/api/using_plugin/test_distributions.py @@ -1,12 +1,12 @@ """Tests that perform actions over distributions.""" -import pytest import json from urllib.parse import urljoin from uuid import uuid4 -from pulpcore.client.pulp_file.exceptions import ApiException +import pytest +from pulpcore.client.pulp_file.exceptions import ApiException from pulpcore.tests.functional.utils import download_file, get_from_url diff --git a/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py b/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py index 50d5f0c1fb0..ef9b06b1af4 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +++ b/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py @@ -5,12 +5,12 @@ the case. """ -import pytest import uuid -from pulpcore.client.pulpcore.exceptions import ApiException +import pytest from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.client.pulpcore.exceptions import ApiException NUM_REPOS = 1 NUM_EXPORTERS = 4 diff --git a/pulpcore/tests/functional/api/using_plugin/test_migrate.py b/pulpcore/tests/functional/api/using_plugin/test_migrate.py index b5a5da750bd..62cafdabd00 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_migrate.py +++ b/pulpcore/tests/functional/api/using_plugin/test_migrate.py @@ -1,8 +1,9 @@ -import pytest import json import shutil - from pathlib import Path + +import pytest + from pulpcore.client.pulpcore import ApiException diff --git a/pulpcore/tests/functional/api/using_plugin/test_orphans.py b/pulpcore/tests/functional/api/using_plugin/test_orphans.py index a1e25c65d4c..b8a615e7ae4 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_orphans.py +++ b/pulpcore/tests/functional/api/using_plugin/test_orphans.py @@ -1,6 +1,7 @@ """Tests that perform actions over orphan files.""" import os + import pytest diff --git a/pulpcore/tests/functional/api/using_plugin/test_prn.py b/pulpcore/tests/functional/api/using_plugin/test_prn.py index c2fcb46f972..55164c8f7d2 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_prn.py +++ b/pulpcore/tests/functional/api/using_plugin/test_prn.py @@ -1,6 +1,6 @@ -import pytest +from random import choice, sample -from random import sample, choice +import pytest @pytest.mark.parallel diff --git a/pulpcore/tests/functional/api/using_plugin/test_proxy.py b/pulpcore/tests/functional/api/using_plugin/test_proxy.py index 29f132ba92a..a2c4085c4a1 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_proxy.py +++ b/pulpcore/tests/functional/api/using_plugin/test_proxy.py @@ -1,7 +1,8 @@ +import sys + import pytest -from pulpcore.tests.functional.utils import PulpTaskError -import sys +from pulpcore.tests.functional.utils import PulpTaskError def _run_basic_sync_and_assert(file_bindings, monitor_task, remote, file_repo): diff --git a/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py b/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py index b99aabb462c..fbca0df5417 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +++ b/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py @@ -7,15 +7,14 @@ import json import os -import pytest import uuid from pathlib import Path -from pulpcore.app import settings - -from pulpcore.client.pulpcore.exceptions import ApiException +import pytest +from pulpcore.app import settings from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.client.pulpcore.exceptions import ApiException NUM_REPOS = 2 diff --git a/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py b/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py index 6307bee0f55..673ffd37a7e 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +++ b/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py @@ -1,12 +1,11 @@ """Tests that perform actions over reclaim disk space.""" -import pytest - from urllib.parse import urljoin -from pulpcore.client.pulp_file import RepositorySyncURL +import pytest -from pulpcore.tests.functional.utils import get_files_in_manifest, download_file +from pulpcore.client.pulp_file import RepositorySyncURL +from pulpcore.tests.functional.utils import download_file, get_files_in_manifest @pytest.mark.parallel diff --git a/pulpcore/tests/functional/api/using_plugin/test_repair.py b/pulpcore/tests/functional/api/using_plugin/test_repair.py index 7785ef5672a..6e2f615e966 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_repair.py +++ b/pulpcore/tests/functional/api/using_plugin/test_repair.py @@ -1,7 +1,7 @@ -import pytest +from random import sample +import pytest from django.core.files.storage import default_storage -from random import sample from pulpcore.tests.functional.utils import get_files_in_manifest diff --git a/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py b/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py index e19b17e6bea..0ad7d065380 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +++ b/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py @@ -1,11 +1,12 @@ """Tests related to repository versions.""" import uuid -import pytest from random import choice from tempfile import NamedTemporaryFile from uuid import uuid4 +import pytest + from pulpcore.tests.functional.utils import PulpTaskError, get_files_in_manifest diff --git a/pulpcore/tests/functional/api/using_plugin/test_tasks.py b/pulpcore/tests/functional/api/using_plugin/test_tasks.py index 8013a0bf587..b5fec0ee43f 100644 --- a/pulpcore/tests/functional/api/using_plugin/test_tasks.py +++ b/pulpcore/tests/functional/api/using_plugin/test_tasks.py @@ -7,9 +7,9 @@ import pytest from aiohttp import BasicAuth + from pulpcore.client.pulp_file import RepositorySyncURL from pulpcore.client.pulpcore.exceptions import ApiException - from pulpcore.tests.functional.utils import download_file diff --git a/pulpcore/tests/functional/content_with_coverage.py b/pulpcore/tests/functional/content_with_coverage.py index 152621c4716..4a4a271940c 100644 --- a/pulpcore/tests/functional/content_with_coverage.py +++ b/pulpcore/tests/functional/content_with_coverage.py @@ -1,5 +1,6 @@ import atexit import sys + import coverage cov = coverage.Coverage() diff --git a/pulpcore/tests/functional/utils.py b/pulpcore/tests/functional/utils.py index aeab1328ca0..87a894ff498 100644 --- a/pulpcore/tests/functional/utils.py +++ b/pulpcore/tests/functional/utils.py @@ -1,13 +1,13 @@ """Utilities for Pulpcore tests.""" -import aiohttp import asyncio import hashlib import os import random +from dataclasses import dataclass +import aiohttp from aiohttp import web -from dataclasses import dataclass from multidict import CIMultiDict diff --git a/pulpcore/tests/performance/test_performance.py b/pulpcore/tests/performance/test_performance.py index 373f7a0b9ed..b88937b338b 100644 --- a/pulpcore/tests/performance/test_performance.py +++ b/pulpcore/tests/performance/test_performance.py @@ -1,14 +1,14 @@ import datetime import logging import multiprocessing -import requests import tempfile import time - from collections import namedtuple from urllib.parse import urljoin from uuid import uuid4 +import requests + Args = namedtuple("Arguments", "limit processes repositories") diff --git a/pulpcore/tests/unit/conftest.py b/pulpcore/tests/unit/conftest.py index dc987229492..e624cb5f8df 100644 --- a/pulpcore/tests/unit/conftest.py +++ b/pulpcore/tests/unit/conftest.py @@ -1,6 +1,7 @@ -import pytest from uuid import uuid4 +import pytest + @pytest.fixture def fake_domain(): diff --git a/pulpcore/tests/unit/content/test_handler.py b/pulpcore/tests/unit/content/test_handler.py index 8bcbfdebb92..48285e483a6 100644 --- a/pulpcore/tests/unit/content/test_handler.py +++ b/pulpcore/tests/unit/content/test_handler.py @@ -1,27 +1,27 @@ +import uuid from datetime import timedelta +from unittest.mock import AsyncMock, Mock + import pytest -import uuid import pytest_asyncio - -from unittest.mock import Mock, AsyncMock - -from pulpcore.constants import TASK_STATES -from django_guid import set_guid, clear_guid from aiohttp.web_exceptions import HTTPMovedPermanently from django.db import IntegrityError -from pulpcore.content.handler import Handler, CheckpointListings, PathNotResolved +from django_guid import clear_guid, set_guid + +from pulpcore.app.models import AppStatus +from pulpcore.constants import TASK_STATES +from pulpcore.content.handler import CheckpointListings, Handler, PathNotResolved from pulpcore.plugin.models import ( Artifact, Content, ContentArtifact, Distribution, + Publication, Remote, RemoteArtifact, Repository, RepositoryVersion, - Publication, ) -from pulpcore.app.models import AppStatus @pytest.fixture @@ -437,15 +437,15 @@ def mock_render_html(directory_list, dates=None, path=None): with pytest.raises(CheckpointListings): Handler._select_checkpoint_publication(checkpoint_distribution, "") assert len(checkpoint_list) == 2 - assert ( - f"{checkpoint_pub_1_ts}/" in checkpoint_list - ), f"{checkpoint_pub_1_ts} not found in error body" - assert ( - f"{checkpoint_pub_2_ts}/" in checkpoint_list - ), f"{checkpoint_pub_2_ts} not found in error body" - assert ( - f"{noncheckpoint_pub_ts}/" not in checkpoint_list - ), f"{noncheckpoint_pub_ts} found in error body" + assert f"{checkpoint_pub_1_ts}/" in checkpoint_list, ( + f"{checkpoint_pub_1_ts} not found in error body" + ) + assert f"{checkpoint_pub_2_ts}/" in checkpoint_list, ( + f"{checkpoint_pub_2_ts} not found in error body" + ) + assert f"{noncheckpoint_pub_ts}/" not in checkpoint_list, ( + f"{noncheckpoint_pub_ts} found in error body" + ) @pytest.mark.django_db @@ -502,9 +502,9 @@ def test_handle_checkpoint_arbitrary_ts( ) expected_location = excinfo.value.location - assert ( - redirect_location == expected_location - ), f"Unexpected redirect location: {redirect_location}" + assert redirect_location == expected_location, ( + f"Unexpected redirect location: {redirect_location}" + ) @pytest.mark.django_db diff --git a/pulpcore/tests/unit/content/test_heartbeat.py b/pulpcore/tests/unit/content/test_heartbeat.py index 1add946966e..5fff2076431 100644 --- a/pulpcore/tests/unit/content/test_heartbeat.py +++ b/pulpcore/tests/unit/content/test_heartbeat.py @@ -1,11 +1,11 @@ -import pytest -from unittest.mock import call, Mock, AsyncMock +from unittest.mock import AsyncMock, Mock, call +import pytest from django.db.utils import InterfaceError, OperationalError +from pulpcore.app.models.status import AppStatus, AppStatusManager from pulpcore.content import _heartbeat from pulpcore.content.handler import Handler -from pulpcore.app.models.status import AppStatus, AppStatusManager class MockException(Exception): diff --git a/pulpcore/tests/unit/metrics/conftest.py b/pulpcore/tests/unit/metrics/conftest.py index 5ede661a7d9..c4e52138283 100644 --- a/pulpcore/tests/unit/metrics/conftest.py +++ b/pulpcore/tests/unit/metrics/conftest.py @@ -1,7 +1,6 @@ import pytest - -from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import InMemoryMetricReader @pytest.fixture diff --git a/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py b/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py index 9022ecba09b..3e06d6a5279 100644 --- a/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +++ b/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py @@ -1,5 +1,4 @@ import pytest - from aiohttp import web from pulpcore.content.instrumentation import instrumentation diff --git a/pulpcore/tests/unit/metrics/test_django_instrumentation.py b/pulpcore/tests/unit/metrics/test_django_instrumentation.py index 987013de14c..6904b49adac 100644 --- a/pulpcore/tests/unit/metrics/test_django_instrumentation.py +++ b/pulpcore/tests/unit/metrics/test_django_instrumentation.py @@ -1,7 +1,6 @@ import pytest - -from django.test import RequestFactory from django.http import HttpResponse +from django.test import RequestFactory from pulpcore.middleware import DjangoMetricsMiddleware diff --git a/pulpcore/tests/unit/models/test_base.py b/pulpcore/tests/unit/models/test_base.py index 2264787b4ad..4e72c8dcad3 100644 --- a/pulpcore/tests/unit/models/test_base.py +++ b/pulpcore/tests/unit/models/test_base.py @@ -1,8 +1,10 @@ -import pytest from uuid import uuid4 +import pytest + from pulpcore.app.models import AutoAddObjPermsMixin, Repository -from pulp_file.app.models import FileRepository, FileRemote + +from pulp_file.app.models import FileRemote, FileRepository @pytest.mark.django_db diff --git a/pulpcore/tests/unit/models/test_content.py b/pulpcore/tests/unit/models/test_content.py index 04eb424b8d3..c4023fce6f5 100644 --- a/pulpcore/tests/unit/models/test_content.py +++ b/pulpcore/tests/unit/models/test_content.py @@ -1,14 +1,13 @@ -import pytest from collections import namedtuple +import pytest from django.core.files.storage import default_storage as storage from django.core.files.uploadedfile import SimpleUploadedFile from pulpcore.plugin.exceptions import ( - UnsupportedDigestValidationError, MissingDigestValidationError, + UnsupportedDigestValidationError, ) - from pulpcore.plugin.models import ( Artifact, Content, diff --git a/pulpcore/tests/unit/models/test_publication_retention.py b/pulpcore/tests/unit/models/test_publication_retention.py index f8ad9bc11dd..f16c9b1e036 100644 --- a/pulpcore/tests/unit/models/test_publication_retention.py +++ b/pulpcore/tests/unit/models/test_publication_retention.py @@ -9,6 +9,7 @@ DistributedPublication, PublishedArtifact, ) + from pulp_file.app.models import ( FileContent, FileDistribution, @@ -36,9 +37,9 @@ def pub_factory(repo_version=None, pass_through=False, create_pa=False): def dist_factory(repo=None, repover=None, pub=None, name=None): - assert [repo, repover, pub].count( - None - ) == 2, "Exactly one of repo, repover, or pub must be provided" + assert [repo, repover, pub].count(None) == 2, ( + "Exactly one of repo, repover, or pub must be provided" + ) name = name or f"dist-{uuid.uuid4().hex[:8]}" return FileDistribution.objects.create( name=name, base_path=name, repository=repo, repository_version=repover, publication=pub @@ -46,9 +47,9 @@ def dist_factory(repo=None, repover=None, pub=None, name=None): def update_dist(dist, repo=UNSET, repover=UNSET, pub=UNSET): - assert (repo, repover, pub).count( - UNSET - ) == 2, "Exactly one of repo, repover, or pub must be provided" + assert (repo, repover, pub).count(UNSET) == 2, ( + "Exactly one of repo, repover, or pub must be provided" + ) if repo is not UNSET: dist.repository = repo if repover is not UNSET: @@ -74,14 +75,14 @@ def create_version(repo, add=None, remove=None): repo_version.remove_content(Content.objects.filter(pk=ca.content_id)) for path in add or []: ca = ContentArtifact.objects.get(relative_path=path) - assert repo_version.content.filter( - pk=ca.content_id - ).exists(), f"{path!r} not found in repository version content" + assert repo_version.content.filter(pk=ca.content_id).exists(), ( + f"{path!r} not found in repository version content" + ) for path in remove or []: ca = ContentArtifact.objects.get(relative_path=path) - assert not repo_version.content.filter( - pk=ca.content_id - ).exists(), f"{path!r} should not be in repository version content after removal" + assert not repo_version.content.filter(pk=ca.content_id).exists(), ( + f"{path!r} should not be in repository version content after removal" + ) return repo_version diff --git a/pulpcore/tests/unit/models/test_remote.py b/pulpcore/tests/unit/models/test_remote.py index ff7d81a9f57..bb394816d37 100644 --- a/pulpcore/tests/unit/models/test_remote.py +++ b/pulpcore/tests/unit/models/test_remote.py @@ -1,12 +1,12 @@ -import pytest from uuid import uuid4 -from cryptography.fernet import InvalidToken +import pytest +from cryptography.fernet import InvalidToken from django.core.management import call_command from django.db import connection -from pulpcore.app.models import Remote, Domain -from pulpcore.app.models.fields import _fernet, EncryptedTextField +from pulpcore.app.models import Domain, Remote +from pulpcore.app.models.fields import EncryptedTextField, _fernet TEST_KEY1 = b"hPCIFQV/upbvPRsEpgS7W32XdFA2EQgXnMtyNAekebQ=" TEST_KEY2 = b"6Xyv+QezAQ+4R870F5qsgKcngzmm46caDB2gyo9qnpc=" diff --git a/pulpcore/tests/unit/models/test_repository.py b/pulpcore/tests/unit/models/test_repository.py index 3caf360b999..621a86373dd 100644 --- a/pulpcore/tests/unit/models/test_repository.py +++ b/pulpcore/tests/unit/models/test_repository.py @@ -1,7 +1,7 @@ -import pytest +from itertools import compress from uuid import uuid4 -from itertools import compress +import pytest from pulpcore.app.models import RepositoryVersionContentDetails from pulpcore.plugin.models import Artifact, Content, ContentArtifact, Repository diff --git a/pulpcore/tests/unit/models/test_task.py b/pulpcore/tests/unit/models/test_task.py index 30ab69c02af..43704bf2eb9 100644 --- a/pulpcore/tests/unit/models/test_task.py +++ b/pulpcore/tests/unit/models/test_task.py @@ -1,6 +1,8 @@ -import pytest import sys -from pulpcore.app.models import AppStatus, Task, ProgressReport + +import pytest + +from pulpcore.app.models import AppStatus, ProgressReport, Task from pulpcore.constants import TASK_STATES diff --git a/pulpcore/tests/unit/roles/test_roles.py b/pulpcore/tests/unit/roles/test_roles.py index 0cfd8b9076a..04941d512f4 100644 --- a/pulpcore/tests/unit/roles/test_roles.py +++ b/pulpcore/tests/unit/roles/test_roles.py @@ -1,6 +1,6 @@ -import pytest from uuid import uuid4 +import pytest from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission @@ -8,9 +8,9 @@ from pulpcore.app.models.role import Role from pulpcore.app.role_util import ( assign_role, - remove_role, get_objects_for_user, get_users_with_perms_attached_roles, + remove_role, ) User = get_user_model() diff --git a/pulpcore/tests/unit/serializers/test_base.py b/pulpcore/tests/unit/serializers/test_base.py index a43188c5029..b1a8c4dfe7d 100644 --- a/pulpcore/tests/unit/serializers/test_base.py +++ b/pulpcore/tests/unit/serializers/test_base.py @@ -1,13 +1,12 @@ import pytest - from rest_framework import serializers +from pulpcore.app.models import RBACContentGuard from pulpcore.app.serializers import ( - validate_unknown_fields, - RBACContentGuardSerializer, GetOrCreateSerializerMixin, + RBACContentGuardSerializer, + validate_unknown_fields, ) -from pulpcore.app.models import RBACContentGuard from pulpcore.app.util import get_domain diff --git a/pulpcore/tests/unit/serializers/test_domain.py b/pulpcore/tests/unit/serializers/test_domain.py index 444723e8022..d064a059bea 100644 --- a/pulpcore/tests/unit/serializers/test_domain.py +++ b/pulpcore/tests/unit/serializers/test_domain.py @@ -1,15 +1,15 @@ -import pytest from types import SimpleNamespace +import pytest from rest_framework import serializers from pulpcore.app.serializers.domain import ( - FileSystemSettingsSerializer, # SFTPSettingsSerializer, AmazonS3SettingsSerializer, AzureSettingsSerializer, # GoogleSettingsSerializer, DomainSerializer, + FileSystemSettingsSerializer, ) MIN_DOMAIN_SETTINGS = { diff --git a/pulpcore/tests/unit/serializers/test_orphans_cleanup.py b/pulpcore/tests/unit/serializers/test_orphans_cleanup.py index c7f7777c61a..5815eb9df07 100644 --- a/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +++ b/pulpcore/tests/unit/serializers/test_orphans_cleanup.py @@ -1,5 +1,4 @@ import pytest - from rest_framework import serializers from pulpcore.app.serializers import OrphansCleanupSerializer diff --git a/pulpcore/tests/unit/serializers/test_pulpexport.py b/pulpcore/tests/unit/serializers/test_pulpexport.py index c2baba7bf8e..e16e61d8826 100644 --- a/pulpcore/tests/unit/serializers/test_pulpexport.py +++ b/pulpcore/tests/unit/serializers/test_pulpexport.py @@ -1,4 +1,5 @@ import pytest + from pulpcore.app.serializers import PulpExportSerializer pytestmark = pytest.mark.usefixtures("fake_domain") diff --git a/pulpcore/tests/unit/serializers/test_repository.py b/pulpcore/tests/unit/serializers/test_repository.py index 3d38eff4c66..1c7adc2afa6 100644 --- a/pulpcore/tests/unit/serializers/test_repository.py +++ b/pulpcore/tests/unit/serializers/test_repository.py @@ -1,13 +1,13 @@ -import pytest from types import SimpleNamespace - from unittest.mock import Mock + +import pytest from rest_framework import serializers from pulpcore.app import models from pulpcore.app.serializers import ( - PublicationSerializer, DistributionSerializer, + PublicationSerializer, RemoteSerializer, RepositorySyncURLSerializer, ValidateFieldsMixin, diff --git a/pulpcore/tests/unit/serializers/test_user.py b/pulpcore/tests/unit/serializers/test_user.py index 611d9665f05..c2b404d18ca 100644 --- a/pulpcore/tests/unit/serializers/test_user.py +++ b/pulpcore/tests/unit/serializers/test_user.py @@ -1,12 +1,13 @@ -import pytest from unittest.mock import Mock +import pytest from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from rest_framework.exceptions import ValidationError -from pulpcore.app.util import get_url, get_prn -from pulpcore.app.serializers import UserRoleSerializer, GroupRoleSerializer +from pulpcore.app.serializers import GroupRoleSerializer, UserRoleSerializer +from pulpcore.app.util import get_prn, get_url + from pulp_file.app.models import FileRepository pytestmark = [pytest.mark.django_db] diff --git a/pulpcore/tests/unit/stages/test_artifactdownloader.py b/pulpcore/tests/unit/stages/test_artifactdownloader.py index a928082e757..c782a4243dd 100644 --- a/pulpcore/tests/unit/stages/test_artifactdownloader.py +++ b/pulpcore/tests/unit/stages/test_artifactdownloader.py @@ -1,13 +1,13 @@ import asyncio +from contextlib import suppress +from unittest import mock +from uuid import uuid4 + import pytest import pytest_asyncio -from uuid import uuid4 -from contextlib import suppress from aiotools.timer import VirtualClock -from unittest import mock - -from pulpcore.plugin.stages import DeclarativeContent, DeclarativeArtifact +from pulpcore.plugin.stages import DeclarativeArtifact, DeclarativeContent from pulpcore.plugin.stages.artifact_stages import ArtifactDownloader pytestmark = pytest.mark.usefixtures("fake_domain") diff --git a/pulpcore/tests/unit/stages/test_stages.py b/pulpcore/tests/unit/stages/test_stages.py index dab2d838962..e96fbbbfb54 100644 --- a/pulpcore/tests/unit/stages/test_stages.py +++ b/pulpcore/tests/unit/stages/test_stages.py @@ -1,10 +1,10 @@ import asyncio -import pytest -import pytest_asyncio import mock +import pytest +import pytest_asyncio -from pulpcore.plugin.stages import Stage, EndStage, DeclarativeContent +from pulpcore.plugin.stages import DeclarativeContent, EndStage, Stage pytestmark = pytest.mark.usefixtures("fake_domain") diff --git a/pulpcore/tests/unit/test_cache.py b/pulpcore/tests/unit/test_cache.py index e7831263ef5..6da69732e07 100644 --- a/pulpcore/tests/unit/test_cache.py +++ b/pulpcore/tests/unit/test_cache.py @@ -1,6 +1,7 @@ -import pytest from time import sleep +import pytest + import pulpcore.app.redis_connection from pulpcore.cache import Cache diff --git a/pulpcore/tests/unit/test_content_guard.py b/pulpcore/tests/unit/test_content_guard.py index c9770f2ea8e..9024020f239 100644 --- a/pulpcore/tests/unit/test_content_guard.py +++ b/pulpcore/tests/unit/test_content_guard.py @@ -1,9 +1,9 @@ import json -import pytest import re - -from unittest.mock import Mock from base64 import b64encode +from unittest.mock import Mock + +import pytest from pulpcore.app.models import ContentRedirectContentGuard, HeaderContentGuard diff --git a/pulpcore/tests/unit/test_import_checks.py b/pulpcore/tests/unit/test_import_checks.py index 0a40f6480ef..7f8ce071f23 100644 --- a/pulpcore/tests/unit/test_import_checks.py +++ b/pulpcore/tests/unit/test_import_checks.py @@ -1,5 +1,4 @@ import pytest - from rest_framework.serializers import ValidationError import pulpcore.app.apps diff --git a/pulpcore/tests/unit/test_list_signing_services_command.py b/pulpcore/tests/unit/test_list_signing_services_command.py index 87421b48615..2c8e1dcd383 100644 --- a/pulpcore/tests/unit/test_list_signing_services_command.py +++ b/pulpcore/tests/unit/test_list_signing_services_command.py @@ -1,7 +1,7 @@ -import pytest from io import StringIO from unittest.mock import patch +import pytest from django.core.management import call_command from pulpcore.app.models.content import AsciiArmoredDetachedSigningService diff --git a/pulpcore/tests/unit/test_pulp_urls.py b/pulpcore/tests/unit/test_pulp_urls.py index c3fb3cc3116..7634f1402e2 100644 --- a/pulpcore/tests/unit/test_pulp_urls.py +++ b/pulpcore/tests/unit/test_pulp_urls.py @@ -1,7 +1,7 @@ import json -from pulpcore.app.templatetags import pulp_urls from pulpcore.app.find_url import find_api_root +from pulpcore.app.templatetags import pulp_urls def test_urlize_basic_url(): diff --git a/pulpcore/tests/unit/test_util.py b/pulpcore/tests/unit/test_util.py index d0d6181e47b..6b2943ceae3 100644 --- a/pulpcore/tests/unit/test_util.py +++ b/pulpcore/tests/unit/test_util.py @@ -3,9 +3,9 @@ import unittest from contextlib import nullcontext from pathlib import Path +from unittest import mock import pytest -from unittest import mock from rest_framework.exceptions import ValidationError from pulpcore.app import models, util diff --git a/pulpcore/tests/unit/test_viewsets.py b/pulpcore/tests/unit/test_viewsets.py index 6f1f10a6531..9e475ba3fb5 100644 --- a/pulpcore/tests/unit/test_viewsets.py +++ b/pulpcore/tests/unit/test_viewsets.py @@ -2,7 +2,9 @@ from django.test import TestCase from rest_framework.serializers import ValidationError as DRFValidationError + from pulpcore.plugin.find_url import find_api_root + from pulp_file.app import models, viewsets _, V3_PATH = find_api_root(domain="default", rewrite_header=False, lstrip=False) diff --git a/pulpcore/tests/unit/test_vulnerability_report.py b/pulpcore/tests/unit/test_vulnerability_report.py index 525b710c3c3..dd8886e7fb6 100644 --- a/pulpcore/tests/unit/test_vulnerability_report.py +++ b/pulpcore/tests/unit/test_vulnerability_report.py @@ -1,6 +1,6 @@ -import pytest +from unittest.mock import AsyncMock, Mock, patch -from unittest.mock import Mock, AsyncMock, patch +import pytest from pulpcore.app.tasks.vulnerability_report import VulnerabilityReportScanner from pulpcore.constants import OSV_QUERY_URL diff --git a/pulpcore/tests/unit/viewsets/test_viewset_base.py b/pulpcore/tests/unit/viewsets/test_viewset_base.py index da1a0d21a8a..c5bab400f3f 100644 --- a/pulpcore/tests/unit/viewsets/test_viewset_base.py +++ b/pulpcore/tests/unit/viewsets/test_viewset_base.py @@ -1,8 +1,8 @@ -import pytest -from pytest_django.asserts import assertQuerySetEqual import unittest +import pytest from django.http import Http404, QueryDict +from pytest_django.asserts import assertQuerySetEqual from pulpcore.app import models, serializers, viewsets diff --git a/pyproject.toml b/pyproject.toml index 27455e82d76..5f21c92219c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -266,3 +266,27 @@ replace = "version = \"{new_version}\"" filename = "./pyproject.toml" search = "version = \"{current_version}\"" replace = "version = \"{new_version}\"" + + +[tool.ruff] +# This section is managed by the plugin template. Do not edit manually. +line-length = 100 +extend-exclude = [ + "docs/**", + "**/migrations/*.py", + "./pulpcore/app/protobuf/*", +] + +[tool.ruff.lint] +# This section is managed by the plugin template. Do not edit manually. +extend-select = [ + "I", + "INT", + "TID", + "T10", +] + +[tool.ruff.lint.isort] +# This section is managed by the plugin template. Do not edit manually. +sections = { second-party = ["pulpcore"] } +section-order = ["future", "standard-library", "third-party", "second-party", "first-party", "local-folder"] diff --git a/template_config.yml b/template_config.yml index 4023271a0d8..6747a8ec558 100644 --- a/template_config.yml +++ b/template_config.yml @@ -6,9 +6,7 @@ # After editing this file please always reapply the plugin template before committing any changes. --- -black: true check_commit_message: true -check_gettext: true check_manifest: true check_stray_pulpcore_imports: false ci_base_image: "ghcr.io/pulp/pulp-ci-centos9" @@ -26,11 +24,10 @@ docker_fixtures: true extra_files: - destination: "/etc/nginx/pulp/api_root_rewrite.conf" origin: "pulpcore/pulpcore/tests/functional/assets/api_root_rewrite.conf" -flake8: true -flake8_ignore: - - "./pulpcore/app/protobuf/*" github_org: "pulp" latest_release_branch: "3.109" +lint_ignore: + - "./pulpcore/app/protobuf/*" lint_requirements: true os_required_packages: [] parallel_test_workers: 8 @@ -125,7 +122,6 @@ pulp_settings_s3: rest_framework__default_permission_classes: - "pulpcore.plugin.access_policy.AccessPolicyFromSettings" spectacular_settings__oas_version: "3.0.3" -pydocstyle: true release_email: "pulp-infra@redhat.com" release_user: "pulpbot" stalebot: true