feat(identity): rename user-visible identity to voculinux with one-time legacy import

The fork takes its own name everywhere a user can see it: binaries
(voculinux, voculinux-gui), desktop entry, autostart, tray, D-Bus
namespace (com.voculinux.Voculinux, no alias for the old name),
config/data/cache dirs, single-instance lock, IBus engine identity,
tray icons, resource prefixes, VOCULINUX_* environment names, and the
update-checker user agent. The internal Python module stays vocalinux
and the distribution metadata keeps the upstream URLs as provenance.

On first run a previous Vocalinux install's config.json, custom
dictionary, and portal restore token are copied once into the new
locations (new config always wins, no merge, no write-back); models
re-resolve through the pinned-checksum download path. An offline
naming-sweep test proves no old-name strings remain on user-visible
surfaces outside the allowlist.

Refs #18
This commit is contained in:
soubarnak
2026-11-06 01:29:39 +05:30
parent c565e6d946
commit ea7be5f111
251 changed files with 2449 additions and 1991 deletions
+18 -18
View File
@@ -29,7 +29,7 @@ class TestMainModule(unittest.TestCase):
def test_parse_arguments_defaults(self):
"""Test argument parsing with defaults."""
# Test with no arguments (model/engine/language will be None without defaults)
with patch("sys.argv", ["vocalinux"]):
with patch("sys.argv", ["voculinux"]):
args = parse_arguments()
self.assertFalse(args.debug)
self.assertIsNone(args.model) # No default set, loaded from config instead
@@ -45,7 +45,7 @@ class TestMainModule(unittest.TestCase):
with patch(
"sys.argv",
[
"vocalinux",
"voculinux",
"--debug",
"--model",
"large",
@@ -67,33 +67,33 @@ class TestMainModule(unittest.TestCase):
def test_parse_arguments_model_values(self):
"""Test model parsing for base and exact whisper.cpp model IDs."""
with patch("sys.argv", ["vocalinux", "--model", "small"]):
with patch("sys.argv", ["voculinux", "--model", "small"]):
args = parse_arguments()
self.assertEqual(args.model, "small")
with patch("sys.argv", ["vocalinux", "--model", "medium"]):
with patch("sys.argv", ["voculinux", "--model", "medium"]):
args = parse_arguments()
self.assertEqual(args.model, "medium")
with patch("sys.argv", ["vocalinux", "--model", "large"]):
with patch("sys.argv", ["voculinux", "--model", "large"]):
args = parse_arguments()
self.assertEqual(args.model, "large")
with patch("sys.argv", ["vocalinux", "--model", "medium.en-q5_0"]):
with patch("sys.argv", ["voculinux", "--model", "medium.en-q5_0"]):
args = parse_arguments()
self.assertEqual(args.model, "medium.en-q5_0")
with patch("sys.argv", ["vocalinux", "--model", "large-v3-turbo"]):
with patch("sys.argv", ["voculinux", "--model", "large-v3-turbo"]):
args = parse_arguments()
self.assertEqual(args.model, "large-v3-turbo")
def test_parse_arguments_engine_choices(self):
"""Test that engine only accepts valid choices."""
with patch("sys.argv", ["vocalinux", "--engine", "vosk"]):
with patch("sys.argv", ["voculinux", "--engine", "vosk"]):
args = parse_arguments()
self.assertEqual(args.engine, "vosk")
with patch("sys.argv", ["vocalinux", "--engine", "whisper"]):
with patch("sys.argv", ["voculinux", "--engine", "whisper"]):
args = parse_arguments()
self.assertEqual(args.engine, "whisper")
@@ -106,7 +106,7 @@ class TestMainModule(unittest.TestCase):
# Spot-check newly exposed languages (issue #565 and catalog expansion).
for lang in ["auto", "en-us", "hu", "ja", "ko", "ar", "nl", "pl", "sl", "uk"]:
self.assertIn(lang, LANGUAGE_CHOICES)
with patch("sys.argv", ["vocalinux", "--language", lang]):
with patch("sys.argv", ["voculinux", "--language", lang]):
args = parse_arguments()
self.assertEqual(args.language, lang)
@@ -399,7 +399,7 @@ class TestMainModule(unittest.TestCase):
mock_args.start_minimized = False
mock_parse.return_value = mock_args
with patch("sys.argv", ["vocalinux", "--engine", engine]):
with patch("sys.argv", ["voculinux", "--engine", engine]):
main()
text_callback = mock_speech_instance.register_text_callback.call_args.args[0]
@@ -923,7 +923,7 @@ class TestMainConfigPrecedence(unittest.TestCase):
with patch(
"sys.argv",
[
"vocalinux",
"voculinux",
"--engine",
"whisper",
"--model",
@@ -989,7 +989,7 @@ class TestMainConfigPrecedence(unittest.TestCase):
mock_action_handler.return_value = mock_action_instance
# No CLI args for engine/model/language
with patch("sys.argv", ["vocalinux"]):
with patch("sys.argv", ["voculinux"]):
with patch("vocalinux.main.logger"):
main()
@@ -1040,7 +1040,7 @@ class TestMainConfigPrecedence(unittest.TestCase):
with patch(
"sys.argv",
[
"vocalinux",
"voculinux",
"--engine",
"parakeet",
"--model",
@@ -1094,7 +1094,7 @@ class TestMainConfigPrecedence(unittest.TestCase):
mock_tray.return_value = MagicMock()
mock_action_handler.return_value = MagicMock()
with patch("sys.argv", ["vocalinux"]):
with patch("sys.argv", ["voculinux"]):
with patch("vocalinux.main.logger"):
main()
@@ -1151,7 +1151,7 @@ class TestMainConfigPrecedence(unittest.TestCase):
mock_tray.return_value = MagicMock()
mock_action_handler.return_value = MagicMock()
with patch("sys.argv", ["vocalinux"]):
with patch("sys.argv", ["voculinux"]):
with patch("vocalinux.main.logger"):
main()
@@ -1368,7 +1368,7 @@ def _boot_main_callbacks(
)
)
mock_parse = stack.enter_context(patch("vocalinux.main.parse_arguments"))
stack.enter_context(patch("sys.argv", ["vocalinux"]))
stack.enter_context(patch("sys.argv", ["voculinux"]))
mock_args = MagicMock()
mock_args.debug = False
@@ -2144,7 +2144,7 @@ class TestSessionHistoryRecording(unittest.TestCase):
stack.enter_context(patch("vocalinux.ui.logging_manager.initialize_logging"))
mock_parse = stack.enter_context(patch("vocalinux.main.parse_arguments"))
stack.enter_context(patch("sys.argv", ["vocalinux"]))
stack.enter_context(patch("sys.argv", ["voculinux"]))
mock_args = MagicMock()
mock_args.debug = False