* chore: bump to 0.5.0 Owner-requested minor bump. package.json is the source of truth; the three mirrors (Cargo.toml, pyproject.toml, _FALLBACK_VERSION), the three lockfiles and the branding pin move in lockstep, and the accumulated Unreleased section becomes the curated 0.5.0 release notes — quiet Highlights first, one-liner subsections after, duplicates folded. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: fresh README for the VoiceStudio era; 0.5.0 notes wear the release README: 551 lines from 656 — a What's-new-in-0.5.0 section with real captures, the engine tables corrected to the actual 16 TTS registrations, a stale Settings path and a broken Colab link fixed, roadmap/FAQ/credits trimmed to what earns its place. Release notes: the quick-switch GIF and catalogue/gallery screenshots, captured from the running app during the pre-bump test pass, embedded after the Highlights; #1542's gallery work and the ffmpeg CI fallback recorded in their subsections. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: the feature inventory's Remote Model Downloads mention survives the README trim check-docs-drift requires every docs/features.yaml name verbatim in the README; the overhaul folded the phrase away. It now lives in the remote workers feature line. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: one blockquote, and an architecture claim that survives the opt-ins CodeRabbit on #1540: MD028 blank line inside adjacent blockquotes, and 'every layer is on your machine' contradicted the opt-in remote paths documented two sections away — it now states local-by-default with the opt-ins named. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
"""Single source of truth for the app version at runtime.
|
|
|
|
Read from the installed package metadata (driven by ``pyproject.toml``) so the
|
|
FastAPI/API version and exported-bundle metadata never drift to a stale literal
|
|
— the prior "0.4.0" / "0.2.7" bug, and the v0.3.6 desktop build that reported
|
|
"0.3.5" because the *frozen* backend couldn't read its own metadata.
|
|
|
|
Resolution order:
|
|
1. installed package metadata — correct in any ``uv sync``'d env and, thanks
|
|
to ``copy_metadata('omnivoice')`` in ``backend.spec``, in the frozen build;
|
|
2. ``pyproject.toml`` walked up from this file — correct for a raw source
|
|
checkout that was never installed;
|
|
3. ``_FALLBACK_VERSION`` — a last resort, kept in lockstep with the four
|
|
version files by ``tests/test_app_version.py`` so it can never silently
|
|
drift again.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from importlib.metadata import PackageNotFoundError, version
|
|
from pathlib import Path
|
|
|
|
# Last-resort literal. Guarded by
|
|
# tests/test_app_version.py::test_all_version_files_in_lockstep and bumped by
|
|
# release.yml's version-bump job, so it stays equal to
|
|
# pyproject/tauri.conf/Cargo/package.json.
|
|
_FALLBACK_VERSION = "0.5.0"
|
|
|
|
|
|
def _fallback_version() -> str:
|
|
"""Version for contexts where package metadata is unavailable."""
|
|
for parent in Path(__file__).resolve().parents:
|
|
pyproject = parent / "pyproject.toml"
|
|
if pyproject.is_file():
|
|
match = re.search(r'(?m)^version\s*=\s*"([^"]+)"', pyproject.read_text())
|
|
if match:
|
|
return match.group(1)
|
|
return _FALLBACK_VERSION
|
|
|
|
|
|
try:
|
|
APP_VERSION = version("omnivoice")
|
|
except PackageNotFoundError: # frozen build w/o metadata, or non-installed checkout
|
|
APP_VERSION = _fallback_version()
|