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 - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: "3.9" - name: Install Python dependencies run: | just install - name: Run linters run: | just lint-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: | just typing - 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: fail-fast: false matrix: os: [ubuntu-latest] python-version: ["3.9", "pypy-3.10", "3.13", "3.13t"] name: CPython ${{ matrix.python-version }}-${{ matrix.os }} steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Install dependencies run: just install - name: Start MongoDB uses: supercharge/mongodb-github-action@90004df786821b6308fb02299e5835d0dae05d0d # 1.12.0 with: mongodb-version: 6.0 - name: Run tests run: just test doctest: runs-on: ubuntu-latest name: DocTest steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: "3.9" - name: Start MongoDB uses: supercharge/mongodb-github-action@90004df786821b6308fb02299e5835d0dae05d0d # 1.12.0 with: mongodb-version: '8.0.0-rc4' - name: Install dependencies run: just install - name: Run tests run: | just setup-tests doctest just run-tests docs: name: Docs Checks runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: "3.9" - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install dependencies run: just install - name: Build docs run: just docs linkcheck: name: Link Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: "3.9" - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install dependencies run: just install - name: Build docs run: just docs-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 - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: enable-cache: true python-version: "${{matrix.python}}" - name: Install just uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3 - name: Install dependencies run: | just install - name: Run typecheck run: | just typing 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@90004df786821b6308fb02299e5835d0dae05d0d # 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 test_minimum: permissions: contents: read runs-on: ubuntu-latest name: Test using minimum dependencies and supported Python steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: python-version: '3.9' - name: Start MongoDB uses: supercharge/mongodb-github-action@90004df786821b6308fb02299e5835d0dae05d0d # 1.12.0 with: mongodb-version: 6.0 # Async and our test_dns do not support dnspython 1.X, so we don't run async or dns tests here - name: Run tests shell: bash run: | uv venv source .venv/bin/activate uv pip install -e ".[test]" --resolution=lowest-direct pytest -v test/test_srv_polling.py test_minimum_for_async: permissions: contents: read runs-on: ubuntu-latest name: Test async's minimum dependencies and Python steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@7edac99f961f18b581bbd960d59d049f04c0002f # v5 with: python-version: '3.9' - name: Start MongoDB uses: supercharge/mongodb-github-action@90004df786821b6308fb02299e5835d0dae05d0d # 1.12.0 with: mongodb-version: 6.0 # The lifetime kwarg we use in srv resolution was added to the async resolver API in dnspython 2.1.0 - name: Run tests shell: bash run: | uv venv source .venv/bin/activate uv pip install -e ".[test]" --resolution=lowest-direct dnspython==2.1.0 --force-reinstall pytest -v test/test_srv_polling.py test/test_dns.py test/asynchronous/test_srv_polling.py test/asynchronous/test_dns.py