diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ef3acff..e87b356b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,10 @@ jobs: strategy: matrix: os: [ubuntu-20.04] - python-version: ['3.8'] - toxenv: [quality, django32, django42] + python-version: + - '3.8' + - '3.11' + toxenv: [quality, django42] steps: - uses: actions/checkout@v2 diff --git a/Makefile b/Makefile index 791cc900..ad663de3 100644 --- a/Makefile +++ b/Makefile @@ -30,11 +30,8 @@ $(COMMON_CONSTRAINTS_TXT): upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade upgrade: piptools $(COMMON_CONSTRAINTS_TXT)## update the requirements/*.txt files with the latest packages satisfying requirements/*.in - - sed 's/Django<2.3//g' requirements/common_constraints.txt > requirements/common_constraints.tmp - mv requirements/common_constraints.tmp requirements/common_constraints.txt - - pip-compile --rebuild --allow-unsafe -o requirements/pip.txt requirements/pip.in + pip install -qr requirements/pip_tools.txt + pip-compile --allow-unsafe --upgrade --rebuild -o requirements/pip.txt requirements/pip.in pip-compile --upgrade -o requirements/pip_tools.txt requirements/pip_tools.in pip install -qr requirements/pip.txt pip install -qr requirements/pip_tools.txt diff --git a/i18n/__init__.py b/i18n/__init__.py index 5673a336..65914f0b 100644 --- a/i18n/__init__.py +++ b/i18n/__init__.py @@ -6,7 +6,7 @@ from . import config -__version__ = '1.3.0' +__version__ = '1.4.0' class Runner: diff --git a/requirements/base.txt b/requirements/base.txt index 3944a101..21b3d58a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,22 +4,27 @@ # # make upgrade # -asgiref==3.6.0 +asgiref==3.8.1 # via django -django==3.2.17 +backports-zoneinfo==0.2.1 ; python_version < "3.9" + # via + # -c requirements/constraints.txt + # django +django==4.2.11 # via # -c requirements/common_constraints.txt # -r requirements/base.in lxml==4.9.3 # via + # -c requirements/constraints.txt # -r requirements/base.in -path==16.6.0 +path==16.10.0 # via -r requirements/base.in -polib==1.1.1 +polib==1.2.0 # via -r requirements/base.in -pytz==2022.7.1 - # via django -pyyaml==6.0 +pyyaml==6.0.1 # via -r requirements/base.in -sqlparse==0.4.3 +sqlparse==0.4.4 # via django +typing-extensions==4.10.0 + # via asgiref diff --git a/requirements/ci.txt b/requirements/ci.txt index 0c897c7a..ffc07bfb 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -4,20 +4,29 @@ # # make upgrade # -asgiref==3.6.0 +asgiref==3.8.1 # via # -r requirements/test.txt # django -astroid==2.14.1 +astroid==3.1.0 # via # -r requirements/test.txt # pylint # pylint-celery -attrs==22.2.0 +backports-zoneinfo==0.2.1 ; python_version < "3.9" # via + # -c requirements/constraints.txt # -r requirements/test.txt - # pytest -click==8.1.3 + # django +cachetools==5.3.3 + # via + # -r requirements/tox.txt + # tox +chardet==5.2.0 + # via + # -r requirements/tox.txt + # tox +click==8.1.7 # via # -r requirements/test.txt # click-log @@ -27,36 +36,40 @@ click-log==0.4.0 # via # -r requirements/test.txt # edx-lint -code-annotations==1.3.0 +code-annotations==1.7.0 # via # -r requirements/test.txt # edx-lint -coverage[toml]==7.1.0 +colorama==0.4.6 + # via + # -r requirements/tox.txt + # tox +coverage[toml]==7.4.4 # via # -r requirements/ci.in # -r requirements/test.txt # pytest-cov -ddt==1.6.0 +ddt==1.7.2 # via -r requirements/test.txt -dill==0.3.6 +dill==0.3.8 # via # -r requirements/test.txt # pylint -distlib==0.3.6 +distlib==0.3.8 # via # -r requirements/tox.txt # virtualenv -django==3.2.17 +django==4.2.11 # via # -c requirements/common_constraints.txt # -r requirements/test.txt -edx-lint==5.3.0 +edx-lint==5.3.6 # via -r requirements/test.txt -exceptiongroup==1.1.0 +exceptiongroup==1.2.0 # via # -r requirements/test.txt # pytest -filelock==3.9.0 +filelock==3.13.3 # via # -r requirements/tox.txt # tox @@ -65,19 +78,19 @@ iniconfig==2.0.0 # via # -r requirements/test.txt # pytest -isort==5.12.0 +isort==5.13.2 # via # -r requirements/test.txt # pylint -jinja2==3.1.2 +jinja2==3.1.3 # via # -r requirements/test.txt # code-annotations -lazy-object-proxy==1.9.0 +lxml==4.9.3 # via + # -c requirements/constraints.txt # -r requirements/test.txt - # astroid -markupsafe==2.1.2 +markupsafe==2.1.5 # via # -r requirements/test.txt # jinja2 @@ -89,39 +102,37 @@ mock==3.0.5 # via # -c requirements/constraints.txt # -r requirements/test.txt -packaging==23.0 +packaging==24.0 # via # -r requirements/test.txt # -r requirements/tox.txt + # pyproject-api # pytest # tox -path==16.6.0 +path==16.10.0 # via -r requirements/test.txt -pbr==5.11.1 +pbr==6.0.0 # via # -r requirements/test.txt # stevedore -platformdirs==3.0.0 +platformdirs==4.2.0 # via # -r requirements/test.txt # -r requirements/tox.txt # pylint + # tox # virtualenv -pluggy==1.0.0 +pluggy==1.4.0 # via # -r requirements/test.txt # -r requirements/tox.txt # pytest # tox -polib==1.1.1 +polib==1.2.0 # via -r requirements/test.txt -py==1.11.0 - # via - # -r requirements/tox.txt - # tox -pycodestyle==2.10.0 +pycodestyle==2.11.1 # via -r requirements/test.txt -pylint==2.16.1 +pylint==3.1.0 # via # -r requirements/test.txt # edx-lint @@ -132,45 +143,45 @@ pylint-celery==0.3 # via # -r requirements/test.txt # edx-lint -pylint-django==2.5.3 +pylint-django==2.5.5 # via # -r requirements/test.txt # edx-lint -pylint-plugin-utils==0.7 +pylint-plugin-utils==0.8.2 # via # -r requirements/test.txt # pylint-celery # pylint-django -pytest==7.2.1 +pyproject-api==1.6.1 + # via + # -r requirements/tox.txt + # tox +pytest==8.1.1 # via # -r requirements/test.txt # pytest-cov -pytest-cov==4.0.0 +pytest-cov==5.0.0 # via -r requirements/test.txt -python-slugify==8.0.0 +python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations -pytz==2022.7.1 - # via - # -r requirements/test.txt - # django -pyyaml==6.0 +pytz==2024.1 + # via -r requirements/test.txt +pyyaml==6.0.1 # via # -r requirements/test.txt # code-annotations six==1.16.0 # via # -r requirements/test.txt - # -r requirements/tox.txt # edx-lint # mock - # tox -sqlparse==0.4.3 +sqlparse==0.4.4 # via # -r requirements/test.txt # django -stevedore==4.1.1 +stevedore==5.2.0 # via # -r requirements/test.txt # code-annotations @@ -184,26 +195,22 @@ tomli==2.0.1 # -r requirements/tox.txt # coverage # pylint + # pyproject-api # pytest # tox -tomlkit==0.11.6 +tomlkit==0.12.4 # via # -r requirements/test.txt # pylint -tox==3.28.0 - # via - # -c requirements/common_constraints.txt - # -r requirements/tox.txt -typing-extensions==4.4.0 +tox==4.14.2 + # via -r requirements/tox.txt +typing-extensions==4.10.0 # via # -r requirements/test.txt + # asgiref # astroid # pylint -virtualenv==20.19.0 +virtualenv==20.25.1 # via # -r requirements/tox.txt # tox -wrapt==1.14.1 - # via - # -r requirements/test.txt - # astroid diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index d34ab34d..2461c264 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -3,6 +3,11 @@ # See BOM-2721 for more details. # Below is the copied and edited version of common_constraints +# This is a temporary solution to override the real common_constraints.txt +# In edx-lint, until the pyjwt constraint in edx-lint has been removed. +# See BOM-2721 for more details. +# Below is the copied and edited version of common_constraints + # A central location for most common version constraints # (across edx repos) for pip-installation. # @@ -18,15 +23,19 @@ # using LTS django version -Django<4.0 +Django<5.0 # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html elasticsearch<7.14.0 # django-simple-history>3.0.0 adds indexing and causes a lot of migrations to be affected -django-simple-history==3.0.0 -# tox>4.0.0 isn't yet compatible with many tox plugins, causing CI failures in almost all repos. -# Details can be found in this discussion: https://github.com/tox-dev/tox/discussions/1810 -tox<4.0.0 +# opentelemetry requires version 6.x at the moment: +# https://github.com/open-telemetry/opentelemetry-python/issues/3570 +# Normally this could be added as a constraint in edx-django-utils, where we're +# adding the opentelemetry dependency. However, when we compile pip-tools.txt, +# that uses version 7.x, and then there's no undoing that when compiling base.txt. +# So we need to pin it globally, for now. +# Ticket for unpinning: https://github.com/openedx/edx-lint/issues/407 +importlib-metadata<7 diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 89858c42..131b4e12 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -13,3 +13,9 @@ # mock version 4.0.0 drops support for python 3.5 mock<4.0.0 + +# temporary constraint +backports.zoneinfo;python_version<"3.9" + +# greater version has issues. +lxml==4.9.3 \ No newline at end of file diff --git a/requirements/dev.txt b/requirements/dev.txt index ec98b24c..b3048900 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,24 +4,33 @@ # # make upgrade # -asgiref==3.6.0 +asgiref==3.8.1 # via # -r requirements/ci.txt # django -astroid==2.14.1 +astroid==3.1.0 # via # -r requirements/ci.txt # pylint # pylint-celery -attrs==22.2.0 +backports-zoneinfo==0.2.1 ; python_version < "3.9" # via + # -c requirements/constraints.txt # -r requirements/ci.txt - # pytest -build==0.10.0 + # django +build==1.2.1 # via # -r requirements/pip_tools.txt # pip-tools -click==8.1.3 +cachetools==5.3.3 + # via + # -r requirements/ci.txt + # tox +chardet==5.2.0 + # via + # -r requirements/ci.txt + # tox +click==8.1.7 # via # -r requirements/ci.txt # -r requirements/pip_tools.txt @@ -33,56 +42,65 @@ click-log==0.4.0 # via # -r requirements/ci.txt # edx-lint -code-annotations==1.3.0 +code-annotations==1.7.0 # via # -r requirements/ci.txt # edx-lint -coverage[toml]==7.1.0 +colorama==0.4.6 + # via + # -r requirements/ci.txt + # tox +coverage[toml]==7.4.4 # via # -r requirements/ci.txt # pytest-cov -ddt==1.6.0 +ddt==1.7.2 # via -r requirements/ci.txt -dill==0.3.6 +dill==0.3.8 # via # -r requirements/ci.txt # pylint -distlib==0.3.6 +distlib==0.3.8 # via # -r requirements/ci.txt # virtualenv -django==3.2.17 +django==4.2.11 # via # -c requirements/common_constraints.txt # -r requirements/ci.txt -edx-lint==5.3.0 +edx-lint==5.3.6 # via -r requirements/ci.txt -exceptiongroup==1.1.0 +exceptiongroup==1.2.0 # via # -r requirements/ci.txt # pytest -filelock==3.9.0 +filelock==3.13.3 # via # -r requirements/ci.txt # tox # virtualenv +importlib-metadata==6.11.0 + # via + # -c requirements/common_constraints.txt + # -r requirements/pip_tools.txt + # build iniconfig==2.0.0 # via # -r requirements/ci.txt # pytest -isort==5.12.0 +isort==5.13.2 # via # -r requirements/ci.txt # pylint -jinja2==3.1.2 +jinja2==3.1.3 # via # -r requirements/ci.txt # code-annotations -lazy-object-proxy==1.9.0 +lxml==4.9.3 # via + # -c requirements/constraints.txt # -r requirements/ci.txt - # astroid -markupsafe==2.1.2 +markupsafe==2.1.5 # via # -r requirements/ci.txt # jinja2 @@ -94,40 +112,38 @@ mock==3.0.5 # via # -c requirements/constraints.txt # -r requirements/ci.txt -packaging==23.0 +packaging==24.0 # via # -r requirements/ci.txt # -r requirements/pip_tools.txt # build + # pyproject-api # pytest # tox -path==16.6.0 +path==16.10.0 # via -r requirements/ci.txt -pbr==5.11.1 +pbr==6.0.0 # via # -r requirements/ci.txt # stevedore -pip-tools==6.12.2 +pip-tools==7.4.1 # via -r requirements/pip_tools.txt -platformdirs==3.0.0 +platformdirs==4.2.0 # via # -r requirements/ci.txt # pylint + # tox # virtualenv -pluggy==1.0.0 +pluggy==1.4.0 # via # -r requirements/ci.txt # pytest # tox -polib==1.1.1 +polib==1.2.0 # via -r requirements/ci.txt -py==1.11.0 - # via - # -r requirements/ci.txt - # tox -pycodestyle==2.10.0 +pycodestyle==2.11.1 # via -r requirements/ci.txt -pylint==2.16.1 +pylint==3.1.0 # via # -r requirements/ci.txt # edx-lint @@ -138,34 +154,37 @@ pylint-celery==0.3 # via # -r requirements/ci.txt # edx-lint -pylint-django==2.5.3 +pylint-django==2.5.5 # via # -r requirements/ci.txt # edx-lint -pylint-plugin-utils==0.7 +pylint-plugin-utils==0.8.2 # via # -r requirements/ci.txt # pylint-celery # pylint-django +pyproject-api==1.6.1 + # via + # -r requirements/ci.txt + # tox pyproject-hooks==1.0.0 # via # -r requirements/pip_tools.txt # build -pytest==7.2.1 + # pip-tools +pytest==8.1.1 # via # -r requirements/ci.txt # pytest-cov -pytest-cov==4.0.0 +pytest-cov==5.0.0 # via -r requirements/ci.txt -python-slugify==8.0.0 +python-slugify==8.0.4 # via # -r requirements/ci.txt # code-annotations -pytz==2022.7.1 - # via - # -r requirements/ci.txt - # django -pyyaml==6.0 +pytz==2024.1 + # via -r requirements/ci.txt +pyyaml==6.0.1 # via # -r requirements/ci.txt # code-annotations @@ -174,12 +193,11 @@ six==1.16.0 # -r requirements/ci.txt # edx-lint # mock - # tox -sqlparse==0.4.3 +sqlparse==0.4.4 # via # -r requirements/ci.txt # django -stevedore==4.1.1 +stevedore==5.2.0 # via # -r requirements/ci.txt # code-annotations @@ -193,35 +211,36 @@ tomli==2.0.1 # -r requirements/pip_tools.txt # build # coverage + # pip-tools # pylint + # pyproject-api # pyproject-hooks # pytest # tox -tomlkit==0.11.6 +tomlkit==0.12.4 # via # -r requirements/ci.txt # pylint -tox==3.28.0 - # via - # -c requirements/common_constraints.txt - # -r requirements/ci.txt -typing-extensions==4.4.0 +tox==4.14.2 + # via -r requirements/ci.txt +typing-extensions==4.10.0 # via # -r requirements/ci.txt + # asgiref # astroid # pylint -virtualenv==20.19.0 +virtualenv==20.25.1 # via # -r requirements/ci.txt # tox -wheel==0.38.4 +wheel==0.43.0 # via # -r requirements/pip_tools.txt # pip-tools -wrapt==1.14.1 +zipp==3.18.1 # via - # -r requirements/ci.txt - # astroid + # -r requirements/pip_tools.txt + # importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/django.txt b/requirements/django.txt index 332dcc3a..db03776f 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==3.2.17 +django==4.2.11 diff --git a/requirements/pip.txt b/requirements/pip.txt index 02f414ba..cf449024 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -4,11 +4,11 @@ # # make upgrade # -wheel==0.37.0 +wheel==0.43.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==21.2.4 +pip==24.0 # via -r requirements/pip.in -setuptools==58.1.0 +setuptools==69.2.0 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 97ec2157..4e1105e9 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -4,20 +4,31 @@ # # make upgrade # -build==0.10.0 +build==1.2.1 # via pip-tools -click==8.1.3 +click==8.1.7 # via pip-tools -packaging==23.0 +importlib-metadata==6.11.0 + # via + # -c requirements/common_constraints.txt + # build +packaging==24.0 # via build -pip-tools==6.12.2 +pip-tools==7.4.1 # via -r requirements/pip_tools.in pyproject-hooks==1.0.0 - # via build + # via + # build + # pip-tools tomli==2.0.1 - # via build -wheel==0.38.4 + # via + # build + # pip-tools + # pyproject-hooks +wheel==0.43.0 # via pip-tools +zipp==3.18.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/test.txt b/requirements/test.txt index 57091e85..74c0b972 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,49 +4,54 @@ # # make upgrade # -asgiref==3.6.0 +asgiref==3.8.1 # via # -r requirements/base.txt # django -astroid==2.14.1 +astroid==3.1.0 # via # pylint # pylint-celery -attrs==22.2.0 - # via pytest -click==8.1.3 +backports-zoneinfo==0.2.1 ; python_version < "3.9" + # via + # -c requirements/constraints.txt + # -r requirements/base.txt + # django +click==8.1.7 # via # click-log # code-annotations # edx-lint click-log==0.4.0 # via edx-lint -code-annotations==1.3.0 +code-annotations==1.7.0 # via edx-lint -coverage[toml]==7.1.0 +coverage[toml]==7.4.4 # via # -r requirements/test.in # pytest-cov -ddt==1.6.0 +ddt==1.7.2 # via -r requirements/test.in -dill==0.3.6 +dill==0.3.8 # via pylint # via # -c requirements/common_constraints.txt # -r requirements/base.txt -edx-lint==5.3.0 +edx-lint==5.3.6 # via -r requirements/test.in -exceptiongroup==1.1.0 +exceptiongroup==1.2.0 # via pytest iniconfig==2.0.0 # via pytest -isort==5.12.0 +isort==5.13.2 # via pylint -jinja2==3.1.2 +jinja2==3.1.3 # via code-annotations -lazy-object-proxy==1.9.0 - # via astroid -markupsafe==2.1.2 +lxml==4.9.3 + # via + # -c requirements/constraints.txt + # -r requirements/base.txt +markupsafe==2.1.5 # via jinja2 mccabe==0.7.0 # via pylint @@ -54,21 +59,21 @@ mock==3.0.5 # via # -c requirements/constraints.txt # -r requirements/test.in -packaging==23.0 +packaging==24.0 # via pytest -path==16.6.0 +path==16.10.0 # via -r requirements/base.txt -pbr==5.11.1 +pbr==6.0.0 # via stevedore -platformdirs==3.0.0 +platformdirs==4.2.0 # via pylint -pluggy==1.0.0 +pluggy==1.4.0 # via pytest -polib==1.1.1 +polib==1.2.0 # via -r requirements/base.txt -pycodestyle==2.10.0 +pycodestyle==2.11.1 # via -r requirements/test.in -pylint==2.16.1 +pylint==3.1.0 # via # edx-lint # pylint-celery @@ -76,24 +81,21 @@ pylint==2.16.1 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.5.3 +pylint-django==2.5.5 # via edx-lint -pylint-plugin-utils==0.7 +pylint-plugin-utils==0.8.2 # via # pylint-celery # pylint-django -pytest==7.2.1 +pytest==8.1.1 # via pytest-cov -pytest-cov==4.0.0 +pytest-cov==5.0.0 # via -r requirements/test.in -python-slugify==8.0.0 +python-slugify==8.0.4 # via code-annotations -pytz==2022.7.1 - # via - # -r requirements/base.txt - # -r requirements/test.in - # django -pyyaml==6.0 +pytz==2024.1 + # via -r requirements/test.in +pyyaml==6.0.1 # via # -r requirements/base.txt # code-annotations @@ -101,11 +103,11 @@ six==1.16.0 # via # edx-lint # mock -sqlparse==0.4.3 +sqlparse==0.4.4 # via # -r requirements/base.txt # django -stevedore==4.1.1 +stevedore==5.2.0 # via code-annotations text-unidecode==1.3 # via python-slugify @@ -114,11 +116,11 @@ tomli==2.0.1 # coverage # pylint # pytest -tomlkit==0.11.6 +tomlkit==0.12.4 # via pylint -typing-extensions==4.4.0 +typing-extensions==4.10.0 # via + # -r requirements/base.txt + # asgiref # astroid # pylint -wrapt==1.14.1 - # via astroid diff --git a/requirements/tox.txt b/requirements/tox.txt index ce189f4d..cc5293d6 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -4,27 +4,35 @@ # # make upgrade # -distlib==0.3.6 +cachetools==5.3.3 + # via tox +chardet==5.2.0 + # via tox +colorama==0.4.6 + # via tox +distlib==0.3.8 # via virtualenv -filelock==3.9.0 +filelock==3.13.3 # via # tox # virtualenv -packaging==23.0 - # via tox -platformdirs==3.0.0 - # via virtualenv -pluggy==1.0.0 - # via tox -py==1.11.0 +packaging==24.0 + # via + # pyproject-api + # tox +platformdirs==4.2.0 + # via + # tox + # virtualenv +pluggy==1.4.0 # via tox -six==1.16.0 +pyproject-api==1.6.1 # via tox tomli==2.0.1 - # via tox -tox==3.28.0 # via - # -c requirements/common_constraints.txt - # -r requirements/tox.in -virtualenv==20.19.0 + # pyproject-api + # tox +tox==4.14.2 + # via -r requirements/tox.in +virtualenv==20.25.1 # via tox diff --git a/setup.py b/setup.py index 24ddb179..725a1251 100755 --- a/setup.py +++ b/setup.py @@ -68,8 +68,8 @@ def get_version(*file_paths): 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.11', 'Framework :: Django', - 'Framework :: Django :: 3.2', - 'Framework :: Django :: 4.0', + 'Framework :: Django :: 4.2', ], ) diff --git a/tox.ini b/tox.ini index b48f98f5..09de8884 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38-django{32,42}, quality +envlist = py{38, 311}-django{42}, quality [pytest] addopts = --cov=tests --cov-report term --cov-config=.coveragerc -p no:randomly @@ -7,7 +7,6 @@ testpaths = tests [testenv] deps = - django32: Django>=3.2,<4.0 django42: Django>=4.2,<4.3 -r requirements/test.txt commands = pytest {posargs}