Skip to content

fix: drop the deprecated setup_locale call - #975

Merged
JarbasAl merged 1 commit into
devfrom
fix/drop-deprecated-setup-locale
Sep 10, 2026
Merged

JarbasAl merged 1 commit into
devfrom
fix/drop-deprecated-setup-locale

Conversation

@openvoiceos-bot

@openvoiceos-bot openvoiceos-bot commented Sep 9, 2026

Copy link
Copy Markdown

🤖 Auto-generated by Claude Opus 5 (claude-opus-5) via Claude Code — NOT human-reviewed. Verify before acting.

Removes the two setup_locale() calls and their imports. Five deleted lines plus one
stale mock in a test.

What the call did

ovos_config.locale.setup_locale is deprecated. On ovos-config dev its whole body is:

lang_code = lang or Configuration().get("lang", "en-us")
set_default_lang(lang_code)   # Configuration()["lang"] = lang_code
set_default_tz(tz)            # discards tz, returns get_config_tz()

Both call sites pass no arguments, so lang_code is read straight out of
Configuration() and written straight back. set_default_tz ignores its argument and
throws away the value it computes. The result is an identity write and a discarded read.

Why the write is not quite nothing, and why it is safe here

Configuration.__setitem__ is not a plain store. It writes the runtime patch layer,
invalidates the cache, and emits configuration.patch to every connected process
whenever Configuration.bus is set. Measured: an identical-value write
still emits, {'config': {'lang': 'en-US'}}.

Neither call site reaches that branch. __main__.py calls it before MessageBusClient()
exists, and launch_standalone in service.py does the same. Configuration.bus is
unset both times, so no frame was ever produced here and nothing is removed from the wire.

The one real difference is precedence. The write promoted lang into the patch layer,
which outranks config files, so a later config reload could not change lang for the
life of the process. Without it a reload is followed. The value is the same either way
unless the configuration changes lang mid-run, where following it is the better
behaviour.

Test change

test_main.py patched ovos_core.__main__.setup_locale. With the import gone that
patch target does not exist and mock.patch raises AttributeError. The decorator and
its argument go with it.

Verification

Tree Result
dev, this venv test_main.py 2 passed
branch, before the test fix 1 failed, the stale patch target
branch, full suite 618 passed, 39 subtests

A matching change for ovos-workshop is held. Its call site sits inside
SkillContainer.__init__, where Configuration.bus can already be set, so deleting it
there can remove a real configuration.patch frame from the bus. That is a wire-surface
change and is being decided separately.

Summary by CodeRabbit

  • Bug Fixes

    • Startup now relies on the configured language setting instead of performing an automatic locale initialization.
    • Improved shutdown validation ensures the message bus receiver completes within a bounded timeout after the bus closes.
  • Tests

    • Updated language-handling and shutdown coverage to reflect the current startup and shutdown behavior.

@github-actions github-actions Bot added the fix label Sep 9, 2026
@coderabbitai

coderabbitai Bot commented Sep 9, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 0d9ce217-ff98-4494-a5d2-e094eeee0ceb

📥 Commits

Reviewing files that changed from the base of the PR and between 04ac070 and 273f247.

📒 Files selected for processing (4)
  • ovos_core/__main__.py
  • ovos_core/intent_services/service.py
  • test/unittests/test_intent_service.py
  • test/unittests/test_main.py
💤 Files with no reviewable changes (2)
  • ovos_core/intent_services/service.py
  • ovos_core/main.py

Included review availability: Your plan provides up to 2 included reviews per hour; 1 remains after this review.


📝 Walkthrough

Walkthrough

The startup paths no longer call setup_locale. Tests update configuration directly and verify that the bus receiver thread joins with a positive timeout.

Changes

Locale startup removal

Layer / File(s) Summary
Remove locale setup from launchers
ovos_core/__main__.py, ovos_core/intent_services/service.py
Startup no longer imports or calls setup_locale.
Update locale and shutdown tests
test/unittests/test_intent_service.py, test/unittests/test_main.py
Tests set language through Configuration and verify bounded receiver-thread joining.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: jarbasal

Merge Risk: ⚪ Minimal · up to 273f2

This change removes deprecated startup locale rewrites while preserving configuration-driven language updates and bus behavior. The change is ready to merge.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the main change: removing deprecated setup_locale calls.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 2 files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/drop-deprecated-setup-locale

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.

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

Hello! The automated checks have been performed. 👋

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

📋 Repo Health

I've checked the repo's eyesight (aka observability). 👓

✅ All required files present.

Latest Version: 3.5.3a2

ovos_core/version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
⚠️ setup.py — setup.py
CHANGELOG.md — Changelog
ovos_core/version.py has valid version block markers

📡 Channel Compat — stable

I've double-checked the data for any anomalies. 🔍

🚧 Channel unresolvable with this checkout — the repo's dependency floors exceed what the channel pins (fleet finding; see the install log).

Constraints: https://raw.githubusercontent.com/OpenVoiceOS/OpenVoiceOS/main/constraints-stable.txt
Resolved stack: channel-compat-stable artifact (constraints + pip freeze).

📚 Docs

Ensuring the quality bar remains high. 📈

✅ All required documentation files present.

README.md

📡 Channel Compat — testing

Just keeping you informed on the state of things. ℹ️

🚧 Channel unresolvable with this checkout — the repo's dependency floors exceed what the channel pins (fleet finding; see the install log).

Constraints: https://raw.githubusercontent.com/OpenVoiceOS/OpenVoiceOS/main/constraints-testing.txt
Resolved stack: channel-compat-testing artifact (constraints + pip freeze).

🏷️ Release Preview

Predicting the ripple effect of this release. 🌊

Current: 3.5.3a2Next: 3.5.4a1

Signal Value
Label fix
PR title fix: drop the deprecated setup_locale call
Bump build

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 3.5.4a1

Channel Status Note Current Constraint
Stable Too new (must be <1.4.0) ovos-core>=1.3.1,<1.4.0
Testing Too new (must be <3.0.0) ovos-core>=2.1.1,<3.0.0
Alpha Compatible ovos-core>=2.2.4a1

🔌 Plugin Detection

Ensuring the plugin is 'future-proof'. 🔮

Plugin Status: ERRORS (1)

Plugin Info:

  • Name: ovos-core
  • Description: The spiritual successor to Mycroft AI, OVOS is flexible voice assistant software that can be run almost anywhere!

OPM Detection:

Plugin Type Wheel Editable
pipeline

Entry Point Validation:

Entry Point Type Import Interface
ovos-converse-pipeline-plugin pipeline ✅ 1020ms
ovos-fallback-pipeline-plugin pipeline ✅ 2ms
ovos-stop-pipeline-plugin pipeline ✅ 55ms

⊘ No settingsmeta.json
requires-python >=3.10 — running Python 3.11

Issues:

  • ❌ Import time for ovos-converse-pipeline-plugin exceeds 500ms (1020ms)
  • ⚠️ No settingsmeta.json found
  • ⚠️ No settingsmeta.json found

📊 Coverage

Calculating the density of our test suite. 🧮

⚠️ 74.4% total coverage

Files below 80% coverage (10 files)
File Coverage Missing lines
ovos_core/__init__.py 0.0% 7
ovos_core/intent_services/__init__.py 0.0% 1
ovos_core/version.py 0.0% 18
ovos_core/transformers.py 50.0% 32
ovos_core/skill_installer.py 50.4% 134
ovos_core/intent_services/working_session.py 60.3% 23
ovos_core/skill_manager.py 63.3% 160
ovos_core/__main__.py 66.7% 9
ovos_core/intent_services/dispatcher.py 73.3% 35
ovos_core/intent_services/service.py 76.9% 133

Full report: download the coverage-report artifact.

🌍 Locale Build

A quick update on the status of your PR. 🔔

✅ Locale properly configured (65 files, 18 languages)

Locale directories found:

  • ovos_core/intent_services/locale

Localization coverage:

  • ovos_core/intent_services/locale: 65 files in 18 languages (pt-br, it-it, gl-es, de-de, pt-pt...)

pyproject.toml:[tool.setuptools.package-data.ovos_core] includes locale

  • intent_services/locale/*/*.voc

Build manifest: ✅ 32 locale files included in package

🔒 Security (pip-audit)

Checking for any potential security breaches. 🔓

✅ No known vulnerabilities found (113 packages scanned).

🔌 Skill Tests (ovoscope)

I've verified the skill's 'tone of voice' is consistent. 🎙️

18/42 passed

TestActiveHandlersOnlyIsNotPolled — 1/1

❌ **TestAdaptIntent** — 0/4
Test Result
test_padatious_no_match ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_adapt_match ❌ subtests passed
test_intent_blacklist ❌ subtests passed

test_padatious_no_match failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_skill_blacklist failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_adapt_match failure:

[gw1] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
❌ **TestCancelIntentMidSentence** — 0/1
Test Result
test_cancel_match ❌ subtests passed

test_cancel_match failure:

[gw2] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
✅ **TestCompletionSyncE2E** — 3/3 ✅ **TestContext1EndToEndReachability** — 3/3
❌ **TestConverse** — 0/1
Test Result
test_parrot_mode ❌ subtests passed

test_parrot_mode failure:

[gw2] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
❌ **TestDeactivate** — 2/3
Test Result
test_activate ✅ passed
test_deactivate ✅ passed
test_deactivate_inside_converse ❌ subtests passed

test_deactivate_inside_converse failure:

[gw2] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
❌ **TestFallback** — 0/1
Test Result
test_fallback_match ❌ subtests passed

test_fallback_match failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
✅ **TestGGWaveSkillInstall** — 2/2 ✅ **TestGlobalStopSpec** — 1/1
❌ **TestIntentPipelineRouting** — 0/4
Test Result
test_high_priority_stage_handles_before_low ❌ subtests passed
test_padatious_intent_matched ❌ subtests passed
test_blacklisted_skill_falls_through_to_failure ❌ subtests passed
test_no_match_produces_intent_failure ❌ subtests passed

test_high_priority_stage_handles_before_low failure:

[gw3] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_padatious_intent_matched failure:

[gw2] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_blacklisted_skill_falls_through_to_failure failure:

[gw3] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
❌ **TestLangDisambiguation** — 0/4
Test Result
test_lang_text_detection ❌ subtests passed
test_invalid_lang_detection ❌ subtests passed
test_metadata_preferred_over_text_detection ❌ subtests passed
test_stt_lang ❌ subtests passed

test_lang_text_detection failure:

[gw1] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_invalid_lang_detection failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_metadata_preferred_over_text_detection failure:

[gw1] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
✅ **TestLegacyGlobalStop** — 1/1
❌ **TestLegacyIntentIdBackCompat** — 0/2
Test Result
test_legacy_blacklist_id_suppresses ❌ subtests passed
test_legacy_dispatch_topic_fires_handler ❌ subtests passed

test_legacy_blacklist_id_suppresses failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_legacy_dispatch_topic_fires_handler failure:

[gw1] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
✅ **TestLegacyTargetedStop** — 1/1
❌ **TestNoSkills** — 0/2
Test Result
test_routing ❌ subtests passed
test_complete_failure ❌ subtests passed

test_routing failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_complete_failure failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
❌ **TestPadatiousIntent** — 0/4
Test Result
test_padatious_match ❌ subtests passed
test_adapt_no_match ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_intent_blacklist ❌ subtests passed

test_padatious_match failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_adapt_no_match failure:

[gw1] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python

test_skill_blacklist failure:

[gw0] linux -- Python 3.11.16 /opt/hostedtoolcache/Python/3.11.16/x64/bin/python
✅ **TestResponseModeHolderStopE2E** — 2/2 ✅ **TestTargetedStopResolves** — 1/1 ✅ **TestTargetedStopSpec** — 1/1

🚌 Bus Coverage

Calculating the signal margins of your changes. 📐

🔴 Coverage Summary

Metric Status Coverage
Listeners █░░░░░░░░░ 15.4% 37/240 handlers
Emitters ██████████ 100% 48/48 observed
Assertions ██████████ 100% 48/48 asserted

📊 Per-Skill Breakdown

Skill Listeners Observed Asserted
AdaptPipeline 0/14 (0.0%) 0/0 0/0
ConverseService 2/4 (50.0%) 0/0 0/0
IntentDispatcher 1/2 (50.0%) 0/0 0/0
IntentManifest 0/8 (0.0%) 0/0 0/0
IntentService 2/4 (50.0%) 0/0 0/0
PadaciosoPipeline 0/11 (0.0%) 0/0 0/0
PadatiousPipeline 0/15 (0.0%) 0/0 0/0
SkillManager 0/8 (0.0%) 0/0 0/0
StopService 1/2 (50.0%) 0/0 0/0
_LegacyStopBridge 2/3 (66.7%) 0/0 0/0
__core__ 7/36 (19.4%) 9/9 9/9
keyword-templates 0/2 (0.0%) 0/0 0/0
my.skill 1/16 (6.2%) 0/0 0/0
ovos-ahocorasick-ner-plugin 0/1 (0.0%) 0/0 0/0
ovos-skill-count.openvoiceos 4/21 (19.0%) 8/8 8/8
ovos-skill-hello-world.openvoiceos 1/25 (4.0%) 0/0 0/0
ovos-skill-parrot.openvoiceos 8/35 (22.9%) 12/12 12/12
stop.openvoiceos 0/0 (0.0%) 5/5 5/5
test_activation.openvoiceos 6/29 (20.7%) 14/14 14/14
type 2/4 (50.0%) 0/0 0/0
🔍 Detailed Message Type Breakdown

AdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • detach_skill
  • intent.service.adapt.get
  • intent.service.adapt.manifest.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
  • register_intent
  • register_vocab

ConverseService

⚠️ Uncovered Listeners:

  • intent.service.active_skills.get
  • intent.service.skills.activate
    ✅ Covered Listeners:
  • converse:skill (6x)
  • intent.service.skills.deactivate (2x)

IntentDispatcher

⚠️ Uncovered Listeners:

  • mycroft.skill.handler.error
    ✅ Covered Listeners:
  • mycroft.skill.handler.complete (13x)

IntentManifest

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.describe (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.list (Intent)
  • ovos.intent.register.keyword (Intent)
  • ovos.intent.register.template (Intent)
  • ovos.skill.deregister

IntentService

⚠️ Uncovered Listeners:

  • intent.service.intent.get (Intent)
  • intent.service.pipelines.reload
    ✅ Covered Listeners:
  • intent.service.skills.deactivate (2x)
  • ovos.utterance.handle (11x)

PadaciosoPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • padatious:register_intent (Intent)
  • detach_intent
  • detach_skill
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister

PadatiousPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • padatious:register_intent (Intent)
  • detach_intent
  • detach_skill
  • intent.service.padatious.entities.manifest.get
  • intent.service.padatious.get
  • intent.service.padatious.manifest.get
  • mycroft.skills.train
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister

SkillManager

⚠️ Uncovered Listeners:

  • padatious:register_intent (Intent)
  • mycroft.skills.trained
  • register_intent
  • skill.converse.get_response.disable
  • skillmanager.activate
  • skillmanager.deactivate
  • skillmanager.keep
  • skillmanager.list

StopService

⚠️ Uncovered Listeners:

  • ovos-stop-pipeline-plugin:global_stop (Intent)
    ✅ Covered Listeners:
  • ovos.utterance.handled (22x)

_LegacyStopBridge

⚠️ Uncovered Listeners:

  • stop:global (Intent)
    ✅ Covered Listeners:
  • ovos.intent.matched (11x)
  • stop:skill (1x)

__core__

⚠️ Uncovered Listeners:

  • add_context
  • clear_context
  • message
  • my.skill.set
  • mycroft.my.skill.all_loaded
  • mycroft.my.skill.is_alive
  • mycroft.my.skill.is_ready
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.openvoiceos.is_ready
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • mycroft.ovos-skill-parrot.openvoiceos.all_loaded
  • mycroft.ovos-skill-parrot.openvoiceos.is_alive
  • mycroft.ovos-skill-parrot.openvoiceos.is_ready
  • mycroft.test_activation.openvoiceos.all_loaded
  • mycroft.test_activation.openvoiceos.is_alive
  • mycroft.test_activation.openvoiceos.is_ready
  • ovos-skill-count.openvoiceos.set
  • ovos-skill-hello-world.openvoiceos.set
  • ovos-skill-parrot.openvoiceos.set
  • ovos.session.sync
  • ovos.session.update_default
  • ovos.skills.fallback.deregister
  • ovos.skills.fallback.register
  • remove_context
  • skill.converse.get_response.enable
  • test_activation.openvoiceos.set
    ✅ Covered Listeners:
  • ovos.converse.pong (5x)
  • ovos.intent.handler.start (1x)
  • ovos.skills.converse.force_timeout (1x)
  • ovos.utterance.speak (13x)
  • recognizer_loop:utterance (2x)
  • skill.converse.pong (5x)
  • skill.converse.response (4x)

📤 Emitters:

  • mycroft.audio.play_sound (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.converse.ping (Asserted ✅)
  • ovos.converse.ping (Asserted ✅)
  • ovos.intent.unmatched (Asserted ✅)
  • ovos.utterance.cancelled (Asserted ✅)
  • ovos.utterance.handle (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • recognizer_loop:utterance (Asserted ✅)
  • test_activation.openvoiceos.converse.ping (Asserted ✅)

keyword-templates

⚠️ Uncovered Listeners:

  • ovos.intent.register.template (Intent)
  • padatious:register_intent (Intent)

my.skill

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.my.skill (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • my.skill.converse.get_response
  • my.skill.stop
  • my.skill.stop.ping
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • ovos.stop.ping (1x)

ovos-ahocorasick-ner-plugin

⚠️ Uncovered Listeners:

  • padatious:register_entity (Intent)

ovos-skill-count.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.ovos-skill-count.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop
  • ovos-skill-count.openvoiceos.converse.get_response
  • ovos-skill-count.openvoiceos.set
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • ovos-skill-count.openvoiceos.stop (1x)
  • ovos-skill-count.openvoiceos.stop.ping (1x)
  • ovos-skill-count.openvoiceos:count_to_n (2x)
  • ovos.stop.ping (1x)

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-count.openvoiceos.activate (Asserted ✅)
  • ovos-skill-count.openvoiceos:count_to_n (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)

ovos-skill-hello-world.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-hello-world.openvoiceos:Greetings (Intent)
  • ovos-skill-hello-world.openvoiceos:HelloWorldIntent (Intent)
  • ovos-skill-hello-world.openvoiceos:HowAreYou (Intent)
  • ovos-skill-hello-world.openvoiceos:ThankYouIntent (Intent)
  • question:action (Intent)
  • question:action.ovos-skill-hello-world.openvoiceos (Intent)
  • question:query (Intent)
  • hello.world
  • homescreen.metadata.get
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop
  • ovos-skill-hello-world.openvoiceos.converse.get_response
  • ovos-skill-hello-world.openvoiceos.set
  • ovos-skill-hello-world.openvoiceos.stop
  • ovos-skill-hello-world.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • ovos.stop.ping (1x)

ovos-skill-parrot.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-parrot.openvoiceos:did_you_hear_me (Intent)
  • ovos-skill-parrot.openvoiceos:repeat_stt (Intent)
  • ovos-skill-parrot.openvoiceos:repeat_tts (Intent)
  • ovos-skill-parrot.openvoiceos:speak (Intent)
  • ovos-skill-parrot.openvoiceos:stop_parrot (Intent)
  • question:action (Intent)
  • question:action.ovos-skill-parrot.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • intent.service.skills.activated
  • mycroft.ovos-skill-parrot.openvoiceos.all_loaded
  • mycroft.ovos-skill-parrot.openvoiceos.is_alive
  • mycroft.ovos-skill-parrot.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop
  • ovos-skill-parrot.openvoiceos.converse.get_response
  • ovos-skill-parrot.openvoiceos.deactivate
  • ovos-skill-parrot.openvoiceos.set
  • ovos-skill-parrot.openvoiceos.stop
  • ovos-skill-parrot.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
  • speak
    ✅ Covered Listeners:
  • intent.service.skills.deactivated (2x)
  • ovos-skill-parrot.openvoiceos.activate (2x)
  • ovos-skill-parrot.openvoiceos.converse.ping (6x)
  • ovos-skill-parrot.openvoiceos.converse.request (4x)
  • ovos-skill-parrot.openvoiceos:start_parrot (2x)
  • ovos.converse.ping (8x)
  • ovos.stop.ping (1x)
  • recognizer_loop:utterance (8x)

📤 Emitters:

  • converse:skill (Asserted ✅)
  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.activate (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.converse.request (Asserted ✅)
  • ovos-skill-parrot.openvoiceos:start_parrot (Asserted ✅)
  • ovos.converse.pong (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • ovos.utterance.speak (Asserted ✅)
  • skill.converse.pong (Asserted ✅)
  • skill.converse.response (Asserted ✅)

stop.openvoiceos

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-count.openvoiceos.stop (Asserted ✅)
  • stop.openvoiceos.activate (Asserted ✅)
  • stop:skill (Asserted ✅)

test_activation.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.test_activation.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • intent.service.skills.activated
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop
  • mycroft.test_activation.openvoiceos.all_loaded
  • mycroft.test_activation.openvoiceos.is_alive
  • mycroft.test_activation.openvoiceos.is_ready
  • ovos.common_query.ping
  • ovos.skills.settings_changed
  • test_activate
  • test_activation.openvoiceos.activate
  • test_activation.openvoiceos.converse.get_response
  • test_activation.openvoiceos.set
  • test_activation.openvoiceos.stop
  • test_activation.openvoiceos.stop.ping
  • test_deactivate
    ✅ Covered Listeners:
  • intent.service.skills.deactivated (2x)
  • ovos.converse.ping (2x)
  • ovos.stop.ping (1x)
  • test_activation.openvoiceos.converse.ping (2x)
  • test_activation.openvoiceos.converse.request (2x)
  • test_activation.openvoiceos.deactivate (2x)

📤 Emitters:

  • converse:skill (Asserted ✅)
  • intent.service.skills.deactivate (Asserted ✅)
  • intent.service.skills.deactivated (Asserted ✅)
  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos.converse.pong (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • skill.converse.pong (Asserted ✅)
  • skill.converse.response (Asserted ✅)
  • test_activation.openvoiceos.converse.request (Asserted ✅)
  • test_activation.openvoiceos.deactivate (Asserted ✅)

type

⚠️ Uncovered Listeners:

  • recognizer_loop:record_begin (Intent)
  • recognizer_loop:record_end (Intent)
    ✅ Covered Listeners:
  • recognizer_loop:audio_output_end (12x)
  • recognizer_loop:audio_output_start (13x)

🔨 Build Tests

Running the final assembly check. 🔧

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

⚖️ License Check

Ensuring our licenses allow for commercial use. 🏢

✅ No license violations found.

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

🔎 Type Check

Analysis complete! Check out the details below. 📊

mypy: 367 error(s) found

test/unittests/test_main.py:13:1: error: Skipping analyzing "ovos_bus_client": module is installed, but missing library stubs or py.typed marker [import-untyped]

Errors (showing first 10/367)
test/unittests/test_skill/__init__.py:15:1: error: Skipping analyzing "ovos_workshop.skills.ovos": module is installed, but missing library stubs or py.typed marker  [import-untyped]
test/end2end/conftest.py:10:1: error: Cannot find implementation or library stub for module named "pytest"  [import-not-found]
ovos_core/transformers.py:3:1: error: Skipping analyzing "ovos_config": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:4:1: error: Skipping analyzing "ovos_plugin_manager.intent_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:5:1: error: Skipping analyzing "ovos_plugin_manager.metadata_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:6:1: error: Skipping analyzing "ovos_plugin_manager.templates.transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:7:1: error: Skipping analyzing "ovos_plugin_manager.text_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:8:1: error: Skipping analyzing "ovos_plugin_manager.transformer_services": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:13:1: error: Skipping analyzing "ovos_plugin_manager.typed_slots_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:14:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker  [import-untyped]

The automation engine never sleeps. 🚂

Replace no-argument setup_locale() no-op calls with a direct
Configuration write where an explicit language value is required,
and remove the now-unused import.

Co-Authored-By: Claude <noreply@anthropic.com>
@JarbasAl
JarbasAl force-pushed the fix/drop-deprecated-setup-locale branch from 7280754 to 273f247 Compare September 10, 2026 15:15
@JarbasAl
JarbasAl marked this pull request as ready for review September 10, 2026 18:54
@github-actions github-actions Bot added fix and removed fix labels Sep 10, 2026
@JarbasAl
JarbasAl merged commit f72c0a8 into dev Sep 10, 2026
21 checks passed
@JarbasAl
JarbasAl deleted the fix/drop-deprecated-setup-locale branch September 10, 2026 19:08
goldyfruit added a commit to goldyfruit/ovos-core that referenced this pull request Sep 11, 2026
Three conflicts, all resolved in upstream's favour where they disagree
about behaviour:

setup_locale is gone. OpenVoiceOS#975 dropped it as deprecated, so the call in
main() and the import in the standalone intent-service entry point go
with it; only the metrics server start remains where they sat.

The lifecycle stamp contract changed. Upstream now says the entry stamp
REPLACES any value already present rather than never overwriting one, so
that comment and its semantics are kept verbatim and simply moved inside
the preprocess measurement.

The transformers import gained TypedSlotsTransformersService, which is
kept alongside the metrics imports.

657 unit tests pass, including the 20 runtime-metrics tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.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.

2 participants