name: Hypothesis CI env: # Tell pytest and other tools to produce coloured terminal output. # Make sure this is also in the "passenv" section of the tox config. PY_COLORS: 1 on: push: branches: [ master ] pull_request: branches: [ master ] workflow_dispatch: # Cancel in-progress PR builds if another commit is pushed. # On non-PR builds, fall back to the globally-unique run_id and don't cancel. concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: test: runs-on: ubuntu-latest strategy: matrix: task: - check-whole-repo-tests - lint - check-format - check-coverage - check-conjecture-coverage - check-py39-cover - check-pypy39-cover - check-py310-cover - check-py310-nocover - check-py310-niche - check-pypy310-cover # - check-py310-pyjion # see notes in tox.ini - check-py311-cover - check-py311-nocover - check-py311-niche - check-py312-cover - check-py312-nocover - check-py312-niche - check-py313-cover - check-py313-nocover - check-py313-niche # - check-py313t-cover # - check-py313t-nocover # - check-py313t-niche # - check-py314-cover # - check-py314-nocover # - check-py314-niche # - check-py314t-cover # - check-py314t-nocover # - check-py314t-niche - check-quality ## Skip all the (inactive/old) Rust and Ruby tests pending fixes # - lint-ruby # - check-ruby-tests # - check-rust-in-ruby-format # - lint-rust-in-ruby # - audit-rust-in-ruby # - check-conjecture-rust-format # - check-rust-tests # - audit-conjecture-rust # - lint-conjecture-rust - check-py39-nose - check-py39-pytest46 - check-py39-pytest54 - check-pytest62 - check-django51 - check-django50 - check-django42 - check-pandas22 - check-pandas21 - check-pandas20 - check-pandas15 - check-pandas14 - check-pandas13 - check-py39-pandas12 - check-py39-pandas11 ## `-cover` is too slow under crosshair; use a custom split # - check-crosshair-custom-cover/test_[a-d]* # - check-crosshair-custom-cover/test_[e-i]* # - check-crosshair-custom-cover/test_[j-r]* # - check-crosshair-custom-cover/test_[s-z]* # - check-crosshair-custom-pytest/test_* # - check-crosshair-nocover # - check-crosshair-niche - check-py39-oldestnumpy - check-numpy-nightly fail-fast: false steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Python 3.10 uses: actions/setup-python@v4 with: python-version: "3.10" - name: Restore cache uses: actions/cache@v3 with: path: | ~/.cache ~/wheelhouse ~/.local vendor/bundle .tox/ key: deps-${{ runner.os }}-${{ hashFiles('requirements/*.txt') }}-${{ matrix.task }} restore-keys: | deps-${{ runner.os }}-${{ hashFiles('requirements/*.txt') }} deps-${{ runner.os }} - name: Install dotnet6 for Pyjion if: ${{ endsWith(matrix.task, '-pyjion') }} run: | wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-6.0 - name: Run tests run: | export TASK=${{ matrix.task }} if [[ $TASK == check-crosshair-custom-* ]]; then GROUP="${TASK#check-crosshair-custom-}" ./build.sh check-crosshair-custom -- -n auto $(cd hypothesis-python ; echo tests/$GROUP) else ./build.sh fi - name: Upload coverage data uses: actions/upload-artifact@v4 # Invoke the magic `always` function to run on both success and failure. if: ${{ always() && endsWith(matrix.task, '-coverage') }} with: name: ${{ matrix.task }}-data path: | hypothesis-python/.coverage* !hypothesis-python/.coveragerc hypothesis-python/branch-check* test-win: runs-on: windows-latest strategy: matrix: python: - version: "3.11" - version: "3.11" architecture: "x86" whichtests: - nocover - cover+rest fail-fast: false steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Python ${{ matrix.python.version }} ${{ matrix.python.architecture }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python.version }} architecture: ${{ matrix.python.architecture }} - name: Restore cache uses: actions/cache@v3 with: path: | ~\appdata\local\pip\cache vendor\bundle .tox key: deps-${{ runner.os }}-${{ matrix.python.architecture }}-${{ hashFiles('requirements/*.txt') }}-${{ matrix.python.version }} restore-keys: | deps-${{ runner.os }}-${{ matrix.python.architecture }}-${{ hashFiles('requirements/*.txt') }} deps-${{ runner.os }}-${{ matrix.python.architecture }} - name: Use old pandas on win32 if: matrix.python.architecture # See https://github.com/pandas-dev/pandas/issues/54979 run: | (Get-Content .\requirements\coverage.txt) -replace 'numpy==[0-9.]+', 'numpy==1.26.4' | Out-File .\requirements\coverage.txt (Get-Content .\requirements\coverage.txt) -replace 'pandas==[0-9.]+', 'pandas==2.0.3' | Out-File .\requirements\coverage.txt (Get-Content .\requirements\coverage.txt) -replace 'pyarrow==[0-9.]+', '# omitted' | Out-File .\requirements\coverage.txt - name: Install dependencies run: | pip install --upgrade setuptools pip wheel pip install -r requirements/coverage.txt pip install hypothesis-python/[all] - name: Run tests run: python -m pytest --numprocesses auto ${{ matrix.whichtests == 'nocover' && 'hypothesis-python/tests/nocover' || 'hypothesis-python/tests/ --ignore=hypothesis-python/tests/nocover/ --ignore=hypothesis-python/tests/quality/ --ignore=hypothesis-python/tests/ghostwriter/ --ignore=hypothesis-python/tests/patching/' }} test-osx: runs-on: macos-latest strategy: matrix: task: - check-py310-cover - check-py310-nocover - check-py310-niche - check-py311-cover fail-fast: false steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Python 3.10 uses: actions/setup-python@v4 with: python-version: "3.10" - name: Restore cache uses: actions/cache@v3 with: path: | ~/.cache ~/Library/Caches/pip .tox/ key: deps-${{ runner.os }}-${{ hashFiles('requirements/*.txt') }}-${{ matrix.task }} - name: Run tests run: TASK=${{ matrix.task }} ./build.sh # See https://pyodide.org/en/stable/development/building-and-testing-packages.html#testing-packages-against-pyodide # and https://github.com/numpy/numpy/blob/9a650391651c8486d8cb8b27b0e75aed5d36033e/.github/workflows/emscripten.yml test-pyodide: runs-on: ubuntu-latest env: NODE_VERSION: 18 # Note that the versions below must be updated in sync; we've automated # that with `update_pyodide_versions()` in our weekly cronjob. PYODIDE_VERSION: 0.26.3 PYTHON_VERSION: 3.12.1 EMSCRIPTEN_VERSION: 3.1.58 steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up Node uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 with: node-version: ${{ env.NODE_VERSION }} - name: Set up Emscripten uses: mymindstorm/setup-emsdk@6ab9eb1bda2574c4ddb79809fc9247783eaf9021 # v14 with: version: ${{ env.EMSCRIPTEN_VERSION }} actions-cache-folder: emsdk-cache - name: Build run: | pip install pyodide-build==$PYODIDE_VERSION cd hypothesis-python/ CFLAGS=-g2 LDFLAGS=-g2 pyodide build - name: Set up Pyodide venv and install dependencies run: | pip install --upgrade setuptools pip wheel python hypothesis-python/setup.py bdist_wheel pip download --dest=dist/ hypothesis-python/ pytest tzdata # fetch all the wheels rm dist/packaging-*.whl # fails with `invalid metadata entry 'name'` pyodide venv .venv-pyodide source .venv-pyodide/bin/activate pip install dist/*.whl - name: Run tests run: | source .venv-pyodide/bin/activate # pyodide can't run multiple processes internally, so parallelize explicitly over # discovered test files instead (20 at a time) TEST_FILES=$(python -m pytest -p no:cacheprovider --setup-plan hypothesis-python/tests/cover | grep ^hypothesis-python/ | cut -d " " -f 1) parallel --max-procs 100% --max-args 20 --keep-order --line-buffer \ python -m pytest -p no:cacheprovider <<< $TEST_FILES deploy: if: "github.event_name == 'push' && github.repository == 'HypothesisWorks/hypothesis'" runs-on: ubuntu-latest needs: [test, test-win, test-osx] strategy: matrix: task: - deploy fail-fast: false steps: - uses: actions/checkout@v3 with: fetch-depth: 0 token: ${{ secrets.GH_TOKEN }} - name: Set up Python 3.10 uses: actions/setup-python@v4 with: python-version: "3.10" - name: Restore cache uses: actions/cache@v3 with: path: | ~/.cache ~/wheelhouse ~/.local vendor/bundle key: deps-${{ runner.os }}-${{ hashFiles('requirements/*.txt') }}-${{ matrix.task }} restore-keys: | deps-${{ runner.os }}-${{ hashFiles('requirements/*.txt') }} deps-${{ runner.os }} - name: Deploy package env: GH_TOKEN: ${{ secrets.GH_TOKEN }} TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_TOKEN }} CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} run: TASK=${{ matrix.task }} ./build.sh