diff --git a/.github/workflows/lazy-imports-all.yml b/.github/workflows/lazy-imports-all.yml new file mode 100644 index 000000000000000..7baed3cae961e23 --- /dev/null +++ b/.github/workflows/lazy-imports-all.yml @@ -0,0 +1,79 @@ +name: Tests + +# Run the CPython test suite with global lazy imports forced on +# (``PYTHON_LAZY_IMPORTS=all``, equivalent to ``-X lazy_imports=all``). +# +# Modules that are known to fail under lazy imports are listed in +# Lib/test/lazy_imports_all_exclude.txt and skipped here. Remove entries from +# that file as the modules are fixed so this workflow starts guarding them +# against regressions. + +on: + workflow_dispatch: + push: + branches: &branches + - 'main' + - '3.*' + paths-ignore: &paths-ignore + - 'Doc/**' + - 'Misc/**' + - '**/*.md' + - '**/*.rst' + pull_request: + branches: *branches + paths-ignore: *paths-ignore + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + FORCE_COLOR: 1 + +jobs: + lazy-imports: + name: Lazy imports all enabled + runs-on: ubuntu-24.04 + timeout-minutes: 60 + env: + PYTHON_LAZY_IMPORTS: all + EXCLUDE_FILE: Lib/test/lazy_imports_all_exclude.txt + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Register gcc problem matcher + run: echo "::add-matcher::.github/problem-matchers/gcc.json" + - name: Install dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: Configure CPython + run: ./configure --config-cache --with-pydebug + - name: Build CPython + run: make -j4 + - name: Display build info + run: make pythoninfo + - name: Verify lazy imports are fullly enabled + run: ./python -c "import sys; assert sys.flags.lazy_imports == 1, sys.flags.lazy_imports; print('lazy imports all enabled')" + - name: Build test list (all tests minus the known-failing exclusions) + run: | + set -euo pipefail + ./python -m test --list-tests > all_tests.txt + # Strip comments/blank lines from the exclusion file, then drop those + # exact test names (whole-line, fixed-string match) from the run list. + grep -vE '^\s*(#.*)?$' "$EXCLUDE_FILE" > exclude_tests.txt + grep -vxF -f exclude_tests.txt all_tests.txt > run_tests.txt + # Fail loudly if any exclusion entry matched nothing: a stale or + # mistyped name (or a change in `--list-tests` output) would otherwise + # silently stop excluding a module and let it fail the run. + stale=$(comm -23 <(sort -u exclude_tests.txt) <(sort -u all_tests.txt)) + if [ -n "$stale" ]; then + echo "::error::Stale entries in $EXCLUDE_FILE (no longer match 'python -m test --list-tests'); remove or fix them:" + echo "$stale" + exit 1 + fi + echo "Excluding $(wc -l < exclude_tests.txt) module(s); running $(wc -l < run_tests.txt) of $(wc -l < all_tests.txt)." + - name: Run stdlib tests with lazy imports + run: xvfb-run xargs ./python -m test --fast-ci --timeout=900 < run_tests.txt diff --git a/Lib/test/lazy_imports_all_exclude.txt b/Lib/test/lazy_imports_all_exclude.txt new file mode 100644 index 000000000000000..6c40dd4910a7d0e --- /dev/null +++ b/Lib/test/lazy_imports_all_exclude.txt @@ -0,0 +1,40 @@ +# Test modules that currently FAIL under global lazy imports +# (``-X lazy_imports=all`` / ``PYTHON_LAZY_IMPORTS=all``). +# +# The "Lazy Imports All" CI workflow (.github/workflows/lazy-imports-all.yml) runs the +# whole test suite with lazy_imports=all, skipping every module listed +# here. Exclusion is whole-module: a listed module is skipped entirely, so any +# passing tests it contains are not covered until its line is removed. As each +# module is fixed, delete its line so the workflow starts guarding it against +# regressions. +# +# Format: one test name per line, exactly as printed by +# ``python -m test --list-tests``. Lines starting with ``#`` and blank lines +# are ignored. Note that split test packages use a dotted path +# (e.g. test.test_future_stmt.test_future) while ordinary modules use the bare +# name (e.g. test_builtin). + +test.test_inspect.test_inspect +test.test_pydoc.test_pydoc +test___all__ +test__interpreters +test_builtin +test_clinic +test_compileall +test_crossinterp +test_datetime +test_generated_cases +test_idle +test_import +test_importlib +test_interpreters +test_json +test_lazy_import +test_subprocess +test_symtable +test_tools +test_trace +test_typing +test_unittest +test_xmlrpc +test_zipfile