Skip to content

stackvox v0.2.0

Choose a tag to compare

@StuBehan StuBehan released this 22 Apr 21:41
· 22 commits to main since this release

First open-source release. Adds packaging/licensing hygiene, a full test + CI + release pipeline, and a quality-of-life fix for audio device switches.

Install from PyPI:

pip install stackvox
# or, for global CLI access:
pipx install stackvox

Added

  • Daemon automatically refreshes PortAudio before each utterance, so switching the system output device (e.g. plugging in Bluetooth headphones) no longer requires a daemon restart.
  • python -m stackvox entry point.
  • stackvox.paths module exposing cache_dir(), socket_path(), and pid_path() as public API.
  • LICENSE (Apache 2.0), NOTICE with third-party attributions, CONTRIBUTING.md, SECURITY.md, and CODE_OF_CONDUCT.md (Contributor Covenant 2.1).
  • GitHub issue templates (bug report, feature request) and a pull-request template.
  • Test suite under tests/ covering path resolution, CLI argument routing, and the daemon socket protocol.
  • stackvox/py.typed marker so downstream type checkers honour the inline type hints.
  • GitHub Actions CI running ruff lint/format, mypy, and pytest across Python 3.10–3.13 on Ubuntu, plus commit-message and PR-title validation.
  • Test coverage reporting via pytest-cov, uploaded to Codecov.
  • README badges for CI, coverage, Python version, and license.
  • dev optional dependency group (pytest, pytest-mock, pytest-cov, ruff, pre-commit, commitizen, mypy).
  • Ruff, mypy, pytest, and coverage configuration in pyproject.toml.
  • Project metadata: SPDX license expression, authors, keywords, project URLs, classifiers.
  • .pre-commit-config.yaml wiring ruff hooks plus a commitizen commit-msg hook for local conventional-commit enforcement.
  • .github/dependabot.yml — weekly pip and GitHub Actions updates.
  • Release automation via release-please: merging conventional-commit PRs rolls a release PR that, when merged, tags the commit and publishes to PyPI via Trusted Publishing (OIDC — no API tokens stored in the repo).
  • PR-title validation workflow (amannn/action-semantic-pull-request) for squash-merge flows where the PR title becomes the commit on main.

Changed

  • Library modules (engine.py, daemon.py) emit diagnostics via logging instead of print(). The CLI configures basicConfig at entry so output shape is unchanged for users.
  • Example scripts moved from the repo root to examples/.
  • stackvox.__version__ is now read from installed package metadata, so pyproject.toml is the single source of truth for the version.
  • Magic numbers in daemon.py (worker poll interval, client/ping timeouts, recv buffer size) promoted to named module constants.

Internal

  • Promoted stackvox.engine._cache_dir (private) to stackvox.paths.cache_dir() (public); daemon.py no longer reaches across module boundaries into a private helper.
  • Two small type-safety fixes (typed the signal-handler frame parameter; narrowed _read_text's argparse Namespace access to avoid an Any return) so mypy runs cleanly.