python-voiceio 0.9.0__tar.gz → 0.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_voiceio-0.9.0/python_voiceio.egg-info → python_voiceio-0.9.1}/PKG-INFO +1 -1
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/pyproject.toml +1 -1
- {python_voiceio-0.9.0 → python_voiceio-0.9.1/python_voiceio.egg-info}/PKG-INFO +1 -1
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_correct_batch.py +19 -1
- python_voiceio-0.9.1/voiceio/__init__.py +1 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/service.py +8 -1
- python_voiceio-0.9.0/voiceio/__init__.py +0 -1
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/LICENSE +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/README.md +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/python_voiceio.egg-info/SOURCES.txt +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/python_voiceio.egg-info/dependency_links.txt +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/python_voiceio.egg-info/entry_points.txt +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/python_voiceio.egg-info/requires.txt +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/python_voiceio.egg-info/top_level.txt +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/setup.cfg +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_adjudicate.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_app_wiring.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_audio_quality.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_audit.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_autocorrect.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_autocorrect_state.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_backend_probes.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_cli.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_clipboard_read.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_commands.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_concurrency_lockdown.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_config.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_corrections.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_evaluate.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_fallback.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_health.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_hints.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_history.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_ibus_pending.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_ibus_ping.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_ibus_typer.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_llm.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_llm_api.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_numbers.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_platform.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_postcorrect.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_postprocess.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_prebuffer.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_prompt.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_recorder_integration.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_retention.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_robustness.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_security_hardening.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_snapshots.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_streaming.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_tokens.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_transcriber.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_tts.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_vad.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_vocabulary.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_wizard.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/tests/test_wordfreq.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/__main__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/app.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/audit.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/autocorrect.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/autocorrect_state.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/backends.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/cli.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/clipboard_read.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/commands.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/config.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/consent.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/corrections.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/demo.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/evaluate.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/feedback.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/health.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hints.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/history.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/base.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/chain.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/evdev.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/pynput_backend.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/hotkeys/socket_backend.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/ibus/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/ibus/engine.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/ibus/pending.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/llm.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/llm_api.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/models/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/models/silero_vad.onnx +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/numbers.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/pidlock.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/platform.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/postcorrect.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/postprocess.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/prompt.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/recorder.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/retention.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/snapshots.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/sounds/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/sounds/commit.wav +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/sounds/start.wav +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/sounds/stop.wav +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/streaming.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tokens.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/transcriber.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tray/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tray/_icons.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tray/_indicator.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tray/_pystray.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/base.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/chain.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/edge_engine.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/espeak.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/piper_engine.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/tts/player.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/__init__.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/base.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/chain.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/clipboard.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/ibus.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/pynput_type.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/wtype.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/xdotool.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/typers/ydotool.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/vad.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/vocab_stats.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/vocabulary.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/wizard.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/wordfreq.py +0 -0
- {python_voiceio-0.9.0 → python_voiceio-0.9.1}/voiceio/worker.py +0 -0
|
@@ -8,7 +8,11 @@ from voiceio.autocorrect import AdjudicationResult, ReviewResult, SuspiciousWord
|
|
|
8
8
|
from voiceio.autocorrect_state import load_state
|
|
9
9
|
from voiceio.cli import _cmd_correct_auto
|
|
10
10
|
from voiceio.corrections import CorrectionDict
|
|
11
|
-
from voiceio.service import
|
|
11
|
+
from voiceio.service import (
|
|
12
|
+
_correct_service_unit,
|
|
13
|
+
_correct_timer_unit,
|
|
14
|
+
_service_unit,
|
|
15
|
+
)
|
|
12
16
|
|
|
13
17
|
|
|
14
18
|
def _entries():
|
|
@@ -115,6 +119,20 @@ class TestBatchMode:
|
|
|
115
119
|
assert "Grafana" in (tmp_path / "vocabulary.txt").read_text()
|
|
116
120
|
|
|
117
121
|
|
|
122
|
+
class TestServiceUnit:
|
|
123
|
+
def test_restarts_on_graphical_relogin(self):
|
|
124
|
+
"""PartOf stops the service on logout; WantedBy must pull it back in on
|
|
125
|
+
the next login. Both must name graphical-session.target or the service
|
|
126
|
+
dies on logout and never returns until a full reboot (GNOME re-login
|
|
127
|
+
leaves the systemd --user manager — and default.target — untouched)."""
|
|
128
|
+
unit = _service_unit("/usr/bin/voiceio")
|
|
129
|
+
assert "PartOf=graphical-session.target" in unit
|
|
130
|
+
assert "WantedBy=graphical-session.target" in unit
|
|
131
|
+
# default.target is reached once at user-manager start and never
|
|
132
|
+
# re-entered on re-login, so it must NOT be the wake-up trigger.
|
|
133
|
+
assert "WantedBy=default.target" not in unit
|
|
134
|
+
|
|
135
|
+
|
|
118
136
|
class TestTimerUnits:
|
|
119
137
|
def test_service_unit_runs_batch(self):
|
|
120
138
|
unit = _correct_service_unit("/usr/bin/voiceio")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.9.1"
|
|
@@ -68,7 +68,7 @@ Environment=PYTHONUNBUFFERED=1
|
|
|
68
68
|
PassEnvironment=DISPLAY WAYLAND_DISPLAY XDG_SESSION_TYPE XDG_RUNTIME_DIR
|
|
69
69
|
|
|
70
70
|
[Install]
|
|
71
|
-
WantedBy=
|
|
71
|
+
WantedBy=graphical-session.target
|
|
72
72
|
"""
|
|
73
73
|
|
|
74
74
|
|
|
@@ -190,6 +190,13 @@ def install_service() -> bool:
|
|
|
190
190
|
["systemctl", "--user", "daemon-reload"],
|
|
191
191
|
capture_output=True, timeout=5,
|
|
192
192
|
)
|
|
193
|
+
# disable before enable so a prior [Install] target (older versions
|
|
194
|
+
# wired WantedBy=default.target, which never restarts the service on a
|
|
195
|
+
# GNOME logout/login) is unlinked instead of left as a stale want.
|
|
196
|
+
subprocess.run(
|
|
197
|
+
["systemctl", "--user", "disable", SERVICE_NAME],
|
|
198
|
+
capture_output=True, timeout=5,
|
|
199
|
+
)
|
|
193
200
|
subprocess.run(
|
|
194
201
|
["systemctl", "--user", "enable", SERVICE_NAME],
|
|
195
202
|
capture_output=True, timeout=5,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.9.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|