Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions .github/workflows/lazy-imports-all.yml
Original file line number Diff line number Diff line change
@@ -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
40 changes: 40 additions & 0 deletions Lib/test/lazy_imports_all_exclude.txt
Original file line number Diff line number Diff line change
@@ -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
Loading