diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 1e96262..ef849b0 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -1,30 +1,21 @@ name: Quality -on: - push: - pull_request: - schedule: - - cron: '0 0 * * 0' # weekly +on: push jobs: build: + name: quality runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: - python-version: 3.9 - - name: Cache pip - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }} + python-version: 3.12 - name: Install dependencies run: | python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade black flake8 - name: Run checks - run: | - make quality + run: make quality diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 44aa8b0..f903149 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,10 +1,6 @@ name: Tests -on: - push: - pull_request: - schedule: - - cron: '0 0 * * 0' # weekly +on: push jobs: build: @@ -30,25 +26,21 @@ jobs: strategy: matrix: python-version: - - 3.6 - - 3.7 - - 3.8 - - 3.9 + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" django: - - django22 - - django31 - django32 + - django41 + - django42 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - - name: Cache pip - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }} - name: Install dependencies run: | python -m pip install --upgrade pip setuptools wheel diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2426224..0000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -sudo: false -language: python - -services: - - postgresql - -addons: - postgresql: "9.6" - -install: - - travis_retry pip install tox tox-travis - -script: - - tox - -matrix: - fast_finish: true - include: - # https://docs.djangoproject.com/en/dev/faq/install/#what-python-version-can-i-use-with-django - - {env: DJANGO=2.2, python: '3.6'} - - {env: DJANGO=2.2, python: '3.7'} - - {env: DJANGO=2.2, python: '3.8'} - - {env: DJANGO=2.2, python: '3.9'} - - {env: DJANGO=2.2, python: 'nightly'} - - - {env: DJANGO=3.1, python: '3.6'} - - {env: DJANGO=3.1, python: '3.7'} - - {env: DJANGO=3.1, python: '3.8'} - - {env: DJANGO=3.1, python: '3.9'} - - {env: DJANGO=3.1, python: 'nightly'} - - - {env: DJANGO=3.2, python: '3.6'} - - {env: DJANGO=3.2, python: '3.7'} - - {env: DJANGO=3.2, python: '3.8'} - - {env: DJANGO=3.2, python: '3.9'} - - {env: DJANGO=3.2, python: 'nightly'} - - - {env: DJANGO=master, python: '3.6'} - - {env: DJANGO=master, python: '3.7'} - - {env: DJANGO=master, python: '3.8'} - - {env: DJANGO=master, python: '3.9'} - - {env: DJANGO=master, python: 'nightly'} - - - {python: '3.9', env: TOXENV=docstring} - - {python: '3.9', env: TOXENV=quality} - - allow_failures: - - python: 'nightly' - - env: DJANGO=master diff --git a/CHANGES.rst b/CHANGES.rst index d705efe..74e49d8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,11 @@ 1.4.2 (unreleased) ------------------ -- Nothing changed yet. +- Add support for Django 4.1 & 4.2 +- Add support for Python 3.10 & 3.11 & 3.12 +- Drop support for Python 3.6 & 3.7 +- Drop support for Django 3.1 +- Drop support for Django 2.2 1.4.1 (2021-06-24) diff --git a/Makefile b/Makefile index f585e88..3057f4d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ .PHONY: update quality tests clean update: - pip install -r requirements/dev.txt + pip install -r requirements/tests.txt + pip install -r requirements/quality.txt quality: black --check --diff metaset tests diff --git a/metaset/__init__.py b/metaset/__init__.py index ff21401..7f21fd0 100644 --- a/metaset/__init__.py +++ b/metaset/__init__.py @@ -1,9 +1,9 @@ from copy import deepcopy from itertools import chain, groupby -from pkg_resources import get_distribution +from importlib.metadata import version -__version__ = get_distribution("metaset").version +__version__ = version("metaset") class MetaSet(dict): diff --git a/metaset/django_field.py b/metaset/django_field.py index 769724d..f45d7c0 100644 --- a/metaset/django_field.py +++ b/metaset/django_field.py @@ -2,15 +2,8 @@ try: from django.utils.translation import gettext_lazy - - try: - # Django >= 3.1 - from django.db import JSONField - from django.forms import JSONField as JSONFormField - except ImportError: - # For Django < 3.1 - from django.contrib.postgres.fields import JSONField - from django.contrib.postgres.forms import JSONField as JSONFormField + from django.db.models import JSONField + from django.forms import JSONField as JSONFormField # avoid import failures for non Django builds. except ImportError: JSONField = object diff --git a/setup.py b/setup.py index 4503074..49ceb51 100644 --- a/setup.py +++ b/setup.py @@ -30,10 +30,11 @@ def read(filename): "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ], include_package_data=True, ) diff --git a/tests/test_django.py b/tests/test_django.py index 9b29929..b278131 100644 --- a/tests/test_django.py +++ b/tests/test_django.py @@ -2,8 +2,6 @@ from django.test import TestCase -import pytest - from metaset import MetaSet from .django_test_app import forms as test_forms @@ -17,26 +15,25 @@ def refresh_from_db(obj): class DjangoTest(TestCase): def test_save_load(self): - obj = test_models.TestModel.objects.create(value={"a": {1}, "b": {2, 3}}) + obj = test_models.TestModel.objects.create( + value={"a": {1}, "b": {2, 3}}, + ) obj.full_clean() obj = refresh_from_db(obj) - assert type(obj.value) == MetaSet, type(obj.value) + assert isinstance(obj.value, MetaSet), type(obj.value) assert obj.value == MetaSet({"a": {1}, "b": {2, 3}}), obj.value def test_model_form(self): - obj = test_models.TestModel.objects.create(value={"a": {1}, "b": {2, 3}}) + obj = test_models.TestModel.objects.create( + value={"a": {1}, "b": {2, 3}}, + ) form = test_forms.TestModelForm(instance=obj) assert json.loads(form["value"].value()) == {"a": [1], "b": [2, 3]} def test_query(self): - try: - from django.contrib.postgres.fields import JSONField # noqa: F401 - except ImportError: - pytest.skip( - "JSON queries are only available " "for native Django (>=1.9) JSONField" - ) - - obj = test_models.TestModel.objects.create(value={"a": {1}, "b": {2, 3}}) + obj = test_models.TestModel.objects.create( + value={"a": {1}, "b": {2, 3}}, + ) res = test_models.TestModel.objects.filter(value__b__contains=[2]) assert obj == res.first(), res res = test_models.TestModel.objects.filter(value__has_key="a") @@ -47,5 +44,8 @@ def test_inception(self): value={"a": {"b": {1}, "c": {2, 3}}, "d": {"e": {4}}} ) obj = refresh_from_db(obj) - assert obj.value == MetaSet(a=MetaSet(b={1}, c={2, 3}), d=MetaSet(e={4})) - assert type(obj.value["a"]) == MetaSet, type(obj.value["a"]) + assert obj.value == MetaSet( + a=MetaSet(b={1}, c={2, 3}), + d=MetaSet(e={4}), + ) + assert isinstance(obj.value["a"], MetaSet), type(obj.value["a"]) diff --git a/tox.ini b/tox.ini index ee6c428..2af8fc3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,6 @@ [tox] envlist = - py{36,37}-django{22,31,32} - py{38,39,nightly}-django{22,31,32,main} + py{38,39,310,311,312,nightly}-django{32,41,42,main} quality docstring @@ -9,9 +8,9 @@ envlist = commands = pytest --doctest-glob=README.rst --doctest-modules {posargs} deps = -rrequirements/tests.txt - django22: Django==2.2.* - django31: Django==3.1.* django32: Django==3.2.* + django41: Django==4.1.* + django42: Django==4.2.* djangomain: https://github.com/django/django/archive/refs/heads/main.zip passenv = PYTEST_ADDOPTS @@ -21,7 +20,7 @@ passenv = DB_PASSWORD [testenv:quality] -basepython = python3.9 +basepython = python3.12 commands = /usr/bin/make quality deps = -rrequirements/quality.txt