[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "gitea-runner-manager" dynamic = ["version"] description = "Lean CLI to manage Gitea Actions runners" readme = "README.md" license = {text = "GPL-3.0"} requires-python = ">=3.12" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", ] dependencies = [ "python-dotenv==1.2.2", "click==8.4.2", "ansible==14.1.0", ] [project.scripts] grm = "gitea_runner_manager.cli:cli" [tool.setuptools.dynamic] version = {attr = "gitea_runner_manager.__version__"} [project.optional-dependencies] # Minimal deps for CI scripts that only need click/dotenv # (detect-changes, discover-runners, pr-review, sync-wiki, badges, etc.) ci = [ "pytest==9.1.1", "pytest-cov==7.1.0", "build==1.5.0", "twine==6.2.0", # Reusable CI/CD and dev tools (auto-merge, pr-review, pre-push checks, etc.) "devx==0.33.3", ] # Lint and type-checking tools (quality job) lint = [ "ruff==0.15.20", "pyright==1.1.411", "bandit==1.9.4", "pip-audit==2.10.1", "pre-commit==4.6.0", "ansible-lint==26.4.0", ] # Molecule testing (molecule-tests job) molecule = [ "molecule==26.6.0", "molecule-docker==2.1.0", ] # Full dev environment (local development, includes everything) dev = [ "gitea-runner-manager[ci,lint,molecule]", # Reusable CI/CD and dev tools (pre-push hooks, create-task, create-pr) "devx==0.33.3", # Non-Python dev dependency: checkmake (Makefile linter) # Install via: go install github.com/checkmake/checkmake/cmd/checkmake@latest ] [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] gitea_runner_manager = ["translations.json"] [tool.pytest.ini_options] testpaths = ["tests", "scripts/tests"] pythonpath = ["src", "scripts"] addopts = "--cov=src/gitea_runner_manager --cov=scripts/prune_runner_images.py --cov-report=term-missing --cov-fail-under=100" markers = [ "integration: marks tests as integration tests (not counted in coverage)", ] [tool.ruff] target-version = "py312" line-length = 120 [tool.ruff.lint] select = ["E", "F", "I", "W", "UP", "B", "C4", "SIM"] ignore = ["SIM117"] [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.pyright] include = ["src"] pythonVersion = "3.12" strict = ["src/gitea_runner_manager"] # --------------------------------------------------------------------------- # Change classification — determines which changes trigger a release # --------------------------------------------------------------------------- # The framework provides DEFAULT_INFRASTRUCTURE (CI workflows, tests, docs, # Project-specific devx configuration (read by devx.config) [tool.devx] task_prefix = "GRM" vikunja_project_id = 6 repo_owner = "oblachno-oss" repo_name = "grm" # Molecule test weights for LPT scheduling. # GRM has a single role (gitea-runner) with 7 scenarios. # Weights are estimates — recalibrate from CI logs after next run. [tool.devx.molecule.weights] "multi-instance" = 8 "lifecycle" = 6 "update" = 5 "default" = 4 "deregister" = 3 "remove" = 3 "template-content" = 2 # lint config, etc.) that applies to any Python project. We only specify # what's different about GRM. [tool.devx.classify] # use_defaults = true # (default) merge with DEFAULT_INFRASTRUCTURE # Project-specific infrastructure paths (merged with defaults). # scripts/** — dev tools and CI/CD automation, not part of the installed package. # (scripts were migrated to devx in GRM-64, but the path is kept for # historical correctness and in case scripts are added back.) infrastructure = ["scripts/**"] # Infrastructure overrides — files that would default to user-facing # but are actually infrastructure: # - __init__.py: only contains __version__ (set by release.py, not user code) infrastructure_overrides = [ "src/gitea_runner_manager/__init__.py", ] # User-facing overrides — safety override for broad infrastructure patterns user_facing_overrides = [] # Tag patterns — additional categories for CI conditional execution # Orthogonal to release impact (user-facing vs infrastructure) [tool.devx.classify.tags] ansible = ["ansible/**", ".ansible-lint"]