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
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,14 @@ jobs:
- name: Run ruff check
run: ruff check src/ tests/

- name: Check formatting
run: ruff format --check src/ tests/

test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12", "3.13"]

steps:
- uses: actions/checkout@v6
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes to Revenue Holdings CLI will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.3.0] - 2026-06-30

### Added
- Python 3.13 to CI test matrix
- Formatting check step in CI workflow
- `format-check` Makefile target

### Changed
- Makefile lint/format targets scoped to `src/ tests/` instead of entire repo

## [0.2.0] - 2026-05-17

### Added
Expand Down
9 changes: 6 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
# Generated by Agent B — Lint & Type Scripts
.PHONY: lint test format typecheck
.PHONY: lint test format typecheck format-check

lint:
ruff check .
ruff check src/ tests/

format:
ruff format .
ruff format src/ tests/

format-check:
ruff format --check src/ tests/

typecheck:
pyright src/
Expand Down
12 changes: 3 additions & 9 deletions src/devforge/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,7 @@ def list_tools(

@app.command()
def install(
tool: str = typer.Argument(
..., help="Tool to install: " + ", ".join(TOOLS.keys()) + ", or 'all'"
),
tool: str = typer.Argument(..., help="Tool to install: " + ", ".join(TOOLS.keys()) + ", or 'all'"),
):
"""Install a DevForge tool."""
if tool == "all":
Expand All @@ -101,10 +99,7 @@ def install(
pkg = f"devforge[{extras}]"
console.print(f"[yellow]Installing {pkg}...[/yellow]")
try:
result = subprocess.run(
[sys.executable, "-m", "pip", "install", pkg],
capture_output=True, text=True
)
result = subprocess.run([sys.executable, "-m", "pip", "install", pkg], capture_output=True, text=True)
if result.returncode == 0:
console.print(f"[green]Successfully installed:[/green] {', '.join(targets)}")
else:
Expand All @@ -130,8 +125,7 @@ def show_versions(
info = TOOLS[t]
try:
result = subprocess.run(
[sys.executable, "-m", "pip", "show", info["package"]],
capture_output=True, text=True
[sys.executable, "-m", "pip", "show", info["package"]], capture_output=True, text=True
)
if result.returncode == 0:
for line in result.stdout.splitlines():
Expand Down
5 changes: 2 additions & 3 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Tests for devforge meta-package."""

from __future__ import annotations

from devforge import TOOLS, __version__
Expand Down Expand Up @@ -86,9 +87,7 @@ def test_versions_unknown_tool_fails(self):
@mock.patch("devforge.cli.subprocess.run")
def test_versions_specific_tool_not_installed(self, mock_run):
"""Show 'not installed' for a tool that isn't installed."""
mock_run.return_value = mock.MagicMock(
returncode=1, stdout="", stderr=""
)
mock_run.return_value = mock.MagicMock(returncode=1, stdout="", stderr="")
result = runner.invoke(app, ["versions", "guard"])
assert result.exit_code == 0
assert "guard" in result.stdout
Expand Down