-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.py
144 lines (101 loc) · 3.47 KB
/
cli.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import os
from pathlib import Path
from typing import Iterable
import typer
from bot.config import DEV_ENV_FILEPATH, ENCODING, PROD_ENV_FILEPATH, Config
from bot.utils.paths import ROOT_PATH, ROUTERS_PATH
app = typer.Typer()
@app.command()
def dev():
DEV_ENV_FILEPATH.touch(exist_ok=True)
update_env_files()
@app.command()
def update():
os.system(
"poetry export -f requirements.txt --output requirements.txt --without-hashes"
)
update_env_files()
@app.command("r")
@app.command("router")
def router(name: str, file: bool = False, jump: bool = False):
FILE_ROUTER_CODE = """from aiogram import F, Router, types
from aiogram.fsm.context import FSMContext
from .. import markups
from ..client import bot
from ..database.models import BotUser
from ..phrases import phrases
from . import root_router
router = Router()
root_router.include_router(router)
"""
DIR_ROUTER_CODE = """from aiogram import Router
from .. import root_router
router = Router()
root_router.include_router(router)
"""
if file:
router_filepath = ROUTERS_PATH / f"{name}.py"
router_filepath.write_text(FILE_ROUTER_CODE, encoding=ENCODING)
typer.echo(f"Created router in {router_filepath}")
if jump:
jump_to_file(router_filepath)
return
router_dirpath = ROUTERS_PATH / name
init_filepath = router_dirpath / "__init__.py"
router_dirpath.mkdir(exist_ok=True)
init_filepath.write_text(DIR_ROUTER_CODE, encoding=ENCODING)
typer.echo(f"Created router in {init_filepath}")
if jump:
jump_to_file(init_filepath)
@app.command("h")
@app.command("handler")
def handler(router: str, name: str, jump: bool = False):
HANDLER_CODE = """from aiogram import F, types
from aiogram.fsm.context import FSMContext
from ... import markups
from ...client import bot
from ...database.models import BotUser
from ...phrases import phrases
from . import router
"""
router_dirpath = ROUTERS_PATH / router
if not router_dirpath.exists():
return typer.echo(f"Router {router} does not exist")
handler_filepath = router_dirpath / f"{name}.py"
if handler_filepath.exists():
typer.echo(f"Handler {handler_filepath} is already created")
else:
handler_filepath.write_text(HANDLER_CODE, encoding=ENCODING)
typer.echo(f"Handler {handler_filepath} has been created")
if jump:
jump_to_file(handler_filepath)
def jump_to_file(path: Path):
os.system(f"code {path.absolute()}")
def generate_filepaths(filenames: Iterable[Path]):
yield from map(lambda filename: ROOT_PATH / filename, filenames)
def _settings_properties_values_generator(
settings_object: Config, field_names: Iterable[str]
):
for field_name in field_names:
value = getattr(settings_object, field_name)
yield field_name, value
def update_env_file(filepath: Path):
settings_object = Config(
_env_file=str(filepath.absolute()), _env_file_encoding=ENCODING # type: ignore
)
env_file_content = "\n".join(
f"{field_name.upper()}={field_value}"
for field_name, field_value in _settings_properties_values_generator(
settings_object, settings_object.model_fields.keys()
)
)
env_file_content += "\n" # trailing new line
filepath.write_text(
env_file_content,
encoding=ENCODING,
)
def update_env_files():
update_env_file(PROD_ENV_FILEPATH)
update_env_file(DEV_ENV_FILEPATH)
if __name__ == "__main__":
app()