Honker — это SQLite-расширение, которое приносит в SQLite
NOTIFY/LISTEN- логику в стиле Postgres.Без брокера. Без polling. Без лишней инфраструктуры.
Идея простая: если у вас SQLite — то очередь и события должны жить прямо в том же
.db файле. INSERT INTO orders ... и queue.enqueue(...) могут коммититься вместе — это очень удобно и надежно.А для пробуждения процессов используется `PRAGMA data_version`, что дает реакцию почти как push — быстро и без ручного опроса.
#SQLite #Rust #OpenSource #PubSub #Queue #Backend #Python #NodeJS #Kotlin #DotNet #DevTools
https://github.com/russellromney/honker
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - russellromney/honker: SQLite extension + bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub…
SQLite extension + bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub, and scheduler - russellromney/honker
1👍2 2 2
Tryke - это современный фреймворк для тестирования в Python, который делает написание тестов более структурированным и интуитивно понятным.
Если в Python вам всегда не хватало красивого BDD-стиля (как в Jest или RSpec) с их вложенными блоками
describe, то Tryke создан именно для вас!with t.describe("имя_группы"):.Annotated[..., t.Depends(...)]). Поддерживается кеширование на уровне модуля или отдельного блока describe (per="scope").t.expect(actual, "описание").to_equal(expected) делает отчеты об ошибках в консоли максимально понятными.async def.tryke test --watch) для запуска тестов на лету при сохранении кода, а также запуск только для измененных файлов (--changed).Авторы подготовили не только классическую шпаргалку по миграции, но и специальный готовый LLM-промпт. Вы можете просто скормить его своему ИИ-ассистенту (Cursor, Copilot и т.д.), и он поэтапно, с проверками перепишет ваши тесты с
pytest на Tryke.Если у вас есть
uv, достаточно выполнить:uvx tryke testПример синтаксиса:
import tryke as t
with t.describe("users"):
@t.test("stores a new user")
async def test_set(users: ...):
users["bob"] = "bob@example.com"
t.expect(users["bob"], "stores email").to_equal("bob@example.com")
#Python #Testing #Tryke #QA #DevTools #Backend #Pytest #OpenSource #Programming
https://github.com/thejchap/tryke
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - thejchap/tryke: A Rust-based Python test runner with a Jest-style API
A Rust-based Python test runner with a Jest-style API - thejchap/tryke
1🔥3 3👍1
Kubex — это современный и невероятно быстрый клиент Kubernetes для Python, вдохновленный rust-библиотекой
kube.rs.Если вы писали K8s-операторы на Python, то наверняка сталкивались с медлительностью и прожорливостью стандартного
kubernetes-asyncio.Kubex меняет правила игры, предоставляя инструмент по-настоящему энтерпрайз-уровня!
dict[str, Any]. Все ресурсы K8s, поля spec и status строго типизированы. IDE сама подскажет нужные параметры, а mypy защитит от ошибок еще до запуска.asyncio (aiohttp/httpx) и trio (httpx). Никакого вендор-лока.exec), подключение к потокам (attach) и проброс портов (portforward) работают прямо из кода, как в kubectl.from kubex.api import Api
from kubex.client import create_client
from kubex.k8s.v1_35.core.v1.pod import Pod
async with await create_client() as client:
api: Api[Pod] = Api(Pod, client=client, namespace="default")
pod = await api.get("my-pod")
# pod.spec и pod.status полностью типизированы!
#Kubernetes #Python #DevOps #Pydantic #OpenSource #K8s #Asyncio #Backend
https://github.com/codemageddon/kubex
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - codemageddon/kubex: Python asynchronous client for Kubernetes
Python asynchronous client for Kubernetes. Contribute to codemageddon/kubex development by creating an account on GitHub.
2🔥5👍2⚡1
Feloxi - это мощная self-hosted платформа для мониторинга очередей задач Python, в первую очередь — Celery. Инструмент предоставляет живые дашборды, поиск по истории задач и гибкую систему алертов.
Вам не нужно устанавливать никаких дополнительных агентов или менять код приложения! Feloxi просто подключается к вашему брокеру (Redis или RabbitMQ), читает стандартные события, которые и так генерирует Celery, и бережно сохраняет их в ClickHouse.
GET /metrics для легкой интеграции с вашей инфраструктурой мониторинга.Добавьте в
celeryconfig.py:worker_send_task_events = True
task_send_sent_event = True
task_track_started = True
Перезапустите воркеры с флагом
--events.Зайдите в UI Feloxi, нажмите Add Broker и введите URL вашего Redis/RabbitMQ. Всё!
git clone https://github.com/thesaadmirza/feloxi.git
cd feloxi
cp .env.example .env
docker compose up -d
Стек: Rust (Axum), Next.js 15, PostgreSQL, ClickHouse и Redis. Поддерживается установка в Kubernetes через Helm-чарты.
#Python #Celery #DevOps #Monitoring #RabbitMQ #Redis #Rust #NextJS #OpenSource #Backend
https://github.com/thesaadmirza/feloxi
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - thesaadmirza/feloxi: Real-time Celery task queue monitoring — Rust/Axum backend, Next.js dashboard, ClickHouse analytics
Real-time Celery task queue monitoring — Rust/Axum backend, Next.js dashboard, ClickHouse analytics - thesaadmirza/feloxi
1👍4 2🔥1
Postman2pytest. — это инструмент, который позволяет конвертировать JSON-файлы из Postman (коллекции v2.1) в готовые для запуска тесты
pytest. И всё это одной командой!Часто коллекции Postman служат отличной документацией для вашего API. Утилита
postman2pytest превращает эту "документацию" в исполняемые регрессионные тесты на Python, которые легко встраиваются в CI/CD. Больше не нужно переписывать тесты вручную — вы избавляетесь от рутины и рассинхрона между доками и кодом.pm.response.to.have.status(200).def test_users_post_create_user()).--filter-folder).{{base_url}} автоматически преобразуются в f-строки и подхватываются через переменные окружения (например, BASE_URL).pip install postman2pytestpostman2pytest \
--collection data/my_api.postman_collection.json \
--out generated_tests/test_api.py
# Запуск сгенерированных тестов
BASE_URL=https://staging.example.com pytest generated_tests/test_api.py -v
form-data и не читает Pre-request скрипты (например, автоматическое получение токенов OAuth придется завернуть в фикстуру pytest руками). Развитие проекта продолжается, и многие из этих пунктов уже в Roadmap.#Python #Testing #QA #Postman #Pytest #API #DevTools #Backend #Automation
https://github.com/golikovichev/postman2pytest
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - golikovichev/postman2pytest: Convert Postman Collection v2.1 JSON into executable pytest test suites
Convert Postman Collection v2.1 JSON into executable pytest test suites - golikovichev/postman2pytest
1⚡2👍2🔥2
Lifeguard — это быстрый инструмент статического анализа, созданный для безопасного внедрения «ленивых» импортов (Lazy Imports) в Python-проектах.
Обычно в Python каждый
import выполняется моментально при чтении файла. Ленивые импорты откладывают реальную загрузку модуля до момента первого обращения к импортированному имени. Это радикально снижает потребление памяти и ускоряет запуск приложений, особенно в огромных кодовых базах с глубоким деревом зависимостей.Перевести старый код на ленивые импорты вслепую не выйдет — часть логики обязательно сломается. Например, проблемы возникнут, если:
sys.modules, ожидая, что предыдущие импорты уже выполнились.__init_subclass__.Найти все такие места в большом проекте вручную практически невозможно.
Инструмент (написанный на Rust) параллельно анализирует AST-дерево ваших исходников и выявляет все несовместимые паттерны. Lifeguard максимально консервативен: если он не может программно доказать, что модуль безопасен для ленивого импорта, он помечает его как небезопасный. Стабильность продакшена здесь ставится выше микрооптимизаций.
LAZY_ELIGIBLE (полностью безопасные модули) и LOAD_IMPORTS_EAGERLY (модули-исключения). В будущем (в Python 3.15) этот JSON можно будет использовать в качестве фильтра для функции importlib.util.lazy_import, чтобы управлять импортами автоматически.Находится в стадии беты и готовится к выходу Python 3.15 (уже протестирован на версиях 3.12 и 3.14). Сейчас для работы требуется Rust (nightly) и запуск через
cargo run, но разработчики уже готовят пакет для PyPI и готовые GitHub Actions.#Python #Rust #LazyImports #PEP810 #StaticAnalysis #DevTools #Backend #Оптимизация
https://github.com/facebook/Lifeguard
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - facebook/Lifeguard: Lifeguard is a static analyzer to detect Lazy Imports incompatibilities and ease the adoption overhead…
Lifeguard is a static analyzer to detect Lazy Imports incompatibilities and ease the adoption overhead for Lazy Imports in Python - facebook/Lifeguard
1🔥4⚡3
Dj-lite-tenant - это экспериментальная библиотека для Django, которая выводит изоляцию данных в мультиарендных (multi-tenant) приложениях на абсолютный максимум. Она автоматически создает отдельную базу данных SQLite для каждого пользователя.
Если вы строите легковесный SaaS или пет-проект, где пользователи не должны пересекаться данными ни при каких обстоятельствах, этот инструмент предлагает элегантное решение без развертывания тяжелых серверов БД.
.sqlite3 для указанных в настройках приложений.ForeignKey между БД пользователя и общей базой данных (например, таблицей самого User) работают прозрачно благодаря механизму ATTACH DATABASE в SQLite. Django ORM сама генерирует валидные SQL-запросы.USE_DATABASE_TEMPLATE. Первая чистая БД выполнит миграции, сохранится как шаблон, а для новых пользователей файлы будут просто клонироваться за миллисекунды.with tenant_db(user):.Установка:
uv add dj-lite-tenant
# или pip install dj-lite-tenant
Минимальная настройка в
settings.py:INSTALLED_APPS = [
...
"dj_lite_tenant",
]
MIDDLEWARE = [
...
"django.contrib.auth.middleware.AuthenticationMiddleware",
"dj_lite_tenant.middleware.TenantDatabaseMiddleware", # Строго после Auth
]
DATABASE_ROUTERS = ["dj_lite_tenant.routers.TenantDatabaseRouter"]
DJ_LITE_TENANT = {
"DIR": BASE_DIR / "db/tenants",
"APPS": {"notes"}, # Приложения, данные которых улетят в персональные БД
}
Для применения новых миграций ко всем базам данных пользователей используется специальная команда:
python manage.py migrate_tenant_dbs.#Django #Python #SQLite #MultiTenant #Backend #WebDev #SaaS #Database #OpenSource
https://github.com/adamghill/dj-lite-tenant
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - adamghill/dj-lite-tenant: Multi-tenant SQLite databases for Django.
Multi-tenant SQLite databases for Django. Contribute to adamghill/dj-lite-tenant development by creating an account on GitHub.
Spoof — это минималистичный и гибкий HTTP-сервер для Python, разработанный специально для изоляции и тестирования сетевого взаимодействия без боли.
Если вам когда-нибудь требовалось переписать клиентскую библиотеку, проверить её поведение в боевых условиях или полноценно замокать сторонний API на реальных сетевых сокетах (а не просто подменить методы в коде), Spoof станет идеальным решением.
http.server, не имеет внешних зависимостей и работает на Python 3.10–3.14..responses) или возвращает .defaultResponse. По умолчанию, если очередь пуста, он честно отдаст 503 Service Unavailable..requests. После тестов можно легко проверить, какие методы, заголовки, query-параметры или JSON-тела прилетали на сервер.CONNECT-запросов, а также умеет слушать исключительно IPv6-сокеты через класс spoof.http6.breakpoint(). При отправке запроса выполнение встанет на паузу, и вы сможете изучить объект request прямо в консоли через Pdb.import requests
import spoof
# Поднимаем сервер в контекстном менеджере
with spoof.http() as http:
# Задаем цепочку ответов
http.responses.extend([
[200, [("Content-Type", "application/json")], b'{"id": 1111}'],
[200, [("Content-Type", "application/json")], b'{"id": 2222}'],
])
http.defaultResponse = [404, [], "Not found"]
# Проверяем поведение клиента
assert requests.get(http.url + "/users").json() == {"id": 1111}
assert requests.get(http.url + "/posts").json() == {"id": 2222}
assert requests.get(http.url + "/unknown").status_code == 404
# Проверяем историю логов сервера
assert [r.path for r in http.requests] == ["/users", "/posts", "/unknown"]
pip install spoof
#Python #Testing #QA #Backend #Mock #HTTPServer #DevTools #OpenSource #WebDevelopment
https://github.com/lexsca/spoof
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - lexsca/spoof: A simple HTTP server for test environments
A simple HTTP server for test environments. Contribute to lexsca/spoof development by creating an account on GitHub.
1🔥4👍3⚡2
Bocpy — это библиотека для Python, реализующая принципиально новую парадигму параллельного программирования — поведенческо-ориентированную конкурентность (Behavior-Oriented Concurrency, BOC).
В параллельном коде на Python часто возникают состояния гонки (data races), а с появлением сборки без GIL (free-threaded Python) защищать данные становится еще сложнее.
bocpy решает эту проблему фундаментально: данные разделяются так, что каждый поток выполнения («поведение») получает уникальное временное владение объектом. Больше не нужно вручную управлять блокировками (lock.acquire()), а риск дедлоков исключен на уровне архитектуры.@when и со стороны выглядят как обычный линейный код.bocpy обеспечивает честный параллелизм и показывает практически линейное масштабирование (до 7.5× ускорения на 8 воркерах).PinnedCown): Если объект не может быть передан между интерпретаторами (например, контекст GPU, файловые дескрипторы или UI-виджеты), его можно закрепить за главным потоком, не ломая параллельную работу остальных воркеров.Вместо сложной синхронизации вы объявляете разделяемые ресурсы как
Cown (concurrently-owned objects) и указываете, какие функции должны дождаться их готовности:from bocpy import Cown, when, wait
# Создаем защищенные ресурсы
cheese = Cown(None)
meal = Cown(None)
# Задачи запустятся параллельно на разных ядрах
@when(cheese)
def buy_cheese(cheese):
cheese.value = "Пармезан"
@when(meal)
def order_meal(meal):
meal.value = "Салат"
# Этот блок выполнится автоматически, как только ОБОИ ресурсы освободятся
@when(cheese, meal)
def eat_dinner(cheese, meal):
print(f"Ужинаем: {meal.value} и {cheese.value}!")
wait() # Ждем завершения всех задач
pip install bocpy
#Python #bocpy #Concurrency #Parallelism #GIL #Multithreading #SubInterpreters #Backend #OpenSource
https://github.com/microsoft/bocpy
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - microsoft/bocpy: Behavior-Oriented Concurrency in Python
Behavior-Oriented Concurrency in Python. Contribute to microsoft/bocpy development by creating an account on GitHub.
3👍2🔥2 2
Python UUID Utils — это сверхбыстрая замена стандартного модуля
uuid в Python, написанная на Rust. Инструмент разработан как полноценная альтернатива (drop-in replacement): вы можете кратно ускорить генерацию уникальных идентификаторов в вашем приложении без кардинального переписывания кодовой базы.Согласно официальным тестам на Python 3.14, ускорение получается просто космическим:
uuid4(): Стандартная библиотека — 1189 нс | uuid_utils — всего 61 нс (быстрее почти в 20 раз!).uuid7(): Стандартная библиотека — 1336 нс | uuid_utils — 84 нс (быстрее в 15 раз!).hex) или байтов работает быстрее в 4–5 раз.Некоторые крупные фреймворки строго требуют, чтобы объекты UUID были именно инстансами стандартного класса
uuid.UUID из встроенной библиотеки Python, а не сторонними сабклассами. Разработчики это учли! Для таких случаев есть специальный модуль совместимости:import uuid_utils.compat as uuid
# Возвращает родной объект stdlib uuid.UUID,
# но генерирует его в 4-5 раз быстрее стандартного модуля!
my_id = uuid.uuid4()
pip install uuid-utils
# или через conda
conda install -c conda-forge uuid-utils
#Python #Rust #Performance #UUID #Backend #Django #DevTools #Programming #OpenSource #Оптимизация
https://github.com/aminalaee/uuid-utils
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - aminalaee/uuid-utils: Fast, drop-in replacement for Python's uuid module, powered by Rust.
Fast, drop-in replacement for Python's uuid module, powered by Rust. - aminalaee/uuid-utils
3⚡2👍2 2
Fstache - это быстрый движок шаблонизации Mustache для Python 3.12+, созданный без единой сторонней зависимости (dependency-free).
Инструмент разработан специально для серверной веб-разработки в стиле HTML-over-the-wire (в связке с HTMX, Alpine.js и Tailwind CSS). Когда сервер рендерит готовую HTML-разметку фрагментами или целиком, скорость шаблонизатора становится критически важной — особенно на бюджетных VPS. Fstache решает эту задачу за счет глубокой оптимизации и предварительной компиляции компонентов.
partials) загружаются и встраиваются в память заранее, полностью убирая накладные расходы при вызове во время обработки запроса.iter_chunks()), что позволяет передавать готовый HTML в браузер частями через StreamingResponse в Starlette, FastAPI или Flask.callables).Установка:
pip install fstache
Использование в коде:
import fstache
# Создаем рендерер для продакшена (шаблоны предзагружаются один раз)
render = fstache.create_prod_renderer("./templates")
# Рендерим страницу
result = render("pages/home.mustache", {"name": "Ада"})
# Получаем результат в виде строки или байтов
print(result.to_string())
Библиотека предоставляет готовые пресеты для разных этапов разработки:
create_dev_renderer() — подхватывает изменения файлов на лету без перезапуска сервера.create_test_renderer() — строго отлавливает пропущенные переменные и шаблоны во время прогона тестов.create_prod_renderer() — обеспечивает максимальную скорость и стабильность в продакшене.#Python #Mustache #HTMX #WebDev #Backend #FastAPI #Flask #Starlette #DevTools #OpenSource
https://github.com/servletcloud/fstache
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - servletcloud/fstache: Fast dependency-free, typed Mustache renderer for Python 3.12+
Fast dependency-free, typed Mustache renderer for Python 3.12+ - servletcloud/fstache
1👍2🔥2 2
Envgap - это диагностическая консольная утилита для Python-проектов, которая находит расхождения и рассинхрон между файлами
.env, .env.example, переменными окружения в shell и вызовами в коде (os.environ, os.getenv или Pydantic BaseSettings).Утилита не загружает ваши конфигурации в рантайм приложения. Её главная задача — показать, почему переменная окружения работает на вашей локальной машине, но внезапно вызывает сбой в CI/CD, внутри Docker-контейнера или на ПК другого разработчика.
DB_URL вместо DATABASE_URL)..env.example, в которых забыли указать новые переменные.changeme, todo или your-key-here.BaseSettings, алиасы, префиксы и дефолтные значения.Если в коде приложения указано:
import os
DATABASE_URL = os.environ["DATABASE_URL"]
А в файле
.env прописано DB_URL=postgres://localhost/app, утилита покажет четкий диагноз:DATABASE_URL отсутствует в .env (ошибка).DB_URL в .env может быть опечаткой для DATABASE_URL (предложение переименовать).Установка через pip:
pip install envgap
Запуск проверки в текущем проекте:
envgap check
Использование в CI пайплайнах (строгий режим с выходом с кодом 1 при предупреждениях):
envgap check --ci
#Python #DevTools #FastAPI #Docker #CICD #Dotenv #Pydantic #Backend #OpenSource #Debugging
https://github.com/Pinak-Datta/envgap
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - Pinak-Datta/envgap: enFind gaps between .env, .env.example, shell variables, and Python code.
enFind gaps between .env, .env.example, shell variables, and Python code. - Pinak-Datta/envgap
1👍3🔥3 2
Icalendar - это библиотека для Python, предназначенная для парсинга, генерации и редактирования файлов формата iCalendar (.ics), полностью совместимая со стандартом RFC 5545.
С ее помощью можно создавать, анализировать и модифицировать события, встречи и задачи в коде, а затем экспортировать их для работы с любыми календарными сервисами (Google Calendar, Apple Calendar, Outlook и др.).
zoneinfo (из стандартной библиотеки Python), dateutil.tz и pytz.icalendar построены десятки других инструментов, таких как caldav (клиент CalDAV по RFC 4791), iCalEvents (расчет повторяющихся событий) и x-wr-timezone.Установка из PyPI:
pip install icalendar
Пример создания календаря с событием:
from icalendar import Calendar, Event
from datetime import datetime
cal = Calendar()
event = Event()
event.add('summary', 'Созвон по проекту')
event.add('dtstart', datetime(2026, 8, 10, 10, 0, 0))
event.add('dtend', datetime(2026, 8, 10, 11, 0, 0))
cal.add_component(event)
# Экспорт в файл .ics
with open('meeting.ics', 'wb') as f:
f.write(cal.to_ical())
Проект распространяется под лицензией BSD (2-Clause) и доступен на GitHub.
#Python #iCalendar #RFC5545 #CalDAV #Calendar #DevTools #OpenSource #Backend
https://github.com/collective/icalendar
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - collective/icalendar: icalendar parser library for Python
icalendar parser library for Python. Contribute to collective/icalendar development by creating an account on GitHub.
2👍3 3🔥2
Num2words library - это библиотека для Python и удобная консольная утилита, которая переводит числа в слова (прописью) на десятках языков мира.
Она превращает числа вроде
42 в текст вида «сорок два» или «forty-two», умеет формировать порядковые числительные и корректно форматировать денежные суммы для финансовых отчетов или документов.ru), английский (en), испанский (es), французский (fr), немецкий (de), казахский (kz), украинский (uk) и многие другие, в том числе региональные диалекты.to):cardinal (по умолчанию) — обычные количественные числительные («сорок два»).ordinal — порядковые числительные («сорок второй»).currency — денежные суммы с указанием валюты и разменных монет («два евро четырнадцать центов»).year — проговаривание годов («девятнадцать восемьдесят четыре»).В коде Python:
from num2words import num2words
# Обычное число на русском языке
print(num2words(42, lang='ru'))
# -> "сорок два"
# Порядковое числительное
print(num2words(42, to='ordinal', lang='ru'))
# -> "сорок второй"
# На французском
print(num2words(42, lang='fr'))
# -> "quarante-deux"
В командной строке (CLI):
# Базовый вызов
num2words 10001
# -> ten thousand and one
# Денежный формат на испанском
num2words 2.14 -l es --to currency
# -> dos euros con catorce céntimos
pip install num2words
#Python #Num2words #Localization #NLP #DevTools #OpenSource #CLI #Backend #Программирование
https://github.com/savoirfairelinux/num2words
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - savoirfairelinux/num2words: Modules to convert numbers to words. 42 --> forty-two
Modules to convert numbers to words. 42 --> forty-two - savoirfairelinux/num2words
1🔥3 1
Tortoise ORM - это простая и производительная асинхронная ORM (Object-Relational Mapper) для Python 3.10+, созданная под сильным вдохновением от Django ORM.
Библиотека разработана специально для
asyncio и сочетает привычный, выразительный синтаксис моделей Django с нативной асинхронностью, избавляя от бойлерплейта и необходимости писать «сырые» SQL-запросы в асинхронных микросервисах.async/await) без блокировки event loop.Model, строгая типизация полей (fields), поддержка связей ForeignKeyField / ManyToManyField и удобный QuerySet (filter, annotate, prefetch_related).asyncpg, psycopg)asyncmy, aiomysql)aiosqlite)asyncodbc)tortoise makemigrations, tortoise migrate, tortoise sqlmigrate) для автоматического отслеживания изменений схем и генерации миграций.1. Определение моделей:
from tortoise import fields
from tortoise.models import Model
class Tournament(Model):
id = fields.IntField(primary_key=True)
name = fields.CharField(max_length=50)
class Event(Model):
id = fields.BigIntField(primary_key=True)
name = fields.TextField()
tournament = fields.ForeignKeyField('models.Tournament', related_name='events')
2. Инициализация и работа с данными:
import asyncio
from tortoise import Tortoise
async def main():
# Подключение к БД
await Tortoise.init(
db_url='sqlite://db.sqlite3',
modules={'models': ['__main__']}
)
# Генерация таблиц (для dev-режима)
await Tortoise.generate_schemas()
# Создание записей
tournament = await Tournament.create(name='Cyber Cup 2026')
await Event.create(name='Final Match', tournament=tournament)
# Выборка с подгрузкой связанных связей
events = await Event.filter(tournament=tournament).prefetch_related('tournament')
for event in events:
print(f"Событие: {event.name}, Турнир: {event.tournament.name}")
await Tortoise.close_connections()
asyncio.run(main())
# Базовая версия (SQLite):
pip install tortoise-orm
# С драйвером для PostgreSQL:
pip install "tortoise-orm[asyncpg]"
# С драйвером для MySQL:
pip install "tortoise-orm[asyncmy]"
#Python #TortoiseORM #ORM #AsyncIO #FastAPI #PostgreSQL #MySQL #Database #Backend #DevTools #OpenSource
https://github.com/tortoise/tortoise-orm
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - tortoise/tortoise-orm: Familiar asyncio ORM for python, built with relations in mind
Familiar asyncio ORM for python, built with relations in mind - tortoise/tortoise-orm
Pydantic Pint - это библиотека для Python, объединяющая возможности валидации данных из Pydantic с библиотекой для работы с физическими величинами и единицами измерения.
Если ваш проект связан с инженерией, научными вычислениями, геоданными или физикой, вам наверняка знакома проблема: Pydantic отлично проверяет типы и структуры, а Pint берет на себя математику над размерными величинами (метры, килограммы, секунды, градусы). По умолчанию они несовместимы, и разработчикам приходится писать кастомные сериализаторы.
pydantic-pint устраняет этот разрыв с помощью чистого синтаксиса typing.Annotated.PydanticPintQuantity("unit").km), а на вход передали строку "12 meters", библиотека проверит размерность и сама пересчитает значение в 0.012 kilometer. Ошибочные размерности (например, попытка передать секунды вместо метров) приведут к ошибке валидации.model_dump() и model_dump_json()).pydantic.BaseModel.from typing import Annotated
from pydantic import BaseModel
from pydantic_pint import PydanticPintQuantity
from pint import Quantity
class Coordinates(BaseModel):
latitude: Annotated[Quantity, PydanticPintQuantity("deg")]
longitude: Annotated[Quantity, PydanticPintQuantity("deg")]
# Поле ожидает километры:
altitude: Annotated[Quantity, PydanticPintQuantity("km")]
# Передаем высоту в метрах — библиотека сконвертирует её сама:
coord = Coordinates(
latitude="39.905705 deg",
longitude="-75.166519 deg",
altitude="12 meters",
)
print(coord.altitude)
# -> <Quantity(0.012, 'kilometer')>
# Сериализация в JSON
print(coord.model_dump_json())
# -> {"latitude":"39.905705 degree","longitude":"-75.166519 degree","altitude":"0.012 kilometer"}
pip install pydantic-pint
#Python #Pydantic #Pint #DataValidation #DataScience #Physics #Engineering #Backend #OpenSource #DevTools
https://github.com/tylerh111/pydantic-pint
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - tylerh111/pydantic-pint: Pydantic Pint Quantities
Pydantic Pint Quantities. Contribute to tylerh111/pydantic-pint development by creating an account on GitHub.
👍4 2🔥1
Vcrpy - это библиотека для Python (порт популярного инструмента VCR из экосистемы Ruby), которая упрощает и многократно ускоряет тестирование кода, завязанного на сетевые HTTP-запросы.
Вместо того чтобы вручную мокать каждый эндпоинт сторонних API, VCR.py использует концепцию «кассет» (cassettes): при первом запуске теста библиотека перехватывает реальные HTTP-запросы и сериализует их вместе с ответами в локальный YAML-файл. При последующих прогонах реальные сетевые вызовы больше не происходят — VCR.py мгновенно воспроизводит сохраненные ответы из файла.
С использованием контекстного менеджера:
import urllib.request
import vcr
# Запросы внутри блока запишутся в файл cassettes/example.yaml
with vcr.use_cassette('cassettes/example.yaml'):
response = urllib.request.urlopen('http://httpbin.org/get').read()
assert b'origin' in response
В виде декоратора:
import vcr
import requests
@vcr.use_cassette('cassettes/users.yaml')
def test_users_api():
response = requests.get('https://api.example.com/users')
assert response.status_code == 200
assert len(response.json()) > 0
Совет для Pytest: Для максимально удобной работы в связке с pytest существует официальный плагин pytest-recording, позволяющий использовать маркер
@pytest.mark.vcr и флаги --record-mode .
pip install vcrpy
#Python #Testing #QA #Pytest #VCR #VCRpy #Mocking #API #DevTools #OpenSource #Backend
https://github.com/kevin1024/vcrpy
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - kevin1024/vcrpy: Automatically mock your HTTP interactions to simplify and speed up testing
Automatically mock your HTTP interactions to simplify and speed up testing - kevin1024/vcrpy
Mitti - это экспериментальный Python ASGI-фреймворк, объединяющий конкурентное и параллельное выполнение кода под капотом привычной синхронной модели программирования.
Вместо того чтобы заставлять разработчика разбираться с «цветными функциями»,
async/await и нюансами asyncio, Mitti оставляет код приложения обычным синхронным Python. Фреймворк сам берет на себя управление рантаймом: он распределяет вызовы конкурентно на стандартных сборках с GIL и запускает их в настоящем многопоточном параллелизме на free-threaded сборках Python (no-GIL / PEP 703).def), а среда Mitti берет на себя планирование и эффективное исполнение потоков.from mitti import App
app = App()
# Обычная синхронная функция, готовая к параллельному исполнению
@app.get("/users/{user_id}")
def get_user(user_id: int):
return users.get(user_id)
#Python #ASGI #Mitti #NoGIL #FreeThreaded #Concurrency #Multithreading #Backend #WebDevelopment #OpenSource
https://github.com/grandimam/mitti
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - grandimam/mitti: Next-gen ASGI Framework
Next-gen ASGI Framework. Contribute to grandimam/mitti development by creating an account on GitHub.
👍2 2🔥1
Cayu - это production-ready среда выполнения (agent runtime) для создания, масштабирования и надежной эксплуатации автономных ИИ-агентов на Python.
Собрать прототип агента на базе стандартных SDK сегодня несложно, но реальные проблемы в проде начинаются на стыках инфраструктуры: падение процесса прямо во время внешнего API-вызова, утечка учетных данных, переполнение контекста LLM, необходимость паузы для аппрува человеком или потеря истории расходов при ретраях. Cayu закрывает именно эти эксплуатационные вызовы, предоставляя надежные низкоуровневые примитивы без привязки к громоздким внешним оркестраторам.
resume) после перезапуска сервиса.approvals) и ручного вмешательства. Если модели требуется подтверждение опасного действия или дополнительный ввод от пользователя, выполнение встает на чекпоинт.ToolPolicy), типизированные эффекты и изоляция учетных данных. Агенты могут выполнять задачи (например, работу с Git/GitHub CLI), не получая прямого доступа к боевым токенам хоста.cayu dashboard eject).import asyncio
from cayu import (
AgentSpec,
CayuApp,
Message,
OpenAIProvider,
RunRequest,
run_to_completion,
)
async def main() -> None:
app = CayuApp()
# Регистрация провайдера (берет ключ из OPENAI_API_KEY)
app.register_provider(OpenAIProvider(), default=True)
app.register_agent(AgentSpec(name="assistant", model="gpt-4o"))
# Надежный запуск с фиксацией событий в сессии
outcome = await run_to_completion(
app,
RunRequest(
agent_name="assistant",
messages=[Message.text("user", "Объясни концепцию durable agent execution.")],
),
)
if outcome.ok:
print(outcome.final_text)
else:
print(f"Ошибка {outcome.status}: {outcome.error}")
asyncio.run(main())
pip install cayu
# Генерация готового каркаса проекта
cayu new myagent
cd myagent
# Запуск проверок и тестов
cayu check --fail-on warning --json
pytest
#Python #Cayu #AIAgents #LLM #AgenticAI #DevTools #MachineLearning #OpenSource #Backend #SoftwareEngineering
https://github.com/cayu-dev/cayu
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - cayu-dev/cayu: Cayu is an open-source Python framework for building and running domain-specific long-horizon agents, with…
Cayu is an open-source Python framework for building and running domain-specific long-horizon agents, with a durable runtime built in. - cayu-dev/cayu
👍2⚡1
Fastlogging-rs - это сверхбыстрый и универсальный кросс-язычный фреймворк для логирования, написанный на Rust и предоставляющий унифицированный API для Python, Rust, C/C++, Go, Java и C#.
Главная проблема традиционных логгеров (например, стандартного модуля
logging в Python) — синхронный ввод-вывод, способный сильно просаживать производительность под высокой нагрузкой.fastlogging-rs решает это архитектурно: вызовы логов абсолютно неблокирующие (non-blocking) и потокобезопасные, а сброс данных во внешние приемники происходит в фоновых потоках. В бенчмарках на запись в файл с ротацией он оказывается быстрее стандартного Python-логгера более чем в 100 раз (0.17 с против 35.2 с).multiprocessing / child processes) в основной процесс с поддержкой глубоких уровней вложенности.JSON, XML, YAML).from fastlogging import Logging
# Инициализация и логирование
log = Logging()
log.info("Привет из fastlogging!")
# Корректное завершение фоновых потоков
log.shutdown(False)
#Fastlogging #Rust #Python #Logging #Performance #Backend #DevTools #Cpp #Golang #Java #OpenSource
https://github.com/brmmm3/fastlogging-rs
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - brmmm3/fastlogging-rs: High-performance async Rust logging library with non-blocking writers and bindings for C, C++,…
High-performance async Rust logging library with non-blocking writers and bindings for C, C++, C#, Go, Java and Python - brmmm3/fastlogging-rs
👍3⚡1