feat: add Woodpecker CI pipeline and update ruff config #8
No reviewers
Labels
No labels
domain:backend
domain:devops
domain:frontend
status:approved
status:in-progress
status:needs-fix
status:qa
type:bug
type:devops
type:feature
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
forgejo_admin/pal-e-auth!8
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "7-add-woodpecker-ci-pipeline-ruff-config-f"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
.woodpecker.ymlwith lint, test, and publish steps following the standardized pattern from woodpecker-sdkChanges
.woodpecker.yml: New file with three CI steps -- lint (ruff==0.15.2), test (pytest -v), publish (build + twine upload to Forgejo PyPI, main-only)pyproject.toml: Updated[tool.ruff]target-version from py312 to py310 and line-length from 100 to 120src/pal_e_auth/config.py: Reformatted by ruff to unwrap tworaise ValueError(...)statements that now fit within 120 charsTest Plan
ruff check src/ tests/passes (0 errors)ruff format --check src/ tests/passes (all files formatted)pytest tests/ -vpasses (29/29 tests)Review Checklist
from_secretfor all credentialsevent: push, branch: mainonlyRelated Notes
plan-2026-03-01-forgejo-pypi-migration-- Phase 1: add CI + ruff to all reposReview-fix loop: PASS (round 1)
Reviewed the full diff (3 files, +38/-8 lines). No issues found.
Checklist:
.woodpecker.ymlmatches the standardized pattern from woodpecker-sdkruff==0.15.2from_secretfor all credentials, gated to main-only pushconfig.pyis a consequence of the line-length increaseruff checkandruff format --checkboth passtemplate-pr-bodyReady for human review.
PR #8 Review
BLOCKERS
None.
NITS
Ruff
selectincludes"N"(pep8-naming) beyond the standard set.The plan (
plan-2026-03-01-forgejo-pypi-migration) specifies "same rules everywhere: E/F/W/I." The currentpyproject.tomlhasselect = ["E", "F", "I", "N", "W"]. The"N"rule was pre-existing and this PR did not introduce it, but it also did not remove it to match the standardized set. The reference implementation (woodpecker-sdk) uses["E", "F", "W", "I"]only.Recommendation: Either remove
"N"to match the standard, or document the intentional deviation. Since"N"is stricter (additive), keeping it is defensible -- but it breaks the "same rules everywhere" goal. Non-blocking.Explicit test dependency installation vs
.[dev].The test step installs
pytest pytest-asyncio httpxexplicitly rather thanpip install -e ".[dev]". This is a reasonable workaround because pal-e-auth usespoetry-coreas its build backend, and poetry defines dev dependencies under[tool.poetry.group.dev.dependencies]rather than PEP 621[project.optional-dependencies], sopip install -e ".[dev]"would not pick them up. The tradeoff is maintenance drift: if test deps change in pyproject.toml, the CI file must be updated manually. Acceptable for now. Non-blocking.Trailing
-fin branch name.Branch
7-add-woodpecker-ci-pipeline-ruff-config-fhas a trailing-fthat appears to be a truncation artifact or worktree suffix. Cosmetic only, does not affect anything. Non-blocking.SOP COMPLIANCE
7-...matches issue #7)template-pr-body(Summary, Changes, Test Plan, Review Checklist, Related Notes -- all present)plan-2026-03-01-forgejo-pypi-migrationfrom_secret)TECHNICAL REVIEW
.woodpecker.ymlmatches proven woodpecker-sdk pattern (lint/test/publish structure, image, gating)ruff==0.15.2target-version = "py310"andline-length = 120correct$$FORGEJO_PYPI_URL,$$FORGEJO_PUBLISH_USER,$$FORGEJO_PUBLISH_TOKENwithfrom_secret--non-interactiveflag present ontwine uploadevent: push, branch: mainconfig.pychanges are purely mechanical reformatting (line unwrapping due to 100->120 line-length change)VERDICT: APPROVED
Clean PR. The three nits are non-blocking. The pipeline matches the proven pattern, secrets are handled correctly, lint changes are mechanical, and SOP compliance is solid.