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 ace9865..4c0f4b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,32 @@ # Changelog +## 1.3.4 (2024-08-24) + +#### Changes + + - Updated docs styling and testing dependencies by [@wesleykendall](https://github.com/wesleykendall) in [#18](https://github.com/Opus10/django-strict-fields/pull/18). + ## 1.3.3 (2024-04-23) -### Trivial +#### Trivial - Update with latest Python template. [Wesley Kendall, e3ce25b] ## 1.3.2 (2024-04-18) -### Trivial +#### Trivial - Upgrade with latest Python template. [Wesley Kendall, 5de5e50] ## 1.3.1 (2024-04-06) -### Trivial +#### Trivial - Fix ReadTheDocs builds. [Wesley Kendall, 2769787] ## 1.3.0 (2023-11-26) -### Feature +#### Feature - Django 5.0 compatibility [Wesley Kendall, 313db19] @@ -28,13 +34,13 @@ ## 1.2.1 (2023-10-09) -### Trivial +#### Trivial - Added Opus10 branding to docs [Wesley Kendall, e04bb67] ## 1.2.0 (2023-10-08) -### Feature +#### Feature - Add Python 3.12 support and use Mkdocs for documentation [Wesley Kendall, cd84ed5] @@ -44,7 +50,7 @@ ## 1.1.0 (2023-06-09) -### Feature +#### Feature - Added Python 3.11, Django 4.2, and Psycopg 3 support [Wesley Kendall, b2926d4] @@ -52,43 +58,43 @@ ## 1.0.6 (2022-08-26) -### Trivial +#### Trivial - Test against Django 4.1 and other CI improvements [Wes Kendall, abc5f20] ## 1.0.5 (2022-08-24) -### Trivial +#### Trivial - Fix ReadTheDocs builds [Wes Kendall, 1a965ac] ## 1.0.4 (2022-08-20) -### Trivial +#### Trivial - Updated with latest Django template [Wes Kendall, fda30c9] ## 1.0.3 (2022-08-20) -### Trivial +#### Trivial - Fix release note rendering and code formatting changes [Wes Kendall, 592722b] ## 1.0.2 (2022-07-31) -### Trivial +#### Trivial - Updated with latest Django template, fixing doc builds [Wes Kendall, f429cca] ## 1.0.1 (2021-06-06) -### Trivial +#### Trivial - Updated with latest Django template [Wes Kendall, 859b6d7] ## 1.0.0 (2020-07-01) -### Api-Break +#### Api-Break - Initial release of django-strict-fields [Tómas Árni Jónasson, 46948b6] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ae8dff..ca5335c 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-strict-fields.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 abf1ca6..13ca0f4 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 feaaf93..2c34734 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This library is meant to help enforce stricter rules around using some of the ba ## Compatibility -`django-strict-fields` is compatible with Python 3.8 - 3.12 and Django 3.2 - 5.0. +`django-strict-fields` is compatible with Python 3.8 - 3.12 and Django 4.2 - 5.1. ## Documentation @@ -15,6 +15,7 @@ This library is meant to help enforce stricter rules around using some of the ba Install `django-strict-fields` with: pip3 install django-strict-fields + After this, add `strict_fields` to the `INSTALLED_APPS` setting of your Django project. ## Contributing Guide 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 e115657..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-strict-fields.git - cd django-strict-fields - 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-strict-fields.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 335ced6..49733f1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -162,4 +162,4 @@ This parameter is inspected when Django is launched and the fields are monkey-pa ## Compatibility -`django-strict-fields` is compatible with Python 3.8 - 3.12 and Django 3.2 - 5.0. +`django-strict-fields` is compatible with Python 3.8 - 3.12 and Django 4.2 - 5.1. diff --git a/docs/release_notes.md b/docs/release_notes.md index ace9865..92a9713 100644 --- a/docs/release_notes.md +++ b/docs/release_notes.md @@ -1,95 +1,3 @@ -# Changelog +# Release Notes -## 1.3.3 (2024-04-23) - -### Trivial - - - Update with latest Python template. [Wesley Kendall, e3ce25b] - -## 1.3.2 (2024-04-18) - -### Trivial - - - Upgrade with latest Python template. [Wesley Kendall, 5de5e50] - -## 1.3.1 (2024-04-06) - -### Trivial - - - Fix ReadTheDocs builds. [Wesley Kendall, 2769787] - -## 1.3.0 (2023-11-26) - -### Feature - - - Django 5.0 compatibility [Wesley Kendall, 313db19] - - Support and test against Django 5 with psycopg2 and psycopg3. - -## 1.2.1 (2023-10-09) - -### Trivial - - - Added Opus10 branding to docs [Wesley Kendall, e04bb67] - -## 1.2.0 (2023-10-08) - -### Feature - - - Add Python 3.12 support and use Mkdocs for documentation [Wesley Kendall, cd84ed5] - - 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.1.0 (2023-06-09) - -### Feature - - - Added Python 3.11, Django 4.2, and Psycopg 3 support [Wesley Kendall, b2926d4] - - 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.0.6 (2022-08-26) - -### Trivial - - - Test against Django 4.1 and other CI improvements [Wes Kendall, abc5f20] - -## 1.0.5 (2022-08-24) - -### Trivial - - - Fix ReadTheDocs builds [Wes Kendall, 1a965ac] - -## 1.0.4 (2022-08-20) - -### Trivial - - - Updated with latest Django template [Wes Kendall, fda30c9] - -## 1.0.3 (2022-08-20) - -### Trivial - - - Fix release note rendering and code formatting changes [Wes Kendall, 592722b] - -## 1.0.2 (2022-07-31) - -### Trivial - - - Updated with latest Django template, fixing doc builds [Wes Kendall, f429cca] - -## 1.0.1 (2021-06-06) - -### Trivial - - - Updated with latest Django template [Wes Kendall, 859b6d7] - -## 1.0.0 (2020-07-01) - -### Api-Break - - - Initial release of django-strict-fields [Tómas Árni Jónasson, 46948b6] - - A collection of fields and utilities to help make model fields more strict. +--8<-- "CHANGELOG.md:2" diff --git a/docs/requirements.txt b/docs/requirements.txt index 3e1fa96..cb33340 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,8 +4,8 @@ astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" babel==2.14.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==24.4.0 ; python_version >= "3.8" and python_version < "4" -cachetools==5.3.3 ; 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==2024.2.2 ; python_version >= "3.8" and python_version < "4" chardet==5.2.0 ; python_version >= "3.8" and python_version < "4" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4" @@ -14,53 +14,50 @@ 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.5.0 ; python_version >= "3.8" and python_version < "4" distlib==0.3.8 ; 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-stubs-ext==4.2.7 ; python_version >= "3.8" and python_version < "4" -django-stubs==4.2.7 ; python_version >= "3.8" 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.11 ; python_version >= "3.8" and python_version < "4" exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" -filelock==3.13.4 ; python_version >= "3.8" and python_version < "4" +filelock==3.15.4 ; python_version >= "3.8" and python_version < "4" footing==0.1.6 ; python_full_version >= "3.8.0" and python_version < "4" -formaldict==1.0.6 ; 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.44.0 ; python_version >= "3.8" and python_version < "4" +griffe==1.2.0 ; python_version >= "3.8" and python_version < "4" idna==3.7 ; python_version >= "3.8" and python_version < "4" importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" 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.3 ; python_version >= "3.8" and python_version < "4" -kmatch==0.5.0 ; python_full_version >= "3.8.0" and python_version < "4" markdown==3.6 ; python_version >= "3.8" and python_version < "4" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4" mergedeep==1.3.4 ; python_version >= "3.8" and python_version < "4" mkdocs-autorefs==1.0.1 ; 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.18 ; python_version >= "3.8" and python_version < "4" -mkdocs==1.5.3 ; python_version >= "3.8" and python_version < "4" -mkdocstrings-python==1.9.2 ; python_version >= "3.8" and python_version < "4" -mkdocstrings==0.24.3 ; 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" nodeenv==1.8.0 ; python_full_version >= "3.8.0" and python_version < "4" -packaging==24.0 ; python_version >= "3.8" 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.12.1 ; python_version >= "3.8" and python_version < "4" -platformdirs==4.2.1 ; 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.9.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.43 ; 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.17.2 ; python_version >= "3.8" and python_version < "4" pymdown-extensions==10.8 ; python_version >= "3.8" and python_version < "4" -pyproject-api==1.6.1 ; python_version >= "3.8" and python_version < "4" -pyright==1.1.358 ; python_full_version >= "3.8.0" 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.14.0 ; python_version >= "3.8" and python_version < "4" -pytest==7.4.2 ; python_version >= "3.8" and python_version < "4" +pytest==8.3.2 ; python_version >= "3.8" and python_version < "4" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4" python-gitlab==4.4.0 ; python_full_version >= "3.8.0" and python_version < "4" @@ -72,23 +69,20 @@ regex==2024.4.16 ; python_version >= "3.8" and python_version < "4" requests-file==2.0.0 ; python_version >= "3.8" 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.3.7 ; 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==69.5.1 ; python_version >= "3.8" and python_version < "4" six==1.16.0 ; python_version >= "3.8" and python_version < "4" sqlparse==0.5.0 ; python_version >= "3.8" and python_version < "4" text-unidecode==1.3 ; python_full_version >= "3.8.0" and python_version < "4" tldextract==5.1.2 ; python_version >= "3.8" 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.9.0.20240316 ; python_version >= "3.8" and python_version < "4" -types-pytz==2024.1.0.20240417 ; 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.11.0 ; python_version >= "3.8" and python_version < "4" +typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4" tzdata==2024.1 ; python_version >= "3.8" and python_version < "4" and sys_platform == "win32" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4" -virtualenv==20.26.0 ; python_version >= "3.8" and python_version < "4" +virtualenv==20.26.3 ; python_version >= "3.8" and python_version < "4" watchdog==4.0.0 ; python_version >= "3.8" and python_version < "4" -wcwidth==0.2.13 ; 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.18.1 ; 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 0000000..9f052b7 Binary files /dev/null and b/docs/static/logo.png differ diff --git a/docs/static/logo.svg b/docs/static/logo.svg deleted file mode 100644 index 7ca7d3b..0000000 --- a/docs/static/logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/footing.yaml b/footing.yaml index 695a8cf..ec26860 100644 --- a/footing.yaml +++ b/footing.yaml @@ -1,7 +1,7 @@ _extensions: - jinja2_time.TimeExtension _template: https://github.com/Opus10/python-library-template -_version: 80d7f1ffae8953435935d7f1ef7d1e526a4be755 +_version: 2794ea47b0220081dc869d01199ee490dda00762 check_types_in_ci: 'False' is_django: 'True' module_name: strict_fields diff --git a/mkdocs.yml b/mkdocs.yml index e349387..f0074ef 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 0cfe40a..0cdc118 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.3" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {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" @@ -461,35 +461,37 @@ files = [ [[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] @@ -512,18 +514,18 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.13.4" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {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.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-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.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]] @@ -545,22 +547,6 @@ pyyaml = ">=5.1.2,<=5.3.1" requests = ">=2.13.0" tldextract = ">=3.1.2" -[[package]] -name = "formaldict" -version = "1.0.6" -description = "Formal structured dictionaries parsed from a schema" -optional = false -python-versions = "<4,>=3.8.0" -files = [ - {file = "formaldict-1.0.6-py3-none-any.whl", hash = "sha256:5b7e1556b077613d9e20c3c2a88d178b11cc1613553990d046b79fab575ce047"}, - {file = "formaldict-1.0.6.tar.gz", hash = "sha256:84314949079d55daa8239b435aa01f2880411e86351b4199b2f0d7b0be40f8c5"}, -] - -[package.dependencies] -kmatch = ">=0.3.0" -prompt-toolkit = ">=3.0.2" -python-dateutil = ">=2.8.1" - [[package]] name = "ghp-import" version = "2.1.0" @@ -578,35 +564,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] @@ -686,17 +652,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.6" @@ -797,34 +752,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" @@ -842,15 +797,32 @@ Markdown = ">=3.3" markupsafe = ">=2.0.1" 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] @@ -858,7 +830,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" @@ -884,13 +856,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] @@ -912,18 +884,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" @@ -952,13 +924,13 @@ setuptools = "*" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -984,13 +956,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.1" +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.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -1035,20 +1007,6 @@ files = [ {file = "poyo-0.5.0.tar.gz", hash = "sha256:e26956aa780c45f011ca9886f044590e2d8fd8b61db7b1c1cf4e0869f48ed4dd"}, ] -[[package]] -name = "prompt-toolkit" -version = "3.0.43" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "psycopg2-binary" version = "2.9.9" @@ -1082,6 +1040,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"}, @@ -1090,6 +1049,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"}, @@ -1162,32 +1123,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] @@ -1199,13 +1160,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] @@ -1213,21 +1174,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] @@ -1235,21 +1196,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"] @@ -1551,28 +1512,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]] @@ -1662,30 +1624,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" @@ -1698,17 +1660,6 @@ files = [ {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, ] -[[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" @@ -1722,13 +1673,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]] @@ -1761,13 +1712,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.0" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.0-py3-none-any.whl", hash = "sha256:0846377ea76e818daaa3e00a4365c018bc3ac9760cbb3544de542885aad61fb3"}, - {file = "virtualenv-20.26.0.tar.gz", hash = "sha256:ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -1820,17 +1771,6 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - [[package]] name = "wheel" version = "0.43.0" @@ -1863,4 +1803,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8.0,<4" -content-hash = "e99909f20027cbb2305535048c630c9af070ea7465f24840f1b0e41a94c0b68f" +content-hash = "2d2de800478706245ed5b00c92fdacc333715a061423446cc8cef05a04148d6a" diff --git a/pyproject.toml b/pyproject.toml index 5507ab2..d310c30 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,17 +27,10 @@ packages = [ exclude = [ "*/tests/" ] -version = "1.3.3" +version = "1.3.4" description = "A collection of fields and utilities to help make model fields more strict." authors = ["Tomas Arni Jonasson"] 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,30 +53,29 @@ documentation = "https://django-strict-fields.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" 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 = "*" -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" -typing-extensions = "4.11.0" -django-stubs = "4.2.7" [tool.pytest.ini_options] xfail_strict = true 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