name: Tests on: push: branches: - main - "maintenance/**" paths-ignore: - doc/data/messages/** pull_request: branches: - main - "maintenance/**" env: CACHE_VERSION: 3 KEY_PREFIX: venv permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: tests-linux: name: run / ${{ matrix.python-version }} / Linux runs-on: ubuntu-latest timeout-minutes: 25 strategy: fail-fast: false matrix: python-version: [3.8, 3.9, "3.10", "3.11"] outputs: python-key: ${{ steps.generate-python-key.outputs.key }} steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.6.0 with: python-version: ${{ matrix.python-version }} check-latest: true - name: Generate partial Python venv restore key id: generate-python-key run: >- echo "key=${{ env.KEY_PREFIX }}-${{ env.CACHE_VERSION }}-${{ hashFiles('pyproject.toml', 'requirements_test.txt', 'requirements_test_min.txt', 'requirements_test_pre_commit.txt') }}" >> $GITHUB_OUTPUT - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv key: >- ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ steps.generate-python-key.outputs.key }} - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | python -m venv venv . venv/bin/activate python -m pip install -U pip setuptools wheel pip install -U -r requirements_test.txt - name: Run pytest run: | . venv/bin/activate pip list | grep 'astroid\|pylint' pytest --durations=10 --benchmark-disable --cov --cov-report= tests/ - name: Run functional tests with minimal messages config run: | . venv/bin/activate pip list | grep 'astroid\|pylint' pytest -vv --minimal-messages-config tests/test_functional.py - name: Upload coverage artifact uses: actions/upload-artifact@v3.1.2 with: name: coverage-${{ matrix.python-version }} path: .coverage coverage: name: process / coverage runs-on: ubuntu-latest timeout-minutes: 5 needs: tests-linux steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python 3.11 id: python uses: actions/setup-python@v4.6.0 with: python-version: "3.11" check-latest: true - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv fail-on-cache-miss: true key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ needs.tests-linux.outputs.python-key }} - name: Download all coverage artifacts uses: actions/download-artifact@v3.0.2 - name: Combine coverage results run: | . venv/bin/activate coverage combine coverage*/.coverage coverage xml - uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true verbose: true benchmark-linux: name: run benchmark / ${{ matrix.python-version }} / Linux runs-on: ubuntu-latest timeout-minutes: 10 needs: tests-linux strategy: fail-fast: false matrix: python-version: ["3.11"] steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.6.0 with: python-version: ${{ matrix.python-version }} check-latest: true - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv fail-on-cache-miss: true key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ needs.tests-linux.outputs.python-key }} - name: Run pytest run: | . venv/bin/activate pip install pygal pip install -e . pip list | grep 'astroid\|pylint' pytest --exitfirst \ --benchmark-only \ --benchmark-autosave \ --benchmark-save-data \ --benchmark-group-by="group" - name: Create partial artifact name suffix id: artifact-name-suffix run: >- echo "datetime="$(date "+%Y%m%d_%H%M") >> $GITHUB_OUTPUT - name: Upload benchmark artifact uses: actions/upload-artifact@v3.1.2 with: name: benchmark-${{ runner.os }}-${{ matrix.python-version }}_${{ steps.artifact-name-suffix.outputs.datetime }} path: .benchmarks/ tests-windows: name: run / ${{ matrix.python-version }} / Windows runs-on: windows-latest timeout-minutes: 25 needs: tests-linux strategy: fail-fast: false matrix: python-version: [3.8, 3.9, "3.10", "3.11"] steps: - name: Set temp directory run: echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV # Workaround to set correct temp directory on Windows # https://github.com/actions/virtual-environments/issues/712 - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.6.0 with: python-version: ${{ matrix.python-version }} check-latest: true - name: Generate partial Python venv restore key id: generate-python-key run: >- echo "key=venv-${{ env.CACHE_VERSION }}-${{ hashFiles('pyproject.toml', 'requirements_test_min.txt') }}" >> $env:GITHUB_OUTPUT - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv key: >- ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ steps.generate-python-key.outputs.key }} - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | python -m venv venv . venv\\Scripts\\activate python -m pip install -U pip setuptools wheel pip install -U -r requirements_test_min.txt - name: Run pytest run: | . venv\\Scripts\\activate pip list | grep 'astroid\|pylint' pytest --durations=10 --benchmark-disable tests/ tests-macos: name: run / ${{ matrix.python-version }} / macOS runs-on: macos-latest timeout-minutes: 25 needs: tests-linux strategy: fail-fast: false matrix: # We only run on the oldest supported version on Mac python-version: [3.8] steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.6.0 with: python-version: ${{ matrix.python-version }} check-latest: true - name: Generate partial Python venv restore key id: generate-python-key run: >- echo "key=venv-${{ env.CACHE_VERSION }}-${{ hashFiles('pyproject.toml', 'requirements_test_min.txt') }}" >> $GITHUB_OUTPUT - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv key: >- ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ steps.generate-python-key.outputs.key }} - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | python -m venv venv . venv/bin/activate python -m pip install -U pip setuptools wheel pip install -U -r requirements_test_min.txt - name: Run pytest run: | . venv/bin/activate pip list | grep 'astroid\|pylint' pytest --durations=10 --benchmark-disable tests/ tests-pypy: name: run / ${{ matrix.python-version }} / Linux runs-on: ubuntu-latest timeout-minutes: 25 strategy: fail-fast: false matrix: python-version: ["pypy-3.8", "pypy-3.9"] steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.6.0 with: python-version: ${{ matrix.python-version }} check-latest: true - name: Generate partial Python venv restore key id: generate-python-key run: >- echo "key=venv-${{ env.CACHE_VERSION }}-${{ hashFiles('pyproject.toml', 'requirements_test_min.txt') }}" >> $GITHUB_OUTPUT - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv key: >- ${{ runner.os }}-${{ matrix.python-version }}-${{ steps.generate-python-key.outputs.key }} - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | python -m venv venv . venv/bin/activate python -m pip install -U pip setuptools wheel pip install -U -r requirements_test_min.txt - name: Run pytest run: | . venv/bin/activate pip list | grep 'astroid\|pylint' pytest --durations=10 --benchmark-disable tests/