add CLI for translation and update dependencies
This commit is contained in:
parent
857d15f167
commit
4cae57b5d2
48
cli/translate.py
Normal file
48
cli/translate.py
Normal 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()
|
||||||
@ -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",
|
||||||
|
|||||||
@ -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}')>"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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(
|
||||||
...,
|
...,
|
||||||
|
|||||||
@ -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
14
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" },
|
{ 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" },
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user