Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ version: 2
updates:
- package-ecosystem: pip
directory: "/"
exclude-paths:
- "requirements/**"
schedule:
interval: daily
open-pull-requests-limit: 10
Expand Down
54 changes: 18 additions & 36 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,13 @@ jobs:
python-version: "3.x"
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-pydocstyle-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pydocstyle-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: Pydocstyle
run: pydocstyle pyvlx test/*.py examples/*.py
flake8:
Expand All @@ -42,16 +39,13 @@ jobs:
python-version: "3.x"
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-flake8-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-flake8-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: Flake8
run: flake8
pylint:
Expand All @@ -64,16 +58,13 @@ jobs:
python-version: "3.x"
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-pylint-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pylint-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: Linter Pylint
run: pylint pyvlx test/*.py examples/*.py
isort:
Expand All @@ -86,16 +77,13 @@ jobs:
python-version: "3.x"
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-isort-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-isort-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: Isort
run: isort --check-only test examples pyvlx
mypy:
Expand All @@ -111,16 +99,13 @@ jobs:
python-version: ${{ matrix.python-version }}
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-mypy-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-mypy-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: Mypy
run: mypy pyvlx
pytest:
Expand All @@ -136,16 +121,13 @@ jobs:
python-version: ${{ matrix.python-version }}
- name: Cache pip packages
uses: actions/cache@v5
env:
cache-name: cache-pypi-modules
with:
# pip cache files are stored in `~/.cache/pip` on Linux
path: ~/.cache/pip
key: ${{ runner.os }}-pytest-${{ env.cache-name }}-${{ hashFiles('pyproject.toml', 'requirements/production.in', 'requirements/testing.in', 'requirements/production.txt', 'requirements/testing.txt') }}
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pytest-${{ env.cache-name }}-
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements/testing.txt
run: pip install -e .[dev]
- name: pytest
# run the tests, produce a .coverage.$pyversion file
run: pytest --cov
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependabot-refresh-requirements.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
python-version: "3.x"

- name: Install uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v7

- name: Regenerate requirements
run: |
Expand Down
39 changes: 5 additions & 34 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ This document describes local checks, dependency management, and release-related
Install development dependencies:

```bash
# Fully locked test/lint environment (including package install)
pip install -r requirements/testing.txt
pip install -e .[dev]
```

Run the full local check suite:
Expand Down Expand Up @@ -36,49 +35,21 @@ make coverage

## Dependency model

- `pyproject.toml` is the **single source of truth** for all dependency declarations:
- `project.dependencies` — runtime requirements with capped major versions (`>=X.Y,<(X+1).0`), keeping the library flexible for consumers.
- `project.optional-dependencies.test`, `.lint`, `.release` — dev/CI dependencies pinned to exact versions (`==X.Y.Z`) so builds are reproducible and Dependabot can detect and propose updates.
- `requirements/*.in` describe locked environment inputs for `uv pip compile`.
- `requirements/*.txt` are fully resolved lock files (including transitive dependencies) for reproducible installs in CI and local development.
- Generated requirements files are committed.
`pyproject.toml` is the single source of truth for all dependency declarations:

## Requirements handling

Regenerate lock files after dependency changes in `pyproject.toml` or updates to `requirements/*.in`:

```bash
make requirements
```

PR checklist:

- If `pyproject.toml` dependency versions changed, run `make requirements` and commit updated `requirements/*.txt` in the same PR.
- If `requirements/*.in` changed, run `make requirements` and commit updated `requirements/*.txt` in the same PR.
- If dependencies did not change, do not modify `requirements/*.txt`.
- For Dependabot PRs, this is handled automatically by the refresh workflow, see below.

Equivalent direct commands:

```bash
python3 -m pip install uv
uv pip compile --strip-extras requirements/production.in --output-file requirements/production.txt
uv pip compile --strip-extras requirements/testing.in --output-file requirements/testing.txt
uv pip compile --strip-extras requirements/release.in --output-file requirements/release.txt
```
- **Runtime deps** (`project.dependencies`) use `>=X.Y,<(X+1).0` — flexible for library consumers, capped at the next major version to prevent surprise breakage.
- **Dev deps** (`project.optional-dependencies.dev`, `.release`) are pinned to exact versions (`==X.Y.Z`) so CI builds are reproducible and Dependabot can detect and propose updates.

### How Dependabot updates work

1. Dependabot monitors `pyproject.toml` for outdated `==` pins and creates a PR bumping them.
2. The `dependabot-refresh-requirements` workflow auto-triggers on the PR, regenerates `requirements/*.txt` lock files via `uv pip compile`, and pushes the updated files.
3. CI runs against the fully locked environment. You review and merge.
2. CI runs against the updated pins. You review and merge.

## CI vs manual operations

| Task | Normally handled by CI | Manual equivalent |
|---|---|---|
| Run linting and tests | `.github/workflows/ci.yml` | `make ci` |
| Regenerate requirements for Dependabot pip PRs | `.github/workflows/dependabot-refresh-requirements.yml` | `make requirements` |
| Build distributions | `.github/workflows/publish.yml` | `make build` |
| Publish distributions | `.github/workflows/publish.yml` via `pypa/gh-action-pypi-publish` | `make pypi` |

Expand Down
10 changes: 1 addition & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ all:
@echo ""
@echo "build -- build python package"
@echo ""
@echo "requirements -- generate requirements/*.txt from requirements/*.in"
@echo ""
@echo "pypi -- upload package to pypi"
@echo ""

Expand Down Expand Up @@ -57,10 +55,4 @@ pydocstyle:
coverage:
pytest --cov --cov-report html --verbose

requirements:
@python3 -m pip install uv
@python3 -m uv pip compile --strip-extras requirements/production.in --output-file requirements/production.txt
@python3 -m uv pip compile --strip-extras requirements/testing.in --output-file requirements/testing.txt
@python3 -m uv pip compile --strip-extras requirements/release.in --output-file requirements/release.txt

.PHONY: test build requirements
.PHONY: test build
4 changes: 1 addition & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,12 @@ dependencies = [
]

[project.optional-dependencies]
test = [
dev = [
"pytest==9.0.2",
"pytest-cov==7.0.0",
"mypy==1.19.1",
"types-PyYAML==6.0.12.20250915",
"types-Deprecated==1.3.1.20260130",
]
lint = [
"isort==7.0.0",
"flake8==7.3.0",
"flake8-isort==7.0.0",
Expand Down
1 change: 0 additions & 1 deletion requirements/production.in

This file was deleted.

14 changes: 0 additions & 14 deletions requirements/production.txt

This file was deleted.

2 changes: 0 additions & 2 deletions requirements/release.in

This file was deleted.

85 changes: 0 additions & 85 deletions requirements/release.txt

This file was deleted.

2 changes: 0 additions & 2 deletions requirements/testing.in

This file was deleted.

Loading
Loading