Skip to content
Merged
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
8 changes: 4 additions & 4 deletions .agents/project.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@

| Task | Command |
|---|---|
| Install dependencies | `uv sync --group dev --all-extras`, as CI does. `make install` and CONTRIBUTING.md leave out `--all-extras`. Without it, `mypy` cannot load the `pydantic.mypy` plugin and 13 test modules fail at collection. |
| Install dependencies | `make install`: `uv sync --group dev --all-extras`, as CI does. Without `--all-extras`, `mypy` cannot load the `pydantic.mypy` plugin and 13 test modules fail at collection. |
| Format | `make fmt`: `uv run ruff format .`, then `uv run ruff check --fix .` |
| Lint and type-check | `make check`: `uv run ruff check .`, `uv run ruff format --check .`, `uv run mypy grpc_server_kit` |
| Test | `make test-unit` (`uv run pytest -m unit`) and `make test-integration` (`uv run pytest -m integration`). `make test` runs both with `--cov-fail-under=90`. CI runs `uv run pytest -m unit --cov=grpc_server_kit --cov-report=xml --cov-fail-under=90` on Python 3.12 and 3.13, and runs `uv run pytest -m integration` in a separate job. |
| Test | `make test-unit` (`uv run pytest -m unit`) and `make test-integration` (`uv run pytest -m integration`). `make test` runs both with `--cov-fail-under=90`. CI runs `uv run pytest -m unit --cov=grpc_server_kit --cov-report=xml --cov-fail-under=90` on Python 3.12, 3.13 and 3.14, and runs `uv run pytest -m integration` in a separate job. |
| Run locally | A library: nothing to run. Each script in `examples/` starts a server and exits on its own, for example `uv run python examples/minimal_server.py`. The docs: `make docs-serve`. |
| Stop the local run | Ctrl+C in the terminal of `make docs-serve`. The examples stop by themselves. |

Expand All @@ -29,7 +29,7 @@

## Boundaries

- `CHANGELOG.md` is generated by release-please. Never edit it by hand, and never add an `## [Unreleased]` section, even though the pull request template's checklist asks for one. `docs/changelog.md` is an untracked copy that the docs build makes.
- `CHANGELOG.md` is generated by release-please. Never edit it by hand, and never add an `## [Unreleased]` section. `docs/changelog.md` is an untracked copy that the docs build makes.
- The version lives in two places: `grpc_server_kit/__version__.py`, on the line marked `# x-release-please-version`, and `.release-please-manifest.json`. release-please bumps both. Never change them by hand.
- `docs/agents.md` is part of the public API. It changes in the same pull request as the API, and each new docs page adds a row to its documentation map (CONTRIBUTING.md, "The agents page").
- Some files come from the engineering-assets hub (`AGENTS.md` explains how it works):
Expand All @@ -43,7 +43,7 @@
## Notes

- Releases: release-please opens its pull request with the workflow's own token, so CI does not start on it and the required `All checks passed` check never reports. Close and reopen the release pull request to run CI, then merge it. When the Release Please run completes, `publish.yml` publishes the `grpc-server-kit-vX.Y.Z` tag to PyPI. Before 1.0, a breaking change bumps the minor version.
- Tests: every test carries the marker `unit` or `integration` (`--strict-markers`). `tests/conftest.py` sets the marker by directory, and each module also declares `pytestmark`. The tests in `tests/integration/` start a real `grpc.aio` server in the same process on `127.0.0.1`. They need no Docker, although CONTRIBUTING.md says they do.
- Tests: every test carries the marker `unit` or `integration` (`--strict-markers`). `tests/conftest.py` sets the marker by directory, and each module also declares `pytestmark`. The tests in `tests/integration/` start a real `grpc.aio` server in the same process on `127.0.0.1`. They need no Docker.
- Test style (CONTRIBUTING.md):
- one behaviour per test;
- Arrange, Act, Assert, in that order;
Expand Down
4 changes: 0 additions & 4 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
blank_issues_enabled: false
contact_links:
- name: Question or discussion
url: https://github.com/bedrock-python/grpc-server-kit/discussions
about: Ask a question or start a discussion about grpc-server-kit
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

- [ ] Tests added or updated
- [ ] `make check` passes locally (`ruff` + `mypy`)
- [ ] `CHANGELOG.md` updated under `[Unreleased]`
- [ ] Conventional-commit title (the changelog is generated by Release Please — do not edit it by hand)
- [ ] Documentation updated (if the public API changed), `docs/agents.md` included

## Related issues
Expand Down
9 changes: 2 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.12", "3.13"]
python-version: ["3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
Expand All @@ -49,12 +49,7 @@ jobs:
- uses: astral-sh/setup-uv@v7
- run: uv sync --group dev --all-extras
- name: Run integration tests
run: |
set +e
uv run pytest -m integration
STATUS=$?
set -e
test $STATUS -eq 0 -o $STATUS -eq 5
run: uv run pytest -m integration

# Sentinel job — use this as the single required status check in branch protection.
all-checks-passed:
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Thank you for your interest in contributing! This document covers everything you
```bash
git clone https://github.com/bedrock-python/grpc-server-kit.git
cd grpc-server-kit
uv sync --group dev
uv sync --group dev --all-extras
uv run pre-commit install --hook-type commit-msg
```

Expand All @@ -16,7 +16,7 @@ uv run pre-commit install --hook-type commit-msg
```bash
make check # ruff lint + format check + mypy
make test-unit # unit tests, no Docker required
make test-integration # integration tests, requires Docker
make test-integration # integration tests, in-process gRPC server, no Docker required
make test # full suite with 90% coverage threshold
```

Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.PHONY: test test-unit test-integration fmt check build install docs-serve docs-build clean

install:
uv sync --group dev
uv sync --group dev --all-extras

fmt:
uv run ruff format .
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Software Development :: Libraries :: Python Modules",
"Typing :: Typed",
]
Expand Down
Loading