name: Python Tests on: push: branches: ["master", "v**"] pull_request: workflow_dispatch: concurrency: group: tests-${{ github.ref }} cancel-in-progress: true defaults: run: shell: bash -eux {0} jobs: static: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: python-version: "3.9" cache: 'pip' cache-dependency-path: 'pyproject.toml' - name: Install Python dependencies run: | python -m pip install -U pip hatch - name: Run linters run: | hatch run lint:run-manual - name: Run compilation run: | export PYMONGO_C_EXT_MUST_BUILD=1 pip install -v -e . python tools/fail_if_no_c.py - name: Run typecheck run: | hatch run typing:check - run: | sudo apt-get install -y cppcheck - run: | cppcheck --force bson cppcheck pymongo build: # supercharge/mongodb-github-action requires containers so we don't test other platforms runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-20.04] python-version: ["3.9", "pypy-3.9", "3.13", "3.13t"] name: CPython ${{ matrix.python-version }}-${{ matrix.os }} steps: - uses: actions/checkout@v4 with: persist-credentials: false - if: ${{ matrix.python-version == '3.13t' }} name: Setup free-threaded Python uses: deadsnakes/action@v3.2.0 with: python-version: 3.13 nogil: true - if: ${{ matrix.python-version != '3.13t' }} name: Setup Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: 'pip' cache-dependency-path: 'pyproject.toml' allow-prereleases: true - name: Install dependencies run: | pip install -U pip if [[ "${{ matrix.python-version }}" == "3.13" ]]; then pip install --pre cffi setuptools pip install --no-build-isolation hatch elif [[ "${{ matrix.python-version }}" == "3.13t" ]]; then # Hatch can't be installed on 3.13t, use pytest directly. pip install . pip install -r requirements/test.txt else pip install hatch fi - name: Start MongoDB uses: supercharge/mongodb-github-action@1.12.0 with: mongodb-version: 6.0 - name: Run tests run: | if [[ "${{ matrix.python-version }}" == "3.13t" ]]; then pytest -v --durations=5 --maxfail=10 else hatch run test:test fi doctest: runs-on: ubuntu-latest name: DocTest steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.9" cache: 'pip' cache-dependency-path: 'pyproject.toml' - name: Install dependencies run: | pip install -U hatch pip - name: Start MongoDB uses: supercharge/mongodb-github-action@1.12.0 with: mongodb-version: '8.0.0-rc4' - name: Run tests run: | hatch run doctest:test docs: name: Docs Checks runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: cache: 'pip' cache-dependency-path: 'pyproject.toml' # Build docs on lowest supported Python for furo python-version: '3.9' - name: Install dependencies run: | pip install -U pip hatch - name: Build docs run: | hatch run doc:build linkcheck: name: Link Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: cache: 'pip' cache-dependency-path: 'pyproject.toml' # Build docs on lowest supported Python for furo python-version: '3.9' - name: Install dependencies run: | pip install -U pip hatch - name: Build docs run: | hatch run doc:linkcheck typing: name: Typing Tests runs-on: ubuntu-latest strategy: matrix: python: ["3.9", "3.11"] steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: python-version: "${{matrix.python}}" cache: 'pip' cache-dependency-path: 'pyproject.toml' - name: Install dependencies run: | pip install -U pip hatch - name: Run typecheck run: | hatch run typing:check make_sdist: runs-on: ubuntu-latest name: "Make an sdist" steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: cache: 'pip' cache-dependency-path: 'pyproject.toml' # Build sdist on lowest supported Python python-version: '3.9' - name: Build SDist shell: bash run: | pip install build python -m build --sdist - uses: actions/upload-artifact@v4 with: name: "sdist" path: dist/*.tar.gz test_sdist: runs-on: ubuntu-latest needs: [make_sdist] name: Install from SDist and Test timeout-minutes: 20 steps: - name: Download sdist uses: actions/download-artifact@v4 - name: Unpack SDist shell: bash run: | cd sdist ls mkdir test tar --strip-components=1 -zxf *.tar.gz -C ./test ls test - uses: actions/setup-python@v5 with: cache: 'pip' cache-dependency-path: 'sdist/test/pyproject.toml' # Test sdist on lowest supported Python python-version: '3.9' - name: Start MongoDB uses: supercharge/mongodb-github-action@1.12.0 - name: Run connect test from sdist shell: bash run: | cd sdist/test ls which python pip install -e ".[test]" PYMONGO_MUST_CONNECT=1 pytest -v -k client_context