[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "devx" dynamic = ["version"] description = "Reusable development and CI/CD tools for oblachno-oss projects" 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 = [ "requests>=2.34.2", "python-dotenv>=1.2.2", "click>=8.4.1", ] [project.scripts] devx = "devx.cli:cli" [tool.setuptools.dynamic] version = {attr = "devx.__version__"} [project.optional-dependencies] # Minimal deps for CI scripts that only need click/dotenv/requests ci = [ "pytest>=9.1.0", "pytest-cov>=7.1.0", ] # Lint and type-checking tools (quality job) lint = [ "ruff>=0.15.17", "pyright>=1.1.410", "bandit>=1.8.2", "pip-audit>=2.10", "pre-commit>=4.6.0", ] # Molecule testing (optional — for projects with Ansible roles) molecule = [ "molecule>=26.4.0", "molecule-docker>=2.1.0", "ansible-lint>=26.4.0", "ansible>=14.0.0", ] # Full dev environment (local development) dev = [ "devx[ci,lint]", "build>=1.3.0", "twine>=6.2.0", ] [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] devx = ["translations.json"] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["src"] addopts = "--cov=src/devx --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/devx/config.py", "src/devx/exceptions.py", "src/devx/i18n.py", "src/devx/api_clients.py", "src/devx/gitea_cli.py"] # --------------------------------------------------------------------------- # Change classification — determines which changes trigger a release # --------------------------------------------------------------------------- # Safe-by-default: any file NOT listed here defaults to user-facing # (requiring a release). This prevents new file types from silently # skipping releases. # # Rule priority (first match wins): # 1. user_facing_overrides (safety — highest priority) # 2. infrastructure_overrides (explicit per-file) # 3. infrastructure (glob patterns) # 4. Default: user-facing (safe) [tool.devx.classify] # Infrastructure paths — changes here don't trigger a release infrastructure = [ ".gitea/**", "tests/**", "docs/**", "hooks/**", "Makefile", "cliff.toml", ".pre-commit-config.yaml", ".env.example", ".gitignore", ".ruff.toml", "AGENTS.md", "README.md", "CHANGELOG.md", "TROUBLESHOOTING.md", ".ansible-lint", ".github/**", ] # Infrastructure overrides — files that would default to user-facing # but are actually infrastructure: # - __init__.py: only contains __version__ (release artifact, not code) # - api_clients.py: used only by CI/CD scripts, not by the CLI infrastructure_overrides = [ "src/devx/__init__.py", "src/devx/api_clients.py", ] # User-facing overrides — safety override for broad infrastructure patterns # (empty — add when an infrastructure pattern is too broad) 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"]