Skip to content

update lint config #902

update lint config

update lint config #902

Workflow file for this run

# Github Action Workflow enforcing our code style and running tests.
name: Lint & Test
# Trigger the workflow on both push (to the main repository)
# and pull requests (against the main repository, but from any repo).
on:
push:
branches:
- main
pull_request:
# Brand new concurrency setting! This ensures that not more than one run can be triggered for the same commit.
# It is useful for pull requests coming from the main repository since both triggers will match.
concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.ref }}
cancel-in-progress: true
env:
# Configure pip to cache dependencies and do a user install
PIP_NO_CACHE_DIR: false
PIP_USER: 1
PYTHON_VERSION: 3.8
# Make sure package manager does not use virtualenv
POETRY_VIRTUALENVS_CREATE: false
# Specify explicit paths for python dependencies and the pre-commit
# environment so we know which directories to cache
POETRY_CACHE_DIR: ${{ github.workspace }}/.cache/py-user-base
PYTHONUSERBASE: ${{ github.workspace }}/.cache/py-user-base
PRE_COMMIT_HOME: ${{ github.workspace }}/.cache/pre-commit-cache
jobs:
lint:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python_version: ['3.8', '3.9','3.10']
env:
PYTHON_VERSION: ${{ matrix.python_version }}
steps:
- name: Add custom PYTHONUSERBASE to PATH
run: echo '${{ env.PYTHONUSERBASE }}/bin/' >> $GITHUB_PATH
# Checks out the repository in the current folder.
- name: Checks out repository
uses: actions/checkout@v4
# Set up the right version of Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
id: python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
# This step caches our Python dependencies. To make sure we
# only restore a cache when the dependencies, the python version,
# the runner operating system, and the dependency location haven't
# changed, we create a cache key that is a composite of those states.
#
# Only when the context is exactly the same, we will restore the cache.
- name: Python Dependency Caching
uses: actions/cache@v4
id: python_cache
with:
path: ${{ env.PYTHONUSERBASE }}
key: "python-0-${{ runner.os }}-${{ env.PYTHONUSERBASE }}-\
${{ steps.python.outputs.python-version }}-\
${{ hashFiles('./pyproject.toml', './poetry.lock') }}"
# Install our dependencies if we did not restore a dependency cache
- name: Install dependencies using poetry
# if: steps.python_cache.outputs.cache-hit != 'true'
run: |
pip install poetry
poetry install --no-interaction --no-ansi
# This step caches our pre-commit environment. To make sure we
# do create a new environment when our pre-commit setup changes,
# we create a cache key based on relevant factors.
- name: Pre-commit Environment Caching
uses: actions/cache@v4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: "precommit-0-${{ runner.os }}-${{ env.PRE_COMMIT_HOME }}-\
${{ steps.python.outputs.python-version }}-\
${{ hashFiles('./.pre-commit-config.yaml') }}"
# We will not run `black` or `flake8` here, as we will use a separate
# black and flake8 action. As pre-commit does not support user installs,
# we set PIP_USER=0 to not do a user install.
- name: Run pre-commit hooks
id: pre-commit
run: export PIP_USER=0; SKIP="no-commit-to-branch,black,flake8" poetry run pre-commit run --all-files
# Run black seperately as we don't want to reformat the files
# just error if something isn't formatted correctly.
- name: Check files with black
id: black
if: always() && (steps.pre-commit.outcome == 'success' || steps.pre-commit.outcome == 'failure')
run: poetry run black . --check --diff --color
# Run flake8 and have it format the linting errors in the format of
# the GitHub Workflow command to register error annotations. This
# means that our flake8 output is automatically added as an error
# annotation to both the run result and in the "Files" tab of a
# pull request.
#
# Format used:
# ::error file={filename},line={line},col={col}::{message}
- name: Run flake8
id: flake8
if: always() && (steps.pre-commit.outcome == 'success' || steps.pre-commit.outcome == 'failure')
run: "poetry run flake8 \
--format='::error file=%(path)s,line=%(row)d,col=%(col)d::\
[flake8] %(code)s: %(text)s'"
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python_version: ['3.8', '3.9','3.10']
os: [ubuntu-latest, windows-latest, macos-latest]
env:
PYTHON_VERSION: ${{ matrix.python_version }}
steps:
- name: Add custom PYTHONUSERBASE to PATH
run: echo '${{ env.PYTHONUSERBASE }}/bin/' >> $GITHUB_PATH
# Checks out the repository in the current folder.
- name: Checks out repository
uses: actions/checkout@v4
# Set up the right version of Python
- name: Set up Python ${{ env.PYTHON_VERSION }}
id: python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
# This step caches our Python dependencies. To make sure we
# only restore a cache when the dependencies, the python version,
# the runner operating system, and the dependency location haven't
# changed, we create a cache key that is a composite of those states.
#
# Only when the context is exactly the same, we will restore the cache.
- name: Python Dependency Caching
uses: actions/cache@v4
id: python_cache
with:
path: ${{ env.PYTHONUSERBASE }}
key: "python-0-${{ runner.os }}-${{ env.PYTHONUSERBASE }}-\
${{ steps.python.outputs.python-version }}-\
${{ hashFiles('./pyproject.toml', './poetry.lock') }}"
# Install our dependencies if we did not restore a dependency cache
- name: Install dependencies using poetry
# if: steps.python_cache.outputs.cache-hit != 'true'
run: |
python -m pip install poetry
python -m poetry install --no-interaction --no-ansi
# Run tests with pytest-cov to generate a coverage report
# This is saved to ./.coverage to be used by codecov to link a
# coverage report to github.
- name: Run tests and generate coverage report
id: run_tests
run: poetry run pytest tests -n auto --dist loadfile --cov --disable-warnings -q
# This step will publish the coverage reports to coveralls.io and
# print a "job" link in the output of the GitHub Action
- name: Publish coverage report to coveralls.io
# upload coverage even if a test run failed
# this is a test, and may be removed in the future
if: always() && (steps.run_tests.outcome == 'success' || steps.run_tests.outcome == 'failure')
# important that we don't fail the workflow when coveralls is down
continue-on-error: true
env:
COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERALLS_FLAG_NAME: coverage-${{ runner.os }}-python-${{ env.PYTHON_VERSION }}
COVERALLS_PARALLEL: true
COVERALLS_SERVICE_NAME: github
run: poetry run coveralls
coveralls-finish:
name: Indicate completion to coveralls.io
runs-on: ubuntu-latest
needs: test
# we don't want to fail the workflow when coveralls is down
continue-on-error: true
# we always want to ensure we attempt to send a finish to coveralls
if: always()
steps:
# Set up a consistent version of Python
- name: Set up Python 3.9
id: python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Coveralls Finished
continue-on-error: true
env:
COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERALLS_SERVICE_NAME: github
# NOTE: this has a small thing where this will not always be the same with the poetry.lock file
# given how this is installed for one api request, its not worth pinning to me.
# any bugs caused by this can be solved when they occur
run: |
python3 -m pip install --upgrade coveralls
python3 -m coveralls --finish
artifact:
name: Generate Artifact
if: always()
needs: [lint,test]
runs-on: ubuntu-latest
steps:
# Prepare the Pull Request Payload artifact. If this fails, we
# we fail silently using the `continue-on-error` option. It's
# nice if this succeeds, but if it fails for any reason, it
# does not mean that our lint-test checks failed.
- name: Prepare Pull Request Payload artifact
id: prepare-artifact
if: always() && github.event_name == 'pull_request'
continue-on-error: true
run: cat $GITHUB_EVENT_PATH | jq '.pull_request' > pull_request_payload.json
# This only makes sense if the previous step succeeded. To
# get the original outcome of the previous step before the
# `continue-on-error` conclusion is applied, we use the
# `.outcome` value. This step also fails silently.
- name: Upload a Build Artifact
if: always() && steps.prepare-artifact.outcome == 'success'
continue-on-error: true
uses: actions/upload-artifact@v2
with:
name: pull-request-payload
path: pull_request_payload.json