Conversation
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughIntroduces extensive test harness and docs: MiniCroft gains config/pipeline isolation and inject_message/get_minicroft timeouts; a pydantic_helpers bridge for typed message conversion and fixture validation; a pytest plugin; migration to pyproject.toml; many docs; and a large new unit test suite. Changes
Sequence Diagram(s)sequenceDiagram
participant Test as TestRunner
participant MC as MiniCroft
participant Sess as SessionManager
participant Bus as FakeBus
rect rgba(200,230,255,0.5)
Test->>MC: get_minicroft(skill_ids, max_wait)
MC->>MC: initialise (isolate_config=True, default_pipeline=DEFAULT_TEST_PIPELINE)
MC->>Sess: set default_pipeline (override)
MC->>Bus: start and wait READY (max_wait)
end
rect rgba(200,255,200,0.5)
Test->>MC: inject_message(msg)
MC->>Bus: emit message directly (bypass utterance pipeline)
Bus->>Skill: deliver message
Skill-->>Bus: emit responses/events
Bus-->>Test: CaptureSession records responses
end
rect rgba(255,230,200,0.5)
Test->>MC: stop()
MC->>Sess: restore original pipeline
MC->>MC: restore original config/blacklists
MC-->>Test: stopped
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (12)
ovoscope/pydantic_helpers.py (1)
143-200: Consider validating required top-level fixture fields.
validate_fixture()validates individual message schemas but does not verify that required top-level fields (skill_ids,source_message,expected_messages) are present. If these are missing,End2EndTest.deserialize()will raise aKeyErrorrather than the clearValueErrorthis function aims to provide.Proposed fix to validate required fields
_require_pydantic() path = Path(path) with path.open() as f: data: "SerializedTest" = json.load(f) + # Validate required top-level fields + required = ("skill_ids", "source_message", "expected_messages") + missing = [f for f in required if f not in data] + if missing: + raise ValueError(f"Fixture missing required fields {missing} in {path}") + for section in ("source_message", "expected_messages"):🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ovoscope/pydantic_helpers.py` around lines 143 - 200, validate_fixture currently only validates messages but doesn't check for required top-level keys so missing fields cause End2EndTest.deserialize to raise KeyError; update validate_fixture to assert presence of the required top-level keys ("skill_ids", "source_message", "expected_messages") immediately after loading data and before iterating messages, and if any are missing raise a ValueError with a clear message referencing the missing keys and the fixture path (no stack trace chaining required); locate this logic inside validate_fixture (near where data is json.load'd and before the loop that calls OpenVoiceOSMessage.model_validate) and return the same data if the keys are present.docs/capture-session.md (1)
46-54: Add language specifier to the ASCII diagram code block.The message routing diagram should use
textas the language specifier for consistency.🔧 Proposed fix
-``` +```text incoming message │ ├─ msg_type in async_messages? → async_responses (unordered)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/capture-session.md` around lines 46 - 54, The ASCII diagram code block starting with "incoming message" should include a language specifier; update the fenced code block that contains the diagram (the block showing "incoming message" and the routing arrows) to use ```text instead of plain ``` so the diagram is marked as text for consistent rendering.test/unittests/test_minicroft.py (1)
171-172: Rename unused parameter to suppress linter warning.The
msgparameter is unused because the test only checks whether the event fires, not its contents. Prefix with underscore to indicate intentional non-use.🔧 Proposed fix
- def on_handled(msg: Message): + def on_handled(_msg: Message): handled.set()🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_minicroft.py` around lines 171 - 172, The test callback on_handled currently declares an unused parameter msg which triggers linter warnings; rename the parameter to _msg (or prefix it with an underscore) in the on_handled function declaration to indicate intentional non-use and suppress the linter, keeping the body calling handled.set() unchanged and ensuring no other references to msg exist.docs/usage-guide.md (1)
561-565: Add language specifier to the code block.This code block should specify
pythonfor proper syntax highlighting.🔧 Proposed fix
-``` +```python LOG.set_level("DEBUG") minicroft = get_minicroft(["my-skill.author"]) # Watch for "Loaded skill: my-skill.author" in output🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/usage-guide.md` around lines 561 - 565, The code block in the docs uses Python code (LOG.set_level("DEBUG"), get_minicroft([...])) but lacks a language specifier; update the fenced code block to include the python specifier (```python) so syntax highlighting applies for the LOG.set_level, get_minicroft and related sample lines.test/unittests/test_pydantic_helpers.py (2)
202-205: Consider usingtempfile.gettempdir()for portability.While this test correctly checks
FileNotFoundErrorfor a non-existent path, using a hardcoded/tmppath is less portable across platforms. The Ruff S108 warning is a false positive for security since the file is never created, but the suggestion improves cross-platform compatibility.🔧 Proposed fix
+import os + def test_missing_file_raises_file_not_found(self) -> None: """validate_fixture raises FileNotFoundError for a non-existent path.""" with self.assertRaises(FileNotFoundError): - validate_fixture("/tmp/ovoscope_nonexistent_fixture_xyz.json") + validate_fixture(os.path.join(tempfile.gettempdir(), "ovoscope_nonexistent_fixture_xyz.json"))🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_pydantic_helpers.py` around lines 202 - 205, Replace the hardcoded "/tmp/..." path in test_missing_file_raises_file_not_found with a portable temp directory by using tempfile.gettempdir() to build the non-existent filename; update the test to call validate_fixture with os.path.join(tempfile.gettempdir(), "ovoscope_nonexistent_fixture_xyz.json") (referencing the test method test_missing_file_raises_file_not_found and the validate_fixture function) so the test remains platform-independent while still asserting FileNotFoundError.
140-147: Temp files are not cleaned up after tests.The
_write_fixturehelper creates temporary files withdelete=Falsebut they are never removed after the test completes. This accumulates orphaned temp files over multiple test runs.♻️ Proposed fix using addCleanup
def _write_fixture(self, data: dict) -> Path: """Write data as JSON to a temp file and return its Path.""" f = tempfile.NamedTemporaryFile( mode="w", suffix=".json", delete=False ) json.dump(data, f) f.close() + self.addCleanup(lambda: Path(f.name).unlink(missing_ok=True)) return Path(f.name)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_pydantic_helpers.py` around lines 140 - 147, The helper _write_fixture creates temp files with delete=False and leaves them behind; modify _write_fixture to register the created file for cleanup with the test harness (e.g., call self.addCleanup to unlink the Path for f.name) or switch to using a TemporaryDirectory/NamedTemporaryFile that is closed and removed by the test via addCleanup; ensure the fix references the existing helper name _write_fixture and registers Path(f.name).unlink (or equivalent cleanup) so temp files are removed after each test.docs/ci-integration.md (1)
14-25: Add language specifier to the fenced code block.The directory layout code block should specify a language (e.g.,
textorplaintext) for consistent formatting across markdown renderers.🔧 Proposed fix
-``` +```text my-skill-repo/ ├── test/🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/ci-integration.md` around lines 14 - 25, The fenced code block showing the directory layout is missing a language specifier; update the opening fence from ``` to ```text (or ```plaintext) so the block is rendered consistently across markdown renderers—modify the directory layout code block in docs so its opening fence is ```text to explicitly mark the snippet as plain text.docs/index.md (1)
20-29: Add language specifier to the ASCII diagram code block.While this is an ASCII diagram rather than code, adding a language hint like
textimproves rendering consistency.🔧 Proposed fix
-``` +```text Test FakeBus ──── ───────🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/index.md` around lines 20 - 29, Update the fenced ASCII diagram block to include a language specifier (e.g., use ```text) so the block starting with "Test FakeBus" and the surrounding triple-backticks is labeled; locate the triple-backtick fenced block containing the diagram and change the opening fence to include "text" (```text) to improve rendering consistency.MAINTENANCE_REPORT.md (1)
46-46: Add language specifier to the empty fenced code block.The empty code block in the format section should have a language specified (or be removed if not needed) to satisfy markdown linting.
📝 Proposed fix
If the block is intentional as a placeholder:
-``` +```textOr remove it if not needed.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@MAINTENANCE_REPORT.md` at line 46, Locate the empty fenced code block in the "format" section of MAINTENANCE_REPORT.md and either add a language specifier (e.g., replace the empty block with a fenced block like ```text) or remove the empty fenced block entirely so the markdown linter no longer flags it; ensure the change targets the exact empty triple-backtick block in that section.test/unittests/test_end2end.py (2)
433-441: Addstrict=Truetozip()to catch length mismatches.Without
strict=True,zip()silently truncates iforiginal.expected_messagesandrestored.expected_messageshave different lengths, potentially masking deserialization bugs.♻️ Proposed fix
- for e, r in zip(original.expected_messages, restored.expected_messages): + for e, r in zip(original.expected_messages, restored.expected_messages, strict=True): self.assertEqual(e.msg_type, r.msg_type)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_end2end.py` around lines 433 - 441, In test_deserialize_round_trip, change the iterator over expected messages to use zip(original.expected_messages, restored.expected_messages, strict=True) inside the for loop so a mismatch in lengths raises an error; update the loop in test_deserialize_round_trip that currently does for e, r in zip(original.expected_messages, restored.expected_messages): to use strict=True to ensure length mismatches between original.expected_messages and restored.expected_messages are caught during deserialization tests.
81-87: Clarify the comment about message index.The comment "message itself is index 0 (caller provides it)" is slightly confusing since
_FAILURE_SEQstarts at index 0 withplay_sound. Consider clarifying that this sequence is appended after the source message.📝 Suggested clarification
# Expected 4-message failure sequence for any utterance that matches nothing +# These 3 messages follow the source message (which the caller provides) _FAILURE_SEQ = [ - # message itself is index 0 (caller provides it) Message("mycroft.audio.play_sound", {"uri": "snd/error.mp3"}), Message("complete_intent_failure", {}), Message("ovos.utterance.handled", {}), ]🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_end2end.py` around lines 81 - 87, Update the confusing comment above _FAILURE_SEQ to clarify that the array represents the messages appended after the original/source message (which the caller supplies), e.g. replace "message itself is index 0 (caller provides it)" with wording that states the sequence is appended after the source/original message and that the first element of _FAILURE_SEQ is the first appended message (Message("mycroft.audio.play_sound", ...)), referencing the _FAILURE_SEQ constant and Message entries so readers understand ordering.test/unittests/test_capture_session.py (1)
133-146: Move inline import to file top and split statements.The
import timeshould be at the top of the file with other imports, and the semicolon-separated statements should be on separate lines for readability.♻️ Proposed fix
Add at file top (after line 3):
import timeThen at line 143:
- import time; time.sleep(0.05) + time.sleep(0.05)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/unittests/test_capture_session.py` around lines 133 - 146, Move the inline "import time" out of the test body and place it with the other module imports at the top of the file, and replace the semicolon-separated statement "import time; time.sleep(0.05)" inside test_finish_stops_future_capture with two separate statements so the import is not inline and the sleep call is on its own line; this affects the test method test_finish_stops_future_capture which uses CaptureSession, Message, and self.mc.bus.emit.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/ci-integration.md`:
- Around line 242-244: The two relative links referencing gh-automations/docs
(gh-automations/docs/workflow-reference.md and
gh-automations/docs/repo-setup.md) are broken because that repository has no
docs/ directory; either remove these links or replace them with correct targets
(for example point to files under gh-automations/.github/workflows, a README in
gh-automations, or to the canonical external docs URL) and update the "Canonical
examples" reference if it should point to a different example path than
Skills/ovos-skill-hello-world/test/test_helloworld.py; ensure the docs/
references are either corrected to the actual file locations or deleted and add
a brief note clarifying the intended source.
In `@docs/index.md`:
- Around line 118-124: The Quick Links table in docs/index.md references
non-existent files (QUICK_FACTS.md, AUDIT.md, SUGGESTIONS.md); fix by either
creating those missing markdown files with appropriate content (QUICK_FACTS.md,
AUDIT.md, SUGGESTIONS.md) or updating the table rows for "Machine-readable
facts", "Known issues", and "Improvement proposals" to point to existing files
or remove those rows; ensure the link targets in the table (the filenames in the
square brackets/parentheses) match the actual repository filenames so the links
resolve.
In `@docs/pydantic-integration.md`:
- Around line 218-225: Replace the setup.py example block with a pyproject.toml
example: change the fenced code block language to toml and show the
[project.optional-dependencies] table with pydantic =
["ovos-pydantic-models>=0.1.0"]; also update the surrounding text to mention
that the bridge functions to_bus_message and from_bus_message can live in
ovoscope.pydantic and should be conditionally imported only when the optional
pydantic dependency is installed.
In `@FAQ.md`:
- Around line 20-23: The test command in FAQ.md uses "ovoscope/test/" which
conflicts with pyproject.toml's testpaths = ["test"]; update the FAQ.md test
command (the pytest invocation shown) to use "test/" instead of "ovoscope/test/"
so it matches pyproject.toml (i.e., change the pytest path in the markdown code
block to "test/ --cov=ovoscope").
In `@ovoscope/pytest_plugin.py`:
- Around line 57-62: Initialize mc to None before calling get_minicroft and wrap
the yield in a try/finally so teardown only calls mc.stop() if mc was
successfully created; specifically, set mc = None, call mc =
get_minicroft(skill_ids) as before, then use try: yield mc finally: if mc is not
None: mc.stop() to avoid NameError masking the original exception from
get_minicroft.
In `@pyproject.toml`:
- Around line 1-39: The optional dependency declaration under
[project.optional-dependencies] references a non-existent package
"ovos-pydantic-models>=0.1.0"; update or remove it to avoid installation
failures by either correcting the package name to the actual PyPI package (if
available) or removing the "pydantic" extras entry entirely from pyproject.toml
(look for the optional-dependencies block and the "pydantic" key) and ensure any
code referencing that extra (e.g., imports/uses in tests or setup) is updated
accordingly.
---
Nitpick comments:
In `@docs/capture-session.md`:
- Around line 46-54: The ASCII diagram code block starting with "incoming
message" should include a language specifier; update the fenced code block that
contains the diagram (the block showing "incoming message" and the routing
arrows) to use ```text instead of plain ``` so the diagram is marked as text for
consistent rendering.
In `@docs/ci-integration.md`:
- Around line 14-25: The fenced code block showing the directory layout is
missing a language specifier; update the opening fence from ``` to ```text (or
```plaintext) so the block is rendered consistently across markdown
renderers—modify the directory layout code block in docs so its opening fence is
```text to explicitly mark the snippet as plain text.
In `@docs/index.md`:
- Around line 20-29: Update the fenced ASCII diagram block to include a language
specifier (e.g., use ```text) so the block starting with "Test
FakeBus" and the surrounding triple-backticks is labeled; locate the
triple-backtick fenced block containing the diagram and change the opening fence
to include "text" (```text) to improve rendering consistency.
In `@docs/usage-guide.md`:
- Around line 561-565: The code block in the docs uses Python code
(LOG.set_level("DEBUG"), get_minicroft([...])) but lacks a language specifier;
update the fenced code block to include the python specifier (```python) so
syntax highlighting applies for the LOG.set_level, get_minicroft and related
sample lines.
In `@MAINTENANCE_REPORT.md`:
- Line 46: Locate the empty fenced code block in the "format" section of
MAINTENANCE_REPORT.md and either add a language specifier (e.g., replace the
empty block with a fenced block like ```text) or remove the empty fenced block
entirely so the markdown linter no longer flags it; ensure the change targets
the exact empty triple-backtick block in that section.
In `@ovoscope/pydantic_helpers.py`:
- Around line 143-200: validate_fixture currently only validates messages but
doesn't check for required top-level keys so missing fields cause
End2EndTest.deserialize to raise KeyError; update validate_fixture to assert
presence of the required top-level keys ("skill_ids", "source_message",
"expected_messages") immediately after loading data and before iterating
messages, and if any are missing raise a ValueError with a clear message
referencing the missing keys and the fixture path (no stack trace chaining
required); locate this logic inside validate_fixture (near where data is
json.load'd and before the loop that calls OpenVoiceOSMessage.model_validate)
and return the same data if the keys are present.
In `@test/unittests/test_capture_session.py`:
- Around line 133-146: Move the inline "import time" out of the test body and
place it with the other module imports at the top of the file, and replace the
semicolon-separated statement "import time; time.sleep(0.05)" inside
test_finish_stops_future_capture with two separate statements so the import is
not inline and the sleep call is on its own line; this affects the test method
test_finish_stops_future_capture which uses CaptureSession, Message, and
self.mc.bus.emit.
In `@test/unittests/test_end2end.py`:
- Around line 433-441: In test_deserialize_round_trip, change the iterator over
expected messages to use zip(original.expected_messages,
restored.expected_messages, strict=True) inside the for loop so a mismatch in
lengths raises an error; update the loop in test_deserialize_round_trip that
currently does for e, r in zip(original.expected_messages,
restored.expected_messages): to use strict=True to ensure length mismatches
between original.expected_messages and restored.expected_messages are caught
during deserialization tests.
- Around line 81-87: Update the confusing comment above _FAILURE_SEQ to clarify
that the array represents the messages appended after the original/source
message (which the caller supplies), e.g. replace "message itself is index 0
(caller provides it)" with wording that states the sequence is appended after
the source/original message and that the first element of _FAILURE_SEQ is the
first appended message (Message("mycroft.audio.play_sound", ...)), referencing
the _FAILURE_SEQ constant and Message entries so readers understand ordering.
In `@test/unittests/test_minicroft.py`:
- Around line 171-172: The test callback on_handled currently declares an unused
parameter msg which triggers linter warnings; rename the parameter to _msg (or
prefix it with an underscore) in the on_handled function declaration to indicate
intentional non-use and suppress the linter, keeping the body calling
handled.set() unchanged and ensuring no other references to msg exist.
In `@test/unittests/test_pydantic_helpers.py`:
- Around line 202-205: Replace the hardcoded "/tmp/..." path in
test_missing_file_raises_file_not_found with a portable temp directory by using
tempfile.gettempdir() to build the non-existent filename; update the test to
call validate_fixture with os.path.join(tempfile.gettempdir(),
"ovoscope_nonexistent_fixture_xyz.json") (referencing the test method
test_missing_file_raises_file_not_found and the validate_fixture function) so
the test remains platform-independent while still asserting FileNotFoundError.
- Around line 140-147: The helper _write_fixture creates temp files with
delete=False and leaves them behind; modify _write_fixture to register the
created file for cleanup with the test harness (e.g., call self.addCleanup to
unlink the Path for f.name) or switch to using a
TemporaryDirectory/NamedTemporaryFile that is closed and removed by the test via
addCleanup; ensure the fix references the existing helper name _write_fixture
and registers Path(f.name).unlink (or equivalent cleanup) so temp files are
removed after each test.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6ee80538-b241-4f6d-add0-d8f934b86957
📒 Files selected for processing (24)
.gitignoreFAQ.mdLICENSEMAINTENANCE_REPORT.mdREADME.mddocs/capture-session.mddocs/ci-integration.mddocs/end2end-test.mddocs/index.mddocs/minicroft.mddocs/pydantic-integration.mddocs/usage-guide.mdovoscope/__init__.pyovoscope/pydantic_helpers.pyovoscope/pytest_plugin.pyovoscope/version.pypyproject.tomlsetup.pytest/__init__.pytest/unittests/__init__.pytest/unittests/test_capture_session.pytest/unittests/test_end2end.pytest/unittests/test_minicroft.pytest/unittests/test_pydantic_helpers.py
💤 Files with no reviewable changes (1)
- setup.py
There was a problem hiding this comment.
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 `@README.md`:
- Around line 138-149: The example import line is missing get_minicroft and
DEFAULT_TEST_PIPELINE, causing the snippet to fail; update the import from
ovoscope to include get_minicroft and DEFAULT_TEST_PIPELINE alongside
ADAPT_PIPELINE, PADATIOUS_PIPELINE, FALLBACK_PIPELINE, and PERSONA_PIPELINE so
the calls to get_minicroft(...) and the use of DEFAULT_TEST_PIPELINE in the
example resolve correctly.
* 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>
Summary by CodeRabbit
New Features
Documentation
Tests
Chores