diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6b27572aae0..1c5eb584f88 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -295,6 +295,76 @@ jobs: files: ./coverage.xml verbose: true + build-uv: + needs: [package] + + runs-on: ${{ matrix.os }} + timeout-minutes: 45 + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + name: [ + "windows-py310", + + "ubuntu-py310", + + "macos-py310", + ] + + include: + - name: "windows-py310" + python: "3.10" + os: windows-latest + tox_env: "py310" + + - name: "ubuntu-py310" + python: "3.10" + os: ubuntu-latest + tox_env: "py310" + + - name: "macos-py310" + python: "3.10" + os: macos-latest + tox_env: "py310" + xfail: true + + continue-on-error: ${{ matrix.xfail && true || false }} + + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Download Package + uses: actions/download-artifact@v5 + with: + name: Packages + path: dist + + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + check-latest: true + allow-prereleases: true + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox>=4 tox-uv>=1 coverage + + - name: Test + shell: bash + env: + UV_RESOLUTION: lowest-direct + UV_PYTHON_PREFERENCE: only-managed + run: tox run -e ${{ matrix.tox_env }} --installpkg `find dist/*.tar.gz` + + check: # This job does nothing and is only used for the branch protection if: always() diff --git a/changelog/13177.packaging.rst b/changelog/13177.packaging.rst new file mode 100644 index 00000000000..ef4d0c8ab0b --- /dev/null +++ b/changelog/13177.packaging.rst @@ -0,0 +1,3 @@ +Raised minimal versions of ``exceptiongroup``, ``iniconfig`` and ``pygments`` following uv powered test runs using the ``lowest-direct`` resolution strategy. + +-- by :user:`sgaist` diff --git a/pyproject.toml b/pyproject.toml index 964c4f449dc..cef60963c65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,21 +47,21 @@ dynamic = [ ] dependencies = [ "colorama>=0.4; sys_platform=='win32'", - "exceptiongroup>=1; python_version<'3.11'", - "iniconfig>=1.0.1", + "exceptiongroup>=1.1; python_version<'3.11'", + "iniconfig>=2", "packaging>=22", "pluggy>=1.5,<2", - "pygments>=2.7.2", + "pygments>=2.14", "tomli>=1; python_version<'3.11'", ] optional-dependencies.dev = [ - "argcomplete", - "attrs>=19.2", - "hypothesis>=3.56", - "mock", - "requests", - "setuptools", - "xmlschema", + "argcomplete>=3.5", + "attrs>=21", + "hypothesis>=5", + "mock>=5", + "requests>=2.26", + "setuptools>=80", + "xmlschema>=3", ] urls.Changelog = "https://docs.pytest.org/en/stable/changelog.html" urls.Contact = "https://docs.pytest.org/en/stable/contact.html" diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index b9384008483..8ec0cddbf72 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -1642,12 +1642,23 @@ def test_fail_call(): result = pytester.runpytest() assert result.ret == ExitCode.TESTS_FAILED result.assert_outcomes(failed=1, passed=1, errors=2) - result.stdout.fnmatch_lines( - [ - "=* short test summary info =*", - "FAILED test_it.py::test_fail_call - StopIteration: 3", - "ERROR test_it.py::test_fail_setup - StopIteration: 1", - "ERROR test_it.py::test_fail_teardown - StopIteration: 2", - "=* 1 failed, 1 passed, 2 errors in * =*", - ] - ) + + # uv managed python versions do not raise the same exception with regard to + # StopIteration. + # See PEP-0479 + runtime_errors = { + "FAILED test_it.py::test_fail_call - RuntimeError: generator raised StopIteration", + "ERROR test_it.py::test_fail_setup - RuntimeError: generator raised StopIteration", + "ERROR test_it.py::test_fail_teardown - RuntimeError: generator raised StopIte...", + } + got_runtime_errors = runtime_errors.issubset(result.outlines) + + stopiteration_errors = { + "FAILED test_it.py::test_fail_call - StopIteration: 3", + "ERROR test_it.py::test_fail_setup - StopIteration: 1", + "ERROR test_it.py::test_fail_teardown - StopIteration: 2", + } + + got_stopiteration_errors = stopiteration_errors.issubset(result.outlines) + + assert got_runtime_errors or got_stopiteration_errors diff --git a/tox-uv.ini b/tox-uv.ini new file mode 100644 index 00000000000..386a270034a --- /dev/null +++ b/tox-uv.ini @@ -0,0 +1,28 @@ +[tox] +requires = + tox>=4 + tox-uv>=1 +isolated_build = True +distshare = {homedir}/.tox/uv-distshare +envlist = + py310 + +[testenv] +description = + run the tests + under `{basepython}` +uv_resolution = lowest-direct +uv_python_preference = only-managed +commands = + {env:_PYTEST_TOX_COVERAGE_RUN:} pytest {posargs:{env:_PYTEST_TOX_DEFAULT_POSARGS:}} --maxfail=1 --pdb +passenv = + PYTEST_ADDOPTS + TERM + SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST + CI +setenv = + _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_DOCTESTING:} {env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_XDIST:} {env:_PYTEST_FILES:} + +extras = dev +deps = + {env:_PYTEST_TOX_EXTRA_DEP:}