Skip to content

feat: Add language customization and expanded test coverage#35

Merged
JarbasAl merged 19 commits into
devfrom
testtz
Mar 10, 2026
Merged

feat: Add language customization and expanded test coverage#35
JarbasAl merged 19 commits into
devfrom
testtz

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Mar 10, 2026

Copy link
Copy Markdown
Member

Summary by CodeRabbit

Release Notes

  • New Features

    • Multilingual testing support: Configure language and secondary language engines for test execution.
    • Enhanced GUI filtering in end-to-end tests with granular message control options.
    • Improved async message handling during test recording and execution.
  • Bug Fixes

    • Fixed crash in test recording caused by uninitialized message parameters.
  • Documentation

    • Expanded FAQ with CI workflow details and multilingual testing guidance.
    • Added comprehensive testing configuration examples.
  • Tests

    • Added extended end-to-end test suite with enhanced coverage scenarios.
  • Chores

    • Modernized CI/CD infrastructure with automated testing and validation workflows.

JarbasAl and others added 5 commits March 10, 2026 00:34
- MiniCroft: added `lang` and `secondary_langs` params to patch
  Configuration() before IntentService init, enabling Adapt/Padatious
  to register vocab for multiple languages
- End2EndTest.from_message(): fixed crash when async_messages=None
- End2EndTest.from_message(): added ignore_gui param (default True)
  to filter GUI namespace messages during fixture recording
- End2EndTest.from_message(): now passes ignore_messages, eof_msgs,
  async_messages to the returned End2EndTest object
- Updated docs/minicroft.md with new constructor params and
  Multilingual Testing section

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Mar 10, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR consolidates CI/CD workflows by delegating to external reusable workflows from OpenVoiceOS, adds language customization features to MiniCroft via new lang and secondary_langs parameters with automatic configuration patching and restoration, extends End2EndTest with GUI message filtering support, and introduces comprehensive test coverage including 985-line extended end-to-end tests and pytest plugin verification tests.

Changes

Cohort / File(s) Summary
CI/Workflow Consolidation
.github/workflows/publish_stable.yml, .github/workflows/release_workflow.yml
Modified existing workflows to add job guards, update external workflow references from TigreGotico@master to OpenVoiceOS@dev, consolidate internal job logic, introduce build_tests dependency for publish_alpha, and remove legacy jobs (notify, publish_pypi, propose_release).
New Automated Workflows
.github/workflows/build_tests.yml, .github/workflows/unit_tests.yml, .github/workflows/license_check.yml, .github/workflows/pip_audit.yml, .github/workflows/python_support.yml, .github/workflows/release_preview.yml, .github/workflows/repo_health.yml
Added seven new GitHub Actions workflows delegating to OpenVoiceOS external workflows for building, testing, license compliance, security audits, Python support validation, release preview, and repository health checks.
Language Customization & GUI Filtering
ovoscope/__init__.py
Added lang and secondary_langs parameters to MiniCroft constructor with automatic patching/restoration of global Configuration and SessionManager; extended End2EndTest with ignore_gui parameter and GUI message filtering via merged GUI_IGNORED list; updated serialization/deserialization to preserve language and filtering settings.
Test Suite Expansion
test/unittests/test_end2end_extended.py, test/unittests/test_pytest_plugin.py
Introduced comprehensive extended end-to-end tests (985 lines) covering routing, skill lifecycle, asynchronous messages, serialization, boot sequences, and multilingual configurations; added pytest plugin fixture verification tests (109 lines) validating minicroft fixture lifecycle and error handling.
Documentation & Configuration
docs/minicroft.md, docs/ci-integration.md, FAQ.md, MAINTENANCE_REPORT.md, pyproject.toml
Added MiniCroft documentation for new language parameters and multilingual testing examples; updated CI integration docs with OpenVoiceOS workflow references; expanded FAQ with testing guidance and bug-fix explanations; added coverage configuration to pyproject.toml; documented maintenance improvements and AI transparency notes.

Sequence Diagram(s)

sequenceDiagram
    participant Test as Test Code
    participant MiniCroft as MiniCroft.__init__
    participant Config as global Configuration
    participant SessionMgr as SessionManager
    participant Restore as MiniCroft.stop()

    Test->>MiniCroft: __init__(lang="es", secondary_langs=["fr"])
    
    Note over MiniCroft: Store original values in _had_* flags
    MiniCraft->>Config: Patch lang, secondary_langs<br/>(capture originals)
    
    MiniCraft->>SessionMgr: Apply lang to<br/>default_session.lang
    
    Note over MiniCraft: super().__init__() proceeds<br/>with patched config
    
    Test->>Test: Run tests with<br/>language config applied
    
    Test->>Restore: stop()
    
    Restore->>Config: Restore original lang/<br/>secondary_langs or remove keys
    Restore->>SessionMgr: Restore original lang setting
    
    Note over Restore: Use _had_* flags to<br/>determine restore vs. removal
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~70 minutes

Possibly related PRs

Poem

🐰 With languages flowing from east and from west,
And workflows now tidy, each passing its test,
The GUI messages filtered, the config restored,
A multilingual future we've collectively poured!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the two main features added in this changeset: language customization support for MiniCroft and expanded end-to-end test coverage.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch testtz

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (3)
test/unittests/test_pytest_plugin.py (1)

97-99: Prefix the unused patch argument if Ruff enforces ARG002.

mock_get is never read in this test, so Ruff will still flag the injected argument. Renaming it to _mock_get (or switching to a context-manager patch) keeps the file lint-clean without changing the test behavior.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/unittests/test_pytest_plugin.py` around lines 97 - 99, The injected
patch argument mock_get in the test function
test_get_minicroft_failure_no_name_error is unused and triggers Ruff ARG002;
rename the parameter to _mock_get (or alternatively apply the patch as a context
manager) so the patch on plugin_mod.get_minicroft
(side_effect=TimeoutError("boom")) remains applied but the unused-argument lint
error is suppressed.
test/unittests/test_end2end_extended.py (2)

632-632: Consider iterable unpacking for list concatenation.

Ruff suggests using iterable unpacking ([*a, *b]) instead of concatenation (a + b). This appears in multiple locations (lines 632, 730, 770, 865, 899, 977).

♻️ Example refactor
-ignore_messages=["ovos.skills.settings_changed"] + HANDLER_LIFECYCLE,
+ignore_messages=["ovos.skills.settings_changed", *HANDLER_LIFECYCLE],

Similarly for DEFAULT_IGNORED + HANDLER_LIFECYCLE:

-ignore_messages=DEFAULT_IGNORED + HANDLER_LIFECYCLE,
+ignore_messages=[*DEFAULT_IGNORED, *HANDLER_LIFECYCLE],
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/unittests/test_end2end_extended.py` at line 632, Replace list
concatenation with iterable unpacking for clarity and to satisfy Ruff: where
code builds lists like ["ovos.skills.settings_changed"] + HANDLER_LIFECYCLE (and
similar occurrences combining DEFAULT_IGNORED + HANDLER_LIFECYCLE), change them
to use unpacking (e.g., [*"ovos.skills.settings_changed"? not literal—unpack the
single-item list and the other iterable]) so that the constructed lists use
[*first_iterable, *second_iterable]; update the occurrences that form
ignore_messages and any other list constructions that currently use + with
HANDLER_LIFECYCLE or DEFAULT_IGNORED to use [*..., *...] instead.

622-636: Consider extracting duplicated _base_flags helper.

The _base_flags method is nearly identical in TestRoutingInternals (lines 622-636) and TestActiveSkillsInternals (lines 760-774), differing only in the test_routing default. This could be extracted to a shared utility or base class.

♻️ Suggested refactor

Create a shared helper or base class:

def _base_test_flags(*, test_routing=False, test_active_skills=False, **overrides):
    defaults = dict(
        test_message_number=False,
        test_msg_type=False,
        test_msg_data=False,
        test_msg_context=False,
        test_routing=test_routing,
        test_active_skills=test_active_skills,
        test_final_session=False,
        test_async_messages=False,
        test_async_message_number=False,
        ignore_messages=["ovos.skills.settings_changed", *HANDLER_LIFECYCLE],
        verbose=False,
    )
    defaults.update(overrides)
    return defaults

Then use it in both test classes:

# In TestRoutingInternals
**_base_test_flags(test_routing=True)

# In TestActiveSkillsInternals  
**_base_test_flags(test_active_skills=True)

Also applies to: 760-774

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/unittests/test_end2end_extended.py` around lines 622 - 636, The
_base_flags method is duplicated between TestRoutingInternals and
TestActiveSkillsInternals (only differing by test_routing/defaults), so extract
a shared helper (e.g., _base_test_flags) that accepts explicit test_routing and
test_active_skills kwargs and returns the same defaults dict (including
ignore_messages built from HANDLER_LIFECYCLE); then replace the class-local
_base_flags in both tests to call the new helper (pass test_routing=True in
TestRoutingInternals, test_active_skills=True in TestActiveSkillsInternals) and
update any callers to unpack the returned dict as before.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/release_workflow.yml:
- Line 4: The workflow_dispatch currently allows manual runs from any branch
which can run jobs against non-dev refs; update the job-level conditions for the
build_tests and publish_alpha jobs to require github.ref == 'refs/heads/dev' in
addition to existing checks so manual triggers only run on dev; locate the jobs
named build_tests and publish_alpha in the workflow and add the branch guard
(e.g., && github.ref == 'refs/heads/dev') to their if expressions.

In `@FAQ.md`:
- Around line 40-42: The FAQ claim "104 tests across 6 test files" is
inconsistent with the documented "58-test baseline" and "52 new tests";
recalculate and reconcile the totals by running the test suite (pytest) to get
the authoritative test count and coverage, then update the "What test coverage
does ovoscope have?" paragraph to show the correct total and a clear breakdown
(baseline vs new tests and number of test files), replacing the "104 tests"
figure and ensuring the breakdown matches the pytest output and other PR
documentation (references: the strings "104 tests", "58-test baseline", and "52
new tests").
- Around line 34-35: The FAQ overstates the gate: update the FAQ.md line that
references release_workflow.yml so it accurately says the release workflow runs
the unit tests only (the build_tests job runs pytest test/unittests/) rather
than the “full test suite”; alternatively, if you intend to gate publish_alpha
on more than unit tests, modify the .github/workflows/release_workflow.yml
build_tests job to run the additional test suites (extend the pytest invocation
or add steps) and keep the FAQ wording as “full test suite” and ensure
publish_alpha still has needs: build_tests.

In `@ovoscope/__init__.py`:
- Line 641: from_message() currently uses ignore_gui while capturing but
constructs the End2EndTest without that flag, causing GUI messages to be
stripped or duplicated in __post_init__; modify from_message() (and the other
construction sites around the mentioned blocks) to preserve the capture-time
ignore_gui value by passing it into the End2EndTest constructor (e.g., add
ignore_gui=<captured flag> when building the recorded test) and ensure
__post_init__ uses the instance attribute rather than a global/local capture
list; keep the separate capture-time ignore list for deciding what to record,
but set the End2EndTest.ignore_gui attribute so replay logic respects the
original capture flag.
- Line 96: The teardown logic only restores keys when the stored _original_*
value is not None, which misses the case where the config key didn't exist
originally; change the override code in MiniCroft (where it sets
_original_secondary_langs, and the similar _original_* variables for other keys)
to also record a boolean flag (e.g. _had_secondary_langs) indicating whether
cfg.get("secondary_langs") existed, and in stop() use that flag to either
pop("secondary_langs") when it did not exist originally or restore the original
value when it did; apply the same pattern to the other override/restore pairs
referenced (_original_primary_langs, _original_lang, etc.) so unset keys are
removed instead of left mutated.

---

Nitpick comments:
In `@test/unittests/test_end2end_extended.py`:
- Line 632: Replace list concatenation with iterable unpacking for clarity and
to satisfy Ruff: where code builds lists like ["ovos.skills.settings_changed"] +
HANDLER_LIFECYCLE (and similar occurrences combining DEFAULT_IGNORED +
HANDLER_LIFECYCLE), change them to use unpacking (e.g.,
[*"ovos.skills.settings_changed"? not literal—unpack the single-item list and
the other iterable]) so that the constructed lists use [*first_iterable,
*second_iterable]; update the occurrences that form ignore_messages and any
other list constructions that currently use + with HANDLER_LIFECYCLE or
DEFAULT_IGNORED to use [*..., *...] instead.
- Around line 622-636: The _base_flags method is duplicated between
TestRoutingInternals and TestActiveSkillsInternals (only differing by
test_routing/defaults), so extract a shared helper (e.g., _base_test_flags) that
accepts explicit test_routing and test_active_skills kwargs and returns the same
defaults dict (including ignore_messages built from HANDLER_LIFECYCLE); then
replace the class-local _base_flags in both tests to call the new helper (pass
test_routing=True in TestRoutingInternals, test_active_skills=True in
TestActiveSkillsInternals) and update any callers to unpack the returned dict as
before.

In `@test/unittests/test_pytest_plugin.py`:
- Around line 97-99: The injected patch argument mock_get in the test function
test_get_minicroft_failure_no_name_error is unused and triggers Ruff ARG002;
rename the parameter to _mock_get (or alternatively apply the patch as a context
manager) so the patch on plugin_mod.get_minicroft
(side_effect=TimeoutError("boom")) remains applied but the unused-argument lint
error is suppressed.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 45718737-6dd3-48b6-9878-bc10f4776ee9

📥 Commits

Reviewing files that changed from the base of the PR and between 7dd74a3 and 296a895.

⛔ Files ignored due to path filters (5)
  • test/__pycache__/__init__.cpython-311.pyc is excluded by !**/*.pyc
  • test/unittests/__pycache__/__init__.cpython-311.pyc is excluded by !**/*.pyc
  • test/unittests/__pycache__/test_capture_session.cpython-311-pytest-9.0.2.pyc is excluded by !**/*.pyc
  • test/unittests/__pycache__/test_end2end.cpython-311-pytest-9.0.2.pyc is excluded by !**/*.pyc
  • test/unittests/__pycache__/test_minicroft.cpython-311-pytest-9.0.2.pyc is excluded by !**/*.pyc
📒 Files selected for processing (9)
  • .github/workflows/publish_stable.yml
  • .github/workflows/release_workflow.yml
  • FAQ.md
  • MAINTENANCE_REPORT.md
  • docs/ci-integration.md
  • docs/minicroft.md
  • ovoscope/__init__.py
  • test/unittests/test_end2end_extended.py
  • test/unittests/test_pytest_plugin.py

Comment thread .github/workflows/release_workflow.yml
Comment thread FAQ.md
Comment thread FAQ.md Outdated
Comment thread ovoscope/__init__.py
Comment thread ovoscope/__init__.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (3)
docs/ci-integration.md (2)

245-245: Avoid hard-coding the current test count.

Line 245 will go stale as soon as tests are added or removed. I'd describe the workflow behavior without 58 tests, or link readers to the workflow file for live details.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/ci-integration.md` at line 245, Update the "Unit Tests" table entry so
it doesn't hard-code the test count: remove "58 tests" and instead describe the
behavior generically (e.g., "runs pytest with coverage") and/or point readers to
the `unit_tests.yml` workflow for the current test count and details; ensure the
row still mentions `unit_tests.yml` and the `pytest --cov=ovoscope` command so
readers can find the live source of truth.

153-153: Pin the workflow reference to an immutable commit SHA instead of the @dev branch.

Line 153 documents @dev, a mutable branch reference that can be updated unexpectedly. GitHub recommends pinning reusable workflows to a full-length commit SHA for reproducibility and security, as branch names (and tags) can be moved and may unexpectedly pick up unintended changes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/ci-integration.md` at line 153, The docs currently reference the
reusable workflow as
OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev which pins to
a mutable branch; update that reference to use the full commit SHA for the
target commit (e.g., replace `@dev` with @<full-commit-sha>) so the workflow is
immutable and reproducible, ensuring the text shows the exact 40-character
commit hash rather than a branch or tag.
.github/workflows/license_tests.yml (1)

13-15: Prefer an immutable ref for this reusable workflow.

Using @dev means license results can change whenever the upstream branch moves, even for the same commit in this repo. Pinning to a release tag or commit SHA will make this check reproducible.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/license_tests.yml around lines 13 - 15, The workflow
currently references the reusable workflow with a moving ref
"OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev"; replace
that mutable ref with an immutable one (a release tag like `@v1.2.3` or a commit
SHA) so results are reproducible—edit the uses line to e.g.
"OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@<TAG-or-SHA>"
and keep the existing with: install_extras: '[pydantic]' unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/build_tests.yml:
- Around line 9-11: The workflow contains a dead PR filter 'requirements/**'
that doesn't exist; update the paths list so dependency changes actually trigger
the job by replacing 'requirements/**' with the repository's real dependency
files (for example add 'requirements.txt' or 'pyproject.toml' already present,
and/or 'poetry.lock' or 'setup.cfg' if those exist), or remove the nonexistent
pattern altogether and ensure the paths array includes the correct dependency
filenames referenced by your project.
- Around line 30-38: The workflow currently runs python -m build twice and then
installs from source using the "Install package" step (pip install .[pydantic]),
which bypasses validation of the built artifacts; remove the duplicate "Build
Source Packages"/"Build Distribution Packages" redundancy (keep a single python
-m build) and change the "Install package" step to install the actual built
wheel from dist (use pip install dist/*.whl[pydantic]) so the job verifies the
produced wheel/sdist rather than the source tree.

In @.github/workflows/pipaudit.yml:
- Around line 2-7: The workflow currently triggers only on push to master/dev
and manual dispatch; add a pull_request trigger to run the audit for incoming
PRs (at least for branch: dev) so dependency scans run before merge; update the
workflow "on" section to include a pull_request key with branches: - dev (and
optionally master) to ensure jobs defined in this file execute for PR events,
referencing the existing top-level on block in .github/workflows/pipaudit.yml.
- Around line 25-31: The workflow currently installs the package without extras
("pip install .") so the declared optional dependency group pydantic (from
pyproject.toml) isn't audited; update the GitHub Actions step named "Install
package" to install the pydantic extra (use pip install ".[pydantic]") so the
pypa/gh-action-pip-audit scan covers the pydantic extra dependency set
referenced in pyproject.toml.

In @.github/workflows/release_workflow.yml:
- Around line 29-39: The workflow currently references the upstream reusable
workflow with a moving ref
"OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev"; replace
that `@dev` ref with an immutable tag or full commit SHA (e.g., change the "uses"
value to ".../publish-alpha.yml@vX.Y.Z" or "...@<commit-sha>") so repeated runs
use the exact same upstream code; keep the rest of the block (secrets: inherit
and with: keys like branch, version_file, publish_pypi, etc.) unchanged.

In `@MAINTENANCE_REPORT.md`:
- Around line 35-39: Summary: Capitalize "GitHub" throughout the workflow notes
in MAINTENANCE_REPORT.md. Fix: update the text in the block that mentions
`.github/workflows/unit_tests.yml`, `.github/workflows/build_tests.yml`,
`.github/workflows/license_tests.yml`, `.github/workflows/pipaudit.yml`, and
`.github/workflows/release_workflow.yml` so every occurrence of "github" is
changed to "GitHub" (preserve surrounding punctuation and filenames exactly).
- Around line 1-28: The summary test-total math is inconsistent: the text lists
previous 58 tests and adds 46 + 6 = 52 new tests but still reports "58 → 104
tests"; update the summary and any matching totals to reflect 58 + 52 = 110
(change the "58 → 104 tests" occurrence to "58 → 110 tests" and verify other
places in MAINTENANCE_REPORT.md that mention totals or the two new files
`test/unittests/test_end2end_extended.py` and
`test/unittests/test_pytest_plugin.py` are consistent with 52 added tests and
the final total of 110).

---

Nitpick comments:
In @.github/workflows/license_tests.yml:
- Around line 13-15: The workflow currently references the reusable workflow
with a moving ref
"OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev"; replace
that mutable ref with an immutable one (a release tag like `@v1.2.3` or a commit
SHA) so results are reproducible—edit the uses line to e.g.
"OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@<TAG-or-SHA>"
and keep the existing with: install_extras: '[pydantic]' unchanged.

In `@docs/ci-integration.md`:
- Line 245: Update the "Unit Tests" table entry so it doesn't hard-code the test
count: remove "58 tests" and instead describe the behavior generically (e.g.,
"runs pytest with coverage") and/or point readers to the `unit_tests.yml`
workflow for the current test count and details; ensure the row still mentions
`unit_tests.yml` and the `pytest --cov=ovoscope` command so readers can find the
live source of truth.
- Line 153: The docs currently reference the reusable workflow as
OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev which pins to
a mutable branch; update that reference to use the full commit SHA for the
target commit (e.g., replace `@dev` with @<full-commit-sha>) so the workflow is
immutable and reproducible, ensuring the text shows the exact 40-character
commit hash rather than a branch or tag.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 57278595-9c58-4e41-9bf7-e9a6a4bf3644

📥 Commits

Reviewing files that changed from the base of the PR and between 296a895 and 6f466d2.

📒 Files selected for processing (8)
  • .github/workflows/build_tests.yml
  • .github/workflows/license_tests.yml
  • .github/workflows/pipaudit.yml
  • .github/workflows/publish_stable.yml
  • .github/workflows/release_workflow.yml
  • .github/workflows/unit_tests.yml
  • MAINTENANCE_REPORT.md
  • docs/ci-integration.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/publish_stable.yml

Comment thread .github/workflows/build_tests.yml Outdated
Comment thread .github/workflows/build_tests.yml Outdated
Comment thread .github/workflows/pipaudit.yml Outdated
Comment thread .github/workflows/pipaudit.yml Outdated
Comment thread .github/workflows/release_workflow.yml
Comment thread MAINTENANCE_REPORT.md Outdated
Comment thread MAINTENANCE_REPORT.md
@JarbasAl JarbasAl changed the title tests and automations feat: Add language customization and expanded test coverage Mar 10, 2026
@github-actions github-actions Bot added feature and removed feature labels Mar 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ovoscope/__init__.py (1)

680-684: ⚠️ Potential issue | 🟠 Major

Handle the first recorded message without a session.

On the first iteration, capture.responses is still empty, so Line 683 raises IndexError whenever the initial message lacks a session context. Only copy from the previous response after the first message; otherwise seed from the current default session.

Suggested fix
         for idx, source_message in enumerate(message):
             if "session" not in source_message.context:
                 # propagate session updates as a client would do
-                source_message.context["session"] = capture.responses[-1].context["session"]
+                if idx == 0 or not capture.responses:
+                    source_message.context["session"] = (
+                        SessionManager.default_session.serialize()
+                    )
+                else:
+                    source_message.context["session"] = (
+                        capture.responses[-1].context["session"]
+                    )
             capture.capture(source_message, timeout)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ovoscope/__init__.py` around lines 680 - 684, When iterating messages, avoid
indexing capture.responses[ -1 ] when it's empty; update the loop in which
source_message without a "session" gets one by first checking if
capture.responses is non-empty and only then copying
capture.responses[-1].context["session"], otherwise seed
source_message.context["session"] from the capture object's default/initial
session (e.g., capture.default_session or capture.initial_session) before
calling capture.capture(source_message, timeout); this ensures the first
recorded message is given a valid session without raising IndexError.
🧹 Nitpick comments (1)
.github/workflows/release_workflow.yml (1)

19-24: Consider removing unused build package and uploading coverage artifacts.

  1. The build package is installed but not used in this job.
  2. Coverage XML is generated but not uploaded, so it's lost after the job completes.
♻️ Optional: Remove unused dependency and add coverage upload
       - name: Install dependencies
         run: |
-          pip install build pytest pytest-cov
+          pip install pytest pytest-cov
           pip install -e .[pydantic]
       - name: Run unit tests
         run: pytest test/unittests/ -v --cov=ovoscope --cov-report xml
+      - name: Upload coverage report
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-report
+          path: coverage.xml
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release_workflow.yml around lines 19 - 24, Remove the
unused "build" package from the "Install dependencies" step (change the pip
install line that currently installs "build pytest pytest-cov" to only install
the packages actually needed, e.g., "pytest pytest-cov" and the editable
install), and add a new job step after the "Run unit tests" step to upload the
generated coverage XML (coverage.xml) as a workflow artifact using the GitHub
Actions upload-artifact action so the --cov-report xml output is preserved for
later inspection.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@ovoscope/__init__.py`:
- Around line 211-212: Before you overwrite SessionManager.default_session.lang
with self._lang, capture the current value from
SessionManager.default_session.lang into self._original_lang (not from
Configuration()); then in stop() restore SessionManager.default_session.lang
from that saved self._original_lang. Update the code paths that set/restore the
locale (the place assigning SessionManager.default_session.lang = self._lang and
the stop() restoration logic around lines 265-272) so they use the captured
original value to avoid leaking a config-derived locale.
- Around line 667-672: The function from_message currently uses `or` to assign
defaults (e.g., `eof_msgs = eof_msgs or DEFAULT_EOF`) which treats an explicit
empty list as falsy and overrides caller intent; change each defaulting
assignment to check for None (e.g., `if eof_msgs is None: eof_msgs =
DEFAULT_EOF`) for eof_msgs, flip_points, ignore_messages, and async_messages so
empty lists are preserved, and keep the ignore_gui branch to extend
ignore_messages only after you ensure ignore_messages is not None (or initialize
it from DEFAULT_IGNORED when None) so the GUI_IGNORED merge behaves correctly.
- Around line 421-424: The code mutates the shared default list by appending
GUI_IGNORED into self.ignore_messages which may be the module-level
DEFAULT_IGNORED; to fix, ensure self.ignore_messages is a new local list before
modifying it (e.g., copy it or create a new list/set) and then add GUI_IGNORED
entries (or perform a set-union) so GUI_IGNORED is not appended into the shared
DEFAULT_IGNORED; update the logic around GUI_IGNORED and self.ignore_messages to
work on that copied list and avoid in-place mutation.

---

Outside diff comments:
In `@ovoscope/__init__.py`:
- Around line 680-684: When iterating messages, avoid indexing
capture.responses[ -1 ] when it's empty; update the loop in which source_message
without a "session" gets one by first checking if capture.responses is non-empty
and only then copying capture.responses[-1].context["session"], otherwise seed
source_message.context["session"] from the capture object's default/initial
session (e.g., capture.default_session or capture.initial_session) before
calling capture.capture(source_message, timeout); this ensures the first
recorded message is given a valid session without raising IndexError.

---

Nitpick comments:
In @.github/workflows/release_workflow.yml:
- Around line 19-24: Remove the unused "build" package from the "Install
dependencies" step (change the pip install line that currently installs "build
pytest pytest-cov" to only install the packages actually needed, e.g., "pytest
pytest-cov" and the editable install), and add a new job step after the "Run
unit tests" step to upload the generated coverage XML (coverage.xml) as a
workflow artifact using the GitHub Actions upload-artifact action so the
--cov-report xml output is preserved for later inspection.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7ff55774-7604-4cdc-9d38-3efab658be83

📥 Commits

Reviewing files that changed from the base of the PR and between 6f466d2 and d907144.

📒 Files selected for processing (3)
  • .github/workflows/build_tests.yml
  • .github/workflows/release_workflow.yml
  • ovoscope/__init__.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/build_tests.yml

Comment thread ovoscope/__init__.py
Comment thread ovoscope/__init__.py
Comment thread ovoscope/__init__.py Outdated
@github-actions github-actions Bot added feature and removed feature labels Mar 10, 2026
@OpenVoiceOS OpenVoiceOS deleted a comment from github-actions Bot Mar 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/unit_tests.yml:
- Around line 6-24: The workflow currently ignores changes to '.github/**' in
both the push and pull_request `paths-ignore` lists, which causes CI to skip
when only workflow/CI files change; remove the '.github/**' entry from the
`paths-ignore` arrays (both the top-level and the push block) so updates to
workflow files trigger the job and the workflow validates its own CI changes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4423441d-0113-4fc2-bcd8-e81eee44d081

📥 Commits

Reviewing files that changed from the base of the PR and between d907144 and d8cef52.

📒 Files selected for processing (3)
  • .github/workflows/pipaudit.yml
  • .github/workflows/unit_tests.yml
  • pyproject.toml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/pipaudit.yml

Comment thread .github/workflows/unit_tests.yml Outdated
@github-actions github-actions Bot added feature and removed feature labels Mar 10, 2026
@OpenVoiceOS OpenVoiceOS deleted a comment from github-actions Bot Mar 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
.github/workflows/release_workflow.yml (1)

29-29: ⚠️ Potential issue | 🟠 Major

Pin the publish workflow to an immutable ref.

A release path should not depend on @dev; two runs for the same commit can execute different upstream publish logic. Use a tag or full commit SHA instead.

Does GitHub recommend pinning third-party actions and reusable workflows to a full commit SHA instead of a branch ref, and does that guidance apply to release workflows?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release_workflow.yml at line 29, The workflow currently
references a reusable workflow with a mutable ref ("uses:
OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev"), which can
change between runs; update that line to pin to an immutable ref (a tag or full
commit SHA) such as replacing "@dev" with a specific tag or the repository
commit SHA for publish-alpha.yml so the release workflow always runs the exact
same upstream code.
.github/workflows/build_tests.yml (1)

29-37: ⚠️ Potential issue | 🟠 Major

Build once, then install the artifact you just produced.

python -m build already creates both sdist and wheel, so the second build is redundant. More importantly, pip install .[pydantic] re-tests the source checkout instead of the wheel that would be published, which misses packaging and file-inclusion regressions. As per coding guidelines, "External-call hazards that can corrupt data or cause cascading outages" and "Reliability concerns that degrade user experience or resilience" should be fixed before release.

Suggested change
-      - name: Build Source Packages
-        run: |
-          python -m build
-      - name: Build Distribution Packages
-        run: |
-          python -m build
-      - name: Install package
-        run: |
-          pip install .[pydantic]
+      - name: Build packages
+        run: |
+          python -m build
+      - name: Install built wheel
+        run: |
+          WHEEL="$(echo dist/*.whl)"
+          python -m pip install "ovoscope[pydantic] @ file://${PWD}/${WHEEL}"
What is the correct pip/PEP 508 syntax to install extras from a local wheel file, e.g. `package[extra] @ file:///.../dist/pkg.whl`?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build_tests.yml around lines 29 - 37, The workflow runs
python -m build twice and then pip installs the source tree instead of the
produced wheel; remove the duplicate Build Distribution Packages step, run build
once, capture the produced .whl (e.g. WHEEL=$(ls dist/*.whl)) and install that
wheel with extras using the PEP 508 file URL syntax like pip install "package[
pydantic] @ file://$PWD/$WHEEL" (or construct the correct package name/wheel
path) so CI installs the actual artifact produced by the build rather than
re-running a source install; update step names "Build Source Packages" /
"Install package" accordingly.
🧹 Nitpick comments (1)
.github/workflows/license_check.yml (1)

13-13: Pin the reusable workflow to an immutable ref.

@dev makes this workflow a moving target—upstream changes can alter CI behavior without any PR in this repo. Use a release tag or full commit SHA instead. GitHub's security guidance recommends pinning third-party actions and reusable workflows to a full-length commit SHA for stability and supply-chain security. The same mutable-ref pattern appears in .github/workflows/pip_audit.yml, .github/workflows/release_preview.yml, and .github/workflows/python_support.yml.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/license_check.yml at line 13, The workflow currently
references the reusable workflow with a mutable ref ("uses:
OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev"), which
should be pinned to an immutable ref; update that uses line to point to a fixed
release tag or full commit SHA (replace "@dev" with the chosen tag or
full-length commit SHA) and make the same change in the other affected workflow
files (.github/workflows/pip_audit.yml, .github/workflows/release_preview.yml,
.github/workflows/python_support.yml) so CI consumes a stable, auditable version
of the OpenVoiceOS/gh-automations workflow.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/build_tests.yml:
- Around line 6-10: The pull_request.paths filter currently only lists
'pyproject.toml' which misses source and workflow changes; update the
pull_request.paths section in the build_tests workflow to also include the
package source and the workflow file itself by adding entries like 'ovoscope/**'
and '.github/workflows/build_tests.yml' (or remove the paths filter entirely) so
changes to package code or this workflow will trigger the CI; modify the
pull_request.paths block accordingly where it appears in the workflow (look for
the pull_request.paths key).

In @.github/workflows/repo_health.yml:
- Line 9: The reusable workflow reference currently uses a mutable branch tag
("uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev");
replace the branch ref with an immutable full commit SHA for the desired version
of the OpenVoiceOS/gh-automations repo so CI is pinned to a specific commit
(update the "uses:
OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@..." entry to use
the full commit SHA string).

---

Duplicate comments:
In @.github/workflows/build_tests.yml:
- Around line 29-37: The workflow runs python -m build twice and then pip
installs the source tree instead of the produced wheel; remove the duplicate
Build Distribution Packages step, run build once, capture the produced .whl
(e.g. WHEEL=$(ls dist/*.whl)) and install that wheel with extras using the PEP
508 file URL syntax like pip install "package[ pydantic] @ file://$PWD/$WHEEL"
(or construct the correct package name/wheel path) so CI installs the actual
artifact produced by the build rather than re-running a source install; update
step names "Build Source Packages" / "Install package" accordingly.

In @.github/workflows/release_workflow.yml:
- Line 29: The workflow currently references a reusable workflow with a mutable
ref ("uses:
OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev"), which can
change between runs; update that line to pin to an immutable ref (a tag or full
commit SHA) such as replacing "@dev" with a specific tag or the repository
commit SHA for publish-alpha.yml so the release workflow always runs the exact
same upstream code.

---

Nitpick comments:
In @.github/workflows/license_check.yml:
- Line 13: The workflow currently references the reusable workflow with a
mutable ref ("uses:
OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev"), which
should be pinned to an immutable ref; update that uses line to point to a fixed
release tag or full commit SHA (replace "@dev" with the chosen tag or
full-length commit SHA) and make the same change in the other affected workflow
files (.github/workflows/pip_audit.yml, .github/workflows/release_preview.yml,
.github/workflows/python_support.yml) so CI consumes a stable, auditable version
of the OpenVoiceOS/gh-automations workflow.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cffdd830-630f-43ae-8625-0d6f6b896da0

📥 Commits

Reviewing files that changed from the base of the PR and between d8cef52 and a593760.

📒 Files selected for processing (8)
  • .github/workflows/build_tests.yml
  • .github/workflows/license_check.yml
  • .github/workflows/pip_audit.yml
  • .github/workflows/python_support.yml
  • .github/workflows/release_preview.yml
  • .github/workflows/release_workflow.yml
  • .github/workflows/repo_health.yml
  • .github/workflows/unit_tests.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/unit_tests.yml

Comment thread .github/workflows/build_tests.yml Outdated
Comment thread .github/workflows/repo_health.yml
@OpenVoiceOS OpenVoiceOS deleted a comment from github-actions Bot Mar 10, 2026
JarbasAl and others added 2 commits March 10, 2026 04:28
- build_tests.yml: remove paths filter (now runs on all PRs); add package_name
  and version_file for channel compatibility check
- release_preview.yml: add package_name and version_file for channel check
- unit_tests.yml: fix install_extras ("-e .[pydantic]" -> "[pydantic]");
  remove push trigger and paths-ignore so coverage always posts on PRs
- release_workflow.yml: remove redundant github.ref guard on job conditions
- downstream_check.yml: new workflow
- python_support.yml: removed (superseded by build-tests.yml)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@OpenVoiceOS OpenVoiceOS deleted a comment from github-actions Bot Mar 10, 2026
@github-actions

github-actions Bot commented Mar 10, 2026

Copy link
Copy Markdown

Hello! I've finished running some automated checks on this PR. 👋

I've aggregated the results of the automated checks for this PR below.

🏷️ Release Preview

Here's what the next release might look like! 🚀

Current: 0.8.0a2Next: 0.9.0a1

Signal Value
Label feature
PR title feat: Add language customization and expanded test coverage
Bump minor

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 0.9.0a1

Channel Status Note Current Constraint
Stable Not in channel -
Testing Compatible ovoscope>=0.7.2,<1.0.0
Alpha Compatible ovoscope>=0.7.2

🔒 Security (pip-audit)

Security check! Are we safe from vulnerabilities? 🛡️

❌ Vulnerabilities found — check the job log for details.

⚖️ License Check

Are we all good on the legal front? Let's find out! 📑

✅ No license violations found (60 packages).

License distribution: 14× MIT, 14× MIT License, 9× Apache Software License, 4× Apache-2.0, 4× BSD-3-Clause, 2× ISC License (ISCL), 2× PSF-2.0, 2× Python Software Foundation License, +8 more

Full breakdown — 60 packages
Package Version License URL
annotated-doc 0.0.4 MIT link
annotated-types 0.7.0 MIT License link
anyio 4.12.1 MIT link
audioop-lts 0.2.2 PSF-2.0 link
build 1.4.0 MIT link
certifi 2026.2.25 Mozilla Public License 2.0 (MPL 2.0) link
charset-normalizer 3.4.5 MIT link
click 8.3.1 BSD-3-Clause link
combo_lock 0.3.0 Apache Software License link
fastapi 0.135.1 MIT link
filelock 3.25.1 MIT link
h11 0.16.0 MIT License link
idna 3.11 BSD-3-Clause link
importlib_metadata 8.7.1 Apache-2.0 link
json-database 0.10.1 MIT link
kthread 0.2.3 MIT License link
langcodes 3.5.1 MIT License link
markdown-it-py 4.0.0 MIT License link
mdurl 0.1.2 MIT License link
memory-tempfile 2.2.3 MIT License link
ovos-config 2.1.1 Apache-2.0 link
ovos-number-parser 0.5.1 Apache Software License link
ovos-plugin-manager 2.2.0 Apache-2.0 link
ovos-pydantic-models 0.1.1 Apache-2.0 link
ovos-solver-yes-no-plugin 0.2.8 MIT link
ovos_bus_client 1.5.0 Apache Software License link
ovos_core 2.1.3a2 Apache Software License link
ovos_utils 0.8.5a2 Apache link
ovos_workshop 8.0.0 apache-2.0 link
ovoscope 0.8.0a2 Apache Software License link
packaging 26.0 Apache-2.0 OR BSD-2-Clause link
padacioso 1.0.0 apache-2.0 link
pexpect 4.9.0 ISC License (ISCL) link
ptyprocess 0.7.0 ISC License (ISCL) link
pydantic 2.12.5 MIT link
pydantic_core 2.41.5 MIT link
pyee 12.1.1 MIT License link
Pygments 2.19.2 BSD License link
pyproject_hooks 1.2.0 MIT License link
python-dateutil 2.9.0.post0 Apache Software License; BSD License link
PyYAML 6.0.3 MIT License link
quebra-frases 0.3.7 Apache Software License link
RapidFuzz 3.14.3 MIT link
regex 2026.2.28 Apache-2.0 AND CNRI-Python link
requests 2.32.5 Apache Software License link
rich 13.9.4 MIT License link
rich-click 1.9.7 MIT License

Copyright (c) 2022 Phil Ewels

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
| link |
| simplematch | 1.4 | MIT License | link |
| six | 1.17.0 | MIT License | link |
| standard-aifc | 3.13.0 | Python Software Foundation License | link |
| standard-chunk | 3.13.0 | Python Software Foundation License | link |
| starlette | 0.52.1 | BSD-3-Clause | link |
| typing-inspection | 0.4.2 | MIT | link |
| typing_extensions | 4.15.0 | PSF-2.0 | link |
| unicode-rbnf | 2.4.0 | MIT License | |
| urllib3 | 2.6.3 | MIT | link |
| uvicorn | 0.41.0 | BSD-3-Clause | link |
| watchdog | 2.3.1 | Apache Software License | link |
| websocket-client | 1.9.0 | Apache Software License | link |
| zipp | 3.23.0 | MIT | link |

Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed.

🔨 Build Tests

I've put your code through the build grinder. ☕

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

📋 Repo Health

How's the repo's pulse? Let's take a look. 💓

✅ All required files present.

Latest Version: 0.8.0a2

ovoscope/version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
CHANGELOG.md — Changelog
⚠️ requirements.txt — Requirements
ovoscope/version.py has valid version block markers


Automating the boring stuff so you don't have to! 🚀

JarbasAl and others added 3 commits March 10, 2026 05:29
build-tests.yml no longer uses these (channel check was removed from
the reusable workflow).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- release_workflow.yml: replace inline build_tests job with reusable
  build-tests.yml@dev (runs full matrix 3.10-3.14, uses wheel install)
- unit_tests.yml: fix install_extras — was '[pydantic]' (invalid pip arg),
  now 'ovoscope[pydantic]' which reinstalls with the optional extra after
  coverage.yml's editable install

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JarbasAl JarbasAl merged commit 0428dbf into dev Mar 10, 2026
9 of 10 checks passed
JarbasAl added a commit that referenced this pull request Mar 10, 2026
* feat: docs, tests and some tiny improvements (#30)

* feat: docs, tests and some tiny improvements

* feat: docs, tests and some tiny improvements

* feat: docs, tests and some tiny improvements

* Increment Version to

* Add renovate.json (#29)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Increment Version to

* Update Changelog

* feat: Add language customization and expanded test coverage (#35)

* feat: docs, tests and some tiny improvements

* feat: docs, tests and some tiny improvements

* feat: docs, tests and some tiny improvements

* feat: add multilingual testing support and fix from_message bugs

- MiniCroft: added `lang` and `secondary_langs` params to patch
  Configuration() before IntentService init, enabling Adapt/Padatious
  to register vocab for multiple languages
- End2EndTest.from_message(): fixed crash when async_messages=None
- End2EndTest.from_message(): added ignore_gui param (default True)
  to filter GUI namespace messages during fixture recording
- End2EndTest.from_message(): now passes ignore_messages, eof_msgs,
  async_messages to the returned End2EndTest object
- Updated docs/minicroft.md with new constructor params and
  Multilingual Testing section

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: tests

* chore: tests

* chore: tests

* coderabbitt

* tests

* tests

* update

* coderrabbit

* coderrabbit

* .

* ci: update workflows for gh-automations refactor

- build_tests.yml: remove paths filter (now runs on all PRs); add package_name
  and version_file for channel compatibility check
- release_preview.yml: add package_name and version_file for channel check
- unit_tests.yml: fix install_extras ("-e .[pydantic]" -> "[pydantic]");
  remove push trigger and paths-ignore so coverage always posts on PRs
- release_workflow.yml: remove redundant github.ref guard on job conditions
- downstream_check.yml: new workflow
- python_support.yml: removed (superseded by build-tests.yml)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* .

* chore: remove unused package_name/version_file inputs from build_tests

build-tests.yml no longer uses these (channel check was removed from
the reusable workflow).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* fix: standardize CI workflows for release readiness

- release_workflow.yml: replace inline build_tests job with reusable
  build-tests.yml@dev (runs full matrix 3.10-3.14, uses wheel install)
- unit_tests.yml: fix install_extras — was '[pydantic]' (invalid pip arg),
  now 'ovoscope[pydantic]' which reinstalls with the optional extra after
  coverage.yml's editable install

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* gitignore

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Update downstream dependency report for ovoscope

* Increment Version to 0.9.0a1

* Update Changelog

* drop pycache

* fix: clean up CI/CD — remove release gate, fix pydantic install (#36)

* feat: docs, tests and some tiny improvements

* feat: docs, tests and some tiny improvements

* chore: tests

* chore: tests

* tests

* tests

* coderrabbit

* ci: update workflows for gh-automations refactor

- build_tests.yml: remove paths filter (now runs on all PRs); add package_name
  and version_file for channel compatibility check
- release_preview.yml: add package_name and version_file for channel check
- unit_tests.yml: fix install_extras ("-e .[pydantic]" -> "[pydantic]");
  remove push trigger and paths-ignore so coverage always posts on PRs
- release_workflow.yml: remove redundant github.ref guard on job conditions
- downstream_check.yml: new workflow
- python_support.yml: removed (superseded by build-tests.yml)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: remove unused package_name/version_file inputs from build_tests

build-tests.yml no longer uses these (channel check was removed from
the reusable workflow).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* fix: remove duplicate coverage_source line in unit_tests.yml

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: split coverage into PR checks and Pages deployment

- unit_tests.yml: coverage + PR comment on pull_request (permissions: pr write)
- coverage_pages.yml: coverage + GitHub Pages on push to dev (permissions: pages, id-token)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* cov

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Increment Version to 0.9.1a1

* Update Changelog

* Increment Version to 0.9.1a2

---------

Co-authored-by: JarbasAI <33701864+JarbasAl@users.noreply.github.com>
Co-authored-by: JarbasAl <JarbasAl@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: miro <jarbasai@mailfence.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant