Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0e6e080
Add new github action to test lazy imports all against stdlib.
brittanyrey Jun 8, 2026
90cf964
Adjust GH Action naming to better match existing checks
brittanyrey Jun 8, 2026
71d3aa7
Address comments for reusability
brittanyrey Jun 8, 2026
d3fb4eb
Fix double typo + add flaky module
brittanyrey Jun 8, 2026
f07ad18
Update test name
brittanyrey Jun 9, 2026
a036677
Remove concurrency configeration for reusable-test-lazy-imports-all.yml
brittanyrey Jun 9, 2026
dbb1390
bikeshed renames
brittanyrey Jun 10, 2026
860f80d
Take a swing at adding exclusion checks
brittanyrey Jun 11, 2026
e1c07b6
remove allegedly passing modules?
brittanyrey Jun 11, 2026
77d1dcf
clean up
brittanyrey Jun 11, 2026
1dbdf0b
Fix bug with env var not flowing through and bring back exclusions
brittanyrey Jun 11, 2026
e577926
Accidentally added random files
brittanyrey Jun 11, 2026
47fb4a4
Add more modules
brittanyrey Jun 11, 2026
651cb43
Address incorrect exclusions
brittanyrey Jun 11, 2026
5540969
Address feedback: update ubuntu version and CODEOWNERS file
brittanyrey Aug 18, 2026
d41581f
Prune test_idle and test_zoneinfo from the exclusion list
brittanyrey Aug 18, 2026
8f7988d
Address comments. Variety of small nits and cleanups.
brittanyrey Aug 18, 2026
e54a674
Remove accidental file and remove myself from codeowners :(
brittanyrey Aug 19, 2026
341b3d7
Deleting other random empty files
brittanyrey Aug 19, 2026
299a6ee
Minor change to trigger tests again
brittanyrey Aug 19, 2026
9ba8ca2
Minor change to trigger tests again 2
brittanyrey Aug 19, 2026
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
10 changes: 7 additions & 3 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -290,9 +290,10 @@ Tools/jit/ @brandtbucher @savannahostrowski @diegorusso
InternalDocs/jit.md @brandtbucher @savannahostrowski @diegorusso @AA-Turner

# Lazy imports (PEP 810)
Objects/lazyimportobject.c @yhg1s @DinoV @pablogsal
Include/internal/pycore_lazyimportobject.h @yhg1s @DinoV @pablogsal
Lib/test/test_lazy_import @yhg1s @DinoV @pablogsal
.github/workflows/reusable-test-lazy-imports-all.yml @yhg1s @DinoV @pablogsal
Objects/lazyimportobject.c @yhg1s @DinoV @pablogsal
Include/internal/pycore_lazyimportobject.h @yhg1s @DinoV @pablogsal
Lib/test/test_lazy_import @yhg1s @DinoV @pablogsal

# Micro-op / μop / Tier 2 Optimiser
Python/optimizer.c @markshannon @Fidget-Spinner
Expand Down Expand Up @@ -643,5 +644,8 @@ Objects/**/clinic/
PC/**/clinic/
Python/**/clinic/

# Exclude Lazy Imports=all CI carve out file
Lib/test/lazy_imports_all_exclude.txt

# Exclude HTML IDs list
Doc/tools/removed-ids.txt
8 changes: 8 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,12 @@ jobs:
name: hypothesis-example-db
path: ${{ env.CPYTHON_BUILDDIR }}/.hypothesis/examples/

test-lazy-imports-all:
name: 'Lazy imports enabled'
needs: build-context
if: fromJSON(needs.build-context.outputs.run-tests)
uses: ./.github/workflows/reusable-test-lazy-imports-all.yml

build-asan:
name: 'Address sanitizer'
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -648,6 +654,7 @@ jobs:
- build-emscripten
- build-wasi
- test-hypothesis
- test-lazy-imports-all
Comment thread
brittanyrey marked this conversation as resolved.
- build-asan
- build-san
- cross-build-linux
Expand Down Expand Up @@ -705,4 +712,5 @@ jobs:
${{ !fromJSON(needs.build-context.outputs.run-ios) && 'build-ios,' || '' }}
${{ !fromJSON(needs.build-context.outputs.run-emscripten) && 'build-emscripten,' || '' }}
${{ !fromJSON(needs.build-context.outputs.run-wasi) && 'build-wasi,' || '' }}
${{ !fromJSON(needs.build-context.outputs.run-tests) && 'test-lazy-imports-all,' || '' }}
jobs: ${{ toJSON(needs) }}
79 changes: 79 additions & 0 deletions .github/workflows/reusable-test-lazy-imports-all.yml
Comment thread
brittanyrey marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Reusable Lazy Imports Tests

# Run the CPython test suite with global lazy imports forced on
# (``-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. Excluded modules are also checked separately so the
# workflow fails when one starts passing and its exclusion should be removed.

on:
workflow_call:

permissions:
contents: read

env:
FORCE_COLOR: 1

jobs:
Comment thread
brittanyrey marked this conversation as resolved.
test-lazy-imports-all:
name: 'Run Tests with lazy_imports=all'
runs-on: ubuntu-26.04
timeout-minutes: 60
env:
EXCLUDE_FILE: Lib/test/lazy_imports_all_exclude.txt
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
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 fully enabled
run: ./python -X lazy_imports=all -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
Comment thread
brittanyrey marked this conversation as resolved.
# exact test names (whole-line, fixed-string match) from the run list.
grep -vE '^\s*(#.*)?$' "$EXCLUDE_FILE" > exclude_tests.txt || true
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 tests with lazy imports
run: xvfb-run xargs -a run_tests.txt ./python -X lazy_imports=all -m test --fast-ci --timeout=900 < /dev/null
- name: Verify excluded tests still need exclusion
run: |
set -euo pipefail
unexpected_passes=()
while IFS= read -r test_name; do
[ -n "$test_name" ] || continue
echo "Checking excluded test: $test_name"
if xvfb-run ./python -X lazy_imports=all -m test --fast-ci --timeout=900 "$test_name"; then
Comment thread
brittanyrey marked this conversation as resolved.
unexpected_passes+=("$test_name")
fi
done < exclude_tests.txt
if [ "${#unexpected_passes[@]}" -ne 0 ]; then
echo "::error::These tests still appear in $EXCLUDE_FILE but now pass with -X lazy_imports=all. Remove them from the exclude file:"
printf '%s\n' "${unexpected_passes[@]}"
exit 1
fi
40 changes: 40 additions & 0 deletions Lib/test/lazy_imports_all_exclude.txt
Comment thread
brittanyrey marked this conversation as resolved.
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/reusable-test-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. The
# workflow also checks listed modules separately and fails if one now passes,
# so accidental fixes prompt cleanup of this file.
#
# 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___all__
test__interpreters
test_builtin
test_clinic
test_crossinterp
test_datetime
test_generated_cases
test_heapq
test_import
test_importlib
test_json
test_pkg
test_profile
test_profiling
test_pyrepl
test_subprocess
test_symtable
test_tools
test_trace
test_type_annotations
test_unittest
Loading