diff --git a/cli/translate.py b/cli/translate.py new file mode 100644 index 0000000..63923de --- /dev/null +++ b/cli/translate.py @@ -0,0 +1,48 @@ +import asyncio +import click + +from greek_lang.container import init_main_container +from greek_lang.languages import LanguageEnum +from greek_lang.translator import translate + + +async def _translate(word: str, source_code: str, target_code: str) -> None: + try: + source_lang = LanguageEnum(source_code.lower()) + target_lang = LanguageEnum(target_code.lower()) + except KeyError as exc: + raise click.BadParameter(f"Unsupported language code: {exc.args[0]}") from exc + + async with init_main_container(): + result = await translate(word, source_lang, target_lang=target_lang) + + click.echo(result) + + +@click.command(help="Перевод слова между языками библиотеки greek_lang.") +@click.argument("word") +@click.option( + "-s", + "--source", + "source_code", + default="el", + show_default=True, + type=click.Choice([lang.name for lang in LanguageEnum], case_sensitive=False), + help="Код исходного языка (ISO-639-1, как в LanguageEnum).", +) +@click.option( + "-t", + "--target", + "target_code", + default="ru", + show_default=True, + type=click.Choice([lang.name for lang in LanguageEnum], case_sensitive=False), + help="Код языка перевода (ISO-639-1, как в LanguageEnum).", +) +def cli(word: str, source_code: str, target_code: str) -> None: + """Обёртка, которая запускает асинхронный перевод через asyncio.""" + asyncio.run(_translate(word, source_code, target_code)) + + +if __name__ == "__main__": + cli() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 40ec3b8..937a11e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ dependencies = [ "aiogtts>=1.1.1", "alembic>=1.16.1", "asyncpg>=0.30.0", + "click>=8.2.1", "dependency-injector>=4.47.1", "greenlet>=3.2.3", "openai>=1.84.0", diff --git a/src/greek_lang/glossaries/models.py b/src/greek_lang/glossaries/models.py index 7b8a7fd..fb24624 100644 --- a/src/greek_lang/glossaries/models.py +++ b/src/greek_lang/glossaries/models.py @@ -37,7 +37,7 @@ class GlossaryWord(Base): term: Mapped[str] = mapped_column( Text(), nullable=False, - unique=True, + unique=False, ) language: Mapped[LanguageEnum] = mapped_column( Enum(LanguageEnum, native_enum=False), @@ -98,7 +98,7 @@ class GlossaryWord(Base): def __repr__(self) -> str: return ( - f"" ) diff --git a/src/greek_lang/openai_manager/manager.py b/src/greek_lang/openai_manager/manager.py index 506978d..2bce216 100644 --- a/src/greek_lang/openai_manager/manager.py +++ b/src/greek_lang/openai_manager/manager.py @@ -25,7 +25,7 @@ class WordInfo(pydantic.BaseModel): ) description: str = pydantic.Field( ..., - description="lemma description in {target_language}", + description="description in {target_language}", ) part_of_speech: str = pydantic.Field( ..., diff --git a/src/greek_lang/openai_manager/models.py b/src/greek_lang/openai_manager/models.py index 418b24a..ec6dd9d 100644 --- a/src/greek_lang/openai_manager/models.py +++ b/src/greek_lang/openai_manager/models.py @@ -40,7 +40,7 @@ class OpenAiTokenUsage(Base): ) response_fingerprint: Mapped[str] = mapped_column( Text(), - nullable=False, + nullable=True, index=True, ) completion_tokens: Mapped[int] = mapped_column( diff --git a/uv.lock b/uv.lock index d310a91..cee55db 100644 --- a/uv.lock +++ b/uv.lock @@ -177,6 +177,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -297,6 +309,7 @@ dependencies = [ { name = "aiogtts" }, { name = "alembic" }, { name = "asyncpg" }, + { name = "click" }, { name = "dependency-injector" }, { name = "greenlet" }, { name = "openai" }, @@ -322,6 +335,7 @@ requires-dist = [ { name = "aiogtts", specifier = ">=1.1.1" }, { name = "alembic", specifier = ">=1.16.1" }, { name = "asyncpg", specifier = ">=0.30.0" }, + { name = "click", specifier = ">=8.2.1" }, { name = "dependency-injector", specifier = ">=4.47.1" }, { name = "greenlet", specifier = ">=3.2.3" }, { name = "openai", specifier = ">=1.84.0" },