Release 0.2.0a1 - #66
Open
github-actions[bot] wants to merge 58 commits into
Open
Conversation
chore: Configure Renovate
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Add French count locale * Sync French count locale snapshots
* fix(i18n): normalize locale folder names to canonical BCP-47 form Rename all locale directories to use canonical BCP-47 codes: - Lowercase regions → uppercase (da-dk → da-DK, en-us → en-US) - Bare language codes → full BCP-47 (da → da-DK, eu → eu-ES) - Invalid codes remapped (eu-eu → eu-ES, fa-fa → fa-IR) - Nested bare-language subdirs merged up (eu-ES/eu/ → eu-ES/) This fixes wheel build failures caused by ZIP files containing duplicate entries with different contents for the same logical path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore(i18n): remove deprecated translations/ folder (gitlocalize) The translations/ folder with JSON files was used by gitlocalize and has been deprecated in favor of ovos-localize. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: aautomations * ci: add standard GitHub Actions workflows
* fix: allow ovos-workshop 9.x Lift the ovos-workshop upper bound from <9.0.0 to <10.0.0 so this fixture skill can be installed alongside ovos-workshop 9.x in the ovos-core ovoscope end-to-end suite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(ci): wire test extra + relocate e2e tests for ovos-workshop 9.x The skill declared no `test` extra, so `install_extras: test` (pip install wheel[test]) never installed the e2e deps (ovos_bus_client / ovoscope), breaking build_tests + coverage; the ovoscope job pointed at a non-existent `test/end2end/` and collected 0 tests (hard-fail). - setup.py: add get_requirements() helper; declare install_requires from requirements.txt and a `test` extra from test/requirements.txt. - test/requirements.txt: bump ovoscope to >=1.0.0a1,<2.0.0 and add ovos-bus-client + ovos-core[plugins,lgpl]>=2.0.0a1 (provides the padatious/stop pipeline plugins the e2e suite needs). - Move the ovoscope e2e test to test/end2end/test_stop.py (where the ovoscope workflow looks) and add test/unittests/ with pipeline-free unit tests (skill loading + plugin discovery) for build_tests/coverage. - build-tests.yml / coverage.yml: run test/unittests with no extra. The unit tests only need the runtime deps + pytest; the `test` extra drags in fann2 (padatious) which needs libfann-dev that those jobs don't install. - ovoscope.yml: require_padatious so padatious tests run (and CI installs swig + libfann) instead of silently skipping. - Refresh stale e2e expectations to current ovos-core 2.x / stop-pipeline behavior (stop:skill, trimmed stop callback, ovos.utterance.speak); ignore the parallel `*.stop.response` fan-out which has no stable cross-machine order. - MANIFEST.in: ship test/requirements.txt in the sdist. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: rename entry-point group to opm.skill Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test: update stop e2e to the current intent-dispatch protocol The end2end expectations predated the namespaced intent lifecycle. Running the suite against the released stack shows the count skill itself emits nothing new; the extra messages all come from ovos-core and the TTS layer: - INTENT §8.1: every match is now bracketed by ovos.intent.matched, ovos.intent.handler.start and ovos.intent.handler.complete, alongside the legacy mycroft.skill.handler.start/complete - INTENT §9.3: a miss is reported as ovos.intent.unmatched, replacing complete_intent_failure - AUDIO-1 §5: the per-number TTS playback boundaries, and the speech.stop that silences an in-flight number, are timing-dependent and are now ignored Each added expectation is a protocol message, not a duplicate emitted by the skill, so this tracks the current contract rather than masking a regression. --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: lowercase intent base name per OVOS-INTENT-2 §2 Rename count_to_N.intent to count_to_n.intent across all locales and update the intent handler and test references. Intent base names must consist only of lowercase ASCII letters, digits and underscores. Remove the orphaned count_to_N.error.dialog files: their base name carried an illegal dot, they were never referenced by the skill, and their text duplicated failed_extract_number.dialog, which is the dialog the number-extraction failure path actually speaks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(test): drift-immune subset e2e for stop and counting Replace the ordered expected_messages sequences (which double under the opt-in dual-send migration and break on the speak -> ovos.utterance.speak and complete_intent_failure -> ovos.intent.unmatched renames) with subset assertions. Each test now asserts only the load-bearing facts: the matched intent, whether a global/skill stop actually fired, and — for the counting skill — its own active_sessions state, which is the ground truth of whether counting is still running, instead of counting bus messages. Emit the unbounded 'count to infinity' on a daemon thread (FakeBus.emit runs handlers synchronously, so the infinite loop would otherwise block the test). Isolate XDG paths per xdist worker to avoid FileExistsError races and floor-pin ovoscope for CaptureSession/make_session helpers. --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* test: add ovoscope end-to-end intent-routing tests Cover the en-US count_to_N.intent samples against the trained Padacioso container, asserting the finite 'count to #', the scale/number-kind modifiers, and the unbounded 'count forever'/'count infinitely' phrasings all route to count_to_N.intent. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(test): match padacioso's lowercase registered intent name CI on feat/ovoscope-tests was failing: the padacioso container registers count_to_N.intent under its lowercased, extension-stripped basename (count_to_n), not the literal on-disk filename. Update the container-level assertions to match the actual registered key instead of the file spelling. * fix(test): drop stale .intent suffix from registered intent-name assertion Same padacioso-registration drift as the previous commit: the bus event is SKILL_ID:count_to_n, not SKILL_ID:count_to_n.intent. --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Vendors the skill's slice of the shared ovoscope golden-utterance corpus (5 rows, all "count forever ..." phrasings). Firing an unbounded count through the real bus would run the counting handler's time.sleep loop forever, so -- following this repo's own test_intents_en_us.py convention -- golden rows are checked against the trained padacioso container directly (container.calc_intent) rather than dispatched live. All 5 rows pass green as-is; no template defects found. Adds 7 negative utterances from other skills' domains, dispatched for real and asserted NOT claimed.
… instances (#51) The stop tests hardcoded the legacy mycroft.stop topic; current core emits the canonical ovos.stop, so STOPPED is now a set accepting either spelling, matching the file's existing NO_MATCH/SPOKE pattern. The skill-loading tests never shut down the skills and loaders they start, leaving workshop background threads mutating shared state during pytest teardown - a race that trips CI's coverage job; a tearDown now stops every instance.
Submitted by @denics via OVOS Localize Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
The count_to_N.intent templates for en-US, pt-PT, fr-FR and it-IT used
inline `#`/`##`/... digit wildcards, a padatious-specific pattern that
only ever matches bare digit sequences and never plain-language numbers
("count to five"). Replaced every wildcard occurrence with the portable
`{number}` slot (no .entity file, kept as an open slot) and deduplicated
the resulting flattened lines.
The intent handler already fell back to ovos-number-parser's
extract_number() over the raw utterance whenever no "number" slot was
present; now that a slot is always populated it needs to also accept
non-digit slot values, so the digit-only `int(number)` cast falls back to
extract_number(number, ...) on parse failure, letting word-form numbers
resolve through the slot path too.
Fail-before: reverted the source/locale changes with the new test still
in place; test_number_slot_parses_words_and_digits and
test_en_us_count_intents both failed (AssertionError: None !=
'ovos-skill-count.openvoiceos:count_to_n' : count to five). Reapplying
the fix makes both pass; full suite is 25 passed, 0 failed.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The intent_handler decorator registers "count_to_n.intent" but the it-IT locale shipped the file as "count_to_N.intent". Resource resolution matches filenames exactly by case within the requested lang directory; when it doesn't find one there it silently falls back to a language-agnostic walk of the whole locale tree and returns the first file with the right name it finds in any locale. For it-IT this meant it silently loaded the en-US intent samples instead of failing to find a resource at all, so the it-IT skill was trained on English utterances. Renamed the file to match the handler; en-US, fr-FR and pt-PT were already correctly named. Added a regression test asserting the it-IT resource resolves to the it-IT file (fails before the rename, resolving to en-US instead; passes after). Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The golden-utterance corpus for ovos-skill-count only carried five
"count forever ..." rows, all mapping to count_to_n.intent; no row
ever exercised the finite "count to <target>" phrasing that fills the
{number} slot, so a regression in the plain "count to {number}" or its
scale/kind-modifier variants could ship without the golden suite
noticing. Two other natural phrasings for the same finite target --
"can you count to five" and "count from one to twenty" -- were not
recognized by the en-US template at all.
Added six golden rows: a bare digit-word target ("count to ten"), a
bare numeral target ("count to 20"), a scale-modifier variant ("count
to 3 in long scale"), an ordinal-numbers variant ("count to five using
ordinal numbers"), and the two previously-unrecognized phrasings
("can you count to five", "count from one to twenty"). The handler
only ever counts from 1 (`for n in range(1, number + 1)`, no start
argument), so "count from one/1 to {number}" is anchored at one rather
than modeled as a general two-endpoint range the skill can't actually
serve. Added four new lines to the en-US count_to_n.intent template
("can you count to {number}", "could you count to {number}", "count
from one to {number}", "count from 1 to {number}") as flat literals
rather than "(a|b)" groups, matching this file's existing convention
of fully expanded lines and avoiding padacioso's per-line sampling cap
(a version using groups pushed the file's total expansions over 2000
samples, triggering padacioso to keep only one nondeterministic
expansion per line and making matches for the untrained branch flaky).
Verified via container.calc_intent probing that all six new
utterances route to count_to_n.intent, then fail-before'd the
assertions themselves: for the first four rows, stripping the bare
"count to {number}" line from the intent file made two of them fail
("count to ten", "count to five using ordinal numbers") and pass again
once restored; for the "can you .../count from ..." rows, reverting
just the four new template lines made both fail and pass again once
restored.
Full test/end2end suite: 24 passed / 2 failed after this change, vs
19 passed / 1 failed before. Both failures are in test_stop.py, whose
docstring-adjacent log output shows padaos "compiling in background,
serving last compiled state in the meantime" -- a known async-compile
race that is timing-sensitive under machine load; re-running
test_stop.py alone reproduces a single failure on a different test
each time, confirming this is pre-existing flakiness unrelated to the
golden_utterances.jsonl / count_to_n.intent changes in this commit.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…, sv-SE locales (#63)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Human review requested! This supersedes any earlier open release proposal for this repository.