name: CI on: push: branches: - master tags: - '**' pull_request: {} jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: 3.9 - uses: actions/cache@v3 id: cache with: path: | ${{ env.pythonLocation }} .mypy_cache key: > lint ${{ runner.os }} ${{ env.pythonLocation }} ${{ hashFiles('tests/requirements-linting.txt') }} - name: install if: steps.cache.outputs.cache-hit != 'true' run: | make install-linting pip freeze - name: lint run: make lint - name: pyupgrade run: make pyupgrade - name: mypy run: make mypy - name: make history run: python3 ./changes/make_history.py - name: check dist run: make check-dist - name: install node for pyright uses: actions/setup-node@v3 with: node-version: '14' - run: npm install -g pyright - run: make pyright docs-build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: 3.9 - uses: actions/cache@v3 id: cache with: path: ${{ env.pythonLocation }} key: > docs-build ${{ runner.os }} ${{ env.pythonLocation }} ${{ hashFiles('setup.py') }} ${{ hashFiles('requirements.txt') }} ${{ hashFiles('docs/requirements.txt') }} - name: install if: steps.cache.outputs.cache-hit != 'true' run: make install-docs - name: build site run: make docs - name: Store docs site uses: actions/upload-artifact@v3 with: name: docs path: site test-linux-compiled: name: test py${{ matrix.python-version }} on linux compiled runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11.0-beta.5'] env: PYTHON: ${{ matrix.python-version }} OS: ubuntu steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - uses: actions/cache@v3 id: cache with: path: ${{ env.pythonLocation }} key: > test-linux-compiled ${{ runner.os }} ${{ env.pythonLocation }} ${{ hashFiles('setup.py') }} ${{ hashFiles('requirements.txt') }} ${{ hashFiles('tests/requirements-testing.txt') }} - name: install run: make install-testing - name: compile run: | make build-trace python -c "import sys, pydantic; print('compiled:', pydantic.compiled); sys.exit(0 if pydantic.compiled else 1)" ls -alh ls -alh pydantic/ - run: mkdir coverage - name: test run: make test env: COVERAGE_FILE: coverage/.coverage.linux-py${{ matrix.python-version }}-compiled CONTEXT: linux-py${{ matrix.python-version }}-compiled - name: store coverage files uses: actions/upload-artifact@v3 with: name: coverage path: coverage test-not-compiled: name: test py${{ matrix.python-version }} on ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu, macos, windows] python-version: ['3.7', '3.8', '3.9', '3.10'] include: - os: ubuntu env: PYTHON: ${{ matrix.python-version }} OS: ${{ matrix.os }} COMPILED: no DEPS: yes runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - uses: actions/cache@v3 id: cache with: path: ${{ env.pythonLocation }} key: > test-not-compiled ${{ runner.os }} ${{ env.pythonLocation }} ${{ hashFiles('setup.py') }} ${{ hashFiles('requirements.txt') }} ${{ hashFiles('tests/requirements-testing.txt') }} - name: install run: make install-testing - run: pip freeze - run: mkdir coverage - name: test with deps run: make test env: COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}-with-deps CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}-with-deps - name: uninstall deps run: pip uninstall -y cython email-validator devtools python-dotenv - name: test without deps run: make test env: COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}-without-deps CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}-without-deps - name: store coverage files uses: actions/upload-artifact@v3 with: name: coverage path: coverage test-old-mypy: name: test mypy v${{ matrix.mypy-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: mypy-version: ['0.910', '0.921', '0.931', '0.942', '0.950', '0.960'] steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: '3.10' - name: install run: | make install-testing pip freeze - name: uninstall deps run: pip uninstall -y mypy tomli toml - name: install specific mypy version run: pip install mypy==${{ matrix.mypy-version }} - run: mkdir coverage - name: run tests run: pytest --cov=pydantic tests/mypy env: COVERAGE_FILE: coverage/.coverage.linux-py3.10-mypy${{ matrix.mypy-version }} CONTEXT: linux-py3.10-mypy${{ matrix.mypy-version }} - name: store coverage files uses: actions/upload-artifact@v3 with: name: coverage path: coverage coverage-combine: needs: [test-linux-compiled, test-not-compiled, test-old-mypy] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.8' - name: get coverage files uses: actions/download-artifact@v3 with: name: coverage path: coverage - run: pip install coverage - run: ls -la coverage - run: coverage combine coverage - run: coverage report - run: coverage html --show-contexts - name: Store coverage html uses: actions/upload-artifact@v3 with: name: coverage-html path: htmlcov test-fastapi: name: test fastAPI runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: '3.10' - name: install run: make install-testing - name: test run: make test-fastapi build: name: build py3.${{ matrix.python-version }} on ${{ matrix.platform || matrix.os }} needs: [lint, test-linux-compiled, test-not-compiled, test-old-mypy, test-fastapi] if: "success() && (startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/master')" strategy: fail-fast: false matrix: os: [ubuntu , macos , windows] python-version: ['7', '8', '9', '10'] include: - os: ubuntu platform: linux - os: windows ls: dir runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: '3.8' - name: install run: pip install -U twine setuptools wheel cibuildwheel - name: build sdist if: matrix.os == 'ubuntu' && matrix.python-version == '9' run: python setup.py sdist bdist_wheel env: SKIP_CYTHON: 1 - name: build ${{ matrix.platform || matrix.os }} binaries run: cibuildwheel --output-dir dist env: PIP: 'pip' CIBW_BUILD: 'cp3${{ matrix.python-version }}-*' CIBW_SKIP: '*-win32' CIBW_PLATFORM: '${{ matrix.platform || matrix.os }}' CIBW_BEFORE_BUILD: 'pip install -U cython' CIBW_TEST_REQUIRES: 'pytest==6.2.5 pytest-mock==3.6.1' CIBW_TEST_COMMAND: 'pytest {project}/tests' CIBW_MANYLINUX_X86_64_IMAGE: 'manylinux2014' CIBW_MANYLINUX_I686_IMAGE: 'manylinux2014' CIBW_ARCHS_MACOS: 'x86_64 arm64' CIBW_TEST_SKIP: '*-macosx_arm64' # see https://cibuildwheel.readthedocs.io/en/stable/faq/#universal2 # TODO build windows 32bit binaries - name: list dist files run: | ${{ matrix.ls || 'ls -lh' }} dist/ twine check dist/* - name: Store dist artifacts uses: actions/upload-artifact@v3 with: name: pypi_files path: dist deploy: name: Deploy needs: build if: "success() && startsWith(github.ref, 'refs/tags/')" runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: set up python uses: actions/setup-python@v4 with: python-version: '3.8' - name: get dist artifacts uses: actions/download-artifact@v3 with: name: pypi_files path: dist - name: get docs uses: actions/download-artifact@v3 with: name: docs path: site - name: install run: | make install-docs pip install -U twine - name: twine check run: | twine check dist/* ls -lh dist - name: check tag run: ./tests/check_tag.py - name: upload to pypi run: twine upload dist/* env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.pypi_token }} - name: publish docs run: make publish-docs env: NETLIFY: ${{ secrets.netlify_token }}