add CLI for translation and update dependencies

This commit is contained in:
ruslangilfanov 2025-08-10 12:29:39 +03:00
parent 857d15f167
commit 4cae57b5d2
No known key found for this signature in database
6 changed files with 67 additions and 4 deletions

48
cli/translate.py Normal file
View File

@ -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()

View File

@ -11,6 +11,7 @@ dependencies = [
"aiogtts>=1.1.1", "aiogtts>=1.1.1",
"alembic>=1.16.1", "alembic>=1.16.1",
"asyncpg>=0.30.0", "asyncpg>=0.30.0",
"click>=8.2.1",
"dependency-injector>=4.47.1", "dependency-injector>=4.47.1",
"greenlet>=3.2.3", "greenlet>=3.2.3",
"openai>=1.84.0", "openai>=1.84.0",

View File

@ -37,7 +37,7 @@ class GlossaryWord(Base):
term: Mapped[str] = mapped_column( term: Mapped[str] = mapped_column(
Text(), Text(),
nullable=False, nullable=False,
unique=True, unique=False,
) )
language: Mapped[LanguageEnum] = mapped_column( language: Mapped[LanguageEnum] = mapped_column(
Enum(LanguageEnum, native_enum=False), Enum(LanguageEnum, native_enum=False),
@ -98,7 +98,7 @@ class GlossaryWord(Base):
def __repr__(self) -> str: def __repr__(self) -> str:
return ( return (
f"<GlossaryWord(id={self.id}, term='{self.term}', language='{self.language.value}', " f"<GlossaryWord(id={self.id}, term='{self.term}', language='{self.language}', "
f"translation='{self.translation}', transcription='{self.transcription}', " f"translation='{self.translation}', transcription='{self.transcription}', "
f"lexical_category='{self.lexical_category}', meaning_category='{self.meaning_category}')>" f"lexical_category='{self.lexical_category}', meaning_category='{self.meaning_category}')>"
) )

View File

@ -25,7 +25,7 @@ class WordInfo(pydantic.BaseModel):
) )
description: str = pydantic.Field( description: str = pydantic.Field(
..., ...,
description="lemma description in {target_language}", description="description in {target_language}",
) )
part_of_speech: str = pydantic.Field( part_of_speech: str = pydantic.Field(
..., ...,

View File

@ -40,7 +40,7 @@ class OpenAiTokenUsage(Base):
) )
response_fingerprint: Mapped[str] = mapped_column( response_fingerprint: Mapped[str] = mapped_column(
Text(), Text(),
nullable=False, nullable=True,
index=True, index=True,
) )
completion_tokens: Mapped[int] = mapped_column( completion_tokens: Mapped[int] = mapped_column(

14
uv.lock
View File

@ -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" }, { 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]] [[package]]
name = "colorama" name = "colorama"
version = "0.4.6" version = "0.4.6"
@ -297,6 +309,7 @@ dependencies = [
{ name = "aiogtts" }, { name = "aiogtts" },
{ name = "alembic" }, { name = "alembic" },
{ name = "asyncpg" }, { name = "asyncpg" },
{ name = "click" },
{ name = "dependency-injector" }, { name = "dependency-injector" },
{ name = "greenlet" }, { name = "greenlet" },
{ name = "openai" }, { name = "openai" },
@ -322,6 +335,7 @@ requires-dist = [
{ name = "aiogtts", specifier = ">=1.1.1" }, { name = "aiogtts", specifier = ">=1.1.1" },
{ name = "alembic", specifier = ">=1.16.1" }, { name = "alembic", specifier = ">=1.16.1" },
{ name = "asyncpg", specifier = ">=0.30.0" }, { name = "asyncpg", specifier = ">=0.30.0" },
{ name = "click", specifier = ">=8.2.1" },
{ name = "dependency-injector", specifier = ">=4.47.1" }, { name = "dependency-injector", specifier = ">=4.47.1" },
{ name = "greenlet", specifier = ">=3.2.3" }, { name = "greenlet", specifier = ">=3.2.3" },
{ name = "openai", specifier = ">=1.84.0" }, { name = "openai", specifier = ">=1.84.0" },