name: Tests on: push: branches: - dev-3.x paths: - ".github/workflows/tests.yml" - "aiogram/**" - "tests/**" - ".coveragerc" - ".flake8" - "codecov.yaml" - "mypy.ini" - "poetry.lock" - "pyproject.toml" pull_request: branches: - dev-3.x paths: - ".github/workflows/tests.yml" - "aiogram/**" - "tests/**" - ".coveragerc" - ".flake8" - "codecov.yaml" - "mypy.ini" - "poetry.lock" - "pyproject.toml" jobs: build: strategy: fail-fast: false matrix: os: - ubuntu-latest - macos-latest - windows-latest python-version: - '3.8' - '3.9' - '3.10' - 'pypy3.8' - 'pypy3.9' defaults: # Windows sucks. Force use bash instead of PowerShell run: shell: bash runs-on: ${{ matrix.os }} 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: Install and configure Poetry uses: snok/install-poetry@v1 if: "!startswith(matrix.python-version, 'pypy') || matrix.os != 'windows-latest'" with: version: 1.1.11 virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true - name: Install and configure Poetry (PyPy on Windows) # Poetry installer raises an error on Windows PyPy, so it's a separate step if: "startswith(matrix.python-version, 'pypy') && matrix.os == 'windows-latest'" run: | set -eu pip install "poetry==1.1.11" poetry config virtualenvs.create true poetry config virtualenvs.in-project true poetry config installer.parallel true - name: Setup redis # Redis can't be used on GitHub Windows Runners if: ${{ matrix.os != 'windows-latest' }} uses: shogo82148/actions-setup-redis@v1 with: redis-version: 6 - name: Load cached venv id: cached-poetry-dependencies uses: actions/cache@v2 with: path: .venv key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }}-${{ secrets.CACHE_VERSION }} - name: Install project dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' env: # uvloop on macOS on PyPy doesn't compile INSTALL_FAST: ${{ matrix.os != 'macos-latest' || !startswith(matrix.python-version, 'pypy') }} run: | flags="" [[ "$INSTALL_FAST" == "true" ]] && flags="$flags -E fast" poetry install --no-interaction -E redis -E proxy -E i18n -E docs $flags - name: Lint code run: | poetry run flake8 aiogram poetry run mypy aiogram poetry run black --check --diff aiogram tests - name: Run tests env: USE_REDIS: ${{ matrix.os != 'windows-latest' }} # Coverage don't work well on PyPy with tests that have timeout USE_COVERAGE: ${{ !startswith(matrix.python-version, 'pypy') }} run: | flags="" [[ "$USE_COVERAGE" == "true" ]] && flags="$flags --cov=aiogram --cov-config .coveragerc --cov-report=xml" [[ "$USE_REDIS" == "true" ]] && flags="$flags --redis redis://localhost:6379/0" poetry run pytest $flags - name: Upload coverage data if: "!startswith(matrix.python-version, 'pypy')" 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