From 9ff31a96670d8d63cfd283b71cef2cc4f626b1da Mon Sep 17 00:00:00 2001 From: cnotbohm Date: Wed, 4 Mar 2026 23:38:50 +0000 Subject: [PATCH 1/3] migrate to poetry --- .github/workflows/publish.yml | 32 ++ .github/workflows/python-version-tests.yml | 82 ++++ .github/workflows/tox.yml | 61 --- AUTHORS.md | 12 + AUTHORS.rst | 12 - CHANGELOG.md | 101 ++++ CHANGELOG.rst | 103 ---- MANIFEST.in | 2 +- Makefile | 32 ++ README.md | 129 +++++ README.rst | 149 ------ build.sh | 9 - poetry.lock | 539 +++++++++++++++++++++ pyproject.toml | 38 ++ setup.py | 115 ----- tests/run_tests.py | 74 +++ tox.ini | 47 -- 17 files changed, 1040 insertions(+), 497 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/python-version-tests.yml delete mode 100644 .github/workflows/tox.yml create mode 100644 AUTHORS.md delete mode 100644 AUTHORS.rst create mode 100644 CHANGELOG.md delete mode 100644 CHANGELOG.rst create mode 100644 Makefile create mode 100644 README.md delete mode 100644 README.rst delete mode 100755 build.sh create mode 100644 poetry.lock create mode 100644 pyproject.toml delete mode 100755 setup.py create mode 100644 tests/run_tests.py delete mode 100644 tox.ini diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..84e51d4 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,32 @@ +name: Client Build and Publish + +on: + workflow_dispatch: + +jobs: + pypi-publish: + name: Upload release to PyPI + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/django-richenum + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install Poetry + run: | + make poetry + - name: Install dependencies + run: | + make install-build + - name: Build package + run: | + make build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/python-version-tests.yml b/.github/workflows/python-version-tests.yml new file mode 100644 index 0000000..51d48e2 --- /dev/null +++ b/.github/workflows/python-version-tests.yml @@ -0,0 +1,82 @@ +name: Python Version Tests + +on: + push: + branches: ["master"] + pull_request: + branches: ["master"] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + env: + SECRET_KEY: placeholder + DJANGO_DB_ENGINE: ${{ matrix.db-engine }} + DJANGO_DB_HOST: 127.0.0.1 + DJANGO_DB_USER: travis + DJANGO_DB_PASSWORD: travis + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + django-version: ["3.2", "4.0", "4.1", "4.2"] + db-engine: ["sqlite", "mysql", "postgres"] + exclude: + - python-version: "3.11" + django-version: "3.2" + - python-version: "3.11" + django-version: "4.0" + services: + postgres: + image: postgres:12 + ports: + - 5432:5432 + options: >- + --health-cmd=pg_isready + --health-interval=10s + --health-timeout=5s + --health-retries=5 + env: + POSTGRES_DB: testdb + POSTGRES_USER: travis + POSTGRES_PASSWORD: travis + mysql: + image: mysql:8 + ports: + - 3306:3306 + options: >- + --health-cmd="mysqladmin ping" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + env: + MYSQL_USER: travis + MYSQL_PASSWORD: travis + MYSQL_ALLOW_EMPTY_PASSWORD: true + MYSQL_DATABASE: test_testdb + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + run: | + make poetry + - name: Install dependencies + run: | + make install-dev + - name: Pin Django version + run: | + poetry run pip install "Django==${{ matrix.django-version }}" + - name: Lint with flake8 and pylint + run: | + make lint + - name: Test with custom Django runner + run: | + make test diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml deleted file mode 100644 index d413b50..0000000 --- a/.github/workflows/tox.yml +++ /dev/null @@ -1,61 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a variety of Python versions -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions - -name: Python package - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - test: - runs-on: ubuntu-latest - strategy: - max-parallel: 1 - matrix: - python-version: [3.8, 3.9, '3.10', '3.11'] - services: - postgres: - image: postgres:12 - ports: - - 5432:5432 - options: >- - --health-cmd=pg_isready - --health-interval=10s - --health-timeout=5s - --health-retries=5 - env: - POSTGRES_DB: testdb - POSTGRES_USER: travis - POSTGRES_PASSWORD: travis - mysql: - image: mysql:8 - ports: - - 3306:3306 - options: >- - --health-cmd="mysqladmin ping" - --health-interval=10s - --health-timeout=5s - --health-retries=5 - env: - MYSQL_USER: travis - MYSQL_PASSWORD: travis - MYSQL_ALLOW_EMPTY_PASSWORD: true - MYSQL_DATABASE: test_testdb - - steps: - - uses: actions/checkout@v1 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install tox tox-gh-actions - - name: Test with tox - run: tox - - name: Lint with tox - run: tox -e lint diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..131a461 --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,12 @@ +Developed and maintained by [Hearsay Social, Inc.](https://hearsaysocial.com). + +## Contributors + +- [Adam DePue](https://github.com/adepue) +- [Akshay Shah](https://github.com/akshayjshah) +- [Cordelia Notbohm](https://github.com/cnotbohm) +- [Dale Hui](https://github.com/dhui) +- [Robert MacCloy](https://github.com/rbm) +- [Ben Lopatin](https://github.com/bennylope) +- [Asher Foa](https://github.com/asherf) +- [Krisztian Csizmazia](https://github.com/csizmaziakiki) diff --git a/AUTHORS.rst b/AUTHORS.rst deleted file mode 100644 index 83167db..0000000 --- a/AUTHORS.rst +++ /dev/null @@ -1,12 +0,0 @@ -Developed and maintained by `Hearsay Social, Inc. -`_. - -Contributors -============ -| `Adam DePue `_ -| `Akshay Shah `_ -| `Dale Hui `_ -| `Robert MacCloy `_ -| `Ben Lopatin `_ -| `Asher Foa `_ -| `Krisztian Csizmazia `_ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..44d6c52 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,101 @@ +# Changelog + +## 5.1.0 (2023-3-4) +- Migrate to poetry + +## 4.1.0 (2023-12-12) + +- Support for Django 4.2 +- Support for Python 3.11 +- Remove support for Django 2.2, 3.0, 3.1 +- Remove support for Python 3.7 +- Require MySQL 8 and Postgres 12 + +## 3.7.0 (2019-09-05) + +- Support for Django 2.3 + +## 3.6.0 (2019-07-09) + +- Support for Django 2.2 +- Support for Python 3.7 +- Remove support for Django 2.0 + +## 3.5.0 (2018-09-10) + +- Fix [deprecation of context param for Field.from_db_value](https://code.djangoproject.com/ticket/28370) +- Support for Django 2.1 +- Switch tests suite to use pytest +- Remove pylint-django plugin, no longer needed + +## 3.4.0 (2018-02-10) + +- Drop support for old Django versions + +## 3.3.0 (2018-01-21) + +- removed Python 3.4 +- add support for Python 3.6 +- add support for Django 2.0 +- Properly mark raw strings (used as regex) + +## 3.2.0 (2016-08-22) + +- Python 3.4 & 3.5 support + +## 3.1.0 (2015-08-02) + +- Django 1.10 support + +## 3.0.1 (2015-07-13) + +- Prepare for python 3 support + +## 2.4.1 (2015-05-04) + +- replace mysql client library (for tests) +- stop using lambdas + +## 2.3.0 (2015-05-04) + +- Support Django 1.8 + +## 2.2.0 (2015-03-11) + +- Support ModelForms for non-SQLite DB backends + +## 2.1.0 (2014-11-01) + +- Support migration in Django 1.7 + +## 2.0.0 (2014-09-04) + +- Support Django 1.7, drop support for Python 2.6. + +## 1.2.2 (2014-08-02) + +- Support Django 1.3 + +## 1.2.1 (2014-06-02) + +- Remove uses of BaseException.message. + +## 1.2.0 (2013-12-03) + +- Add enum-aware versions of TypedMultipleChoiceField. + +## 1.1.0 (2013-12-03) + +- Fix form fields to support Django 1.6 (while maintaining compatibility with 1.4 and 1.5). + +## 1.0.2 (2013-11-05) + +- Make EnumField.run_validators a no-op. This stops some warnings from type comparison, and it doesn't seem useful in an EnumField context. + +## 1.0.1 (2013-09-10) + +- Support South. + +## 1.0.0 (2013-08-16) + +- Initial public release. diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 9204313..0000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,103 +0,0 @@ -Changelog -========= - -4.1.0 (2023-12-12) ------------------- - - Support for Django 4.2 - - Support for Python 3.11 - - Remove support for Django 2.2, 3.0, 3.1 - - Remove support for Python 3.7 - - Require MySQL 8 and Postgres 12 - -3.7.0 (2019-09-05) ------------------- - - Support for Django 2.3 - -3.6.0 (2019-07-09) ------------------- - - Support for Django 2.2 - - Support for Python 3.7 - - Remove support for Django 2.0 - -3.5.0 (2018-09-10) ------------------- - - Fix [deprecation of context param for Field.from_db_value](https://code.djangoproject.com/ticket/28370) - - Support for Django 2.1 - - Switch tests suite to use pytest - - Remove pylint-django plugin, no longer needed - -3.4.0 (2018-02-10) ------------------- - - Drop support for old Django versions - - -3.3.0 (2018-01-21) ------------------- - - removed Python 3.4 - - add support for Python 3.6 - - add support for Django 2.0 - - Properly mark raw strings (used as regex) - -3.2.0 (2016-08-22) ------------------- - - Python 3.4 & 3.5 support - -3.1.0 (2015-08-02) ------------------- - - Django 1.10 support - -3.0.1 (2015-07-13) ------------------- - - Prepare for python 3 support - -2.4.1 (2015-05-04) ------------------- - - replace mysql client library (for tests) - - stop using lambdas - -2.3.0 (2015-05-04) ------------------- - - Support Django 1.8 - -2.2.0 (2015-03-11) ------------------- - - Support ModelForms for non-SQLite DB backends - -2.1.0 (2014-11-01) ------------------- - - Support migration in Django 1.7 - -2.0.0 (2014-09-04) ------------------- - - Support Django 1.7, drop support for Python 2.6. - -1.2.2 (2014-08-02) ------------------- - - Support Django 1.3 - -1.2.1 (2014-06-02) ------------------- - - Remove uses of BaseException.message. - -1.2.0 (2013-12-03) ------------------- - - Add enum-aware versions of TypedMultipleChoiceField. - -1.1.0 (2013-12-03) ------------------- - - Fix form fields to support Django 1.6 (while maintaining - compatibility with 1.4 and 1.5). - -1.0.2 (2013-11-05) ------------------- - - Make EnumField.run_validators a no-op. - This stops some warnings from type comparison, and it doesn't seem - useful in an EnumField context. - -1.0.1 (2013-09-10) ------------------- - - Support South. - -1.0.0 (2013-08-16) ------------------- - - Initial public release. diff --git a/MANIFEST.in b/MANIFEST.in index 98c429d..b9c7b4a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1 @@ -include *.rst LICENSE.txt +include *.md LICENSE.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..54f4eef --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +REPO = $(shell git rev-parse --show-toplevel) +POETRY = poetry + +install-build: + ${POETRY} install --only=main + +install-dev: + ${POETRY} install + +poetry: + curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.4 python3 - + poetry cache clear pypi --all + poetry config virtualenvs.in-project true + +quickstart: poetry install-dev + +quickstart-build: poetry install-build + +clean: + # Delete all .pyc and .pyo files. + find ${REPO} \( -name "*~" -o -name "*.py[co]" -o -name ".#*" -o -name "#*#" \) -exec rm -f '{}' + + rm -rf build dist src/django_richenum.egg-info django_richenum.egg-info + +lint: clean + ${POETRY} run flake8 --config=${REPO}/setup.cfg ${REPO}/src/django_richenum/ ${REPO}/tests/ + ${POETRY} run pylint --rcfile=${REPO}/pylint.rc ${REPO}/src/django_richenum/ ${REPO}/tests/ + +test: clean + ${POETRY} run python ${REPO}/tests/run_tests.py + +build: + ${POETRY} build diff --git a/README.md b/README.md new file mode 100644 index 0000000..748e523 --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +# django-richenum + +[![Latest PyPI Version](https://img.shields.io/pypi/v/django-richenum.svg)](https://pypi.python.org/pypi/django-richenum/) +[![Python versions](https://img.shields.io/pypi/pyversions/django-richenum.svg)](https://pypi.org/project/django-richenum/) +[![PyPI Downloads](https://img.shields.io/pypi/dm/django-richenum.svg)](https://pypi.org/project/django-richenum/) + +## About + +A Django extension of richenum for Python. If you're unfamiliar with richenums, please read up on them (see [Related Packages](#related-packages)) before using django-richenum. + +### Model Fields + +`IndexEnumField` +Store ints in DB, but expose OrderedRichEnumValues in Python. + +`CanonicalNameEnumField` +Store varchar in DB, but expose RichEnumValues in Python. +We recommend that you use `IndexEnumField` for storage and query efficiency. + +`LaxIndexEnumField` +Like `IndexEnumField`, but also allows casting to and from canonical names. +Mainly used to help migrate existing code that uses strings as database values. + +### Form Fields + +`CanonicalEnumField` +Uses the RichEnum/OrderedRichEnum `canonical_name` as form field values. + +`IndexEnumField` +Uses the OrderedRichEnum `index` as form field values. + +### Django Admin + +`RichEnumFieldListFilter` +Enables filtering by RichEnum model fields in the Django admin UI. + +## Links + +- [GitHub: django-richenum](https://github.com/hearsaycorp/django-richenum) +- [PyPI: django-richenum](https://pypi.python.org/pypi/django-richenum/) + +## Installation + +```bash +pip install django-richenum +``` + +## Example Usage + +### IndexEnumField + +```python +>>> from richenum import OrderedRichEnum, OrderedRichEnumValue +>>> class MyOrderedRichEnum(OrderedRichEnum): +... FOO = OrderedRichEnumValue(index=1, canonical_name="foo", display_name="Foo") +... BAR = OrderedRichEnumValue(index=2, canonical_name="bar", display_name="Bar") +... +>>> from django.db import models +>>> from django_richenum.models import IndexEnumField +>>> class MyModel(models.Model): +... my_enum = IndexEnumField(MyOrderedRichEnum, default=MyOrderedRichEnum.FOO) +... +>>> m = MyModel.objects.create(my_enum=MyOrderedRichEnum.BAR) +>>> m.save() +>>> m.my_enum +OrderedRichEnumValue - idx: 2 canonical_name: 'bar' display_name: 'Bar' +>>> MyModel.objects.filter(my_enum=MyOrderedRichEnum.BAR) +``` + +### CanonicalNameEnumField + +```python +>>> from richenum import RichEnum, RichEnumValue +>>> class MyRichEnum(RichEnum): +... FOO = RichEnumValue(canonical_name="foo", display_name="Foo") +... BAR = RichEnumValue(canonical_name="bar", display_name="Bar") +... +>>> from django.db import models +>>> from django_richenum.models import CanonicalNameEnumField +>>> class MyModel(models.Model): +... my_enum = CanonicalNameEnumField(MyRichEnum, default=MyRichEnum.FOO) +... +>>> m = MyModel.objects.create(my_enum=MyRichEnum.BAR) +>>> m.save() +>>> m.my_enum +RichEnumValue - canonical_name: 'bar' display_name: 'Bar' +>>> MyModel.objects.filter(my_enum=MyRichEnum.BAR) +``` + +### RichEnumFieldListFilter + +```python +>>> from django_richenum.admin import register_admin_filters +>>> register_admin_filters() +``` + +## Related Packages + +`richenum` +Package implementing RichEnum and OrderedRichEnum that django-richenum depends on. + +- [GitHub: richenum](https://github.com/hearsaycorp/richenum) +- [PyPI: richenum](https://pypi.python.org/pypi/richenum/) + +## Notes + +If you're using Django 1.7+, you'll need to use the `@deconstructible` decorator for your `RichEnumValue` and `OrderedRichEnumValue` classes so Django's migration framework knows how to serialize your `RichEnumValue` and `OrderedRichEnumValue`. + +```python +>>> from django.utils.deconstruct import deconstructible +>>> from richenum import RichEnumValue, OrderedRichEnumValue +>>> @deconstructible +... class CustomRichEnumValue(RichEnumValue): +... pass +... +>>> @deconstructible +... class CustomOrderedRichEnumValue(OrderedRichEnumValue): +... pass +... +``` + +## Contributing + +1. Fork the repo from [GitHub](https://github.com/hearsaycorp/django-richenum). +2. Make your changes. +3. Add unittests for your changes. +4. Run `make lint` and `make test`. +5. Add yourself to `AUTHORS.md` (in alphabetical order). +6. Send a pull request from your fork to the main repo. diff --git a/README.rst b/README.rst deleted file mode 100644 index c3c5515..0000000 --- a/README.rst +++ /dev/null @@ -1,149 +0,0 @@ -.. role:: python(code) - :language: python - -django-richenum -=============== - -.. image:: https://travis-ci.org/hearsaycorp/django-richenum.png?branch=master - :alt: Build Status - :target: https://travis-ci.org/hearsaycorp/django-richenum - -.. image:: https://img.shields.io/pypi/v/django-richenum.svg - :alt: Latest PyPI Version - :target: https://pypi.python.org/pypi/django-richenum/ - -.. image:: https://img.shields.io/pypi/pyversions/django-richenum.svg - :alt: Python versions - :target: https://pypi.org/project/django-richenum/ - -.. image:: https://img.shields.io/pypi/dm/django-richenum.svg - :alt: Pypi Downloads - :target: https://pypi.org/project/django-richenum/ - -About -===== -A Django extension of richenum for Python. If you're unfamiliar with richenums, please read up on them (see `Related Packages`_) before using django-richenum. - -Model Fields ------------- -IndexEnumField - Store ints in DB, but expose OrderedRichEnumValues in Python. -CanonicalNameEnumField - Store varchar in DB, but expose RichEnumValues in Python. - We recommend that you use IndexEnumField for storage and query efficiency. -LaxIndexEnumField - Like IndexEnumField, but also allows casting to and from canonical names. - Mainly used to help migrate existing code that uses strings as database values. - -Form Fields ------------ -CanonicalEnumField - Uses the RichEnum/OrderedRichEnum canonical_name as form field values. -IndexEnumField - Uses the OrderedRichEnum index as form field values. - -Django Admin ------------- -RichEnumFieldListFilter - Enables filtering by RichEnum model fields in the Django admin UI - -Links ------ -| `GitHub: django-richenum `_ -| `PyPi: django-richenum `_ - -Installation -============ -.. code:: bash - - $ pip install django-richenum - -Example Usage -============= - -IndexEnumField --------------- -.. code:: python - - >>> from richenum import OrderedRichEnum, OrderedRichEnumValue - >>> class MyOrderedRichEnum(OrderedRichEnum): - ... FOO = OrderedRichEnumValue(index=1, canonical_name="foo", display_name="Foo") - ... BAR = OrderedRichEnumValue(index=2, canonical_name="bar", display_name="Bar") - ... - >>> from django.db import models - >>> from django_richenum.models import IndexEnumField - >>> class MyModel(models.Model): - ... my_enum = IndexEnumField(MyOrderedRichEnum, default=MyOrderedRichEnum.FOO) - ... - >>> m = MyModel.objects.create(my_enum=MyOrderedRichEnum.BAR) - >>> m.save() - >>> m.my_enum - OrderedRichEnumValue - idx: 2 canonical_name: 'bar' display_name: 'Bar' - >>> MyModel.objects.filter(my_enum=MyOrderedRichEnum.BAR) - - -CanonicalNameEnumField ----------------------- -.. code:: python - - >>> from richenum import RichEnum, RichEnumValue - >>> class MyRichEnum(RichEnum): - ... FOO = RichEnumValue(canonical_name="foo", display_name="Foo") - ... BAR = RichEnumValue(canonical_name="bar", display_name="Bar") - ... - >>> from django.db import models - >>> from django_richenum.models import CanonicalNameEnumField - >>> class MyModel(models.Model): - ... my_enum = CanonicalNameEnumField(MyRichEnum, default=MyRichEnum.FOO) - ... - >>> m = MyModel.objects.create(my_enum=MyRichEnum.BAR) - >>> m.save() - >>> m.my_enum - RichEnumValue - canonical_name: 'bar' display_name: 'Bar' - >>> MyModel.objects.filter(my_enum=MyRichEnum.BAR) - -RichEnumFieldListFilter ------------------------ -.. code:: python - - >>> from django_richenum.admin import register_admin_filters - >>> register_admin_filters() - - -Related Packages -================ - -richenum - Package implementing RichEnum and OrderedRichEnum that django-richenum depends on. - - | `GitHub: richenum `_ - - | `PyPi: richenum `_ - -Notes -===== - -If you're using Django 1.7+, you'll need to use the :python:`@deconstructible` decorator for your :python:`RichEnumValue` and :python:`OrderedRichEnumValue` classes so Django's migration framework knows how to serialize your :python:`RichEnumValue` and :python:`OrderedRichEnumValue`. - -.. code:: python - - >>> from django.utils.deconstruct import deconstructible - >>> from richenum import RichEnumValue, OrderedRichEnumValue - >>> @deconstructible - ... class CustomRichEnumValue(RichEnumValue): - ... pass - ... - >>> @deconstructible - ... class CustomOrderedRichEnumValue(OrderedRichEnumValue): - ... pass - ... - -Contributing -============ - -#. Fork the repo from `GitHub `_. -#. Make your changes. -#. Add unittests for your changes. -#. Run `pep8 `_, `pyflakes `_, and `pylint `_ to make sure your changes follow the Python style guide and doesn't have any errors. -#. Add yourself to the AUTHORS file (in alphabetical order). -#. Send a pull request from your fork to the main repo. diff --git a/build.sh b/build.sh deleted file mode 100755 index f0fb26c..0000000 --- a/build.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env sh - -# Safer to update these separately. -pip install -U "setuptools" -pip install -U "wheel" -pip install -U "pip" - -./setup.py sdist -./setup.py bdist_wheel diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..0383768 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,539 @@ +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.8.1" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "astroid" +version = "3.2.4" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, + {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +description = "Backport of the standard library zoneinfo module" +optional = false +python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] + +[package.extras] +tzdata = ["tzdata"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "dill" +version = "0.4.0" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, + {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "dill" +version = "0.4.1" +description = "serialize all of Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d"}, + {file = "dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "django" +version = "4.2.29" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-4.2.29-py3-none-any.whl", hash = "sha256:074d7c4d2808050e528388bda442bd491f06def4df4fe863f27066851bba010c"}, + {file = "django-4.2.29.tar.gz", hash = "sha256:86d91bc8086569c8d08f9c55888b583a921ac1f95ed3bdc7d5659d4709542014"}, +] + +[package.dependencies] +asgiref = ">=3.6.0,<4" +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mysqlclient" +version = "2.2.7" +description = "Python interface to MySQL" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mysqlclient-2.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:2e3c11f7625029d7276ca506f8960a7fd3c5a0a0122c9e7404e6a8fe961b3d22"}, + {file = "mysqlclient-2.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:a22d99d26baf4af68ebef430e3131bb5a9b722b79a9fcfac6d9bbf8a88800687"}, + {file = "mysqlclient-2.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:4b4c0200890837fc64014cc938ef2273252ab544c1b12a6c1d674c23943f3f2e"}, + {file = "mysqlclient-2.2.7-cp313-cp313-win_amd64.whl", hash = "sha256:201a6faa301011dd07bca6b651fe5aaa546d7c9a5426835a06c3172e1056a3c5"}, + {file = "mysqlclient-2.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:199dab53a224357dd0cb4d78ca0e54018f9cee9bf9ec68d72db50e0a23569076"}, + {file = "mysqlclient-2.2.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92af368ed9c9144737af569c86d3b6c74a012a6f6b792eb868384787b52bb585"}, + {file = "mysqlclient-2.2.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:977e35244fe6ef44124e9a1c2d1554728a7b76695598e4b92b37dc2130503069"}, + {file = "mysqlclient-2.2.7.tar.gz", hash = "sha256:24ae22b59416d5fcce7e99c9d37548350b4565baac82f95e149cac6ce4163845"}, +] + +[[package]] +name = "packaging" +version = "26.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +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.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, +] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pylint" +version = "3.2.7" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b"}, + {file = "pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e"}, +] + +[package.dependencies] +astroid = ">=3.2.4,<=3.3.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, +] +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pytest" +version = "8.3.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-django" +version = "4.11.1" +description = "A Django plugin for pytest." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_django-4.11.1-py3-none-any.whl", hash = "sha256:1b63773f648aa3d8541000c26929c1ea63934be1cfa674c76436966d73fe6a10"}, + {file = "pytest_django-4.11.1.tar.gz", hash = "sha256:a949141a1ee103cb0e7a20f1451d355f83f5e4a5d07bdd4dcfdd1fd0ff227991"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +docs = ["sphinx", "sphinx_rtd_theme"] +testing = ["Django", "django-configurations (>=2.0)"] + +[[package]] +name = "richenum" +version = "2.0.2" +description = "Enum library for python." +optional = false +python-versions = "*" +files = [ + {file = "richenum-2.0.2-py2.py3-none-any.whl", hash = "sha256:60802c5d35713dc6bb767c62bb27bc4df09ac094c5b812e2cf9955041156eccf"}, + {file = "richenum-2.0.2.tar.gz", hash = "sha256:286b83be8779b6eac6c3586d904241321eb2f7b9b5c98a1e91bf42e8b3a28b85"}, +] + +[[package]] +name = "sqlparse" +version = "0.5.5" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, + {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, +] + +[package.extras] +dev = ["build"] +doc = ["sphinx"] + +[[package]] +name = "tomli" +version = "2.4.0" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, +] + +[[package]] +name = "tomlkit" +version = "0.13.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, + {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, +] + +[[package]] +name = "tzdata" +version = "2025.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.8,<4.0" +content-hash = "2d54cdf3913723c555e2c7b5b182cc7f6d18662ecc34f1bc4c5907e400047fcb" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..a058716 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,38 @@ +[tool.poetry] +name = "django-richenum" +version = "5.1.0" +description = "Django Enum library for python." +authors = ["Hearsay Social "] +license = "MIT" +readme = "README.md" +homepage = "https://github.com/hearsaycorp/django-richenum" +repository = "https://github.com/hearsaycorp/django-richenum" +keywords = ["python", "django", "enum", "richenum"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", +] +packages = [{ include = "django_richenum", from = "src" }] +include = ["LICENSE.txt", "AUTHORS.md", "CHANGELOG.md"] + +[tool.poetry.dependencies] +python = ">=3.8,<4.0" +Django = ">=3.2,<4.3" +richenum = "*" + +[tool.poetry.group.dev.dependencies] +pytest = "*" +pytest-django = "*" +flake8 = "*" +pylint = "*" +mysqlclient = "*" +psycopg2-binary = "*" + +[build-system] +requires = ["poetry-core>=1.1.0"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.py b/setup.py deleted file mode 100755 index 5a41a14..0000000 --- a/setup.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -from setuptools import find_packages -from setuptools import setup -from setuptools.command.test import test as TestCommand - -tests_require = ( - 'pytest>=6.2.5,<7.5', - 'pytest-django', -) - - -install_requires = ( - 'Django>=3.2,<4.3', - 'richenum', -) - - -class DjangoTest(TestCommand): - DIRNAME = os.path.dirname(__file__) - APPS = ('tests',) - - def finalize_options(self): - TestCommand.finalize_options(self) - self.test_args = [] - self.test_suite = True - - def run_tests(self): - import django - import pytest - from django.conf import settings - - db_host = os.environ.get('DJANGO_DB_HOST') - db_engine = os.environ.get('DJANGO_DB_ENGINE', 'sqlite') - db_user = os.environ.get('DJANGO_DB_USER') - db_pass = os.environ.get('DJANGO_DB_PASSWORD') - - if db_engine == 'mysql': - db_settings = { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'testdb', - 'USER': db_user or 'root', - 'HOST': db_host, - 'PASSWORD': db_pass - } - elif db_engine == 'postgres': - db_settings = { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'testdb', - 'USER': db_user or 'postgres', - 'HOST': db_host, - 'PASSWORD': db_pass - } - elif db_engine == 'sqlite': - db_settings = { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(self.DIRNAME, 'database.db'), - } - else: - raise ValueError("Unknown DB engine: %s" % db_engine) - - settings.configure( - DEBUG=True, - DATABASES={'default': db_settings}, - SECRET_KEY=os.environ.get('SECRET_KEY'), - CACHES={ - 'default': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache' - } - }, - MIDDLEWARE_CLASSES=['django.middleware.common.CommonMiddleware'], - INSTALLED_APPS=( - # Default Django apps from settings template - # https://github.com/django/django/blob/2.1/django/conf/project_template/project_name/settings.py-tpl - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles') + self.APPS) - - django.setup() - sys.exit(pytest.main(["tests/"])) - - -setup( - name='django-richenum', - version='5.0.0', - description='Django Enum library for python.', - long_description=( - open('README.rst').read() + '\n\n' + - open('CHANGELOG.rst').read() + '\n\n' + - open('AUTHORS.rst').read()), - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: Implementation :: CPython', - ], - keywords='python django enum richenum', - url='https://github.com/hearsaycorp/django-richenum', - author='Hearsay Social', - author_email='opensource@hearsaysocial.com', - license='MIT', - package_dir={'': 'src'}, - packages=find_packages('src'), - install_requires=install_requires, - tests_require=tests_require, - cmdclass={'test': DjangoTest}, -) diff --git a/tests/run_tests.py b/tests/run_tests.py new file mode 100644 index 0000000..4510b61 --- /dev/null +++ b/tests/run_tests.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import os +import sys + + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +SRC_ROOT = os.path.join(REPO_ROOT, "src") + + +def _db_settings(): + db_host = os.environ.get("DJANGO_DB_HOST") + db_engine = os.environ.get("DJANGO_DB_ENGINE", "sqlite") + db_user = os.environ.get("DJANGO_DB_USER") + db_pass = os.environ.get("DJANGO_DB_PASSWORD") + + if db_engine == "mysql": + return { + "ENGINE": "django.db.backends.mysql", + "NAME": "testdb", + "USER": db_user or "root", + "HOST": db_host, + "PASSWORD": db_pass, + } + if db_engine == "postgres": + return { + "ENGINE": "django.db.backends.postgresql_psycopg2", + "NAME": "testdb", + "USER": db_user or "postgres", + "HOST": db_host, + "PASSWORD": db_pass, + } + if db_engine == "sqlite": + return { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(REPO_ROOT, "database.db"), + } + + raise ValueError(f"Unknown DB engine: {db_engine}") + + +def main(): + if REPO_ROOT not in sys.path: + sys.path.insert(0, REPO_ROOT) + if SRC_ROOT not in sys.path: + sys.path.insert(0, SRC_ROOT) + + import django + import pytest + from django.conf import settings + + if not settings.configured: + settings.configure( + DEBUG=True, + DATABASES={"default": _db_settings()}, + SECRET_KEY=os.environ.get("SECRET_KEY", "placeholder"), + CACHES={"default": {"BACKEND": "django.core.cache.backends.dummy.DummyCache"}}, + MIDDLEWARE_CLASSES=["django.middleware.common.CommonMiddleware"], + INSTALLED_APPS=( + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "tests", + ), + ) + + django.setup() + return pytest.main(["tests/"]) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 96d1236..0000000 --- a/tox.ini +++ /dev/null @@ -1,47 +0,0 @@ -[tox] -envlist = {py38,py39,py310}-django{320,400,410,420}-{sqlite,mysql,postgres},lint - -[gh-actions] -python = - 3.8: py38 - 3.9: py39 - 3.10: py310 - 3.11: py311 - -[testenv] -deps = - django320: Django>=3.2,<3.3 - django400: Django>=3.3,<4.1 - django410: Django>=4.1,<4.2 - django420: Django>=4.2,<4.3 - pytest>=6.2.5,<7.5 - pytest-django - mysqlclient - psycopg2 -skip_missing_interpreters=true -setenv = - mysql: DJANGO_DB_HOST = 127.0.0.1 - mysql: DJANGO_DB_ENGINE = mysql - mysql: DJANGO_DB_USER = travis - mysql: DJANGO_DB_PASSWORD = travis - sqlite: DJANGO_DB_ENGINE = sqlite - postgres: DJANGO_DB_HOST = 127.0.0.1 - postgres: DJANGO_DB_ENGINE = postgres - postgres: DJANGO_DB_USER = travis - postgres: DJANGO_DB_PASSWORD = travis - SECRET_KEY = placeholder # required env variable for django>=3.2 - -commands = - python setup.py test - -[testenv:lint] -deps = - flake8 - pytest - pylint - setuptools -commands = - flake8 tests src setup.py - pylint --rcfile=pylint.rc src/django_richenum - pylint --rcfile=pylint.rc tests - pylint --rcfile=pylint.rc setup.py From 8e54b344e76ea8ecb57ff000af52c67be2c86bfc Mon Sep 17 00:00:00 2001 From: cnotbohm Date: Thu, 5 Mar 2026 00:06:58 +0000 Subject: [PATCH 2/3] address commend --- .github/workflows/python-version-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-version-tests.yml b/.github/workflows/python-version-tests.yml index 51d48e2..b485656 100644 --- a/.github/workflows/python-version-tests.yml +++ b/.github/workflows/python-version-tests.yml @@ -73,7 +73,7 @@ jobs: make install-dev - name: Pin Django version run: | - poetry run pip install "Django==${{ matrix.django-version }}" + poetry run pip install "Django==${{ matrix.django-version }}.*" - name: Lint with flake8 and pylint run: | make lint From d86ac8ee078ef995d97658f187bcd4c3ca34d7bb Mon Sep 17 00:00:00 2001 From: cnotbohm Date: Fri, 13 Mar 2026 23:27:19 +0000 Subject: [PATCH 3/3] remove manifest --- MANIFEST.in | 1 - pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index b9c7b4a..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include *.md LICENSE.txt diff --git a/pyproject.toml b/pyproject.toml index a058716..a0caca6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "5.1.0" description = "Django Enum library for python." authors = ["Hearsay Social "] license = "MIT" -readme = "README.md" +readme = ["README.md", "CHANGELOG.md"] homepage = "https://github.com/hearsaycorp/django-richenum" repository = "https://github.com/hearsaycorp/django-richenum" keywords = ["python", "django", "enum", "richenum"]