Skip to content
Latchkey

Linting workflow (tenpy/tenpy)

The Linting workflow from tenpy/tenpy, explained and optimized by Latchkey.

D

CI health: D - needs work

Point runs-on at Latchkey and get caching, run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: tenpy/tenpy.github/workflows/linting.ymlLicense Apache-2.0View source

What it does

This is the Linting workflow from the tenpy/tenpy repository, a real project running GitHub Actions. It is shown here with attribution under its Apache-2.0 license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
name: Linting
# Run linter (flake8) and custom linting script (tests/linting.py)

on:
  # pushes to main
  push:
    branches:
      - main
  # PRs
  pull_request:


jobs:
  lint:
    runs-on: ubuntu-latest
    steps:

    - name: Checkout
      uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: 3.13

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade setuptools build

    - name: Build and install tenpy
      # needed to run custom linting script, which imports tenpy
      run: |
        python -m build .
        python -m pip install ".[lint]"

    - name: Lint python code
      # uses options from pyproject.toml
      run: |
        ruff check

    - name: Lint docs
      # we run flake8 only for RST rules of docstrings in .py files
      # config in .flake8
      run: |
        flake8 --select RST
        sphinx-lint -e all doc -i doc/toycodes -i doc/notebooks --max-line-length=1000 -d default-role

    - name: Run autoformatter
      # uses options from pyproject.toml
      run: |
        ruff format --diff

    - name: Run custom linting script
      run: |
        python ./tests/linting.py

The same workflow, on Latchkey

Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.

name: Linting
# Run linter (flake8) and custom linting script (tests/linting.py)
 
on:
  # pushes to main
  push:
    branches:
      - main
  # PRs
  pull_request:
 
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  lint:
    timeout-minutes: 30
    runs-on: latchkey-small
    steps:
 
    - name: Checkout
      uses: actions/checkout@v4
 
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        cache: 'pip'
        python-version: 3.13
 
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade setuptools build
 
    - name: Build and install tenpy
      # needed to run custom linting script, which imports tenpy
      run: |
        python -m build .
        python -m pip install ".[lint]"
 
    - name: Lint python code
      # uses options from pyproject.toml
      run: |
        ruff check
 
    - name: Lint docs
      # we run flake8 only for RST rules of docstrings in .py files
      # config in .flake8
      run: |
        flake8 --select RST
        sphinx-lint -e all doc -i doc/toycodes -i doc/notebooks --max-line-length=1000 -d default-role
 
    - name: Run autoformatter
      # uses options from pyproject.toml
      run: |
        ruff format --diff
 
    - name: Run custom linting script
      run: |
        python ./tests/linting.py
 

What changed

What Latchkey heals here

This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:

This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow