scripts/ had ~80 flat files. Entry points (ci_*.sh, codegen.sh, run_tests.sh, format_native.sh, setup_hooks.sh, upload-symbols.*) and the shared pubspec_version.py stay at the root; checkers, generators, maestro tooling and release tooling move into subdirectories with their tests. Updated every reference: workflow steps, guard-test glob, Docker COPY paths and .dockerignore whitelist, website audit path, dart test imports, and regenerated the five outputs whose headers embed generator paths.
122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
import tempfile
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
|
|
import clean_translations
|
|
|
|
|
|
class CollectReferencesTest(unittest.TestCase):
|
|
def test_collects_global_and_explicit_translation_access(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
lib = Path(directory)
|
|
(lib / "widget.dart").write_text(
|
|
"""
|
|
final first = t.common.home;
|
|
final second = Translations.of(context).navigation.liveTv;
|
|
final third = Translations . of ( context ) . libraries . hiddenLibrariesCount;
|
|
""",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
with patch.object(clean_translations, "LIB_DIR", lib):
|
|
references = clean_translations.collect_references()
|
|
|
|
self.assertEqual(
|
|
references,
|
|
{
|
|
"common.home",
|
|
"navigation.liveTv",
|
|
"libraries.hiddenLibrariesCount",
|
|
},
|
|
)
|
|
|
|
def test_skips_generated_i18n_sources(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
lib = Path(directory)
|
|
i18n = lib / "i18n"
|
|
i18n.mkdir()
|
|
(i18n / "strings.g.dart").write_text(
|
|
"final generated = Translations.of(context).unused.generated;",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
with patch.object(clean_translations, "LIB_DIR", lib):
|
|
references = clean_translations.collect_references()
|
|
|
|
self.assertEqual(references, set())
|
|
|
|
|
|
class NormalizePluralTest(unittest.TestCase):
|
|
def _normalize(self, en, locale):
|
|
stats = {"added": 0, "removed": 0, "type_fixed": 0, "unchanged": 0}
|
|
categories = clean_translations.locale_plural_categories(en, locale)
|
|
return clean_translations.normalize(en, locale, "", stats, categories), stats
|
|
|
|
def test_preserves_locale_specific_plural_categories(self):
|
|
en = {"count": {"one": "${n} item", "other": "${n} items"}}
|
|
locale = {
|
|
"count": {
|
|
"one": "${n} element",
|
|
"few": "${n} elementy",
|
|
"many": "${n} elementów",
|
|
"other": "${n} elementu",
|
|
}
|
|
}
|
|
|
|
normalized, stats = self._normalize(en, locale)
|
|
|
|
self.assertEqual(normalized, locale)
|
|
self.assertEqual(stats["removed"], 0)
|
|
|
|
def test_does_not_inject_one_into_other_only_locales(self):
|
|
en = {"count": {"one": "${n} item", "other": "${n} items"}}
|
|
locale = {"count": {"other": "${n} 個"}}
|
|
|
|
normalized, stats = self._normalize(en, locale)
|
|
|
|
self.assertEqual(normalized, locale)
|
|
self.assertEqual(stats["added"], 0)
|
|
|
|
def test_new_plural_branches_use_categories_inferred_from_locale(self):
|
|
en = {
|
|
"existing": {"one": "one", "other": "other"},
|
|
"new": {"one": "one", "other": "other"},
|
|
}
|
|
locale = {
|
|
"existing": {
|
|
"one": "one",
|
|
"few": "few",
|
|
"many": "many",
|
|
"other": "other",
|
|
}
|
|
}
|
|
|
|
normalized, _ = self._normalize(en, locale)
|
|
|
|
self.assertEqual(set(normalized["new"]), {"one", "few", "many", "other"})
|
|
|
|
|
|
class MainExitStatusTest(unittest.TestCase):
|
|
def test_check_fails_when_locale_normalization_would_change_files(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
i18n = Path(directory)
|
|
(i18n / "en.i18n.json").write_text("{}\n", encoding="utf-8")
|
|
with (
|
|
patch.object(clean_translations, "I18N_DIR", i18n),
|
|
patch.object(clean_translations, "ROOT", i18n),
|
|
patch.object(clean_translations, "clean_pass", return_value=True),
|
|
patch.object(clean_translations, "unused_pass", return_value=0),
|
|
patch.object(sys, "argv", ["clean_translations.py", "--check", "--strict"]),
|
|
):
|
|
result = clean_translations.main()
|
|
|
|
self.assertEqual(result, 1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|