name: Tests on: push: branches: - dev-3.x paths: - ".github/workflows/tests.yml" - "aiogram/**" - "tests/**" - "codecov.yaml" - "pyproject.toml" pull_request: branches: - dev-3.x paths: - ".github/workflows/tests.yml" - "aiogram/**" - "tests/**" - "pyproject.toml" jobs: build: strategy: fail-fast: false matrix: os: - ubuntu-latest - macos-latest - windows-latest python-version: - '3.8' - '3.9' - '3.10' - '3.11' - 'pypy3.8' - 'pypy3.9' defaults: # Windows sucks. Force use bash instead of PowerShell run: shell: bash runs-on: ${{ matrix.os }} env: # We disable some features for PyPy by this environment variable such as: # – Installation of `fast` extras: `uvloop` on PyPy is useless and may be even slower # than the default loop; # – Coverage reports: code introspection disables any optimizations, so tests with # coverage enabled are very slow on PyPy. # More: https://www.pypy.org/performance.html IS_PYPY: ${{ startswith(matrix.python-version, 'pypy') }} # Windows has also some limitations: # – Redis is not supported on GitHub Windows runners; # – Poetry installer doesn't work on Windows with PyPy. IS_WINDOWS: ${{ startswith(matrix.os, 'windows') }} steps: - name: Checkout code uses: actions/checkout@master - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Setup redis if: ${{ env.IS_WINDOWS == 'false' }} uses: shogo82148/actions-setup-redis@v1 with: redis-version: 6 - name: Load cached venv id: cached-pip-dependencies uses: actions/cache@v2 with: path: .venv key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/pyproject.toml') }}-${{ secrets.CACHE_VERSION }} - name: Install project dependencies if: steps.cached-pip-dependencies.outputs.cache-hit != 'true' run: | virtualenv .venv source .venv/bin/activate extras="redis,proxy,i18n,test" [[ "$IS_PYPY" == "false" ]] && extras="$extras,fast" pip install -e .[$extras] - name: Lint code if: "env.IS_PYPY == 'false'" run: | ruff --format=github aiogram examples mypy aiogram black --check --diff aiogram tests - name: Run tests run: | flags="" [[ "$IS_PYPY" == "false" ]] && flags="$flags --cov=aiogram --cov-config .coveragerc --cov-report=xml" [[ "$IS_WINDOWS" == "false" ]] && flags="$flags --redis redis://localhost:6379/0" pytest $flags - name: Upload coverage data if: "env.IS_PYPY == 'false'" uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} file: coverage.xml flags: unittests name: py-${{ matrix.python-version }}-${{ matrix.os }} fail_ci_if_error: true