| name: Tests | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: [main, master, 'release*'] | |
| tags: ['*'] | |
| pull_request: | |
| paths-ignore: | |
| - 'docs/**' | |
| - 'mypyc/doc/**' | |
| - '**/*.rst' | |
| - '**/*.md' | |
| - .gitignore | |
| - CREDITS | |
| - LICENSE | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
| cancel-in-progress: true | |
| jobs: | |
| main: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # Make sure to run mypyc compiled unit tests for both | |
| # the oldest and newest supported Python versions | |
| - name: Test suite with py310-ubuntu, mypyc-compiled | |
| python: '3.10' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| test_mypyc: true | |
| - name: Test suite with py311-ubuntu | |
| python: '3.11' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| - name: Test suite with py312-ubuntu | |
| python: '3.12' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| - name: Test suite with py313-ubuntu, mypyc-compiled | |
| python: '3.13' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| test_mypyc: true | |
| - name: Test suite with py314-ubuntu, mypyc-compiled | |
| python: '3.14' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| test_mypyc: true | |
| - name: Test suite with py315-ubuntu, mypyc-compiled | |
| python: '3.15' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| test_mypyc: true | |
| - name: Test suite with py314t-ubuntu, mypyc-compiled | |
| python: '3.14t' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| test_mypyc: true | |
| - name: Test suite with py314-windows-64 | |
| python: '3.14' | |
| os: windows-latest | |
| toxenv: py | |
| tox_extra_args: "-n 4" | |
| # - name: Test suite with py315-dev-ubuntu | |
| # python: '3.15-dev' | |
| # os: ubuntu-24.04-arm | |
| # toxenv: py | |
| # tox_extra_args: "-n 4" | |
| # # allow_failure: true | |
| # test_mypyc: true | |
| - name: mypyc runtime tests with py313-macos | |
| python: '3.13' | |
| os: macos-latest | |
| toxenv: py | |
| tox_extra_args: "-n 3 mypyc/test/test_run.py mypyc/test/test_external.py" | |
| - name: mypyc runtime tests with py310-ubuntu | |
| python: '3.10' | |
| os: ubuntu-latest | |
| toxenv: py | |
| tox_extra_args: "-n 3 mypyc/test/test_run.py mypyc/test/test_external.py" | |
| # This is broken. See | |
| # - https://github.com/python/mypy/issues/17819 | |
| # - https://github.com/python/mypy/pull/17822 | |
| # - name: mypyc runtime tests with py310-debug-build-ubuntu | |
| # python: '3.10' | |
| # os: ubuntu-latest | |
| # toxenv: py | |
| # tox_extra_args: "-n 4 mypyc/test/test_run.py mypyc/test/test_external.py" | |
| # debug_build: true | |
| - name: Parallel tests with py314-ubuntu, interpreted | |
| python: '3.14' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4 --mypy-num-workers=4 mypy/test/testcheck.py" | |
| - name: Parallel tests with py314-ubuntu, mypyc-compiled | |
| python: '3.14' | |
| os: ubuntu-24.04-arm | |
| toxenv: py | |
| tox_extra_args: "-n 4 --mypy-num-workers=4 mypy/test/testcheck.py" | |
| test_mypyc: true | |
| - name: Parallel tests with py314-windows-64, interpreted | |
| python: '3.14' | |
| os: windows-latest | |
| toxenv: py | |
| tox_extra_args: "-n 2 --mypy-num-workers=2 mypy/test/testcheck.py -k 'incremental or modules or classes'" | |
| - name: Type check our own code (py310-ubuntu) | |
| python: '3.10' | |
| os: ubuntu-latest | |
| toxenv: type | |
| - name: Type check our own code (py310-windows-64) | |
| python: '3.10' | |
| os: windows-latest | |
| toxenv: type | |
| # We also run these checks with pre-commit in CI, | |
| # but it's useful to run them with tox too, | |
| # to ensure the tox env works as expected | |
| - name: Formatting and code style with Black + ruff | |
| python: '3.10' | |
| os: ubuntu-latest | |
| toxenv: lint | |
| name: ${{ matrix.name }} | |
| timeout-minutes: 60 | |
| env: | |
| TOX_SKIP_MISSING_INTERPRETERS: False | |
| VIRTUALENV_SYSTEM_SITE_PACKAGES: ${{ matrix.test_mypyc && 1 || 0 }} | |
| # Rich (pip) -- Disable color for windows + pytest | |
| FORCE_COLOR: ${{ !(startsWith(matrix.os, 'windows-') && startsWith(matrix.toxenv, 'py')) && 1 || 0 }} | |
| # Tox | |
| PY_COLORS: 1 | |
| # Python -- Disable argparse help colors (3.14+) | |
| PYTHON_COLORS: 0 | |
| # Mypy (see https://github.com/python/mypy/issues/7771) | |
| TERM: xterm-color | |
| MYPY_FORCE_COLOR: 1 | |
| MYPY_FORCE_TERMINAL_WIDTH: 200 | |
| # Pytest | |
| PYTEST_ADDOPTS: --color=yes | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Latest dev build | |
| if: ${{ endsWith(matrix.python, '-dev') }} | |
| run: | | |
| git clone --depth 1 https://github.com/python/cpython.git /tmp/cpython --branch $( echo ${{ matrix.python }} | sed 's/-dev//' ) | |
| cd /tmp/cpython | |
| echo git rev-parse HEAD; git rev-parse HEAD | |
| git show --no-patch | |
| sudo apt-get update -q | |
| sudo apt-get install -q -y --no-install-recommends \ | |
| build-essential gdb lcov libbz2-dev libffi-dev libgdbm-dev liblzma-dev libncurses5-dev \ | |
| libreadline6-dev libsqlite3-dev libssl-dev lzma lzma-dev tk-dev uuid-dev zlib1g-dev | |
| ./configure --prefix=/opt/pythondev | |
| make -j$(nproc) | |
| sudo make install | |
| sudo ln -s /opt/pythondev/bin/python3 /opt/pythondev/bin/python | |
| sudo ln -s /opt/pythondev/bin/pip3 /opt/pythondev/bin/pip | |
| echo "/opt/pythondev/bin" >> $GITHUB_PATH | |
| - name: Debug build | |
| if: ${{ matrix.debug_build }} | |
| run: | | |
| git clone --depth 1 https://github.com/python/cpython.git /tmp/cpython --branch ${{ matrix.python }} | |
| cd /tmp/cpython | |
| echo git rev-parse HEAD; git rev-parse HEAD | |
| git show --no-patch | |
| sudo apt-get update -q | |
| sudo apt-get install -q -y --no-install-recommends \ | |
| build-essential gdb lcov libbz2-dev libffi-dev libgdbm-dev liblzma-dev libncurses5-dev \ | |
| libreadline6-dev libsqlite3-dev libssl-dev lzma lzma-dev tk-dev uuid-dev zlib1g-dev | |
| ./configure CFLAGS="-DPy_DEBUG -DPy_TRACE_REFS -DPYMALLOC_DEBUG" --with-pydebug -with-trace-refs --prefix=/opt/pythondev | |
| make -j$(nproc) | |
| sudo make install | |
| sudo ln -s /opt/pythondev/bin/python3 /opt/pythondev/bin/python | |
| sudo ln -s /opt/pythondev/bin/pip3 /opt/pythondev/bin/pip | |
| echo "/opt/pythondev/bin" >> $GITHUB_PATH | |
| - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 | |
| if: ${{ !(matrix.debug_build || endsWith(matrix.python, '-dev')) }} | |
| with: | |
| python-version: ${{ matrix.python }} | |
| allow-prereleases: true | |
| - name: Install tox | |
| run: | | |
| echo PATH; echo $PATH | |
| echo which python; which python | |
| echo which pip; which pip | |
| echo python version; python -c 'import sys; print(sys.version)' | |
| echo debug build; python -c 'import sysconfig; print(bool(sysconfig.get_config_var("Py_DEBUG")))' | |
| echo os.cpu_count; python -c 'import os; print(os.cpu_count())' | |
| echo os.sched_getaffinity; python -c 'import os; print(len(getattr(os, "sched_getaffinity", lambda *args: [])(0)))' | |
| pip install tox==4.53.1 | |
| - name: Compiled with mypyc | |
| if: ${{ matrix.test_mypyc }} | |
| # Use local version of librt during self-compilation in tests. | |
| run: | | |
| pip install -r test-requirements.txt | |
| pip install -U mypyc/lib-rt | |
| CC=clang MYPYC_OPT_LEVEL=0 MYPY_USE_MYPYC=1 pip install -e . | |
| - name: Setup tox environment | |
| run: | | |
| tox run -e ${{ matrix.toxenv }} --notest | |
| - name: Test | |
| run: tox run -e ${{ matrix.toxenv }} --skip-pkg-install -- ${{ matrix.tox_extra_args }} | |
| continue-on-error: ${{ matrix.allow_failure == 'true' }} | |
| - name: Mark as success (check failures manually) | |
| if: ${{ matrix.allow_failure == 'true' }} | |
| run: exit 0 | |
| python_32bits: | |
| runs-on: ubuntu-latest | |
| name: Test mypyc suite with 32-bit Python | |
| timeout-minutes: 60 | |
| env: | |
| TOX_SKIP_MISSING_INTERPRETERS: False | |
| # Rich (pip) | |
| FORCE_COLOR: 1 | |
| # Tox | |
| PY_COLORS: 1 | |
| # Mypy (see https://github.com/python/mypy/issues/7771) | |
| TERM: xterm-color | |
| MYPY_FORCE_COLOR: 1 | |
| MYPY_FORCE_TERMINAL_WIDTH: 200 | |
| # Pytest | |
| PYTEST_ADDOPTS: --color=yes | |
| CXX: i686-linux-gnu-g++ | |
| CC: i686-linux-gnu-gcc | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Install 32-bit build dependencies | |
| run: | | |
| sudo dpkg --add-architecture i386 && \ | |
| sudo apt-get update && sudo apt-get install -y \ | |
| zlib1g-dev:i386 \ | |
| libgcc-s1:i386 \ | |
| g++-i686-linux-gnu \ | |
| gcc-i686-linux-gnu \ | |
| libffi-dev:i386 \ | |
| libssl-dev:i386 \ | |
| libbz2-dev:i386 \ | |
| libncurses-dev:i386 \ | |
| libreadline-dev:i386 \ | |
| libsqlite3-dev:i386 \ | |
| liblzma-dev:i386 \ | |
| uuid-dev:i386 | |
| - name: Compile, install, and activate 32-bit Python | |
| uses: gabrielfalcao/pyenv-action@5668dcb49bd9d228bba29dd5e1fbb6e0aae55a71 # v13 | |
| with: | |
| default: 3.11.1 | |
| command: python -c "import platform; print(f'{platform.architecture()=} {platform.machine()=}');" | |
| - name: Install tox | |
| run: pip install tox==4.53.1 | |
| - name: Setup tox environment | |
| run: tox run -e py --notest | |
| - name: Test | |
| run: tox run -e py --skip-pkg-install -- -n 4 mypyc/test/ |