From 47ed057ac0d375334bf1b9819ebe0ed135d42e29 Mon Sep 17 00:00:00 2001 From: andrew000 <11490628+andrew000@users.noreply.github.com> Date: Thu, 23 Oct 2025 02:04:06 +0300 Subject: [PATCH] Drop FTL stub generator --- aiogram_i18n/utils/cli/extract.py | 3 ++ aiogram_i18n/utils/cli/multiple_extract.py | 3 ++ aiogram_i18n/utils/fluent_stub/__init__.py | 48 ++++++---------------- aiogram_i18n/utils/fluent_stub/visitor.py | 32 --------------- 4 files changed, 19 insertions(+), 67 deletions(-) delete mode 100644 aiogram_i18n/utils/fluent_stub/visitor.py diff --git a/aiogram_i18n/utils/cli/extract.py b/aiogram_i18n/utils/cli/extract.py index e40fde4..66fbf28 100644 --- a/aiogram_i18n/utils/cli/extract.py +++ b/aiogram_i18n/utils/cli/extract.py @@ -70,6 +70,9 @@ def extract( style( text="This function is removed. Use FTL-Extract instead.\n" "pip install ftl-extract\n" + "\n" + "ftl extract [OPTIONS]\n" + "\n" "https://pypi.org/project/FTL-Extract/", fg="red", ), diff --git a/aiogram_i18n/utils/cli/multiple_extract.py b/aiogram_i18n/utils/cli/multiple_extract.py index bd19dd1..f8f0a19 100644 --- a/aiogram_i18n/utils/cli/multiple_extract.py +++ b/aiogram_i18n/utils/cli/multiple_extract.py @@ -76,6 +76,9 @@ def multiple_extract( style( text="This function is removed. Use FTL-Extract instead.\n" "pip install ftl-extract\n" + "\n" + "ftl extract [OPTIONS]\n" + "\n" "https://pypi.org/project/FTL-Extract/", fg="red", ), diff --git a/aiogram_i18n/utils/fluent_stub/__init__.py b/aiogram_i18n/utils/fluent_stub/__init__.py index 7dad9e6..863b1ac 100644 --- a/aiogram_i18n/utils/fluent_stub/__init__.py +++ b/aiogram_i18n/utils/fluent_stub/__init__.py @@ -1,41 +1,19 @@ from collections.abc import Sequence -from pathlib import Path -from aiogram_i18n.exceptions import NoModuleError -from aiogram_i18n.utils.stub_tree import Key +from click import echo, style -try: - from fluent.syntax import FluentParser - from aiogram_i18n.utils.fluent_stub.visitor import FluentVisitor -except ImportError: - raise NoModuleError(name="Fluent stub generator", module_name="fluent.syntax") from None - -MESSAGES = dict[str, set[str]] - - -def parse(text: str) -> MESSAGES: - resource = FluentParser().parse(text) - if not resource.body: - msg = "no body" - raise ValueError(msg) - - ftl_visitor = FluentVisitor() - ftl_visitor.visit(resource) - - return ftl_visitor.messages - - -def parse_file(file: str) -> MESSAGES: - return parse(text=Path(file).read_text(encoding="utf8")) - - -def from_files_to_file_ex(files: Sequence[str], to_file: str) -> None: - if file_dir := Path(to_file).parent: - file_dir.mkdir(exist_ok=True, parents=True) - Path(to_file).write_text( - Key().run( - messages={k: list(v) for file in files for k, v in parse_file(file).items()}, +def from_files_to_file_ex(files: Sequence[str], to_file: str) -> None: # noqa: ARG001 + echo( + style( + text="This function is removed. Use FTL-Extract instead.\n" + "pip install ftl-extract\n" + "\n" + "ftl stub \n" + "\n" + "https://pypi.org/project/FTL-Extract/", + fg="red", ), - encoding="utf8", + err=True, + color=True, ) diff --git a/aiogram_i18n/utils/fluent_stub/visitor.py b/aiogram_i18n/utils/fluent_stub/visitor.py deleted file mode 100644 index 211bde6..0000000 --- a/aiogram_i18n/utils/fluent_stub/visitor.py +++ /dev/null @@ -1,32 +0,0 @@ -from collections.abc import Generator - -from fluent.syntax import ast -from fluent.syntax.visitor import Visitor - - -class FluentVisitor(Visitor): - def __init__(self) -> None: - self.messages: dict[str, set[str]] = {} - - def _get_placeholders(self, element: ast.BaseNode) -> Generator[str, None, None]: - if isinstance(element, ast.VariableReference): - yield element.id.name - elif isinstance(element, ast.Placeable): - yield from self._get_placeholders(element.expression) - elif isinstance(element, ast.SelectExpression): - yield from self._get_placeholders(element.selector) - elif isinstance(element, ast.FunctionReference): - for pos_arg in element.arguments.positional: - yield from self._get_placeholders(pos_arg) - - def visit_Message(self, message: ast.Message) -> None: # noqa: N802 - m = self.messages[message.id.name] = set() - - if not message.value: - return self.generic_visit(message) - - for element in message.value.elements: - if isinstance(element, ast.Placeable): - m.update(self._get_placeholders(element)) - - return self.generic_visit(message)