readio 0.3.2__tar.gz → 0.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
- readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/audit/commit-audit.yaml +80 -0
- readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/entries/entry-0001.md +36 -0
- readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/entries/entry-0002.md +33 -0
- readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/release.md +27 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/audit-decisions.yaml +34 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/audit.yaml +56 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/entries.yaml +48 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/05f8940.patch +211 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/3dbc57b.patch +826 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/manifest.json +48 -0
- readio-0.3.3/.ledger/releaseledger/work/v0.3.3/range.json +13 -0
- {readio-0.3.2/readio.egg-info → readio-0.3.3}/PKG-INFO +14 -1
- {readio-0.3.2 → readio-0.3.3}/README.md +12 -0
- {readio-0.3.2 → readio-0.3.3}/docs/api.md +4 -2
- {readio-0.3.2 → readio-0.3.3}/docs/changelog.md +9 -0
- {readio-0.3.2 → readio-0.3.3}/docs/cli.md +15 -0
- {readio-0.3.2 → readio-0.3.3}/pyproject.toml +1 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/projects.py +14 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/types.py +6 -0
- {readio-0.3.2 → readio-0.3.3}/readio/cli.py +190 -53
- readio-0.3.3/readio/cli_help.py +28 -0
- {readio-0.3.2 → readio-0.3.3}/readio/spotify_cli.py +6 -2
- {readio-0.3.2 → readio-0.3.3/readio.egg-info}/PKG-INFO +14 -1
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/SOURCES.txt +13 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/requires.txt +1 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/scm_file_list.json +13 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/scm_version.json +2 -2
- readio-0.3.3/tests/test_cli_help.py +257 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_projects.py +43 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_types.py +58 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_voice_catalog.py +6 -3
- {readio-0.3.2 → readio-0.3.3}/.codecrate.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.github/workflows/codecov.yml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.github/workflows/pre-commit.yml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.github/workflows/python-publish.yml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.github/workflows/tests.yml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.gitignore +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/.ledger-project.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/config.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/.ledger-project.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/docs-changelog-md-77f023b9.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/docs-index-md-b4d68dc8.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/readme-md-b3356305.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/scan.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/source-index.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/storage.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/ledger.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/.ledger-project.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/config.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0005.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0006.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0005.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0006.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0007.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0005.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0006.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0004.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/audit/commit-audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0001.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0002.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0003.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/release.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/audit-decisions.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/entries.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/evidence/4ecf165.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/evidence/manifest.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/range.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/audit-decisions.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/entries.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/18d1765.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/2c5e221.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/4791e70.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/5840ad5.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/manifest.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/range.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/audit-decisions.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/entries.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/evidence/86a3aec.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/evidence/manifest.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/range.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/audit-decisions.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/audit.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/entries.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/0251443.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/20c4037.patch +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/manifest.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/range.json +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/write.lock +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/taskledger/.ledger-project.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.ledger/taskledger/config.toml +0 -0
- {readio-0.3.2 → readio-0.3.3}/.pre-commit-config.yaml +0 -0
- {readio-0.3.2 → readio-0.3.3}/LICENSE +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/architecture.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/conf.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/incremental-rendering.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/index.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/make.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/projects.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/docs/requirements.txt +0 -0
- {readio-0.3.2 → readio-0.3.3}/examples/README.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/examples/python_api.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/examples/readio-podcast.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/examples/readio-prosody.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/README.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/audio-drama.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/debate-pro-con.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/document-summary.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/dramatic-story.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/educational-explainer.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/funny-story.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/general-narration.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/guided-meditation.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/kids-story.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/language-learning.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/news-briefing.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-interview.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-roundtable.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-solo.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/quiz-trivia.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/__main__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/app.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/audiobooks.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/catalog.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/configuration.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/diagnostics.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/errors.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/events.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/extensions.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/ingest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/integrations/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/integrations/spotify.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/roles.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/speech.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/ssmd.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/api/templates.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/audio.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/audiobook.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/chapter_selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/cli_adapter.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/cli_present.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/config.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/doctor.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/document.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/base.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/catalog.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/discovery.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/pipersynth.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/pocketsynth.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/pykokoro.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/registry.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/engines/selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/errors.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/execution.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/formats.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/ingest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/jsonutil.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/lexicons.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/logging_config.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/manifest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/markdown.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/models.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/paths.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/plan.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/planning/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/planning/compiler.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/planning/policy.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/planning/semantic.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/progress.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/project.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/project_model.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/project_roles.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/project_settings.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/py.typed +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/reader.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/rendering/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/rendering/capacity.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/rendering/lowering.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/resources/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/briefing.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/dialogue.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/podcast.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/spotify.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/ssmd.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/ssmd_authoring.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/__init__.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/audiobook_export.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/composition.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/export.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/pipeline.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/planning.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/speech_identity.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/stages/synthesis.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/synthesis.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/templates.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/text.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/voices.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio/wave.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/dependency_links.txt +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/entry_points.txt +0 -0
- {readio-0.3.2 → readio-0.3.3}/readio.egg-info/top_level.txt +0 -0
- {readio-0.3.2 → readio-0.3.3}/setup.cfg +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/SKILL.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/references/cli.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/references/input-formats.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/references/spotify.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/references/ssmd.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/skill/readio/references/troubleshooting.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/audiobook_support.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/conftest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/fixtures/architecture-review.ssmd +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/fixtures/markdown/all-elements.md +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/fixtures/markdown/all-elements.txt +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/multiscope_support.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/project_support.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audio.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audio_formats.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_export.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_export_api.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_pipeline.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_project.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_status.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_backend_config.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_chapter_selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_chapters.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_cli_adapter.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_cli_public_api_boundary.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_composition_ssmd09_prosody.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_config.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_defaults_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_doctor.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_document.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_engine_adapters_requests.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_engine_contract.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_engine_execution.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_engine_registry.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_engine_spine.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_examples.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_execution_request_path.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ffmpeg_sink.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_incremental_project_render.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ingest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_language_defaults_config.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_lexicon_catalog.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_lexicons_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_llm_guides.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_logging_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_manifest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_markdown.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_model_source_preference.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_models_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_package_resources.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_packaging_metadata.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_paths.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_piper_engine.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_plan.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_plan_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_plan_no_tts_load.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_plan_v2.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_plan_validation.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_pocketsynth_engine.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_progress.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_atomic_manifest.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_composition.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_export.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_layout.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_model.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_planning.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_roles.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_project_target_routing.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_catalog_listings.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_catalog_roles_ssmd_extensions.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_configuration_templates_ingest_diagnostics.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_errors.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_events.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_examples.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_imports.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_speech.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_spotify.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_contract.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_regressions.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_support.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_reader_markdown.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_reader_selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_released_engine_apis.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_render_from_plan.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_render_manifest_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_rendering_capacity.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_rendering_lowering.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_segment_architecture.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_selection.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_semantic_plan.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_skill_integrity.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_spotify.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_spotify_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_spotify_lifecycle.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_authoring_09.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_integration.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_model_roster.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_preflight.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_single_source.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_synthesis.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_template_validate.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_templates.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_text.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_utterplan_v3_linguistics.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_voice_resolution_workflow.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_voices_cli.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/test_wave.py +0 -0
- {readio-0.3.2 → readio-0.3.3}/tests/typecheck/public_api_consumer.py +0 -0
|
@@ -101,3 +101,9 @@
|
|
|
101
101
|
{"data":{"updated_rows":2},"event":"audit.updated","event_id":"event-0101","record_revisions":{"commit_audit_sheet":4},"release_version":"v0.3.2","schema_version":2}
|
|
102
102
|
{"data":{"entry_ids":["entry-0003"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0102","record_revisions":{"commit_audit_sheet":5,"entry:v0.3.2/entry-0003":1,"release:v0.3.2":4},"release_version":"v0.3.2","schema_version":2}
|
|
103
103
|
{"data":{"released_at":"2026-09-28"},"event":"release.finalized","event_id":"event-0103","record_revisions":{"release:v0.3.2":5},"release_version":"v0.3.2","schema_version":2}
|
|
104
|
+
{"data":{"status":"planned"},"event":"release.created","event_id":"event-0104","record_revisions":{"release:v0.3.3":1},"release_version":"v0.3.3","schema_version":2}
|
|
105
|
+
{"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0105","record_revisions":{"release:v0.3.3":2},"release_version":"v0.3.3","schema_version":2}
|
|
106
|
+
{"data":{"row_count":2},"event":"audit.created","event_id":"event-0106","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.3.3","schema_version":2}
|
|
107
|
+
{"data":{"updated_rows":2},"event":"audit.updated","event_id":"event-0107","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.3.3","schema_version":2}
|
|
108
|
+
{"data":{"entry_ids":["entry-0001","entry-0002"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0108","record_revisions":{"commit_audit_sheet":3,"entry:v0.3.3/entry-0001":1,"entry:v0.3.3/entry-0002":1,"release:v0.3.3":3},"release_version":"v0.3.3","schema_version":2}
|
|
109
|
+
{"data":{"released_at":"2026-09-28"},"event":"release.finalized","event_id":"event-0109","record_revisions":{"release:v0.3.3":4},"release_version":"v0.3.3","schema_version":2}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
object_type: commit_audit_sheet
|
|
3
|
+
versioning:
|
|
4
|
+
schema_version: 1
|
|
5
|
+
revision: 3
|
|
6
|
+
release_version: v0.3.3
|
|
7
|
+
git_base_ref: v0.3.2
|
|
8
|
+
git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
|
|
9
|
+
git_head_ref: HEAD
|
|
10
|
+
git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
11
|
+
git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
12
|
+
commit_count: 2
|
|
13
|
+
rows:
|
|
14
|
+
- sha: 3dbc57bc393a396c67606b36fbde0960b5347187
|
|
15
|
+
source_ref: git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
16
|
+
short_sha: 3dbc57b
|
|
17
|
+
changed_paths:
|
|
18
|
+
- README.md
|
|
19
|
+
- docs/cli.md
|
|
20
|
+
- pyproject.toml
|
|
21
|
+
- readio/cli.py
|
|
22
|
+
- readio/cli_help.py
|
|
23
|
+
- readio/spotify_cli.py
|
|
24
|
+
- tests/test_cli_help.py
|
|
25
|
+
- tests/test_voice_catalog.py
|
|
26
|
+
stats:
|
|
27
|
+
files_changed: 8
|
|
28
|
+
insertions: 515
|
|
29
|
+
deletions: 58
|
|
30
|
+
inspected: true
|
|
31
|
+
inspected_paths:
|
|
32
|
+
- README.md
|
|
33
|
+
- docs/cli.md
|
|
34
|
+
- pyproject.toml
|
|
35
|
+
- readio/cli.py
|
|
36
|
+
- readio/cli_help.py
|
|
37
|
+
- readio/spotify_cli.py
|
|
38
|
+
- tests/test_cli_help.py
|
|
39
|
+
- tests/test_voice_catalog.py
|
|
40
|
+
observed_behavior:
|
|
41
|
+
Added formatted root and command-group help, plus engine and
|
|
42
|
+
output-format discovery commands with JSON output; documented the CLI behavior
|
|
43
|
+
and covered it with tests.
|
|
44
|
+
public_impact: public
|
|
45
|
+
decision: accepted
|
|
46
|
+
stale: false
|
|
47
|
+
evidence_subject: "feat: better cli help"
|
|
48
|
+
target_entry_id: entry-0001
|
|
49
|
+
notes: ""
|
|
50
|
+
- sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
51
|
+
source_ref: git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
52
|
+
short_sha: 05f8940
|
|
53
|
+
changed_paths:
|
|
54
|
+
- docs/api.md
|
|
55
|
+
- readio/api/projects.py
|
|
56
|
+
- readio/api/types.py
|
|
57
|
+
- tests/test_public_api_projects.py
|
|
58
|
+
- tests/test_public_api_types.py
|
|
59
|
+
stats:
|
|
60
|
+
files_changed: 5
|
|
61
|
+
insertions: 125
|
|
62
|
+
deletions: 2
|
|
63
|
+
inspected: true
|
|
64
|
+
inspected_paths:
|
|
65
|
+
- docs/api.md
|
|
66
|
+
- readio/api/projects.py
|
|
67
|
+
- readio/api/types.py
|
|
68
|
+
- tests/test_public_api_projects.py
|
|
69
|
+
- tests/test_public_api_types.py
|
|
70
|
+
observed_behavior:
|
|
71
|
+
Exposed resolved pronunciation, lexicon, and language-detection
|
|
72
|
+
settings through the read-only synthesis preflight result, preserving automatic
|
|
73
|
+
versus explicitly empty lexicon selections; documented the behavior and added
|
|
74
|
+
tests.
|
|
75
|
+
public_impact: public
|
|
76
|
+
decision: accepted
|
|
77
|
+
stale: false
|
|
78
|
+
evidence_subject: "feat: add missing parameter to api"
|
|
79
|
+
target_entry_id: entry-0002
|
|
80
|
+
notes: ""
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 1
|
|
7
|
+
entry_id: entry-0001
|
|
8
|
+
release_version: v0.3.3
|
|
9
|
+
kind: added
|
|
10
|
+
summary:
|
|
11
|
+
Added formatted command help and engine and output-format discovery to the
|
|
12
|
+
CLI
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs:
|
|
17
|
+
- git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
18
|
+
paths:
|
|
19
|
+
- README.md
|
|
20
|
+
- docs/cli.md
|
|
21
|
+
- pyproject.toml
|
|
22
|
+
- readio/cli.py
|
|
23
|
+
- readio/cli_help.py
|
|
24
|
+
- readio/spotify_cli.py
|
|
25
|
+
- tests/test_cli_help.py
|
|
26
|
+
- tests/test_voice_catalog.py
|
|
27
|
+
issues: []
|
|
28
|
+
prs: []
|
|
29
|
+
sources:
|
|
30
|
+
- git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
31
|
+
contributors:
|
|
32
|
+
- "@holgern"
|
|
33
|
+
breaking: false
|
|
34
|
+
internal: false
|
|
35
|
+
order: 1
|
|
36
|
+
---
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 1
|
|
7
|
+
entry_id: entry-0002
|
|
8
|
+
release_version: v0.3.3
|
|
9
|
+
kind: added
|
|
10
|
+
summary:
|
|
11
|
+
Added lexicon, pronunciation, and language-detection policies to the read-only
|
|
12
|
+
synthesis preflight API
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs:
|
|
17
|
+
- git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
18
|
+
paths:
|
|
19
|
+
- docs/api.md
|
|
20
|
+
- readio/api/projects.py
|
|
21
|
+
- readio/api/types.py
|
|
22
|
+
- tests/test_public_api_projects.py
|
|
23
|
+
- tests/test_public_api_types.py
|
|
24
|
+
issues: []
|
|
25
|
+
prs: []
|
|
26
|
+
sources:
|
|
27
|
+
- git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
28
|
+
contributors:
|
|
29
|
+
- "@holgern"
|
|
30
|
+
breaking: false
|
|
31
|
+
internal: false
|
|
32
|
+
order: 2
|
|
33
|
+
---
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 4
|
|
7
|
+
version: v0.3.3
|
|
8
|
+
status: released
|
|
9
|
+
history_state: curated
|
|
10
|
+
title: null
|
|
11
|
+
released_at: "2026-09-28"
|
|
12
|
+
previous_version: v0.3.2
|
|
13
|
+
cancel_reason: null
|
|
14
|
+
superseded_by: null
|
|
15
|
+
changelog_file: docs/changelog.md
|
|
16
|
+
boundary_ref: null
|
|
17
|
+
source_refs: []
|
|
18
|
+
source_count: null
|
|
19
|
+
entry_count: 2
|
|
20
|
+
artifact_count: 0
|
|
21
|
+
git_base_ref: v0.3.2
|
|
22
|
+
git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
|
|
23
|
+
git_head_ref: HEAD
|
|
24
|
+
git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
25
|
+
git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
26
|
+
git_commit_count: 2
|
|
27
|
+
---
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
rows:
|
|
2
|
+
- sha: 3dbc57bc393a396c67606b36fbde0960b5347187
|
|
3
|
+
inspected: true
|
|
4
|
+
inspected_paths:
|
|
5
|
+
- README.md
|
|
6
|
+
- docs/cli.md
|
|
7
|
+
- pyproject.toml
|
|
8
|
+
- readio/cli.py
|
|
9
|
+
- readio/cli_help.py
|
|
10
|
+
- readio/spotify_cli.py
|
|
11
|
+
- tests/test_cli_help.py
|
|
12
|
+
- tests/test_voice_catalog.py
|
|
13
|
+
observed_behavior: Added formatted root and command-group help, plus engine and output-format discovery commands with JSON output; documented the CLI behavior and covered it with tests.
|
|
14
|
+
public_impact: public
|
|
15
|
+
decision: accepted
|
|
16
|
+
target_entry_key: null
|
|
17
|
+
target_entry_id: null
|
|
18
|
+
notes: ""
|
|
19
|
+
stale: false
|
|
20
|
+
- sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
21
|
+
inspected: true
|
|
22
|
+
inspected_paths:
|
|
23
|
+
- docs/api.md
|
|
24
|
+
- readio/api/projects.py
|
|
25
|
+
- readio/api/types.py
|
|
26
|
+
- tests/test_public_api_projects.py
|
|
27
|
+
- tests/test_public_api_types.py
|
|
28
|
+
observed_behavior: Exposed resolved pronunciation, lexicon, and language-detection settings through the read-only synthesis preflight result, preserving automatic versus explicitly empty lexicon selections; documented the behavior and added tests.
|
|
29
|
+
public_impact: public
|
|
30
|
+
decision: accepted
|
|
31
|
+
target_entry_key: null
|
|
32
|
+
target_entry_id: null
|
|
33
|
+
notes: ""
|
|
34
|
+
stale: false
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
object_type: commit_audit_sheet
|
|
3
|
+
versioning:
|
|
4
|
+
schema_version: 1
|
|
5
|
+
revision: 1
|
|
6
|
+
release_version: v0.3.3
|
|
7
|
+
git_base_ref: v0.3.2
|
|
8
|
+
git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
|
|
9
|
+
git_head_ref: HEAD
|
|
10
|
+
git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
11
|
+
git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
12
|
+
commit_count: 2
|
|
13
|
+
rows:
|
|
14
|
+
- sha: 3dbc57bc393a396c67606b36fbde0960b5347187
|
|
15
|
+
source_ref: git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
16
|
+
short_sha: 3dbc57b
|
|
17
|
+
changed_paths:
|
|
18
|
+
- README.md
|
|
19
|
+
- docs/cli.md
|
|
20
|
+
- pyproject.toml
|
|
21
|
+
- readio/cli.py
|
|
22
|
+
- readio/cli_help.py
|
|
23
|
+
- readio/spotify_cli.py
|
|
24
|
+
- tests/test_cli_help.py
|
|
25
|
+
- tests/test_voice_catalog.py
|
|
26
|
+
stats:
|
|
27
|
+
files_changed: 8
|
|
28
|
+
insertions: 515
|
|
29
|
+
deletions: 58
|
|
30
|
+
inspected: false
|
|
31
|
+
inspected_paths: []
|
|
32
|
+
observed_behavior: ""
|
|
33
|
+
public_impact: unknown
|
|
34
|
+
decision: needs_review
|
|
35
|
+
stale: false
|
|
36
|
+
evidence_subject: "feat: better cli help"
|
|
37
|
+
- sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
38
|
+
source_ref: git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
39
|
+
short_sha: 05f8940
|
|
40
|
+
changed_paths:
|
|
41
|
+
- docs/api.md
|
|
42
|
+
- readio/api/projects.py
|
|
43
|
+
- readio/api/types.py
|
|
44
|
+
- tests/test_public_api_projects.py
|
|
45
|
+
- tests/test_public_api_types.py
|
|
46
|
+
stats:
|
|
47
|
+
files_changed: 5
|
|
48
|
+
insertions: 125
|
|
49
|
+
deletions: 2
|
|
50
|
+
inspected: false
|
|
51
|
+
inspected_paths: []
|
|
52
|
+
observed_behavior: ""
|
|
53
|
+
public_impact: unknown
|
|
54
|
+
decision: needs_review
|
|
55
|
+
stale: false
|
|
56
|
+
evidence_subject: "feat: add missing parameter to api"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
schema: releaseledger.entry-batch.v1
|
|
2
|
+
operation: create
|
|
3
|
+
schema_version: 1
|
|
4
|
+
object_type: release_entry_batch
|
|
5
|
+
release_version: v0.3.3
|
|
6
|
+
git_base_ref: fcf02b93783d26ec02252791a1642ea7bb3cc26a
|
|
7
|
+
git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
|
|
8
|
+
git_head_ref: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
9
|
+
git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
10
|
+
include_merges: nontrivial
|
|
11
|
+
entries:
|
|
12
|
+
- kind: added
|
|
13
|
+
summary: Added formatted command help and engine and output-format discovery to the CLI
|
|
14
|
+
status: accepted
|
|
15
|
+
source_refs:
|
|
16
|
+
- git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
17
|
+
paths:
|
|
18
|
+
- README.md
|
|
19
|
+
- docs/cli.md
|
|
20
|
+
- pyproject.toml
|
|
21
|
+
- readio/cli.py
|
|
22
|
+
- readio/cli_help.py
|
|
23
|
+
- readio/spotify_cli.py
|
|
24
|
+
- tests/test_cli_help.py
|
|
25
|
+
- tests/test_voice_catalog.py
|
|
26
|
+
sources:
|
|
27
|
+
- git:3dbc57bc393a396c67606b36fbde0960b5347187
|
|
28
|
+
prs: []
|
|
29
|
+
issues: []
|
|
30
|
+
contributors:
|
|
31
|
+
- "@holgern"
|
|
32
|
+
- kind: added
|
|
33
|
+
summary: Added lexicon, pronunciation, and language-detection policies to the read-only synthesis preflight API
|
|
34
|
+
status: accepted
|
|
35
|
+
source_refs:
|
|
36
|
+
- git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
37
|
+
paths:
|
|
38
|
+
- docs/api.md
|
|
39
|
+
- readio/api/projects.py
|
|
40
|
+
- readio/api/types.py
|
|
41
|
+
- tests/test_public_api_projects.py
|
|
42
|
+
- tests/test_public_api_types.py
|
|
43
|
+
sources:
|
|
44
|
+
- git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
|
|
45
|
+
prs: []
|
|
46
|
+
issues: []
|
|
47
|
+
contributors:
|
|
48
|
+
- "@holgern"
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
docs/api.md | 6 ++--
|
|
2
|
+
readio/api/projects.py | 14 ++++++++++
|
|
3
|
+
readio/api/types.py | 6 ++++
|
|
4
|
+
tests/test_public_api_projects.py | 43 +++++++++++++++++++++++++++++
|
|
5
|
+
tests/test_public_api_types.py | 58 +++++++++++++++++++++++++++++++++++++++
|
|
6
|
+
5 files changed, 125 insertions(+), 2 deletions(-)
|
|
7
|
+
|
|
8
|
+
diff --git a/docs/api.md b/docs/api.md
|
|
9
|
+
index 36229ca..31a4453 100644
|
|
10
|
+
--- a/docs/api.md
|
|
11
|
+
+++ b/docs/api.md
|
|
12
|
+
@@ -132,9 +132,11 @@ build = app.projects.build(project, ProjectBuildRequest(target="export"))
|
|
13
|
+
`app.audiobooks.inspect(epub_path)` returns typed EPUB metadata and chapters. `create_project()` creates an ordinary Readio project; `create_project_result()` additionally returns the selected chapter numbers and scope IDs. `app.audiobooks.export(project, AudiobookExportOptions(...))` writes M4B with chapters using the audiobook-specific API. `SUPPORTED_AUDIOBOOK_FORMATS` contains `m4b`; it is intentionally not in generic `SUPPORTED_AUDIO_FORMATS`.
|
|
14
|
+
`describe_project(project)` describes an existing audiobook after reopening it. The immutable `AudiobookProjectDescription` contains its `ProjectRef`, persisted source path, and persisted `AudiobookProjectChapter` values (chapter number, scope ID, title, and level). Readio loads the project and validates its kind; consumers do not need to inspect project files.
|
|
15
|
+
|
|
16
|
+
-`app.projects.resolve_synthesis(project, request=None, *, voice_bindings=None)` returns a typed `SynthesisResolution` with effective engine, language, voice, model, model source, quality, speed, unit, pause mode, voice level, and supported planning/provider settings. It uses the same project synthesis resolver as `synthesize()`: fatal choices raise public API errors, and non-fatal resolver diagnostics are returned on the result.
|
|
17
|
+
+`app.projects.resolve_synthesis(project, request=None, *, voice_bindings=None)` returns a typed `SynthesisResolution` with effective engine, language, voice, model, model source, quality, speed, unit, pause mode, voice level, planning/provider settings, and pronunciation/resource policies: lexicons, G2P fallback, lexicon data policy, language-detection mode and languages, and experimental-option permission. It uses the same project synthesis resolver as `synthesize()`: fatal choices raise public API errors, and non-fatal resolver diagnostics are returned on the result.
|
|
18
|
+
|
|
19
|
+
-Resolution is for preflight, validation, and UI display. It does not render audio, open an engine session, activate a profile, or mutate persistent synthesis/build state. It reports the same effective selection semantics used by actual project synthesis.
|
|
20
|
+
+`lexicons` preserves three states: `None` means automatic or inherited behavior, an empty tuple means static lexicon layers were explicitly disabled, and a non-empty tuple lists selected layers. These fields expose resolved request/profile values; preflight does not materialize backend runtime defaults that were not resolved.
|
|
21
|
+
+
|
|
22
|
+
+Resolution is read-only and intended for preflight, validation, and UI display. It does not render audio, open an engine session, activate a profile, or mutate project configuration, profile files, manifests, caches, audio, role bindings, or persistent synthesis/build state. It reports the same effective selection semantics used by actual project synthesis.
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
diff --git a/readio/api/projects.py b/readio/api/projects.py
|
|
27
|
+
index e72cb82..4cab874 100644
|
|
28
|
+
--- a/readio/api/projects.py
|
|
29
|
+
+++ b/readio/api/projects.py
|
|
30
|
+
@@ -91,6 +91,14 @@ _OPERATION_DETAIL_KEYS = frozenset(
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
+def _optional_string_tuple(value: object) -> tuple[str, ...] | None:
|
|
35
|
+
+ if value is None:
|
|
36
|
+
+ return None
|
|
37
|
+
+ if isinstance(value, (tuple, list)):
|
|
38
|
+
+ return tuple(str(item) for item in value)
|
|
39
|
+
+ raise TypeError(f"expected a list or tuple, got {type(value).__name__}")
|
|
40
|
+
+
|
|
41
|
+
+
|
|
42
|
+
class ProjectService:
|
|
43
|
+
"""Create, inspect, plan, and incrementally build persistent projects."""
|
|
44
|
+
|
|
45
|
+
@@ -215,6 +223,12 @@ class ProjectService:
|
|
46
|
+
spacy=resolved.plan.planning.spacy,
|
|
47
|
+
short_sentence=cast(str | None, options.get("short_sentence")),
|
|
48
|
+
provider=adapter.capabilities().voice_binding_namespace,
|
|
49
|
+
+ lexicons=_optional_string_tuple(options.get("lexicons")),
|
|
50
|
+
+ g2p_fallback=cast(str | None, options.get("g2p_fallback")),
|
|
51
|
+
+ lexicon_data_policy=cast(str | None, options.get("lexicon_data_policy")),
|
|
52
|
+
+ language_detection=cast(str | None, options.get("language_detection")),
|
|
53
|
+
+ detect_languages=_optional_string_tuple(options.get("detect_languages")),
|
|
54
|
+
+ allow_experimental=bool(options.get("allow_experimental", False)),
|
|
55
|
+
diagnostics=diagnostics,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
diff --git a/readio/api/types.py b/readio/api/types.py
|
|
59
|
+
index bbf859e..37b0dcd 100644
|
|
60
|
+
--- a/readio/api/types.py
|
|
61
|
+
+++ b/readio/api/types.py
|
|
62
|
+
@@ -379,6 +379,12 @@ class SynthesisResolution:
|
|
63
|
+
short_sentence: str | None = None
|
|
64
|
+
provider: str | None = None
|
|
65
|
+
diagnostics: tuple[Diagnostic, ...] = ()
|
|
66
|
+
+ lexicons: tuple[str, ...] | None = None
|
|
67
|
+
+ g2p_fallback: str | None = None
|
|
68
|
+
+ lexicon_data_policy: str | None = None
|
|
69
|
+
+ language_detection: str | None = None
|
|
70
|
+
+ detect_languages: tuple[str, ...] | None = None
|
|
71
|
+
+ allow_experimental: bool = False
|
|
72
|
+
|
|
73
|
+
def to_dict(self) -> dict[str, JsonValue]:
|
|
74
|
+
return cast(dict[str, JsonValue], json_value(self))
|
|
75
|
+
diff --git a/tests/test_public_api_projects.py b/tests/test_public_api_projects.py
|
|
76
|
+
index ad24290..178f187 100644
|
|
77
|
+
--- a/tests/test_public_api_projects.py
|
|
78
|
+
+++ b/tests/test_public_api_projects.py
|
|
79
|
+
@@ -248,11 +248,54 @@ def test_resolve_synthesis_uses_profile_and_reader_settings_without_mutation(
|
|
80
|
+
assert resolution.pause_mode == "manual"
|
|
81
|
+
assert resolution.voice_level == "calibrated"
|
|
82
|
+
assert resolution.provider == "fake"
|
|
83
|
+
+ assert resolution.lexicons is None
|
|
84
|
+
assert adapter.open_calls == 0
|
|
85
|
+
assert _project_snapshot(project.root) == before
|
|
86
|
+
assert json.loads(json.dumps(resolution.to_dict()))["model"] == "profile-model"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
+def test_resolve_synthesis_exposes_pronunciation_options_and_empty_lexicons(
|
|
90
|
+
+ tmp_path: Path, monkeypatch
|
|
91
|
+
+) -> None:
|
|
92
|
+
+ adapter = Adapter()
|
|
93
|
+
+ monkeypatch.setitem(_registry._adapters, "fake", adapter)
|
|
94
|
+
+ app = Readio(ReadioConfig(reader=ReaderSettings(engine="fake", voice="fake-voice")))
|
|
95
|
+
+ source = tmp_path / "pronunciation.txt"
|
|
96
|
+
+ source.write_text("Preflight pronunciation settings.", encoding="utf-8")
|
|
97
|
+
+ project = app.projects.create(source, output=tmp_path / "pronunciation.readio")
|
|
98
|
+
+ before = _project_snapshot(project.root)
|
|
99
|
+
+
|
|
100
|
+
+ request = SynthesisRequest(
|
|
101
|
+
+ engine="fake",
|
|
102
|
+
+ voice="fake-voice",
|
|
103
|
+
+ lexicons=("lex-a", "lex-b"),
|
|
104
|
+
+ g2p_fallback="espeak",
|
|
105
|
+
+ lexicon_data_policy="installed-only",
|
|
106
|
+
+ allow_experimental=True,
|
|
107
|
+
+ language_detection="auto",
|
|
108
|
+
+ detect_languages=("en-us", "de"),
|
|
109
|
+
+ )
|
|
110
|
+
+ resolution = app.projects.resolve_synthesis(project, request)
|
|
111
|
+
+
|
|
112
|
+
+ assert resolution.lexicons == ("lex-a", "lex-b")
|
|
113
|
+
+ assert resolution.g2p_fallback == "espeak"
|
|
114
|
+
+ assert resolution.lexicon_data_policy == "installed-only"
|
|
115
|
+
+ assert resolution.allow_experimental is True
|
|
116
|
+
+ assert resolution.language_detection == "auto"
|
|
117
|
+
+ assert resolution.detect_languages == ("en-us", "de")
|
|
118
|
+
+ assert isinstance(resolution.lexicons, tuple)
|
|
119
|
+
+ assert isinstance(resolution.detect_languages, tuple)
|
|
120
|
+
+ assert adapter.open_calls == 0
|
|
121
|
+
+ assert _project_snapshot(project.root) == before
|
|
122
|
+
+
|
|
123
|
+
+ no_lexicons = app.projects.resolve_synthesis(
|
|
124
|
+
+ project, SynthesisRequest(engine="fake", voice="fake-voice", lexicons=())
|
|
125
|
+
+ )
|
|
126
|
+
+ assert no_lexicons.lexicons == ()
|
|
127
|
+
+ assert adapter.open_calls == 0
|
|
128
|
+
+ assert _project_snapshot(project.root) == before
|
|
129
|
+
+
|
|
130
|
+
+
|
|
131
|
+
def test_resolve_synthesis_respects_request_overrides_and_voice_bindings(
|
|
132
|
+
tmp_path: Path, monkeypatch
|
|
133
|
+
) -> None:
|
|
134
|
+
diff --git a/tests/test_public_api_types.py b/tests/test_public_api_types.py
|
|
135
|
+
index 8d4cae2..d2f6c46 100644
|
|
136
|
+
--- a/tests/test_public_api_types.py
|
|
137
|
+
+++ b/tests/test_public_api_types.py
|
|
138
|
+
@@ -87,15 +87,73 @@ def test_audiobook_and_synthesis_preflight_types_are_immutable_and_json_serializ
|
|
139
|
+
pause_mode="auto",
|
|
140
|
+
voice_level="off",
|
|
141
|
+
provider="kokoro",
|
|
142
|
+
+ lexicons=("lex-a", "lex-b"),
|
|
143
|
+
+ g2p_fallback="espeak",
|
|
144
|
+
+ lexicon_data_policy="installed-only",
|
|
145
|
+
+ language_detection="auto",
|
|
146
|
+
+ detect_languages=("en-us", "de"),
|
|
147
|
+
+ allow_experimental=True,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
description_payload = json.loads(json.dumps(description.to_dict()))
|
|
151
|
+
resolution_payload = json.loads(json.dumps(resolution.to_dict()))
|
|
152
|
+
assert description_payload["chapters"][0]["scope_id"] == "chapter-0003"
|
|
153
|
+
assert resolution_payload["model_source"] == "github"
|
|
154
|
+
+ assert resolution_payload["lexicons"] == ["lex-a", "lex-b"]
|
|
155
|
+
+ assert resolution_payload["g2p_fallback"] == "espeak"
|
|
156
|
+
+ assert resolution_payload["lexicon_data_policy"] == "installed-only"
|
|
157
|
+
+ assert resolution_payload["language_detection"] == "auto"
|
|
158
|
+
+ assert resolution_payload["detect_languages"] == ["en-us", "de"]
|
|
159
|
+
+ assert resolution_payload["allow_experimental"] is True
|
|
160
|
+
with pytest.raises(FrozenInstanceError):
|
|
161
|
+
resolution.engine = "piper" # type: ignore[misc]
|
|
162
|
+
|
|
163
|
+
+ legacy_resolution = SynthesisResolution(
|
|
164
|
+
+ engine="pykokoro",
|
|
165
|
+
+ language="en-us",
|
|
166
|
+
+ voice="af_heart",
|
|
167
|
+
+ model="kokoro-v1",
|
|
168
|
+
+ model_source="github",
|
|
169
|
+
+ quality="fp32",
|
|
170
|
+
+ speed=1.0,
|
|
171
|
+
+ unit="paragraph",
|
|
172
|
+
+ pause_mode="auto",
|
|
173
|
+
+ voice_level="off",
|
|
174
|
+
+ )
|
|
175
|
+
+ assert legacy_resolution.lexicons is None
|
|
176
|
+
+ assert legacy_resolution.g2p_fallback is None
|
|
177
|
+
+ assert legacy_resolution.lexicon_data_policy is None
|
|
178
|
+
+ assert legacy_resolution.language_detection is None
|
|
179
|
+
+ assert legacy_resolution.detect_languages is None
|
|
180
|
+
+ assert legacy_resolution.allow_experimental is False
|
|
181
|
+
+ assert set(legacy_resolution.to_dict()) >= {
|
|
182
|
+
+ "lexicons",
|
|
183
|
+
+ "g2p_fallback",
|
|
184
|
+
+ "lexicon_data_policy",
|
|
185
|
+
+ "language_detection",
|
|
186
|
+
+ "detect_languages",
|
|
187
|
+
+ "allow_experimental",
|
|
188
|
+
+ }
|
|
189
|
+
+
|
|
190
|
+
+ legacy_positional = SynthesisResolution(
|
|
191
|
+
+ "pykokoro",
|
|
192
|
+
+ "en-us",
|
|
193
|
+
+ "af_heart",
|
|
194
|
+
+ "kokoro-v1",
|
|
195
|
+
+ "github",
|
|
196
|
+
+ "fp32",
|
|
197
|
+
+ 1.0,
|
|
198
|
+
+ "paragraph",
|
|
199
|
+
+ "auto",
|
|
200
|
+
+ "off",
|
|
201
|
+
+ None,
|
|
202
|
+
+ None,
|
|
203
|
+
+ None,
|
|
204
|
+
+ (),
|
|
205
|
+
+ )
|
|
206
|
+
+ assert legacy_positional.diagnostics == ()
|
|
207
|
+
+ assert legacy_positional.lexicons is None
|
|
208
|
+
+
|
|
209
|
+
|
|
210
|
+
def test_synthesis_engine_options_are_json_compatible_and_frozen() -> None:
|
|
211
|
+
request = SynthesisRequest(
|