Для тестов потребуется отдельная база данных. Проще всего создать её заранее рядом с базой для локальной разработки. В CI-окружении тестовую базу можно разворачивать в рамках pipeline jobs. Примеры для GitHub Actions и GitLab CI.
Вот пример использования — очень легко запустить в fixture со скоупом session (сразу с фиксом для разработчиков на Windows):
postgres = PostgresContainer("postgres:16.1")
if os.name == "nt": # TODO workaround from testcontainers/testcontainers-python#108
postgres.get_container_host_ip = lambda: "localhost"
try:
postgres.start()
postgres_url = postgres.get_connection_url().replace("psycopg2", "asyncpg")
logger.info("postgres url %s", postgres_url)
yield postgres_url
finally:
postgres.stop()
Таким образом не надо вообще ничего делать ни для локального запуска, ни для CI. Вход новичков в проект так же значительно облегчается — не надо следовать длинным инструкциям чтобы первый раз запустить тесты. просто выполнил pytest . и всё полетело
Ещё очень важный, возможно самый важный момент - разработка lightstar ведётся сообществом, более чем из одного человека. К сожалению, мы знаем истории библиотек, у которых был единственный мейнтейнер, а потом с ним что-то случилось :(
Какие хорошие библиотеки (фреймворки) выбрал автор. Давно за ними наблюдаю, очень надеюсь на их развитие и популяризацию, нравятся заложенные концепции.
Есть опыт использования в проде? Есть ли какие-то неочевидные особенности по эксплуатации?
Использую aiogram-dioalog для довольно большого бота (26 диалогов, 58 окон, 25к строк). Очень удобно, наконец-то разделена обработка события и подготовка и отрисовка следующего меню. Да ещё и в комплекте куча батареек.
Хочу рассказать про мой любимый виджет Jinja
Типичная проблема - мы используем везде html-форматирование, тогда пользовательский ввод надо экранировать. Весь код превращается в кашу из смеси текстовых шаблонов с html.escape. А если вывод сложный, то там ещё и длинная вермишель из for и if.
В случае использования Format в aiogram-dialog в геттере приходится заниматься склейкой каких-то строк в циклах, попутно не забывая экранировать.
Вместо этого можно взять Jinja и использовать любимый шаблонизатор на полную: экранирование при подстановке, циклы, условия, jinja-фильтры, в том числе пользовательские.
Живой пример из моего бота. Задача здесь - отрисовать уровни на каких сейчас находятся команды:
Jinja(
"{% for level_time in stat %}"
"{% if level_time.is_finished %}"
"?<b>{{ level_time.team.name }}</b> - финишировала в "
"{% else %}"
"?<b>{{ level_time.team.name }}</b> - уровень {{ level_time.level_number + 1 }} начат "
"{% endif %}"
"{{ level_time.start_at|user_timezone }}\n"
"{% endfor %}",
),
Получаем примерно такой вывод:
?another team - уровень 1 начат 13.05.23 00:05 ?like a team - уровень 3 начат 13.05.23 01:01 ?Майтим - уровень 3 начат 13.05.23 00:05 ?Победители по жизни - финишировала в 13.05.23 05:06
Удобно, что мы так полностью отдели логику представления от логики подготовки данных для представления. Всё то, чем пользуются классические web-приложения теперь доступно и при разработке ботов.
2. Лица, участвующие в деле, и другие участники процесса также считаются извещенными надлежащим образом судом, если:
6) имеются доказательства доставки судебного извещения посредством единого портала государственных и муниципальных услуг участнику процесса, давшему согласие на едином портале государственных и муниципальных услуг на уведомление посредством единого портала государственных и муниципальных услуг.
Традиционно рекомендую testcontainers
Вот пример использования — очень легко запустить в fixture со скоупом session (сразу с фиксом для разработчиков на Windows):
Таким образом не надо вообще ничего делать ни для локального запуска, ни для CI. Вход новичков в проект так же значительно облегчается — не надо следовать длинным инструкциям чтобы первый раз запустить тесты. просто выполнил
pytest .и всё полетелоСпасибо, со скриншотами стало гораздо понятнее!
Насколько я понял вопрос нужно создать два инстанса StorageClient.
Дишка позволяет это делать с помощью NewType
Такие типы дишка будет считать разными и как следствие выдавать разные инстансы
TaskStorage = typing.NewType("TaskStorage", StorageClient)SkillStorage = typing.NewType("SkillStorage", StorageClient)И дальше уже использовать эти типы в провайдерах в качестве получаемых аргументов и возвращаемых значений
Ещё очень важный, возможно самый важный момент - разработка lightstar ведётся сообществом, более чем из одного человека. К сожалению, мы знаем истории библиотек, у которых был единственный мейнтейнер, а потом с ним что-то случилось :(
Какие хорошие библиотеки (фреймворки) выбрал автор. Давно за ними наблюдаю, очень надеюсь на их развитие и популяризацию, нравятся заложенные концепции.
Есть опыт использования в проде? Есть ли какие-то неочевидные особенности по эксплуатации?
Использую
aiogram-dioalogдля довольно большого бота (26 диалогов, 58 окон, 25к строк). Очень удобно, наконец-то разделена обработка события и подготовка и отрисовка следующего меню. Да ещё и в комплекте куча батареек.Хочу рассказать про мой любимый виджет
JinjaТипичная проблема - мы используем везде html-форматирование, тогда пользовательский ввод надо экранировать. Весь код превращается в кашу из смеси текстовых шаблонов с
html.escape. А если вывод сложный, то там ещё и длинная вермишель изforиif.В случае использования
Formatвaiogram-dialogв геттере приходится заниматься склейкой каких-то строк в циклах, попутно не забывая экранировать.Вместо этого можно взять
Jinjaи использовать любимый шаблонизатор на полную: экранирование при подстановке, циклы, условия, jinja-фильтры, в том числе пользовательские.Живой пример из моего бота. Задача здесь - отрисовать уровни на каких сейчас находятся команды:
Получаем примерно такой вывод:
Удобно, что мы так полностью отдели логику представления от логики подготовки данных для представления. Всё то, чем пользуются классические web-приложения теперь доступно и при разработке ботов.
ГПК РФ Статья 117. Надлежащее извещение
вот тут есть небольшой FAQ от госуслуг