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..b485656 --- /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 deleted file mode 100644 index 98c429d..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include *.rst 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..a0caca6 --- /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", "CHANGELOG.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