PYTHONOMANIA
273 subscribers
195 photos
3 videos
1 file
616 links
Откройте для себя мир Python в PYTHONOMANIA!

Идеально подходит как для начинающих, так и для опытных разработчиков. Присоединяйтесь к нам, чтобы достичь совершенства в Python!

Сайт: https://pythonomania.github.io/
Download Telegram
📱Honker.

Honker — это SQLite-расширение, которое приносит в SQLite NOTIFY/LISTEN- логику в стиле Postgres.
Без брокера. Без polling. Без лишней инфраструктуры.

❓Что умеет:

🔘durable pub/sub
🔘очередь задач
🔘event streams
🔘retry, delayed jobs, priority
🔘scheduler по cron
🔘атомарные enqueue вместе с бизнес-транзакцией

Идея простая: если у вас SQLite — то очередь и события должны жить прямо в том же .db файле.
INSERT INTO orders ... и queue.enqueue(...) могут коммититься вместе — это очень удобно и надежно.

❗️Поддерживаются Python, Node.js, Bun, Ruby, Go, Elixir, C++, .NET/C#, JVM и Kotlin.

А для пробуждения процессов используется `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
1👍222
📱Tryke.

Tryke - это современный фреймворк для тестирования в Python, который делает написание тестов более структурированным и интуитивно понятным.

Если в Python вам всегда не хватало красивого BDD-стиля (как в Jest или RSpec) с их вложенными блоками describe, то Tryke создан именно для вас!

🔹Главные фишки:

🔘Иерархия тестов: Логически группируйте сценарии с помощью контекстных менеджеров with t.describe("имя_группы"):.

🔘Умные фикстуры: Удобное внедрение зависимостей через аннотации типов (Annotated[..., t.Depends(...)]). Поддерживается кеширование на уровне модуля или отдельного блока describe (per="scope").

🔘Читаемые проверки (Assertions): Синтаксис t.expect(actual, "описание").to_equal(expected) делает отчеты об ошибках в консоли максимально понятными.

🔘Асинхронность из коробки: Нативная поддержка тестов через async def.

🔘Продвинутый CLI-раннер: Встроенный режим постоянной работы (tryke test --watch) для запуска тестов на лету при сохранении кода, а также запуск только для измененных файлов (--changed).

💡Переходите с pytest?

Авторы подготовили не только классическую шпаргалку по миграции, но и специальный готовый 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
1🔥33👍1
📱Kubex.

Kubex — это
современный и невероятно быстрый клиент Kubernetes для Python, вдохновленный rust-библиотекой kube.rs.

Если вы писали K8s-операторы на Python, то наверняка сталкивались с медлительностью и прожорливостью стандартного kubernetes-asyncio.

Kubex меняет правила игры, предоставляя инструмент по-настоящему энтерпрайз-уровня!

🔹Главные фишки библиотеки:

🔘Космическая производительность: Работает до 40 раз быстрее (например, при получении списка из 500 подов), потребляет на 47% меньше памяти и делает в 5 раз меньше аллокаций. Давление на Garbage Collector минимально!

🔘Pydantic v2 под капотом: Забудьте про dict[str, Any]. Все ресурсы K8s, поля spec и status строго типизированы. IDE сама подскажет нужные параметры, а mypy защитит от ошибок еще до запуска.

🔘Мультиверсионность: Модели генерируются из OpenAPI (поддерживаются K8s с 1.32 по 1.37). Вы можете использовать модели разных версий одновременно, если управляете зоопарком кластеров.

🔘Свобода от фреймворков: Работает с asyncio (aiohttp/httpx) и trio (httpx). Никакого вендор-лока.

🔘Интерактивность: Экспериментальная, но мощная поддержка WebSocket. Выполнение команд (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
2🔥5👍2⚡1
📱Feloxi.

Feloxi - это
мощная self-hosted платформа для мониторинга очередей задач Python, в первую очередь — Celery. Инструмент предоставляет живые дашборды, поиск по истории задач и гибкую систему алертов.

Вам не нужно устанавливать никаких дополнительных агентов или менять код приложения! Feloxi просто подключается к вашему брокеру (Redis или RabbitMQ), читает стандартные события, которые и так генерирует Celery, и бережно сохраняет их в ClickHouse.

🔹Главные возможности:

🔘Продвинутый поиск: Ищите таски по ID, названию, аргументам (args/kwargs), результатам и даже по тексту ошибок. Смотрите таймлайны, ретраи и полные трейсбеки.

🔘Health-мониторинг воркеров: Следите за загрузкой CPU, памятью, размером пула, активными задачами и пропусками heartbeat.

🔘Визуализация цепочек: Сложные воркфлоу (chains, groups, chords) автоматически отрисовываются в виде интерактивных DAG (направленных ациклических графов). Если пайплайн упадет, вы сразу увидите, на каком именно шаге это произошло.

🔘Контроль периодических задач (Celery Beat): Вы всегда будете знать расписание задач, время последнего запуска и не пропустили ли они свой "бит".

🔘Умные алерты: Доступно 10 типов условий (например, падение скорости обработки, медленные таски, оффлайн воркер, аномалии в глубине очереди). Уведомления можно отправлять в Slack, PagerDuty, на email или через Webhook.

🔘Prometheus из коробки: Метрики доступны по эндпоинту GET /metrics для легкой интеграции с вашей инфраструктурой мониторинга.

❓Как подключить (нужно всего 3 шага):

Добавьте в celeryconfig.py:
worker_send_task_events = True
task_send_sent_event = True
task_track_started = True


Перезапустите воркеры с флагом --events.

Зайдите в UI Feloxi, нажмите Add Broker и введите URL вашего Redis/RabbitMQ. Всё!

🚀Быстрый старт (через Docker Compose):

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
1👍42🔥1
📱Postman2pytest.

Postman2pytest. — это
инструмент, который позволяет конвертировать JSON-файлы из Postman (коллекции v2.1) в готовые для запуска тесты pytest. И всё это одной командой!

Часто коллекции Postman служат отличной документацией для вашего API. Утилита postman2pytest превращает эту "документацию" в исполняемые регрессионные тесты на Python, которые легко встраиваются в CI/CD. Больше не нужно переписывать тесты вручную — вы избавляетесь от рутины и рассинхрона между доками и кодом.

🔹Главные фичи:

🔘Поддерживает GET, POST, PUT, DELETE, PATCH, HEAD и OPTIONS.

🔘Распознает заголовки (включая отключенные) и JSON-тела запросов (raw JSON body).

🔘Умеет вытаскивать ожидаемый HTTP-статус из скриптов Postman вида pm.response.to.have.status(200).

🔘Разворачивает вложенные папки Postman в плоский список тестов с понятными названиями (например, def test_users_post_create_user()).

🔘Позволяет сгенерировать тесты только для одной конкретной папки из коллекции (--filter-folder).

🔘Переменные вроде {{base_url}} автоматически преобразуются в f-строки и подхватываются через переменные окружения (например, BASE_URL).

🔧Установка:

pip install postman2pytest

🔻Как использовать:
postman2pytest \
--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
1⚡2👍2🔥2
📱Lifeguard.

Lifeguard —
это быстрый инструмент статического анализа, созданный для безопасного внедрения «ленивых» импортов (Lazy Imports) в Python-проектах.

❓Зачем нужны ленивые импорты (PEP 810).

Обычно в Python каждый import выполняется моментально при чтении файла. Ленивые импорты откладывают реальную загрузку модуля до момента первого обращения к импортированному имени. Это радикально снижает потребление памяти и ускоряет запуск приложений, особенно в огромных кодовых базах с глубоким деревом зависимостей.

🔻В чем подвох?

Перевести старый код на ленивые импорты вслепую не выйдет — часть логики обязательно сломается. Например, проблемы возникнут, если:

🔘У модуля есть сайд-эффекты при загрузке (он меняет глобальное состояние).

🔘Используется паттерн «Реестр» (Registry), где модуль регистрирует себя в глобальном словаре в момент импорта.

🔘Код манипулирует sys.modules, ожидая, что предыдущие импорты уже выполнились.

🔘Используются сложные метаклассы или __init_subclass__.

Найти все такие места в большом проекте вручную практически невозможно.

🔧Как помогает Lifeguard:

Инструмент (написанный на Rust) параллельно анализирует AST-дерево ваших исходников и выявляет все несовместимые паттерны. Lifeguard максимально консервативен: если он не может программно доказать, что модуль безопасен для ленивого импорта, он помечает его как небезопасный. Стабильность продакшена здесь ставится выше микрооптимизаций.

🔹 Два главных сценария использования:

🔘Как классический линтер: Запуск в подробном режиме (verbose) покажет конкретные строки в файлах, которые мешают отложенной загрузке. Вы можете постепенно исправлять их в коде.

🔘Как генератор конфига: Lifeguard выдает JSON-файл с двумя списками: 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
1🔥4⚡3
📱Dj-lite-tenant.

Dj-lite-tenant -
это экспериментальная библиотека для Django, которая выводит изоляцию данных в мультиарендных (multi-tenant) приложениях на абсолютный максимум. Она автоматически создает отдельную базу данных SQLite для каждого пользователя.
Если вы строите легковесный SaaS или пет-проект, где пользователи не должны пересекаться данными ни при каких обстоятельствах, этот инструмент предлагает элегантное решение без развертывания тяжелых серверов БД.

🔹Основные возможности:

🔘Абсолютная изоляция: Каждый зарегистрированный пользователь получает свой собственный изолированный файл .sqlite3 для указанных в настройках приложений.

🔘Кросс-базовые связи: Связи типа ForeignKey между БД пользователя и общей базой данных (например, таблицей самого User) работают прозрачно благодаря механизму ATTACH DATABASE в SQLite. Django ORM сама генерирует валидные SQL-запросы.

🔘Автоматический роутинг: Специальный Middleware сам определяет текущего пользователя в запросе и направляет все запросы ORM в нужный файл. Есть полная поддержка синхронного и асинхронного выполнения.

🔘Мгновенное создание БД (Шаблоны): Чтобы не гонять миграции при регистрации каждого нового юзера, можно включить опцию USE_DATABASE_TEMPLATE. Первая чистая БД выполнит миграции, сохранится как шаблон, а для новых пользователей файлы будут просто клонироваться за миллисекунды.

🔘Фоновые задачи: Для работы вне контекста HTTP-запроса (например, в Celery-тасках) есть удобный контекстный менеджер: with tenant_db(user):.

🔘Интеграция с админкой: Суперпользователи могут переключаться между базами данных пользователей прямо через стандартную панель Django Admin.

🚀Быстрый старт:

Установка:
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.

⚠️Важное примечание: Автор честно предупреждает, что проект пока очень экспериментальный. В текущем виде он не предназначен для production-сред с высокой нагрузкой, но концепт изоляции на уровне SQLite-файлов выглядит чертовски интересно!

#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
3👍2⚡1
📱Spoof.

Spoof —
это минималистичный и гибкий HTTP-сервер для Python, разработанный специально для изоляции и тестирования сетевого взаимодействия без боли.

Если вам когда-нибудь требовалось переписать клиентскую библиотеку, проверить её поведение в боевых условиях или полноценно замокать сторонний API на реальных сетевых сокетах (а не просто подменить методы в коде), Spoof станет идеальным решением.

🔹Главные фичи инструмента:

🔘Батарейки в комплекте: Написан на базе стандартного модуля http.server, не имеет внешних зависимостей и работает на Python 3.10–3.14.

🔘Динамическая очередь ответов: В отличие от классических серверов, где роуты прописываются заранее, Spoof принимает любые запросы. Он выдает ответы из настроенной FIFO-очереди (.responses) или возвращает .defaultResponse. По умолчанию, если очередь пуста, он честно отдаст 503 Service Unavailable.

🔘Живой лог запросов: Каждый чих со стороны клиента записывается в историю .requests. После тестов можно легко проверить, какие методы, заголовки, query-параметры или JSON-тела прилетали на сервер.

🔘Постквантовая криптография: Из коробки поддерживает SSL/TLS с самоподписанными сертификатами, а если в системе установлен OpenSSL 3.5+, вы можете тестировать соединения с использованием постквантовых алгоритмов (PQC)!

🔘Проксирование и IPv6: Поддерживает прокси-туннелирование через обработку 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
1🔥4👍3⚡2
📱Bocpy.

Bocpy —
это библиотека для Python, реализующая принципиально новую парадигму параллельного программирования — поведенческо-ориентированную конкурентность (Behavior-Oriented Concurrency, BOC).

В параллельном коде на Python часто возникают состояния гонки (data races), а с появлением сборки без GIL (free-threaded Python) защищать данные становится еще сложнее. bocpy решает эту проблему фундаментально: данные разделяются так, что каждый поток выполнения («поведение») получает уникальное временное владение объектом. Больше не нужно вручную управлять блокировками (lock.acquire()), а риск дедлоков исключен на уровне архитектуры.

🔹Главные фичи и преимущества:

🔘Фокус на потоке данных: Задача разработчика смещается с решения проблем параллельного доступа к простой организации логики. Функции оборачиваются в декораторы @when и со стороны выглядят как обычный линейный код.

🔘Настоящая многоядерность: Библиотека написана на C и использует механизм суб-интерпретаторов Python. Начиная с Python 3.12, где у каждого суб-интерпретатора свой собственный GIL (PEP 684), bocpy обеспечивает честный параллелизм и показывает практически линейное масштабирование (до 7.5× ускорения на 8 воркерах).

🔘Безопасность по умолчанию: Под капотом движок на C реализует двухфазное запирание (2PL) и MCS-очереди. Потоки изолированы друг от друга, поэтому данные обрабатываются так, будто программа работает в один поток.

🔘Поддержка тяжелых объектов (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() # Ждем завершения всех задач


📈Поддержка версий Python:

🔘Python 3.10 / 3.11: Полная совместимость, но из-за общего глобального GIL задачи будут выполняться последовательно. Подходит для отладки и портативности.

🔘Python 3.12+: Идеальный вариант. Задачи распределяются по суб-интерпретаторам со своими GIL и работают на полную мощность процессора.

🔘Python 3.13t+ (Free-threaded): Полная нативная поддержка сборки без GIL.

🔧Установка:

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
3👍2🔥22
📱Python UUID Utils.

Python UUID Utils —
это сверхбыстрая замена стандартного модуля uuid в Python, написанная на Rust. Инструмент разработан как полноценная альтернатива (drop-in replacement): вы можете кратно ускорить генерацию уникальных идентификаторов в вашем приложении без кардинального переписывания кодовой базы.

🔹Доступные версии UUID:

🔘uuid1 / uuid6 — на основе временной метки и монотонного счетчика.

🔘uuid3 / uuid5 — на основе хэшей MD5 и SHA-1 от переданных данных.

🔘uuid4 — классический UUID на базе случайных данных.

🔘uuid7 — современный стандарт на основе Unix-времени, идеально подходящий для первичных ключей в базах данных благодаря сортировке по времени создания.

🔘uuid8 — кастомные UUID на основе пользовательских данных.

🚀Потрясающая производительность (Бенчмарки):

Согласно официальным тестам на Python 3.14, ускорение получается просто космическим:

🔘uuid4(): Стандартная библиотека — 1189 нс | uuid_utils — всего 61 нс (быстрее почти в 20 раз!).

🔘uuid7(): Стандартная библиотека — 1336 нс | uuid_utils — 84 нс (быстрее в 15 раз!).

🔘Парсинг идентификатора из строк (hex) или байтов работает быстрее в 4–5 раз.

🔧Совместимость с Django и другими фреймворками:

Некоторые крупные фреймворки строго требуют, чтобы объекты 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
3⚡2👍22
📱Fstache.

Fstache -
это быстрый движок шаблонизации Mustache для Python 3.12+, созданный без единой сторонней зависимости (dependency-free).

Инструмент разработан специально для серверной веб-разработки в стиле HTML-over-the-wire (в связке с HTMX, Alpine.js и Tailwind CSS). Когда сервер рендерит готовую HTML-разметку фрагментами или целиком, скорость шаблонизатора становится критически важной — особенно на бюджетных VPS. Fstache решает эту задачу за счет глубокой оптимизации и предварительной компиляции компонентов.

❓Почему Fstache.

🔘Высокая скорость: По результатам бенчмарков рендерит страницы в 3.1–3.5 раза быстрее, чем популярные аналоги (Chevron, mstache, Pystache).

🔘Предзагрузка и инлайнинг: Статические фрагменты (partials) загружаются и встраиваются в память заранее, полностью убирая накладные расходы при вызове во время обработки запроса.

🔘Поддержка потоковой отдачи (Streaming): Генерация возвращает чанки (iter_chunks()), что позволяет передавать готовый HTML в браузер частями через StreamingResponse в Starlette, FastAPI или Flask.

🔘Удобная работа с данными: В качестве контекста можно передавать обычные словари Python, объекты, датаклассы, списки и функции (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
1👍2🔥22
📱Envgap.

Envgap
- это диагностическая консольная утилита для Python-проектов, которая находит расхождения и рассинхрон между файлами .env, .env.example, переменными окружения в shell и вызовами в коде (os.environ, os.getenv или Pydantic BaseSettings).

Утилита не загружает ваши конфигурации в рантайм приложения. Её главная задача — показать, почему переменная окружения работает на вашей локальной машине, но внезапно вызывает сбой в CI/CD, внутри Docker-контейнера или на ПК другого разработчика.

❓Зачем нужен envgap.

🔘Поиск опечаток: Легко находит несоответствия в именах (например, DB_URL вместо DATABASE_URL).

🔘Контроль документации: Подсвечивает устаревшие или неполные файлы .env.example, в которых забыли указать новые переменные.

🔘Детектор секретов-заглушек: Находит оставленные в конфигах тестовые значения вроде changeme, todo или your-key-here.

🔘Поддержка Pydantic и FastAPI: Распознает поля BaseSettings, алиасы, префиксы и дефолтные значения.

🔘Простая проверка для CI/CD: Позволяет внедрить легкий автоматический аудит конфигураций без подключения сложных фреймворков.

🔻Пример работы.
Если в коде приложения указано:

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
1👍3🔥32
📱Icalendar.

Icalendar
- это библиотека для Python, предназначенная для парсинга, генерации и редактирования файлов формата iCalendar (.ics), полностью совместимая со стандартом RFC 5545.

С ее помощью можно создавать, анализировать и модифицировать события, встречи и задачи в коде, а затем экспортировать их для работы с любыми календарными сервисами (Google Calendar, Apple Calendar, Outlook и др.).

🔹Ключевые возможности:

🔘Стандарт RFC 5545: Полная поддержка спецификации iCalendar для создания и чтения объектов календаря.

🔘Поддержка часовых поясов: Корректно обрабатывает таймзоны с помощью 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
2👍33🔥2
📱Num2words library.

Num2words library
- это библиотека для Python и удобная консольная утилита, которая переводит числа в слова (прописью) на десятках языков мира.

Она превращает числа вроде 42 в текст вида «сорок два» или «forty-two», умеет формировать порядковые числительные и корректно форматировать денежные суммы для финансовых отчетов или документов.

🔹Ключевые возможности:

🔘Поддержка более 50 языков: Включая русский (ru), английский (en), испанский (es), французский (fr), немецкий (de), казахский (kz), украинский (uk) и многие другие, в том числе региональные диалекты.

🔘Несколько режимов конвертации (to):

cardinal (по умолчанию) — обычные количественные числительные («сорок два»).

ordinal — порядковые числительные («сорок второй»).

currency — денежные суммы с указанием валюты и разменных монет («два евро четырнадцать центов»).

year — проговаривание годов («девятнадцать восемьдесят четыре»).

🔘Работа прямо из терминала (CLI): Можно использовать в shell-скриптах и пайплайнах без необходимости писать отдельный код на Python.

🔻Примеры использования:

В коде 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


✅Отличный инструмент для генерации счетов, чеков, договоров, аудиогидов и систем синтеза речи (TTS), где требуется грамотное текстовое представление чисел.

#Python #Num2words #Localization #NLP #DevTools #OpenSource #CLI #Backend #Программирование

📱Ссылка на репозиторий:
https://github.com/savoirfairelinux/num2words
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥31
📱Tortoise ORM.

Tortoise ORM
- это простая и производительная асинхронная ORM (Object-Relational Mapper) для Python 3.10+, созданная под сильным вдохновением от Django ORM.

Библиотека разработана специально для asyncio и сочетает привычный, выразительный синтаксис моделей Django с нативной асинхронностью, избавляя от бойлерплейта и необходимости писать «сырые» SQL-запросы в асинхронных микросервисах.

🔹Ключевые возможности:

🔘Нативная асинхронность: Спроектирована с нуля для работы с современным асинхронным стеком Python (async/await) без блокировки event loop.

🔘Django-подобный API: Привычное объявление моделей через классы Model, строгая типизация полей (fields), поддержка связей ForeignKeyField / ManyToManyField и удобный QuerySet (filter, annotate, prefetch_related).

🔘Широкая поддержка баз данных:

✔️PostgreSQL (asyncpg, psycopg)

✔️MySQL / MariaDB (asyncmy, aiomysql)

✔️SQLite (aiosqlite)

✔️MS SQL & Oracle (asyncodbc)

🔘Встроенные миграции: Поставляется с готовым CLI-инструментом (tortoise makemigrations, tortoise migrate, tortoise sqlmigrate) для автоматического отслеживания изменений схем и генерации миграций.

🔘Бесшовная интеграция: Идеально подходит для связки с FastAPI, Sanic, Litestar, Quart и другими современными веб-фреймворками.

💻Быстрый старт:

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]"


✅Проект распространяется под открытой лицензией Apache 2.0.

#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
4🔥11
📱Pydantic Pint.

Pydantic Pint
- это библиотека для Python, объединяющая возможности валидации данных из Pydantic с библиотекой для работы с физическими величинами и единицами измерения.

Если ваш проект связан с инженерией, научными вычислениями, геоданными или физикой, вам наверняка знакома проблема: Pydantic отлично проверяет типы и структуры, а Pint берет на себя математику над размерными величинами (метры, килограммы, секунды, градусы). По умолчанию они несовместимы, и разработчикам приходится писать кастомные сериализаторы. pydantic-pint устраняет этот разрыв с помощью чистого синтаксиса typing.Annotated.

🔹Ключевые возможности:

🔘Строгая типизация размерностей: Позволяет задать целевую единицу измерения для поля модели через аннотацию PydanticPintQuantity("unit").

🔘Автоматическая конвертация: Если поле ожидает километры (km), а на вход передали строку "12 meters", библиотека проверит размерность и сама пересчитает значение в 0.012 kilometer. Ошибочные размерности (например, попытка передать секунды вместо метров) приведут к ошибке валидации.

🔘Полная поддержка сериализации: Корректно выгружается в структуры Python и JSON через стандартные методы Pydantic V2 (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
👍42🔥1
📱Vcrpy.

Vcrpy
- это библиотека для Python (порт популярного инструмента VCR из экосистемы Ruby), которая упрощает и многократно ускоряет тестирование кода, завязанного на сетевые HTTP-запросы.

Вместо того чтобы вручную мокать каждый эндпоинт сторонних API, VCR.py использует концепцию «кассет» (cassettes): при первом запуске теста библиотека перехватывает реальные HTTP-запросы и сериализует их вместе с ответами в локальный YAML-файл. При последующих прогонах реальные сетевые вызовы больше не происходят — VCR.py мгновенно воспроизводит сохраненные ответы из файла.

🔹Главные преимущества:

🔘Максимальная скорость тестов: Запросы отдаются моментально из локального файла, убирая задержки на сетевой round-trip и ответ сервера.

🔘Работа в офлайне: Тестовый сьют можно без проблем прогонять в самолете, поезде или на изолированных CI/CD раннерах без доступа во внешнюю сеть.

🔘100% детерминированность: Тесты перестают быть нестабильными (flaky) из-за проблем с интернетом, превышения лимитов API (rate limits) или временного падения сторонних сервисов.

🔘Простое обновление: Если логика удаленного API изменилась, не нужно переписывать моки вручную — достаточно удалить файл кассеты, и библиотека автоматически запишет свежие данные при следующем прогоне.

🔻Пример использования:

С использованием контекстного менеджера:
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


✅Проект распространяется под открытой лицензией MIT.

#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
4👍2🔥1
📱Mitti.

Mitti
- это экспериментальный Python ASGI-фреймворк, объединяющий конкурентное и параллельное выполнение кода под капотом привычной синхронной модели программирования.

Вместо того чтобы заставлять разработчика разбираться с «цветными функциями», async/await и нюансами asyncio, Mitti оставляет код приложения обычным синхронным Python. Фреймворк сам берет на себя управление рантаймом: он распределяет вызовы конкурентно на стандартных сборках с GIL и запускает их в настоящем многопоточном параллелизме на free-threaded сборках Python (no-GIL / PEP 703).

🔹Ключевые особенности:

🔘Синхронный код без бойлерплейта: Вы пишете стандартные синхронные функции (def), а среда Mitti берет на себя планирование и эффективное исполнение потоков.

🔘Готовность к Python 3.13+ (Free-threaded): Спроектирован с прицелом на отказ от GIL. На no-GIL интерпретаторах код масштабируется по процессорным ядрам без межпроцессного оверхеда, а на стандартном Python работает через пул потоков в режиме обратной совместимости.

🔘Стандарт ASGI 3: Приложение легко разворачивается под современными ASGI-серверами (например, Uvicorn).

🔘Современный стек: Включает роутинг, типизированные path- и query-параметры, внедрение зависимостей (Dependency Injection), базовую валидацию, middleware, обработку событий жизненного цикла (lifespan) и сериализацию в JSON.

💻Пример кода:

from mitti import App

app = App()

# Обычная синхронная функция, готовая к параллельному исполнению
@app.get("/users/{user_id}")
def get_user(user_id: int):
return users.get(user_id)


❗️Статус проекта: Ранняя альфа (Early alpha). Для работы требуется Python 3.13+, в идеале — в сборке без GIL (free-threaded Python).

#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
👍22🔥1
📱Cayu.

Cayu
- это production-ready среда выполнения (agent runtime) для создания, масштабирования и надежной эксплуатации автономных ИИ-агентов на Python.

Собрать прототип агента на базе стандартных SDK сегодня несложно, но реальные проблемы в проде начинаются на стыках инфраструктуры: падение процесса прямо во время внешнего API-вызова, утечка учетных данных, переполнение контекста LLM, необходимость паузы для аппрува человеком или потеря истории расходов при ретраях. Cayu закрывает именно эти эксплуатационные вызовы, предоставляя надежные низкоуровневые примитивы без привязки к громоздким внешним оркестраторам.

🔹Ключевые возможности и примитивы рантайма:

🔘Durable Execution и контрольные точки: Сессии, события и транскрипты сохраняются в базу (SQLite локально или PostgreSQL в проде). Любой пайплайн агента можно поставить на паузу, безопасно форкнуть, прервать или возобновить (resume) после перезапуска сервиса.

🔘Human-in-the-Loop (HITL): Нативные механизмы согласований (approvals) и ручного вмешательства. Если модели требуется подтверждение опасного действия или дополнительный ввод от пользователя, выполнение встает на чекпоинт.

🔘Безопасность и виртуальный egress: Строгие политики вызова инструментов (ToolPolicy), типизированные эффекты и изоляция учетных данных. Агенты могут выполнять задачи (например, работу с Git/GitHub CLI), не получая прямого доступа к боевым токенам хоста.

🔘Изоляция окружений: Поддержка локальных воркспейсов, Docker-контейнеров, песочниц E2B и легковесных микро-ВМ (Microsandbox, AWS Lambda MicroVM).

🔘Контроль контекста и расходов: Автоматический подсчет токенов, алгоритмическое сжатие контекста (compaction), защита от переполнения окна модели и пошаговый учет стоимости каждого вызова.

🔘Встроенный Control Plane: Включает готовый сервер на FastAPI и веб-дашборд на React/TypeScript для мониторинга сессий, трейсов, артефактов и задач. Исходники дашборда можно в один клик извлечь для кастомизации (cayu dashboard eject).

🔘Мультипровайдерность: Поддержка OpenAI, Anthropic, AWS Bedrock, Google Cloud Vertex AI, OpenRouter, а также локальный режим авторизации через личную подписку ChatGPT.

💻Пример запуска агента на Python:
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())


🚀Быстрый старт через CLI:
pip install cayu

# Генерация готового каркаса проекта
cayu new myagent
cd myagent

# Запуск проверок и тестов
cayu check --fail-on warning --json
pytest


✅Проект распространяется под открытой лицензией Apache 2.0.

#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
👍2⚡1
📱Fastlogging-rs.

Fastlogging-rs
- это сверхбыстрый и универсальный кросс-язычный фреймворк для логирования, написанный на Rust и предоставляющий унифицированный API для Python, Rust, C/C++, Go, Java и C#.

Главная проблема традиционных логгеров (например, стандартного модуля logging в Python) — синхронный ввод-вывод, способный сильно просаживать производительность под высокой нагрузкой.

fastlogging-rs решает это архитектурно: вызовы логов абсолютно неблокирующие (non-blocking) и потокобезопасные, а сброс данных во внешние приемники происходит в фоновых потоках. В бенчмарках на запись в файл с ротацией он оказывается быстрее стандартного Python-логгера более чем в 100 раз (0.17 с против 35.2 с).

🔹Ключевые возможности:

🔘Экстремальная производительность: Запись сообщений не тормозит основной поток приложения, пока не переполнится внутренняя очередь.

🔘Полноценная кросс-язычность: Единый согласованный API для Rust, Python (>=3.10 через PyO3), C / C++ (FFI/CXX), Go, Java (через FFM и JNI) и C#.

🔘Автоматический сбор из подпроцессов: Автоматически перенаправляет логи из дочерних процессов (multiprocessing / child processes) в основной процесс с поддержкой глубоких уровней вложенности.

🔘Богатый выбор приемников (Sinks / Writers):

✔️Консоль с поддержкой цветов;

✔️Файлы с автоматической ротацией и сжатием;

✔️TCP-клиент с аутентификацией и AES-шифрованием сетевых логов;

✔️Системные журналы: Syslog (Linux) и EventLog (Windows);

✔️Пользовательские функции обратного вызова (Callbacks).

🔘Гибкая конфигурация: Настраивается как программно через API, так и декларативно через файлы конфигурации (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
👍3⚡1