{"id":44855581,"url":"https://github.com/srichs/devr","last_synced_at":"2026-02-22T12:01:49.462Z","repository":{"id":338680024,"uuid":"1158704791","full_name":"srichs/devr","owner":"srichs","description":"A python developer tooling suite to make it simple to lint, format, type check, and test a python project before committing.","archived":false,"fork":false,"pushed_at":"2026-02-17T22:23:45.000Z","size":149,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-18T10:43:08.741Z","etag":null,"topics":["ci","cli","code-quality","dev-tools","formatting","linting","pre-commit","python","testing","virtualenv"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/devr/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srichs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-15T19:43:14.000Z","updated_at":"2026-02-17T22:23:48.000Z","dependencies_parsed_at":"2026-02-18T08:00:55.568Z","dependency_job_id":null,"html_url":"https://github.com/srichs/devr","commit_stats":null,"previous_names":["srichs/devr"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/srichs/devr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srichs%2Fdevr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srichs%2Fdevr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srichs%2Fdevr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srichs%2Fdevr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srichs","download_url":"https://codeload.github.com/srichs/devr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srichs%2Fdevr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29609524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T06:47:36.664Z","status":"ssl_error","status_checked_at":"2026-02-19T06:45:47.551Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","cli","code-quality","dev-tools","formatting","linting","pre-commit","python","testing","virtualenv"],"created_at":"2026-02-17T07:54:30.914Z","updated_at":"2026-02-19T09:01:10.849Z","avatar_url":"https://github.com/srichs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# devr\n\n[![CI](https://github.com/srichs/devr/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/srichs/devr/actions/workflows/ci.yml)\n[![PyPI version](https://img.shields.io/pypi/v/devr.svg)](https://pypi.org/project/devr/)\n\n**devr** (pronounced *dev-er*, like “developer” without the “lop”) is a single\ncommand that runs your Python linting, formatting, type checks, tests, and\ncoverage inside your project’s virtual environment.\n\n## Why devr?\n\n- One setup command for new repos: `devr init`\n- One gate command before commit/PR: `devr check`\n- Works from your project venv, so tooling is isolated per repo\n- Can install a local pre-commit hook that runs the same checks on staged files\n\nMost Python projects have:\n- ruff\n- a formatter\n- mypy or pyright\n- pytest + coverage\n- pre-commit\n\n**devr runs all of them together, correctly, inside your project’s virtualenv — with one command.**\n\nNo guessing which Python is used.  \nNo copying long command chains.  \nNo drift between local and pre-commit.\n\n---\n\n## Install\n\nRecommended with `pipx`:\n\n```bash\npipx install devr\n```\n\nOr with pip:\n\n```bash\npip install devr\n```\n\n## Quick start\n\nFrom the root of a Python project:\n\n```bash\ndevr init\ndevr check\n```\n\n`devr init` will:\n\n1. Create or find a virtual environment.\n2. Install the default toolchain into that environment.\n3. Install your project dependencies (`pip install -e .` when `pyproject.toml` exists).\n4. Create `.pre-commit-config.yaml` if it does not already exist.\n5. Install the git pre-commit hook.\n\n## Commands\n\n- `devr init [--python python3.12]`\n- `devr check [--fix] [--staged --changed] [--fast] [--no-tests]`\n- `devr fix`\n- `devr security [--fail-fast]`\n- `devr doctor`\n- `python -m devr --version` (module entrypoint smoke check)\n\n### Shell completion\n\n`devr` currently ships with Typer shell completion disabled (`add_completion=False`).\nThis is intentional for now to keep startup behavior predictable in minimal\nenvironments and avoid implying completion-install support that is not yet\ndocumented or validated across shells.\n\nIf you need completion today, use your shell's native completion wrappers or\naliasing as a local workaround. A future release can enable Typer completion\ninstallation once cross-shell setup guidance is documented and tested.\n\n### Notes\n\n- `--changed --staged` scopes lint/format checks to staged Python files.\n- `--fast` skips tests.\n- `--no-tests` always skips tests, even when configured to run.\n- `--fix` applies safe autofixes (ruff fix + formatting).\n- `devr security` runs `pip-audit` and `bandit` for dependency and code security scans.\n- `--fail-fast` stops the security scan after the first failing check.\n- `devr doctor` prints environment diagnostics (project root, Python path, venv resolution, and git detection) to help debug setup issues.\n\n## Configuration\n\nAdd configuration in your `pyproject.toml`:\n\n```toml\n[tool.devr]\nvenv_path = \".venv\"\nformatter = \"ruff\"      # or \"black\"\ntypechecker = \"mypy\"    # or \"pyright\"\ncoverage_min = 85\ncoverage_branch = true\nrun_tests = true\n```\n\nIf values are omitted or invalid, `devr` falls back to safe defaults.\n\n### Virtual environment resolution order\n\nWhen `devr` needs to run tooling, it resolves the venv in this order:\n\n1. `tool.devr.venv_path` from `pyproject.toml` (when it points to a valid venv).\n2. The currently active virtual environment (when `devr` is invoked from inside one).\n3. Project-local fallback directories: `.venv`, then `venv`, then `env`.\n\nThis is the same resolution order used by `devr init`, `devr check`, `devr fix`, and\n`devr security`.\n\n\n## Release checklist\n\nUse this checklist when cutting a release:\n\n1. Verify local quality gates pass (`devr check` and `devr security`).\n2. Update `CHANGELOG.md`:\n   - Move completed entries from `Unreleased` into a new version section.\n   - Add release date (`YYYY-MM-DD`) and keep entries grouped by change type.\n3. Bump version in `pyproject.toml` under `[project].version`.\n4. Run release preflight checks (artifact smoke tests + changelog/version consistency):\n   - `python -m devr.release_preflight`\n   - This builds both wheel and sdist artifacts, installs each in an isolated venv, and verifies both `devr --version` and `python -m devr --version`.\n5. Commit release metadata (`CHANGELOG.md`, version bump, and any final docs updates).\n6. Tag the release (for example, `vX.Y.Z`) and push branch + tag.\n7. Publish to PyPI using your standard release workflow.\n8. Add a fresh `Unreleased` section to `CHANGELOG.md` for subsequent work.\n\n## Default toolchain\n\n`devr init` installs:\n\n- `ruff`\n- `black`\n- `mypy`\n- `pyright`\n- `pytest`\n- `pytest-cov`\n- `pre-commit`\n- `pip-audit`\n- `bandit`\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrichs%2Fdevr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrichs%2Fdevr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrichs%2Fdevr/lists"}