diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c65395e..31f8bc0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,9 +12,10 @@ jobs: name: Tests runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [ubuntu-20.04] - python-version: ['3.8', '3.11'] + python-version: ['3.8', '3.11', '3.12'] toxenv: [quality, docs, pii_check, django42-celery53] steps: diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 27ed665..d530236 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,8 +11,10 @@ Change Log .. There should always be an "Unreleased" section for changes pending release. -Unreleased +[1.1.1] - +~~~~~~~~~~~~~~~~~~~~ +* Added support for python 3.12. [1.1.0] - 2024-03-22 ~~~~~~~~~~~~~~~~~~~~ diff --git a/bulk_grades/__init__.py b/bulk_grades/__init__.py index 91eea5c..cc92b75 100644 --- a/bulk_grades/__init__.py +++ b/bulk_grades/__init__.py @@ -2,6 +2,6 @@ Support for bulk scoring and grading. """ -__version__ = '1.1.0' +__version__ = '1.1.1' default_app_config = 'bulk_grades.apps.BulkGradesConfig' # pylint: disable=invalid-name diff --git a/bulk_grades/views.py b/bulk_grades/views.py index 0165b01..c760d9a 100644 --- a/bulk_grades/views.py +++ b/bulk_grades/views.py @@ -69,7 +69,8 @@ def get(self, request, course_id, *args, **kwargs): filename = self.get_export_filename(course_id) response = StreamingHttpResponse(iterator, content_type='text/csv') - response['Content-Disposition'] = f'attachment; filename="{filename}"' + response_content = 'attachment;' + response['Content-Disposition'] = f'{response_content} filename="{filename}"' log.info('Exporting %s CSV for %s', course_id, self.__class__) return response diff --git a/requirements/base.txt b/requirements/base.txt index 15242e7..25d5b2b 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,7 +6,7 @@ # amqp==5.2.0 # via kombu -asgiref==3.8.0 +asgiref==3.8.1 # via django backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via @@ -34,7 +34,7 @@ click==8.1.7 # click-plugins # click-repl # edx-django-utils -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via celery click-plugins==1.1.1 # via celery @@ -56,18 +56,18 @@ django-crum==0.7.9 # via # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/base.in # edx-celeryutils # super-csv django-waffle==4.1.0 # via edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via super-csv -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via super-csv edx-opaque-keys==2.5.1 # via -r requirements/base.in @@ -75,9 +75,9 @@ idna==3.6 # via requests jsonfield==3.1.0 # via edx-celeryutils -kombu==5.3.5 +kombu==5.3.6 # via celery -newrelic==9.7.1 +newrelic==9.8.0 # via edx-django-utils pbr==6.0.0 # via stevedore @@ -85,7 +85,7 @@ prompt-toolkit==3.0.43 # via click-repl psutil==5.9.8 # via edx-django-utils -pycparser==2.21 +pycparser==2.22 # via cffi pymongo==3.13.0 # via edx-opaque-keys @@ -111,7 +111,7 @@ stevedore==5.2.0 # edx-opaque-keys super-csv==3.1.0 # via -r requirements/base.in -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # asgiref # edx-opaque-keys diff --git a/requirements/celery53.txt b/requirements/celery53.txt index 71b2985..74a9f41 100644 --- a/requirements/celery53.txt +++ b/requirements/celery53.txt @@ -2,8 +2,8 @@ amqp==5.2.0 billiard==4.2.0 celery==5.3.6 click==8.1.7 -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 click-repl==0.3.0 -kombu==5.3.5 +kombu==5.3.6 prompt-toolkit==3.0.43 vine==5.1.0 diff --git a/requirements/ci.txt b/requirements/ci.txt index 5c7fe04..2e918e8 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -14,7 +14,7 @@ coverage==7.4.4 # via -r requirements/ci.in distlib==0.3.8 # via virtualenv -filelock==3.13.1 +filelock==3.13.3 # via # tox # virtualenv @@ -34,7 +34,7 @@ tomli==2.0.1 # via # pyproject-api # tox -tox==4.14.1 +tox==4.14.2 # via -r requirements/ci.in virtualenv==20.25.1 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 84a8006..d2c3808 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,7 +8,7 @@ amqp==5.2.0 # via # -r requirements/quality.txt # kombu -asgiref==3.8.0 +asgiref==3.8.1 # via # -r requirements/quality.txt # django @@ -29,7 +29,7 @@ billiard==4.2.0 # via # -r requirements/quality.txt # celery -build==1.1.1 +build==1.2.1 # via # -r requirements/pip-tools.txt # pip-tools @@ -72,7 +72,7 @@ click==8.1.7 # edx-django-utils # edx-lint # pip-tools -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via # -r requirements/quality.txt # celery @@ -88,7 +88,7 @@ click-repl==0.3.0 # via # -r requirements/quality.txt # celery -code-annotations==1.7.0 +code-annotations==1.8.0 # via # -r requirements/quality.txt # edx-lint @@ -131,7 +131,7 @@ django-crum==0.7.9 # -r requirements/quality.txt # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/quality.txt # edx-celeryutils @@ -140,15 +140,15 @@ django-waffle==4.1.0 # via # -r requirements/quality.txt # edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via # -r requirements/quality.txt # super-csv -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via # -r requirements/quality.txt # super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via # -r requirements/quality.txt # super-csv @@ -162,7 +162,7 @@ exceptiongroup==1.2.0 # via # -r requirements/quality.txt # pytest -filelock==3.13.1 +filelock==3.13.3 # via # -r requirements/ci.txt # tox @@ -193,11 +193,11 @@ jsonfield==3.1.0 # via # -r requirements/quality.txt # edx-celeryutils -kombu==5.3.5 +kombu==5.3.6 # via # -r requirements/quality.txt # celery -lxml==5.1.0 +lxml==5.2.1 # via edx-i18n-tools markupsafe==2.1.5 # via @@ -209,7 +209,7 @@ mccabe==0.7.0 # pylint mock==5.1.0 # via -r requirements/quality.txt -newrelic==9.7.1 +newrelic==9.8.0 # via # -r requirements/quality.txt # edx-django-utils @@ -222,7 +222,7 @@ packaging==24.0 # pyproject-api # pytest # tox -path==16.10.0 +path==16.13.0 # via edx-i18n-tools pbr==6.0.0 # via @@ -256,7 +256,7 @@ psutil==5.9.8 # edx-django-utils pycodestyle==2.11.1 # via -r requirements/quality.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/quality.txt # cffi @@ -306,7 +306,7 @@ pytest==8.1.1 # -r requirements/quality.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/quality.txt pytest-django==4.8.0 # via -r requirements/quality.txt @@ -375,9 +375,9 @@ tomlkit==0.12.4 # via # -r requirements/quality.txt # pylint -tox==4.14.1 +tox==4.14.2 # via -r requirements/ci.txt -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/quality.txt # asgiref diff --git a/requirements/doc.txt b/requirements/doc.txt index 6656cfb..a574a1a 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -12,7 +12,7 @@ amqp==5.2.0 # via # -r requirements/test.txt # kombu -asgiref==3.8.0 +asgiref==3.8.1 # via # -r requirements/test.txt # django @@ -20,6 +20,8 @@ babel==2.14.0 # via # pydata-sphinx-theme # sphinx +backports-tarfile==1.0.0 + # via jaraco-context backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via # -c requirements/constraints.txt @@ -60,7 +62,7 @@ click==8.1.7 # click-repl # code-annotations # edx-django-utils -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via # -r requirements/test.txt # celery @@ -72,7 +74,7 @@ click-repl==0.3.0 # via # -r requirements/test.txt # celery -code-annotations==1.7.0 +code-annotations==1.8.0 # via -r requirements/test.txt coverage[toml]==7.4.4 # via @@ -97,7 +99,7 @@ django-crum==0.7.9 # -r requirements/test.txt # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/test.txt # edx-celeryutils @@ -106,7 +108,7 @@ django-waffle==4.1.0 # via # -r requirements/test.txt # edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via # -r requirements/test.txt # super-csv @@ -119,11 +121,11 @@ docutils==0.19 # readme-renderer # restructuredtext-lint # sphinx -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via # -r requirements/test.txt # super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via # -r requirements/test.txt # super-csv @@ -151,7 +153,11 @@ iniconfig==2.0.0 # via # -r requirements/test.txt # pytest -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 + # via keyring +jaraco-context==5.3.0 + # via keyring +jaraco-functools==4.0.0 # via keyring jinja2==3.1.3 # via @@ -162,9 +168,9 @@ jsonfield==3.1.0 # via # -r requirements/test.txt # edx-celeryutils -keyring==24.3.1 +keyring==25.1.0 # via twine -kombu==5.3.5 +kombu==5.3.6 # via # -r requirements/test.txt # celery @@ -179,12 +185,14 @@ mdurl==0.1.2 mock==5.1.0 # via -r requirements/test.txt more-itertools==10.2.0 - # via jaraco-classes -newrelic==9.7.1 + # via + # jaraco-classes + # jaraco-functools +newrelic==9.8.0 # via # -r requirements/test.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.17 # via readme-renderer packaging==24.0 # via @@ -210,7 +218,7 @@ psutil==5.9.8 # via # -r requirements/test.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi @@ -237,7 +245,7 @@ pytest==8.1.1 # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.txt pytest-django==4.8.0 # via -r requirements/test.txt @@ -332,7 +340,7 @@ tomli==2.0.1 # pytest twine==5.0.0 # via -r requirements/doc.in -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/test.txt # asgiref diff --git a/requirements/pii_check.txt b/requirements/pii_check.txt index 47231d2..3414532 100644 --- a/requirements/pii_check.txt +++ b/requirements/pii_check.txt @@ -8,7 +8,7 @@ amqp==5.2.0 # via # -r requirements/base.txt # kombu -asgiref==3.8.0 +asgiref==3.8.1 # via # -r requirements/base.txt # django @@ -50,7 +50,7 @@ click==8.1.7 # click-repl # code-annotations # edx-django-utils -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via # -r requirements/base.txt # celery @@ -62,7 +62,7 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==1.7.0 +code-annotations==1.8.0 # via -r requirements/pii_check.in django==4.2.11 # via @@ -81,7 +81,7 @@ django-crum==0.7.9 # -r requirements/base.txt # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/base.txt # edx-celeryutils @@ -90,15 +90,15 @@ django-waffle==4.1.0 # via # -r requirements/base.txt # edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via # -r requirements/base.txt # super-csv -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via # -r requirements/base.txt # super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via # -r requirements/base.txt # super-csv @@ -114,13 +114,13 @@ jsonfield==3.1.0 # via # -r requirements/base.txt # edx-celeryutils -kombu==5.3.5 +kombu==5.3.6 # via # -r requirements/base.txt # celery markupsafe==2.1.5 # via jinja2 -newrelic==9.7.1 +newrelic==9.8.0 # via # -r requirements/base.txt # edx-django-utils @@ -136,7 +136,7 @@ psutil==5.9.8 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi @@ -184,7 +184,7 @@ super-csv==3.1.0 # via -r requirements/base.txt text-unidecode==1.3 # via python-slugify -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/base.txt # asgiref diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index aad9d38..748bf44 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -4,7 +4,7 @@ # # make upgrade # -build==1.1.1 +build==1.2.1 # via pip-tools click==8.1.7 # via pip-tools diff --git a/requirements/quality.txt b/requirements/quality.txt index 781afa2..6ba200f 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -8,7 +8,7 @@ amqp==5.2.0 # via # -r requirements/test.txt # kombu -asgiref==3.8.0 +asgiref==3.8.1 # via # -r requirements/test.txt # django @@ -56,7 +56,7 @@ click==8.1.7 # code-annotations # edx-django-utils # edx-lint -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via # -r requirements/test.txt # celery @@ -70,7 +70,7 @@ click-repl==0.3.0 # via # -r requirements/test.txt # celery -code-annotations==1.7.0 +code-annotations==1.8.0 # via # -r requirements/test.txt # edx-lint @@ -99,7 +99,7 @@ django-crum==0.7.9 # -r requirements/test.txt # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/test.txt # edx-celeryutils @@ -108,15 +108,15 @@ django-waffle==4.1.0 # via # -r requirements/test.txt # edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via # -r requirements/test.txt # super-csv -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via # -r requirements/test.txt # super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via # -r requirements/test.txt # super-csv @@ -148,7 +148,7 @@ jsonfield==3.1.0 # via # -r requirements/test.txt # edx-celeryutils -kombu==5.3.5 +kombu==5.3.6 # via # -r requirements/test.txt # celery @@ -160,7 +160,7 @@ mccabe==0.7.0 # via pylint mock==5.1.0 # via -r requirements/test.txt -newrelic==9.7.1 +newrelic==9.8.0 # via # -r requirements/test.txt # edx-django-utils @@ -188,7 +188,7 @@ psutil==5.9.8 # edx-django-utils pycodestyle==2.11.1 # via -r requirements/quality.in -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi @@ -221,7 +221,7 @@ pytest==8.1.1 # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.txt pytest-django==4.8.0 # via -r requirements/test.txt @@ -278,7 +278,7 @@ tomli==2.0.1 # pytest tomlkit==0.12.4 # via pylint -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/test.txt # asgiref diff --git a/requirements/test.txt b/requirements/test.txt index 2fdf714..0919913 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -7,7 +7,7 @@ # via # -r requirements/base.txt # kombu -asgiref==3.8.0 +asgiref==3.8.1 # via # -r requirements/base.txt # django @@ -47,7 +47,7 @@ click==8.1.7 # click-repl # code-annotations # edx-django-utils -click-didyoumean==0.3.0 +click-didyoumean==0.3.1 # via # -r requirements/base.txt # celery @@ -59,7 +59,7 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==1.7.0 +code-annotations==1.8.0 # via -r requirements/test.in coverage[toml]==7.4.4 # via pytest-cov @@ -81,7 +81,7 @@ django-crum==0.7.9 # -r requirements/base.txt # edx-django-utils # super-csv -django-model-utils==4.4.0 +django-model-utils==4.5.0 # via # -r requirements/base.txt # edx-celeryutils @@ -90,15 +90,15 @@ django-waffle==4.1.0 # via # -r requirements/base.txt # edx-django-utils -djangorestframework==3.15.0 +djangorestframework==3.15.1 # via # -r requirements/base.txt # super-csv -edx-celeryutils==1.2.5 +edx-celeryutils==1.3.0 # via # -r requirements/base.txt # super-csv -edx-django-utils==5.11.0 +edx-django-utils==5.12.0 # via # -r requirements/base.txt # super-csv @@ -125,7 +125,7 @@ markupsafe==2.1.5 # via jinja2 mock==5.1.0 # via -r requirements/test.in -newrelic==9.7.1 +newrelic==9.8.0 # via # -r requirements/base.txt # edx-django-utils @@ -145,7 +145,7 @@ psutil==5.9.8 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi @@ -161,7 +161,7 @@ pytest==8.1.1 # via # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.in pytest-django==4.8.0 # via -r requirements/test.in @@ -205,7 +205,7 @@ tomli==2.0.1 # via # coverage # pytest -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/base.txt # asgiref diff --git a/setup.py b/setup.py index d59a74d..9707a1e 100644 --- a/setup.py +++ b/setup.py @@ -90,6 +90,7 @@ def is_requirement(line): 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', ], entry_points={ 'lms.djangoapp': [ diff --git a/tox.ini b/tox.ini index 8dee1d4..f430c9b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{38, 311}-django{42}-celery{53},quality,docs,pii_check +envlist = py{38, 311, 312}-django{42}-celery{53},quality,docs,pii_check [pytest] DJANGO_SETTINGS_MODULE = test_settings @@ -24,6 +24,8 @@ allowlist_externals = make rm deps = + setuptools + wheel -r{toxinidir}/requirements/doc.txt commands = doc8 --ignore-path docs/_build README.rst docs @@ -43,6 +45,8 @@ allowlist_externals = rm touch deps = + setuptools + wheel -r{toxinidir}/requirements/quality.txt commands = touch tests/__init__.py @@ -57,6 +61,7 @@ setenv = DJANGO_SETTINGS_MODULE = test_settings PYTHONPATH = {toxinidir}/mock_apps/ deps = + setuptools -r{toxinidir}/requirements/pii_check.txt commands = code_annotations django_find_annotations --config_file .pii_annotations.yml --lint --report --coverage