From 40c29a049444880d4faec8ecd61dfd48a41c4a2f Mon Sep 17 00:00:00 2001 From: Evgen Fil Date: Tue, 30 Aug 2022 03:23:43 +0500 Subject: [PATCH] PyPy support (#985) * Run tests on PyPy (#984) Remove unnecessary `jobs.build.strategy.max_parallel` attribute * Workaround `symlink() is not implemented for PyPy on Windows` * Quote conditions in tests workflow file * Fix quoting in Poetry installation script * Adjust timeout when testing on pypy Running the tests with coverage pytest plugin makes some tests run slower than expected * Try to fix uvloop build errors on macos-latest * Try to fix uvloop build errors on macos-latest (2) * Adjust timeout when testing on pypy (2) * Increase timeout even more * Try to fix uvloop build errors on macos-latest (3) * Update tests.yml, revert changes in test files Add and improve step names Merge "Lint code" and "Check code-style" steps Don't install uvloop on macos when running on pypy Don't run tests with coverage on pypy Remove test timeout adjustments * Fix condition * Update README, add changelog * Put environment info (`IS_PYPY`, `IS_WINDOWS`) into environment variables * Fix conditions --- .github/workflows/tests.yml | 58 +++++++++++++++++++++++++------------ CHANGES/985.feature | 1 + README.rst | 1 + 3 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 CHANGES/985.feature diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2dfebe63..3ababc4c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,7 +32,6 @@ jobs: build: strategy: fail-fast: false - max-parallel: 9 matrix: os: - ubuntu-latest @@ -42,6 +41,8 @@ jobs: - '3.8' - '3.9' - '3.10' + - 'pypy3.8' + - 'pypy3.9' defaults: # Windows sucks. Force use bash instead of PowerShell @@ -50,8 +51,22 @@ jobs: 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: - - uses: actions/checkout@master + - name: Checkout code + uses: actions/checkout@master - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v4 @@ -60,14 +75,24 @@ jobs: - name: Install and configure Poetry uses: snok/install-poetry@v1 + if: "env.IS_PYPY == 'false' || env.IS_WINDOWS == 'false'" with: version: 1.1.11 virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true + - name: Install and configure Poetry (PyPy on Windows) + if: "env.IS_PYPY == 'true' && env.IS_WINDOWS == 'true'" + 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 - if: ${{ matrix.os != 'windows-latest' }} + if: ${{ env.IS_WINDOWS == 'false' }} uses: shogo82148/actions-setup-redis@v1 with: redis-version: 6 @@ -79,32 +104,29 @@ jobs: path: .venv key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }}-${{ secrets.CACHE_VERSION }} - - name: Project dependencies + - name: Install project dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: | - poetry install --no-interaction -E fast -E redis -E proxy -E i18n -E docs + flags="" + [[ "$IS_PYPY" == "false" ]] && 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 - - - name: Check code-style (Black) - run: | poetry run black --check --diff aiogram tests - - name: Run tests (with Redis) - if: ${{ matrix.os != 'windows-latest' }} + - name: Run tests run: | - poetry run pytest --cov=aiogram --cov-config .coveragerc --cov-report=xml --redis redis://localhost:6379/0 + flags="" + [[ "$IS_PYPY" == "false" ]] && flags="$flags --cov=aiogram --cov-config .coveragerc --cov-report=xml" + [[ "$IS_WINDOWS" == "false" ]] && flags="$flags --redis redis://localhost:6379/0" + poetry run pytest $flags - - name: Run tests (without Redis) - # Redis can't be used on GitHub Windows Runners - if: ${{ matrix.os == 'windows-latest' }} - run: | - poetry run pytest --cov=aiogram --cov-config .coveragerc --cov-report=xml - - - uses: codecov/codecov-action@v1 + - name: Upload coverage data + if: "env.IS_PYPY == 'false'" + uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} file: coverage.xml diff --git a/CHANGES/985.feature b/CHANGES/985.feature new file mode 100644 index 00000000..d7f8a052 --- /dev/null +++ b/CHANGES/985.feature @@ -0,0 +1 @@ +Add PyPy support and run tests under PyPy diff --git a/README.rst b/README.rst index 312cc63f..3be42b83 100644 --- a/README.rst +++ b/README.rst @@ -61,6 +61,7 @@ Features - Asynchronous (`asyncio docs `_, :pep:`492`) - Has type hints (:pep:`484`) and can be used with `mypy `_ +- Supports `PyPy `_ - Supports `Telegram Bot API 5.3 `_ - Telegram Bot API integration code was `autogenerated `_ and can be easily re-generated when API gets updated - Updates router (Blueprints)