From dda3810e875a8074e2e5c99647f7a6a958a90c75 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Sat, 24 Aug 2024 21:02:40 -0500 Subject: [PATCH] Django 5.1 compatibilty, and Dropped Django 3.2 / Postgres 12 support (#10) * Initialize template from version 80d7f1ffae8953435935d7f1ef7d1e526a4be755 * Update template to version 2794ea47b0220081dc869d01199ee490dda00762 * Lock reqs * Update version and release notes * Update author --- .circleci/config.yml | 43 ++-- .git-tidy/commit.tpl | 15 -- .git-tidy/commit.yaml | 22 -- .git-tidy/log.tpl | 28 --- .gitcommit.tpl | 11 - CHANGELOG.md | 22 +- CONTRIBUTING.md | 26 +-- Makefile | 37 +--- README.md | 2 +- devops.py | 154 +------------ docs/contributing.md | 76 +------ docs/css/mkdocs-material.css | 17 ++ docs/index.md | 2 +- docs/release_notes.md | 75 +------ docs/requirements.txt | 62 +++--- docs/static/logo.png | Bin 0 -> 13655 bytes docs/static/logo.svg | 4 - footing.yaml | 2 +- mkdocs.yml | 7 +- poetry.lock | 414 +++++++++++++++-------------------- pyproject.toml | 44 ++-- tox.ini | 9 +- 22 files changed, 304 insertions(+), 768 deletions(-) delete mode 100644 .git-tidy/commit.tpl delete mode 100644 .git-tidy/commit.yaml delete mode 100644 .git-tidy/log.tpl delete mode 100644 .gitcommit.tpl create mode 100644 docs/static/logo.png delete mode 100644 docs/static/logo.svg diff --git a/.circleci/config.yml b/.circleci/config.yml index ecbcede..a32650b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,9 +8,8 @@ orbs: docker: - image: opus10/circleci-python-library:2024-04-17 environment: - # Ensure makefile commands are not wrapped in "docker-compose run" + # Ensure makefile commands are not wrapped in "docker compose run" EXEC_WRAPPER: '' - TOX_PARALLEL_NO_SPINNER: 1 DATABASE_URL: postgres://root@localhost/circle_test?sslmode=disable - image: cimg/postgres:<> environment: @@ -40,14 +39,14 @@ jobs: test_pg_min: executor: name: opus10/python - pg_version: "12.15" + pg_version: "13.16" steps: - opus10/test test_pg_max: executor: name: opus10/python - pg_version: "16.0" + pg_version: "16.4" steps: - opus10/test @@ -69,16 +68,6 @@ jobs: - run: make dependencies - run: make type-check || true - check_changelog: - executor: opus10/python - steps: - - checkout - - restore_cache: - key: v4-{{ checksum "poetry.lock" }} - - run: make dependencies - - run: git tidy-log origin/main.. - - run: make tidy-lint - deploy: executor: opus10/python steps: @@ -94,14 +83,22 @@ workflows: version: 2 on_commit: jobs: - - test_pg_min - - test_pg_max - - lint - - type_check - - check_changelog: + - test_pg_min: filters: - branches: - ignore: main + tags: + only: /.*/ + - test_pg_max: + filters: + tags: + only: /.*/ + - lint: + filters: + tags: + only: /.*/ + - type_check: + filters: + tags: + only: /.*/ - deploy: context: python-library requires: @@ -111,4 +108,6 @@ workflows: - type_check filters: branches: - only: main + ignore: /.*/ + tags: + only: /.*/ diff --git a/.git-tidy/commit.tpl b/.git-tidy/commit.tpl deleted file mode 100644 index e3bf3c9..0000000 --- a/.git-tidy/commit.tpl +++ /dev/null @@ -1,15 +0,0 @@ -# Remember - commit messages are used to generate release notes! -# Use the following template when writing a commit message or -# use "git tidy-commit" to commit a properly-formatted message. -# -# ---- Commit Message Format ---- -# -# {{ schema.summary.help }} -# -# {{ schema.description.help }} -# -{% for entry in schema %} -{% if entry.label not in ['summary', 'description'] %} -# {{ entry.label.replace('_', '-').title() }}: {{ entry.help }} -{% endif %} -{% endfor %} \ No newline at end of file diff --git a/.git-tidy/commit.yaml b/.git-tidy/commit.yaml deleted file mode 100644 index 05ee6ba..0000000 --- a/.git-tidy/commit.yaml +++ /dev/null @@ -1,22 +0,0 @@ -- label: type - name: Type - help: The type of change. - type: string - choices: - - api-break - - bug - - feature - - trivial - -- label: summary - name: Summary - help: A high-level summary of the changes. - type: string - -- label: description - name: Description - help: An in-depth description of the changes. - type: string - condition: ['!=', 'type', 'trivial'] - multiline: True - required: False diff --git a/.git-tidy/log.tpl b/.git-tidy/log.tpl deleted file mode 100644 index d4d9b81..0000000 --- a/.git-tidy/log.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{% if output == ':github/pr' %} -**Heads up!** This is what the release notes will look like based on the commits. - -{% endif %} -{% if not range %} -# Changelog -{% endif %} -{% for tag, commits_by_tag in commits.exclude('summary', '.*\[skip ci\].*', match=True).group('tag').items() %} - -## {{ tag|default('Unreleased', True) }} {% if tag.date %}({{ tag.date.date() }}){% endif %} - -{% for type, commits_by_type in commits_by_tag.group('type', ascending_keys=True, none_key_last=True).items() %} - -### {{ type|default('Other', True)|title }} - -{% for commit in commits_by_type %} -{% if not commit.is_parsed %} - - {{ commit.sha[:7] }}: Commit could not be parsed. -{% else %} - - {{ commit.summary }} [{{ commit.author_name }}, {{ commit.sha[:7] }}] -{% if commit.description %} - - {{ commit.description|indent(4) }} -{% endif %} -{% endif %} -{% endfor %} -{% endfor %} -{% endfor %} \ No newline at end of file diff --git a/.gitcommit.tpl b/.gitcommit.tpl deleted file mode 100644 index 2ea7ff1..0000000 --- a/.gitcommit.tpl +++ /dev/null @@ -1,11 +0,0 @@ -# Remember - commit messages are used to generate release notes! -# Use the following template when writing a commit message or -# use "git tidy-commit" to commit a properly-formatted message. -# -# ---- Commit Message Format ---- -# -# A high-level summary of the changes. -# -# An in-depth description of the changes. -# -# Type: The type of change. diff --git a/CHANGELOG.md b/CHANGELOG.md index d006f68..039397c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,20 @@ # Changelog +## 1.5.0 (2024-08-24) + +#### Changes + + - Django 5.1 compatibilty, and Dropped Django 3.2 / Postgres 12 support by [@wesleykendall](https://github.com/wesleykendall) in [#10](https://github.com/Opus10/django-pgactivity/pull/10). + ## 1.4.1 (2024-04-06) -### Trivial +#### Trivial - Fix ReadTheDocs builds. [Wesley Kendall, 8b3c49e] ## 1.4.0 (2023-11-26) -### Feature +#### Feature - Django 5.0 compatibility [Wesley Kendall, 12efd20] @@ -16,13 +22,13 @@ ## 1.3.1 (2023-10-09) -### Trivial +#### Trivial - Added Opus10 branding to docs [Wesley Kendall, 877178b] ## 1.3.0 (2023-10-08) -### Feature +#### Feature - Add Python 3.12 support and use Mkdocs for documentation [Wesley Kendall, ec98a78] @@ -32,7 +38,7 @@ ## 1.2.0 (2023-06-08) -### Feature +#### Feature - Added Python 3.11, Django 4.2, and Psycopg 3 support [Wesley Kendall, 72af215] @@ -40,13 +46,13 @@ ## 1.1.1 (2022-10-25) -### Trivial +#### Trivial - Use ``None`` to reset ``pgactivity.timeout``. [Wesley Kendall, fcabcb7] ## 1.1.0 (2022-10-24) -### Feature +#### Feature - Simplify management command and nest ``pgactivity.timeout``. [Wesley Kendall, b7d359d] @@ -57,7 +63,7 @@ ## 1.0.0 (2022-10-18) -### Api-Break +#### Api-Break - Initial release of ``django-pgactivity`` [Wesley Kendall, 593bda7] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 01aae2b..171ea91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,24 +32,6 @@ If your code fails the linter checks, fix common errors with: make lint-fix -## Committing - -This project uses [git-tidy](https://github.com/Opus10/git-tidy) to produce structured commits with git trailers. Information from commit messages is used to generate release notes and bump the version properly. - -To do a structured commit with `git-tidy`, do: - - make tidy-commit - -All commits in a pull request must be tidy commits that encapsulate a change. Ideally entire features or bug fixes are encapsulated in a single commit. Squash all of your commits into a tidy commit with: - - make tidy-squash - -To check if your commits pass linting, do: - - make tidy-lint - -Note, the above command lints every commit since branching from main. You can also run `make shell` and run `git tidy` commands inside the docker environment to do other flavors of `git tidy` commands. - ## Documentation [Mkdocs Material](https://squidfunk.github.io/mkdocs-material/) documentation can be built with: @@ -62,10 +44,4 @@ A shortcut for serving them is: ## Releases and Versioning -Anything that is merged into the main branch will be automatically deployed to PyPI. Documentation will be published to a ReadTheDocs at `https://django-pgactivity.readthedocs.io/`. - -The following files will be generated and should *not* be edited by a user: - -- `CHANGELOG.md` - Contains an automatically-generated change log for each release. - -This project uses [Semantic Versioning](http://semver.org) by analyzing `Type:` trailers on git commit messages (trailers are added when using `git tidy-commit`). In order to bump the minor version, use "feature" or "bug" as the type. In order to bump the major version, use "api-break". The patch version will be updated automatically if none of these tags are present. +The version number and release notes are manually updated by the maintainer during the release process. Do not edit these. \ No newline at end of file diff --git a/Makefile b/Makefile index 20bcb9e..013e70a 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ else ifeq (${OS}, Darwin) endif # Docker run mounts the local code directory, SSH (for git), and global git config information -DOCKER_RUN_CMD?=$(DOCKER_CMD)-compose run --name $(PACKAGE_NAME) $(DOCKER_RUN_ARGS) -d app +DOCKER_RUN_CMD?=$(DOCKER_CMD) compose run --name $(PACKAGE_NAME) $(DOCKER_RUN_ARGS) -d app # Print usage of main targets when user types "make" or "make help" .PHONY: help @@ -66,7 +66,7 @@ endif # Pull the latest container and start a detached run .PHONY: docker-start docker-start: - $(DOCKER_CMD)-compose pull + $(DOCKER_CMD) compose pull $(DOCKER_RUN_CMD) @@ -74,6 +74,7 @@ docker-start: .PHONY: lock lock: $(EXEC_WRAPPER) poetry lock --no-update + $(EXEC_WRAPPER) poetry export --with dev --without-hashes -f requirements.txt > docs/requirements.txt # Install dependencies @@ -82,13 +83,6 @@ dependencies: $(EXEC_WRAPPER) poetry install --no-ansi -# Set up git configuration -.PHONY: git-setup -git-setup: - $(EXEC_WRAPPER) git tidy --template -o .gitcommit.tpl - $(EXEC_WRAPPER) git config --local commit.template .gitcommit.tpl - - # Sets up the local database .PHONY: db-setup db-setup: @@ -109,18 +103,18 @@ conda-create: # Sets up a Conda development environment .PHONY: conda-setup conda-setup: EXEC_WRAPPER=conda run -n ${PACKAGE_NAME} --no-capture-output -conda-setup: conda-create lock dependencies git-setup db-setup +conda-setup: conda-create lock dependencies db-setup # Sets up a Docker development environment .PHONY: docker-setup -docker-setup: docker-teardown docker-start lock dependencies git-setup +docker-setup: docker-teardown docker-start lock dependencies # Spin down docker resources .PHONY: docker-teardown docker-teardown: - $(DOCKER_CMD)-compose down --remove-orphans + $(DOCKER_CMD) compose down --remove-orphans # Run a shell @@ -159,6 +153,7 @@ lint: $(EXEC_WRAPPER) ruff format . --check $(EXEC_WRAPPER) ruff check ${MODULE_NAME} $(EXEC_WRAPPER) bash -c 'make docs' + $(EXEC_WRAPPER) diff <(poetry export --with dev --without-hashes -f requirements.txt) docs/requirements.txt >/dev/null 2>&1 || exit 1 # Fix common linting errors @@ -172,21 +167,3 @@ lint-fix: .PHONY: type-check type-check: $(EXEC_WRAPPER) pyright $(MODULE_NAME) - - -# Lint commit messages -.PHONY: tidy-lint -tidy-lint: - $(EXEC_WRAPPER) git tidy-lint origin/main.. - - -# Perform a tidy commit -.PHONY: tidy-commit -tidy-commit: - $(EXEC_WRAPPER) git tidy-commit - - -# Perform a tidy squash -.PHONY: tidy-squash -tidy-squash: - $(EXEC_WRAPPER) git tidy-squash origin/main diff --git a/README.md b/README.md index 8c8a531..adb9fff 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ def my_operation(): ## Compatibility -`django-pgactivity` is compatible with Python 3.8 - 3.12, Django 3.2 - 5.0, Psycopg 2 - 3, and Postgres 12 - 16. +`django-pgactivity` is compatible with Python 3.8 - 3.12, Django 4.2 - 5.1, Psycopg 2 - 3, and Postgres 13 - 16. ## Documentation diff --git a/devops.py b/devops.py index 9f22dd1..ee7f602 100644 --- a/devops.py +++ b/devops.py @@ -14,31 +14,12 @@ import os import subprocess import sys -import tempfile -from typing import IO, Any, Final, Literal, Tuple, TypeAlias, Union +from typing import IO, Any, TypeAlias, Union -from packaging import version - -CIRCLECI_ENV_VAR: Final = "CIRCLECI" File: TypeAlias = Union[IO[Any], int, None] -class Error(Exception): - """Base exception for this script""" - - -class NotOnCircleCIError(Error): - """Thrown when not running on CircleCI""" - - -def _check_git_version() -> None: - """Verify git version""" - git_version = _shell_stdout("git --version | rev | cut -f 1 -d' ' | rev") - if version.parse(git_version) < version.parse("2.22.0"): - raise RuntimeError(f"Must have git version >= 2.22.0 (version = {git_version})") - - def _shell( cmd: str, check: bool = True, @@ -50,114 +31,6 @@ def _shell( return subprocess.run(cmd, shell=True, check=check, stdin=stdin, stdout=stdout, stderr=stderr) -def _shell_stdout(cmd: str, check: bool = True) -> str: - """Runs a shell command and returns stdout""" - ret = _shell(cmd, stdout=subprocess.PIPE, check=check) - return ret.stdout.decode("utf-8").strip() if ret.stdout else "" - - -def _configure_git() -> None: - """Configure git name/email and verify git version""" - _check_git_version() - - _shell('git config --local user.email "wesleykendall@protonmail.com"') - _shell('git config --local user.name "Opus 10 Devops"') - _shell("git config push.default current") - - -def _find_latest_tag() -> str: - return _shell_stdout("git describe --tags --abbrev=0", check=False) - - -def _find_sem_ver_update() -> Literal["major", "minor", "patch"]: - """ - Find the semantic version string based on the commit log. - Defaults to returning "patch" - """ - sem_ver = "patch" - latest_tag = _find_latest_tag() - log_section = f"{latest_tag}..HEAD" if latest_tag else "" - - cmd = ( - f"git log {log_section} --pretty='%(trailers:key=type,valueonly)'" - " | grep -q {sem_ver_type}" - ) - change_types_found = { - change_type: _shell(cmd.format(sem_ver_type=change_type), check=False).returncode == 0 - for change_type in ["bug", "feature", "api-break"] - } - - if change_types_found["api-break"]: - sem_ver = "major" - elif change_types_found["bug"] or change_types_found["feature"]: - sem_ver = "minor" - - return sem_ver - - -def _update_package_version() -> Tuple[str, str]: - """Apply semantic versioning to package based on git commit messages""" - # Obtain the current version - old_version = _shell_stdout("poetry version | rev | cut -f 1 -d' ' | rev") - if old_version == "0.0.0": - old_version = "" - latest_tag = _find_latest_tag() - - if old_version and version.parse(old_version) != version.parse(latest_tag): - raise RuntimeError( - f'The latest tag "{latest_tag}" and the current version' - f' "{old_version}" do not match.' - ) - - # Find out the sem-ver tag to apply - sem_ver = _find_sem_ver_update() - _shell(f"poetry version {sem_ver}") - - # Get the new version - new_version = _shell_stdout("poetry version | rev | cut -f 1 -d' ' | rev") - - if new_version == old_version: - raise RuntimeError(f'Version update could not be applied (version = "{old_version}")') - - return old_version, new_version - - -def _generate_changelog_and_tag(old_version: str, new_version: str) -> None: - """Generates a change log using git-tidy and tags repo""" - # Tag the version temporarily so that changelog generation - # renders properly - _shell(f'git tag -f -a {new_version} -m "Version {new_version}"') - - # Generate the full changelog and copy it to docs/release_notes.md - _shell("git tidy-log > CHANGELOG.md") - _shell("cp CHANGELOG.md docs/release_notes.md") - - # Generate a requirements.txt for readthedocs.org - _shell("poetry export --with dev --without-hashes -f requirements.txt > docs/requirements.txt") - _shell('echo "." >> docs/requirements.txt') - - # Add all updated files - _shell("git add pyproject.toml CHANGELOG.md docs/release_notes.md docs/requirements.txt") - - # Use [skip ci] to ensure CircleCI doesnt recursively deploy - _shell( - 'git commit --no-verify -m "Release version' - f' {new_version} [skip ci]" -m "Type: trivial"' - ) - - # Create release notes just for this release so that we can use them in - # the commit message - with tempfile.NamedTemporaryFile() as commit_msg_file: - _shell(f'echo "{new_version}\n" > {commit_msg_file.name}') - tidy_log_args = f"^{old_version} HEAD" if old_version else "HEAD" - _shell(f"git tidy-log {tidy_log_args} >> {commit_msg_file.name}") - - # Update the tag so that it includes the latest release messages and - # the automated commit - _shell(f"git tag -d {new_version}") - _shell(f"git tag -f -a {new_version} -F {commit_msg_file.name} --cleanup=whitespace") - - def _publish_to_pypi() -> None: """ Uses poetry to publish to pypi @@ -170,32 +43,15 @@ def _publish_to_pypi() -> None: _shell("poetry publish -vvv -n", stdout=subprocess.PIPE) -def _build_and_push_distribution() -> None: - """ - Builds and pushes distribution to PyPI, along with pushing the - tags back to the repo - """ - _publish_to_pypi() - - # Push the code changes after succcessful pypi deploy - _shell("git push --follow-tags") - - def deploy() -> None: """Deploys the package and uploads documentation.""" # Ensure proper environment - if not os.environ.get(CIRCLECI_ENV_VAR): # pragma: no cover - raise NotOnCircleCIError("Must be on CircleCI to run this script") - - _configure_git() + if not os.environ.get("CIRCLECI"): # pragma: no cover + raise RuntimeError("Must be on CircleCI to run this script") - old_version, new_version = _update_package_version() - - _generate_changelog_and_tag(old_version, new_version) - - _build_and_push_distribution() + _publish_to_pypi() - print(f"Deployment complete. Latest version is {new_version}") + print(f"Deployment complete.") if __name__ == "__main__": diff --git a/docs/contributing.md b/docs/contributing.md index f70978d..e079654 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,75 +1 @@ -# Contributing Guide - -This project was created using footing. For more information about footing, go to the [footing docs](https://github.com/Opus10/footing). - -## Setup - -Set up your development environment with: - - git clone git@github.com:Opus10/django-pgactivity.git - cd django-pgactivity - make docker-setup - -`make docker-setup` will set up a development environment managed by Docker. Install docker [here](https://www.docker.com/get-started) and be sure it is running when executing any of the commands below. - -If you prefer a native development environment, `make conda-setup` will set up a development environment managed by [Conda](https://conda.io). The database must be ran manually. - -## Testing and Validation - -Run the tests on one Python version with: - - make test - -Run the full test suite against all supported Python versions with: - - make full-test-suite - -Validate the code with: - - make lint - -If your code fails the linter checks, fix common errors with: - - make lint-fix - -Run type checking with: - - make type-check - -## Committing - -This project uses [git-tidy](https://github.com/Opus10/git-tidy) to produce structured commits with git trailers. Information from commit messages is used to generate release notes and bump the version properly. - -To do a structured commit with `git-tidy`, do: - - make tidy-commit - -All commits in a pull request must be tidy commits that encapsulate a change. Ideally entire features or bug fixes are encapsulated in a single commit. Squash all of your commits into a tidy commit with: - - make tidy-squash - -To check if your commits pass linting, do: - - make tidy-lint - -Note, the above command lints every commit since branching from main. You can also run `make shell` and run `git tidy` commands inside the docker environment to do other flavors of `git tidy` commands. - -## Documentation - -[Mkdocs Material](https://squidfunk.github.io/mkdocs-material/) documentation can be built with: - - make docs - -A shortcut for serving them is: - - make docs-serve - -## Releases and Versioning - -Anything that is merged into the main branch will be automatically deployed to PyPI. Documentation will be published to a ReadTheDocs at `https://django-pgactivity.readthedocs.io/`. - -The following files will be generated and should *not* be edited by a user: - -- `CHANGELOG.md` - Contains an automatically-generated change log for each release. - -This project uses [Semantic Versioning](http://semver.org) by analyzing `Type:` trailers on git commit messages (trailers are added when using `git tidy-commit`). In order to bump the minor version, use "feature" or "bug" as the type. In order to bump the major version, use "api-break". The patch version will be updated automatically if none of these tags are present. +--8<-- "CONTRIBUTING.md" \ No newline at end of file diff --git a/docs/css/mkdocs-material.css b/docs/css/mkdocs-material.css index 60ace12..22c8f71 100644 --- a/docs/css/mkdocs-material.css +++ b/docs/css/mkdocs-material.css @@ -4,4 +4,21 @@ .md-typeset table:not([class]) { display: table; +} + +:root { + --md-primary-fg-color: #BD4D86; + --md-primary-fg-color--light: #BD4D86; + --md-primary-fg-color--dark: #BD4D86; +} + +.md-footer { + background-color: #BD4D86; +} +.md-footer-meta { + background-color: #973E6B; +} + +readthedocs-flyout { + display: none; } \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 53aea96..0258e93 100644 --- a/docs/index.md +++ b/docs/index.md @@ -62,7 +62,7 @@ def my_operation(): ## Compatibility -`django-pgactivity` is compatible with Python 3.8 - 3.12, Django 3.2 - 5.0, Psycopg 2 - 3, and Postgres 12 - 16. +`django-pgactivity` is compatible with Python 3.8 - 3.12, Django 4.2 - 5.1, Psycopg 2 - 3, and Postgres 12 - 16. ## Next Steps diff --git a/docs/release_notes.md b/docs/release_notes.md index d006f68..92a9713 100644 --- a/docs/release_notes.md +++ b/docs/release_notes.md @@ -1,74 +1,3 @@ -# Changelog +# Release Notes -## 1.4.1 (2024-04-06) - -### Trivial - - - Fix ReadTheDocs builds. [Wesley Kendall, 8b3c49e] - -## 1.4.0 (2023-11-26) - -### Feature - - - Django 5.0 compatibility [Wesley Kendall, 12efd20] - - Support and test against Django 5 with psycopg2 and psycopg3. - -## 1.3.1 (2023-10-09) - -### Trivial - - - Added Opus10 branding to docs [Wesley Kendall, 877178b] - -## 1.3.0 (2023-10-08) - -### Feature - - - Add Python 3.12 support and use Mkdocs for documentation [Wesley Kendall, ec98a78] - - Python 3.12 and Postgres 16 are supported now, along with having revamped docs using Mkdocs and the Material theme. - - Python 3.7 support was dropped. - -## 1.2.0 (2023-06-08) - -### Feature - - - Added Python 3.11, Django 4.2, and Psycopg 3 support [Wesley Kendall, 72af215] - - Adds Python 3.11, Django 4.2, and Psycopg 3 support along with tests for multiple Postgres versions. Drops support for Django 2.2. - -## 1.1.1 (2022-10-25) - -### Trivial - - - Use ``None`` to reset ``pgactivity.timeout``. [Wesley Kendall, fcabcb7] - -## 1.1.0 (2022-10-24) - -### Feature - - - Simplify management command and nest ``pgactivity.timeout``. [Wesley Kendall, b7d359d] - - The ``pgactivity`` command has been turned into a single management command that can list and kill - queries rather than having mulitple subcommands. - - The ``pgactivity.timeout`` context manager can now be nested too. - -## 1.0.0 (2022-10-18) - -### Api-Break - - - Initial release of ``django-pgactivity`` [Wesley Kendall, 593bda7] - - ``django-pgactivity`` makes it easy to view, filter, and kill - Postgres queries. It comes with the following functionality: - - * The ``PGActivity`` proxy model and ``pgactivity`` management command - for querying and filtering the ``pg_stats_activity`` table. - * ``pgactivity.context`` and ``pgactivity.middleware.ActivityMiddleware`` - for annotating queries with application metadata, such as the request URL. - * ``pgactivity.cancel`` and ``pgactivity.terminate`` for cancelling - and terminating queries. The ``PGActivity`` model manager also has - these methods. - * ``pgactivity.timeout`` for dynamically setting the statement timeout. +--8<-- "CHANGELOG.md:2" diff --git a/docs/requirements.txt b/docs/requirements.txt index b9e4ab4..ba2e893 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,10 +1,11 @@ arrow==1.3.0 ; python_version >= "3.8" and python_version < "4" asgiref==3.7.2 ; python_version >= "3.8" and python_version < "4" +astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" babel==2.13.0 ; python_version >= "3.8" and python_version < "4" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" binaryornot==0.4.4 ; python_full_version >= "3.8.0" and python_version < "4" -black==23.9.1 ; python_version >= "3.8" and python_version < "4" -cachetools==5.3.1 ; python_version >= "3.8" and python_version < "4" +black==24.8.0 ; python_version >= "3.8" and python_version < "4" +cachetools==5.5.0 ; python_version >= "3.8" and python_version < "4" certifi==2023.7.22 ; python_version >= "3.8" and python_version < "4" chardet==5.2.0 ; python_version >= "3.8" and python_version < "4" charset-normalizer==3.3.0 ; python_version >= "3.8" and python_version < "4" @@ -13,51 +14,52 @@ colorama==0.4.6 ; python_version >= "3.8" and python_version < "4" cookiecutter==1.7.3 ; python_full_version >= "3.8.0" and python_version < "4" coverage[toml]==7.3.2 ; python_version >= "3.8" and python_version < "4" distlib==0.3.7 ; python_version >= "3.8" and python_version < "4" -dj-database-url==2.1.0 ; python_full_version >= "3.8.0" and python_version < "4" +dj-database-url==2.2.0 ; python_full_version >= "3.8.0" and python_version < "4" django-dynamic-fixture==4.0.1 ; python_full_version >= "3.8.0" and python_version < "4" django-extensions==3.2.1 ; python_full_version >= "3.8.0" and python_version < "4" +django-stubs-ext==5.0.4 ; python_version >= "3.8" and python_version < "4" +django-stubs==5.0.4 ; python_version >= "3.8" and python_version < "4" django==4.2.6 ; python_version >= "3.8" and python_version < "4" -exceptiongroup==1.1.3 ; python_full_version >= "3.8.0" and python_version < "3.11" -filelock==3.12.4 ; python_version >= "3.8" and python_version < "4" +exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.11" +filelock==3.15.4 ; python_version >= "3.8" and python_version < "4" footing==0.1.4 ; python_full_version >= "3.8.0" and python_version < "4" -formaldict==1.0.5 ; python_full_version >= "3.8.0" and python_version < "4" ghp-import==2.1.0 ; python_version >= "3.8" and python_version < "4" -git-tidy==1.2.0 ; python_full_version >= "3.8.0" and python_version < "4" -griffe==0.36.4 ; python_version >= "3.8" and python_version < "4" +griffe==1.2.0 ; python_version >= "3.8" and python_version < "4" idna==3.4 ; python_version >= "3.8" and python_version < "4" importlib-metadata==6.8.0 ; python_version >= "3.8" and python_version < "3.10" -iniconfig==2.0.0 ; python_full_version >= "3.8.0" and python_version < "4" +iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "4" jinja2-time==0.2.0 ; python_full_version >= "3.8.0" and python_version < "4" jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4" -kmatch==0.5.0 ; python_full_version >= "3.8.0" and python_version < "4" markdown==3.5 ; python_version >= "3.8" and python_version < "4" markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4" mergedeep==1.3.4 ; python_version >= "3.8" and python_version < "4" mkdocs-autorefs==0.5.0 ; python_version >= "3.8" and python_version < "4" -mkdocs-material-extensions==1.2 ; python_version >= "3.8" and python_version < "4" -mkdocs-material==9.4.4 ; python_version >= "3.8" and python_version < "4" -mkdocs==1.5.3 ; python_version >= "3.8" and python_version < "4" -mkdocstrings-python==1.7.2 ; python_version >= "3.8" and python_version < "4" -mkdocstrings==0.23.0 ; python_version >= "3.8" and python_version < "4" +mkdocs-get-deps==0.2.0 ; python_version >= "3.8" and python_version < "4" +mkdocs-material-extensions==1.3.1 ; python_version >= "3.8" and python_version < "4" +mkdocs-material==9.5.33 ; python_version >= "3.8" and python_version < "4" +mkdocs==1.6.0 ; python_version >= "3.8" and python_version < "4" +mkdocstrings-python==1.10.8 ; python_version >= "3.8" and python_version < "4" +mkdocstrings==0.25.2 ; python_version >= "3.8" and python_version < "4" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4" -packaging==23.2 ; python_version >= "3.8" and python_version < "4" +nodeenv==1.8.0 ; python_full_version >= "3.8.0" and python_version < "4" +packaging==24.1 ; python_version >= "3.8" and python_version < "4" paginate==0.5.6 ; python_version >= "3.8" and python_version < "4" pathspec==0.11.2 ; python_version >= "3.8" and python_version < "4" -platformdirs==3.11.0 ; python_version >= "3.8" and python_version < "4" -pluggy==1.3.0 ; python_version >= "3.8" and python_version < "4" +platformdirs==4.2.2 ; python_version >= "3.8" and python_version < "4" +pluggy==1.5.0 ; python_version >= "3.8" and python_version < "4" poetry-core==1.7.0 ; python_version >= "3.8" and python_version < "4.0" poyo==0.5.0 ; python_full_version >= "3.8.0" and python_version < "4" -prompt-toolkit==3.0.39 ; python_full_version >= "3.8.0" and python_version < "4" psycopg2-binary==2.9.9 ; python_full_version >= "3.8.0" and python_version < "4" pygments==2.16.1 ; python_version >= "3.8" and python_version < "4" pymdown-extensions==10.3 ; python_version >= "3.8" and python_version < "4" -pyproject-api==1.6.1 ; python_version >= "3.8" and python_version < "4" -pytest-cov==4.1.0 ; python_full_version >= "3.8.0" and python_version < "4" -pytest-django==4.5.2 ; python_full_version >= "3.8.0" and python_version < "4" +pyproject-api==1.7.1 ; python_version >= "3.8" and python_version < "4" +pyright==1.1.377 ; python_full_version >= "3.8.0" and python_version < "4" +pytest-cov==5.0.0 ; python_version >= "3.8" and python_version < "4" +pytest-django==4.8.0 ; python_version >= "3.8" and python_version < "4" pytest-dotenv==0.5.2 ; python_full_version >= "3.8.0" and python_version < "4" -pytest-mock==3.10.0 ; python_full_version >= "3.8.0" and python_version < "4" +pytest-mock==3.14.0 ; python_version >= "3.8" and python_version < "4" pytest-reraise==2.1.2 ; python_full_version >= "3.8.0" and python_version < "4" -pytest==7.4.2 ; python_full_version >= "3.8.0" and python_version < "4" +pytest==8.3.2 ; python_version >= "3.8" and python_version < "4" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4" python-dotenv==1.0.0 ; python_version >= "3.8" and python_version < "4" python-gitlab==3.15.0 ; python_full_version >= "3.8.0" and python_version < "4" @@ -69,20 +71,20 @@ regex==2023.10.3 ; python_version >= "3.8" and python_version < "4" requests-file==1.5.1 ; python_full_version >= "3.8.0" and python_version < "4" requests-toolbelt==1.0.0 ; python_full_version >= "3.8.0" and python_version < "4" requests==2.31.0 ; python_version >= "3.8" and python_version < "4" -ruff==0.0.292 ; python_full_version >= "3.8.0" and python_version < "4" +ruff==0.6.2 ; python_full_version >= "3.8.0" and python_version < "4" setuptools==68.2.2 ; python_version >= "3.8" and python_version < "4" six==1.16.0 ; python_version >= "3.8" and python_version < "4" sqlparse==0.4.4 ; python_version >= "3.8" and python_version < "4" text-unidecode==1.3 ; python_full_version >= "3.8.0" and python_version < "4" tldextract==3.6.0 ; python_full_version >= "3.8.0" and python_version < "4" tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6" -tox==4.11.3 ; python_version >= "3.8" and python_version < "4" +tox==4.18.0 ; python_version >= "3.8" and python_version < "4" types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "4" -typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "4" +types-pyyaml==6.0.12.20240311 ; python_version >= "3.8" and python_version < "4" +typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4" tzdata==2023.3 ; python_version >= "3.8" and python_version < "4" and sys_platform == "win32" urllib3==2.0.6 ; python_version >= "3.8" and python_version < "4" -virtualenv==20.24.5 ; python_version >= "3.8" and python_version < "4" +virtualenv==20.26.3 ; python_version >= "3.8" and python_version < "4" watchdog==3.0.0 ; python_version >= "3.8" and python_version < "4" -wcwidth==0.2.8 ; python_full_version >= "3.8.0" and python_version < "4" +wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" -. diff --git a/docs/static/logo.png b/docs/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9f052b705f802e2c43e557539a414ba4218707be GIT binary patch literal 13655 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 cd~p+A - - - \ No newline at end of file diff --git a/footing.yaml b/footing.yaml index 7c660f5..55fe0d7 100644 --- a/footing.yaml +++ b/footing.yaml @@ -1,7 +1,7 @@ _extensions: - jinja2_time.TimeExtension _template: git@github.com:Opus10/public-django-app-template.git -_version: 80d7f1ffae8953435935d7f1ef7d1e526a4be755 +_version: 2794ea47b0220081dc869d01199ee490dda00762 check_types_in_ci: 'False' is_django: 'True' module_name: pgactivity diff --git a/mkdocs.yml b/mkdocs.yml index b5c3284..377fb0a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,7 +49,8 @@ markdown_extensions: theme: name: material - logo: static/logo.svg + logo: static/logo.png + favicon: static/logo.png features: - navigation.footer - navigation.path @@ -61,13 +62,13 @@ theme: palette: - media: "(prefers-color-scheme: light)" scheme: default - primary: #6658ea + primary: custom toggle: icon: material/brightness-7 name: Switch to dark mode - media: "(prefers-color-scheme: dark)" scheme: slate - primary: #6658ea + primary: custom toggle: icon: material/brightness-4 name: Switch to light mode diff --git a/poetry.lock b/poetry.lock index 121b37d..ef20d30 100644 --- a/poetry.lock +++ b/poetry.lock @@ -112,33 +112,33 @@ chardet = ">=3.0.2" [[package]] name = "black" -version = "24.4.0" +version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, - {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, - {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, - {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, - {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, - {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, - {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, - {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, - {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, - {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, - {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, - {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, - {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, - {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, - {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, - {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, - {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, - {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, - {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, - {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, - {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, - {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -158,13 +158,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -414,18 +414,18 @@ files = [ [[package]] name = "dj-database-url" -version = "2.1.0" +version = "2.2.0" description = "Use Database URLs in your Django Application." optional = false python-versions = "*" files = [ - {file = "dj-database-url-2.1.0.tar.gz", hash = "sha256:f2042cefe1086e539c9da39fad5ad7f61173bf79665e69bf7e4de55fa88b135f"}, - {file = "dj_database_url-2.1.0-py3-none-any.whl", hash = "sha256:04bc34b248d4c21aaa13e4ab419ae6575ef5f10f3df735ce7da97722caa356e0"}, + {file = "dj_database_url-2.2.0-py3-none-any.whl", hash = "sha256:3e792567b0aa9a4884860af05fe2aa4968071ad351e033b6db632f97ac6db9de"}, + {file = "dj_database_url-2.2.0.tar.gz", hash = "sha256:9f9b05058ddf888f1e6f840048b8d705ff9395e3b52a07165daa3d8b9360551b"}, ] [package.dependencies] Django = ">=3.2" -typing-extensions = ">=3.10.0.0" +typing_extensions = ">=3.10.0.0" [[package]] name = "django" @@ -475,35 +475,37 @@ Django = ">=3.2" [[package]] name = "django-stubs" -version = "4.2.7" +version = "5.0.4" description = "Mypy stubs for Django" optional = false python-versions = ">=3.8" files = [ - {file = "django-stubs-4.2.7.tar.gz", hash = "sha256:8ccd2ff4ee5adf22b9e3b7b1a516d2e1c2191e9d94e672c35cc2bc3dd61e0f6b"}, - {file = "django_stubs-4.2.7-py3-none-any.whl", hash = "sha256:4cf4de258fa71adc6f2799e983091b9d46cfc67c6eebc68fe111218c9a62b3b8"}, + {file = "django_stubs-5.0.4-py3-none-any.whl", hash = "sha256:c2502f5ecbae50c68f9a86d52b5b2447d8648fd205036dad0ccb41e19a445927"}, + {file = "django_stubs-5.0.4.tar.gz", hash = "sha256:78e3764488fdfd2695f12502136548ec22f8d4b1780541a835042b8238d11514"}, ] [package.dependencies] +asgiref = "*" django = "*" -django-stubs-ext = ">=4.2.7" +django-stubs-ext = ">=5.0.4" tomli = {version = "*", markers = "python_version < \"3.11\""} -types-pytz = "*" types-PyYAML = "*" -typing-extensions = "*" +typing-extensions = ">=4.11.0" [package.extras] -compatible-mypy = ["mypy (>=1.7.0,<1.8.0)"] +compatible-mypy = ["mypy (>=1.11.0,<1.12.0)"] +oracle = ["oracledb"] +redis = ["redis"] [[package]] name = "django-stubs-ext" -version = "4.2.7" +version = "5.0.4" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" files = [ - {file = "django-stubs-ext-4.2.7.tar.gz", hash = "sha256:519342ac0849cda1559746c9a563f03ff99f636b0ebe7c14b75e816a00dfddc3"}, - {file = "django_stubs_ext-4.2.7-py3-none-any.whl", hash = "sha256:45a5d102417a412e3606e3c358adb4744988a92b7b58ccf3fd64bddd5d04d14c"}, + {file = "django_stubs_ext-5.0.4-py3-none-any.whl", hash = "sha256:910cbaff3d1e8e806a5c27d5ddd4088535aae8371ea921b7fd680fdfa5f14e30"}, + {file = "django_stubs_ext-5.0.4.tar.gz", hash = "sha256:85da065224204774208be29c7d02b4482d5a69218a728465c2fbe41725fdc819"}, ] [package.dependencies] @@ -526,19 +528,19 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.12.4" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, - {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] -typing = ["typing-extensions (>=4.7.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "footing" @@ -559,22 +561,6 @@ pyyaml = ">=3.12" requests = ">=2.13.0" tldextract = ">=3.1.2" -[[package]] -name = "formaldict" -version = "1.0.5" -description = "Formal structured dictionaries parsed from a schema" -optional = false -python-versions = ">=3.7.0,<4" -files = [ - {file = "formaldict-1.0.5-py3-none-any.whl", hash = "sha256:8fdf65620052f34df2808f16c6aaee6e3f866348b1b1a441568d7cf79af94222"}, - {file = "formaldict-1.0.5.tar.gz", hash = "sha256:9cf2d0035275858076b84ff07cafcbdef6af67e71a86dbe90e02264f3ec29cf1"}, -] - -[package.dependencies] -kmatch = ">=0.3.0" -prompt-toolkit = ">=3.0.2" -python-dateutil = ">=2.8.1" - [[package]] name = "ghp-import" version = "2.1.0" @@ -592,35 +578,15 @@ python-dateutil = ">=2.8.1" [package.extras] dev = ["flake8", "markdown", "twine", "wheel"] -[[package]] -name = "git-tidy" -version = "1.2.0" -description = "Tidy git commit messages, linting, and logging" -optional = false -python-versions = ">=3.7.0,<4" -files = [ - {file = "git-tidy-1.2.0.tar.gz", hash = "sha256:14d04a4ee2de0ae4c72b1aeb1128c65fd6be6786618d5a0747ec182364fe657b"}, - {file = "git_tidy-1.2.0-py3-none-any.whl", hash = "sha256:8d88520390963c698babec05e9c121fd2bb8e3f21865096dbe445f082881dd76"}, -] - -[package.dependencies] -click = ">7.0" -formaldict = ">0.2.0" -jinja2 = ">2.10.3" -packaging = ">20.0" -python-dateutil = ">2.8.1" -pyyaml = ">5.1.2" -requests = ">2.22.0" - [[package]] name = "griffe" -version = "0.44.0" +version = "1.2.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.44.0-py3-none-any.whl", hash = "sha256:8a4471c469ba980b87c843f1168850ce39d0c1d0c7be140dca2480f76c8e5446"}, - {file = "griffe-0.44.0.tar.gz", hash = "sha256:34aee1571042f9bf00529bc715de4516fb6f482b164e90d030300601009e0223"}, + {file = "griffe-1.2.0-py3-none-any.whl", hash = "sha256:a8b2fcb1ecdc5a412e646b0b4375eb20a5d2eac3a11dd8c10c56967a4097663c"}, + {file = "griffe-1.2.0.tar.gz", hash = "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31"}, ] [package.dependencies] @@ -700,17 +666,6 @@ files = [ arrow = "*" jinja2 = "*" -[[package]] -name = "kmatch" -version = "0.5.0" -description = "A language for matching/validating/filtering Python dictionaries" -optional = false -python-versions = "*" -files = [ - {file = "kmatch-0.5.0-py3-none-any.whl", hash = "sha256:93045cd2bc359c6d4e7dde114a4e13bd24926192a217c290538b798b027dc719"}, - {file = "kmatch-0.5.0.tar.gz", hash = "sha256:7690d16606c87a77a72691f04728b6935f65b0c819dcf070a7c95946ce2b5ac0"}, -] - [[package]] name = "markdown" version = "3.5" @@ -756,16 +711,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -811,34 +756,34 @@ files = [ [[package]] name = "mkdocs" -version = "1.5.3" +version = "1.6.0" description = "Project documentation with Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, - {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, + {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, + {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" -markdown = ">=3.2.1" +markdown = ">=3.3.6" markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" packaging = ">=20.5" pathspec = ">=0.11.1" -platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" @@ -855,15 +800,32 @@ files = [ Markdown = ">=3.3" mkdocs = ">=1.1" +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + [[package]] name = "mkdocs-material" -version = "9.5.18" +version = "9.5.33" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.18-py3-none-any.whl", hash = "sha256:1e0e27fc9fe239f9064318acf548771a4629d5fd5dfd45444fd80a953fe21eb4"}, - {file = "mkdocs_material-9.5.18.tar.gz", hash = "sha256:a43f470947053fa2405c33995f282d24992c752a50114f23f30da9d8d0c57e62"}, + {file = "mkdocs_material-9.5.33-py3-none-any.whl", hash = "sha256:dbc79cf0fdc6e2c366aa987de8b0c9d4e2bb9f156e7466786ba2fd0f9bf7ffca"}, + {file = "mkdocs_material-9.5.33.tar.gz", hash = "sha256:d23a8b5e3243c9b2f29cdfe83051104a8024b767312dc8fde05ebe91ad55d89d"}, ] [package.dependencies] @@ -871,7 +833,7 @@ babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" -mkdocs = ">=1.5.3,<1.6.0" +mkdocs = ">=1.6,<2.0" mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" @@ -897,13 +859,13 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.24.3" +version = "0.25.2" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.24.3-py3-none-any.whl", hash = "sha256:5c9cf2a32958cd161d5428699b79c8b0988856b0d4a8c5baf8395fc1bf4087c3"}, - {file = "mkdocstrings-0.24.3.tar.gz", hash = "sha256:f327b234eb8d2551a306735436e157d0a22d45f79963c60a8b585d5f7a94c1d2"}, + {file = "mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc"}, + {file = "mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc"}, ] [package.dependencies] @@ -925,18 +887,18 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.9.2" +version = "1.10.8" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings_python-1.9.2-py3-none-any.whl", hash = "sha256:96d82f6424e08db6245e4a15ca95619f4ecd0ddd254c0aa590d4181814e16ee5"}, - {file = "mkdocstrings_python-1.9.2.tar.gz", hash = "sha256:8546a103c9b22e1778c72c887696acc39a6635fedde3c912ce00f967518a8847"}, + {file = "mkdocstrings_python-1.10.8-py3-none-any.whl", hash = "sha256:bb12e76c8b071686617f824029cb1dfe0e9afe89f27fb3ad9a27f95f054dcd89"}, + {file = "mkdocstrings_python-1.10.8.tar.gz", hash = "sha256:5856a59cbebbb8deb133224a540de1ff60bded25e54d8beacc375bb133d39016"}, ] [package.dependencies] -griffe = ">=0.37" -mkdocstrings = ">=0.24.2" +griffe = ">=0.49" +mkdocstrings = ">=0.25" [[package]] name = "mypy-extensions" @@ -965,13 +927,13 @@ setuptools = "*" [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -997,28 +959,29 @@ files = [ [[package]] name = "platformdirs" -version = "3.11.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -1047,20 +1010,6 @@ files = [ {file = "poyo-0.5.0.tar.gz", hash = "sha256:e26956aa780c45f011ca9886f044590e2d8fd8b61db7b1c1cf4e0869f48ed4dd"}, ] -[[package]] -name = "prompt-toolkit" -version = "3.0.39" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "psycopg2-binary" version = "2.9.9" @@ -1094,6 +1043,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -1102,6 +1052,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -1173,32 +1125,32 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyproject-api" -version = "1.6.1" +version = "1.7.1" description = "API to interact with the python pyproject.toml based projects" optional = false python-versions = ">=3.8" files = [ - {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, - {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, + {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"}, + {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"}, ] [package.dependencies] -packaging = ">=23.1" +packaging = ">=24.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] +docs = ["furo (>=2024.5.6)", "sphinx-autodoc-typehints (>=2.2.1)"] +testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=70.1)"] [[package]] name = "pyright" -version = "1.1.358" +version = "1.1.377" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.358-py3-none-any.whl", hash = "sha256:0995b6a95eb11bd26f093cd5dee3d5e7258441b1b94d4a171b5dc5b79a1d4f4e"}, - {file = "pyright-1.1.358.tar.gz", hash = "sha256:185524a8d52f6f14bbd3b290b92ad905f25b964dddc9e7148aad760bd35c9f60"}, + {file = "pyright-1.1.377-py3-none-any.whl", hash = "sha256:af0dd2b6b636c383a6569a083f8c5a8748ae4dcde5df7914b3f3f267e14dd162"}, + {file = "pyright-1.1.377.tar.gz", hash = "sha256:aabc30fedce0ded34baa0c49b24f10e68f4bfc8f68ae7f3d175c4b0f256b4fcf"}, ] [package.dependencies] @@ -1210,13 +1162,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "7.4.2" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -1224,21 +1176,21 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -1246,21 +1198,21 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-django" -version = "4.5.2" +version = "4.8.0" description = "A Django plugin for pytest." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2"}, - {file = "pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e"}, + {file = "pytest-django-4.8.0.tar.gz", hash = "sha256:5d054fe011c56f3b10f978f41a8efb2e5adfc7e680ef36fb571ada1f24779d90"}, + {file = "pytest_django-4.8.0-py3-none-any.whl", hash = "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7"}, ] [package.dependencies] -pytest = ">=5.4.0" +pytest = ">=7.0.0" [package.extras] docs = ["sphinx", "sphinx-rtd-theme"] @@ -1412,6 +1364,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -1609,28 +1562,29 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "ruff" -version = "0.3.7" +version = "0.6.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, - {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, - {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, - {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, - {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, + {file = "ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c"}, + {file = "ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570"}, + {file = "ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56"}, + {file = "ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da"}, + {file = "ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2"}, + {file = "ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9"}, + {file = "ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be"}, ] [[package]] @@ -1717,30 +1671,30 @@ files = [ [[package]] name = "tox" -version = "4.11.3" +version = "4.18.0" description = "tox is a generic virtualenv management and test command line tool" optional = false python-versions = ">=3.8" files = [ - {file = "tox-4.11.3-py3-none-any.whl", hash = "sha256:599af5e5bb0cad0148ac1558a0b66f8fff219ef88363483b8d92a81e4246f28f"}, - {file = "tox-4.11.3.tar.gz", hash = "sha256:5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951"}, + {file = "tox-4.18.0-py3-none-any.whl", hash = "sha256:0a457400cf70615dc0627eb70d293e80cd95d8ce174bb40ac011011f0c03a249"}, + {file = "tox-4.18.0.tar.gz", hash = "sha256:5dfa1cab9f146becd6e351333a82f9e0ade374451630ba65ee54584624c27b58"}, ] [package.dependencies] -cachetools = ">=5.3.1" +cachetools = ">=5.4" chardet = ">=5.2" colorama = ">=0.4.6" -filelock = ">=3.12.3" -packaging = ">=23.1" -platformdirs = ">=3.10" -pluggy = ">=1.3" -pyproject-api = ">=1.6.1" +filelock = ">=3.15.4" +packaging = ">=24.1" +platformdirs = ">=4.2.2" +pluggy = ">=1.5" +pyproject-api = ">=1.7.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} -virtualenv = ">=20.24.3" +virtualenv = ">=20.26.3" [package.extras] -docs = ["furo (>=2023.8.19)", "sphinx (>=7.2.4)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.24)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.1.1)", "devpi-process (>=1)", "diff-cover (>=7.7)", "distlib (>=0.3.7)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.18)", "psutil (>=5.9.5)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-xdist (>=3.3.1)", "re-assert (>=1.1)", "time-machine (>=2.12)", "wheel (>=0.41.2)"] +docs = ["furo (>=2024.7.18)", "sphinx (>=7.4.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.3)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] +testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.3)", "time-machine (>=2.14.2)", "wheel (>=0.43)"] [[package]] name = "types-python-dateutil" @@ -1753,17 +1707,6 @@ files = [ {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, ] -[[package]] -name = "types-pytz" -version = "2024.1.0.20240417" -description = "Typing stubs for pytz" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-pytz-2024.1.0.20240417.tar.gz", hash = "sha256:6810c8a1f68f21fdf0f4f374a432487c77645a0ac0b31de4bf4690cf21ad3981"}, - {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, -] - [[package]] name = "types-pyyaml" version = "6.0.12.20240311" @@ -1777,13 +1720,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -1816,22 +1759,22 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.5" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, - {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] @@ -1873,17 +1816,6 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] -[[package]] -name = "wcwidth" -version = "0.2.8" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, - {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, -] - [[package]] name = "wheel" version = "0.43.0" @@ -1916,4 +1848,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8.0,<4" -content-hash = "6cea7bb3cdbb48cf9761f7a1602386363a012773e658f313fb90ebb048f59d4c" +content-hash = "424487bea433df14640344f94f323852f35f5d841e3c8580a4cf06bf99117e7b" diff --git a/pyproject.toml b/pyproject.toml index e270fc0..aca7874 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,17 +27,10 @@ packages = [ exclude = [ "*/tests/" ] -version = "1.4.1" +version = "1.5.0" description = "Monitor, kill, and analyze Postgres queries." -authors = ["Opus 10 Engineering"] +authors = ["Wes Kendall"] classifiers = [ - "Framework :: Django", - "Framework :: Django :: 3.2", - "Framework :: Django :: 4.0", - "Framework :: Django :: 4.1", - "Framework :: Django :: 4.2", - "Framework :: Django :: 5.0", - "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", @@ -48,7 +41,9 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3 :: Only", "Framework :: Django", - + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", + "Framework :: Django :: 5.1", ] license = "BSD-3-Clause" readme = "README.md" @@ -58,31 +53,30 @@ documentation = "https://django-pgactivity.readthedocs.io" [tool.poetry.dependencies] python = ">=3.8.0,<4" -django = ">=3" +django = ">=4" [tool.poetry.dev-dependencies] -git-tidy = "1.2.0" -pytest = "7.4.2" -pytest-cov = "4.1.0" +pytest = "8.3.2" +pytest-cov = "5.0.0" pytest-dotenv = "0.5.2" -pytest-django = "4.5.2" +pytest-django = "4.8.0" pytest-mock = "3.14.0" pytest-reraise = "2.1.2" django-extensions = "3.2.1" django-dynamic-fixture = "4.0.1" -tox = "4.11.3" -ruff = "0.3.7" -pyright = "1.1.358" -mkdocs = "1.5.3" -black = "24.4.0" -mkdocs-material = "9.5.18" -mkdocstrings-python = "1.9.2" +tox = "4.18.0" +ruff = "0.6.2" +pyright = "1.1.377" +mkdocs = "1.6.0" +black = "24.8.0" +mkdocs-material = "9.5.33" +mkdocstrings-python = "1.10.8" footing = "*" setuptools = "*" poetry-core = "*" -typing-extensions = "4.11.0" -django-stubs = "4.2.7" -dj-database-url = "2.1.0" +typing-extensions = "4.12.2" +django-stubs = "5.0.4" +dj-database-url = "2.2.0" psycopg2-binary = "2.9.9" [tool.pytest.ini_options] diff --git a/tox.ini b/tox.ini index 7e87b15..215b05f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,12 @@ [tox] isolated_build = true envlist = - py{38,39,310,311,312}-django32-psycopg2 py{38,39,310,311,312}-django42-psycopg2 py312-django42-psycopg3 py{310,311,312}-django50-psycopg2 py312-django50-psycopg3 + py{310,311,312}-django51-psycopg2 + py312-django51-psycopg3 report [testenv] @@ -19,9 +20,9 @@ passenv = PYTHONDONTWRITEBYTECODE install_command = pip install {opts} --no-compile {packages} deps = - django32: Django>=3.2,<3.3 django42: Django>=4.2,<4.3 - django50: Django>=5.0rc1,<5.1 + django50: Django>=5.0,<5.1 + django51: Django>=5.1,<5.2 psycopg2: psycopg2-binary psycopg3: psycopg[binary] commands = @@ -33,7 +34,7 @@ commands = allowlist_externals = coverage skip_install = true -depends = py{38,39,310,311,312}-django{32,42}-psycopg2,py312-django42-psycopg3-py{310,311,312}-django50-psycopg2-py312-django50-psycopg3 +depends = py{38,39,310,311,312}-django42-psycopg2, py312-django42-psycopg3, py{310,311,312}-django50-psycopg2, py312-django50-psycopg3, py{310,311,312}-django51-psycopg2, py312-django51-psycopg3 parallel_show_output = true commands = coverage report --fail-under 100