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

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

Сайт: https://pythonomania.github.io/
Download Telegram
📱Pytest-leak-finder.

Pytest-leak-finder
- это плагин для pytest, который помогает быстро найти конкретный тест, загрязняющий общее состояние и ломающий последующие тесты в сьюте.

Знакома ситуация, когда тест стабильно падает при общем прогоне набора, но проходит без единой ошибки при изолированном запуске (pytest -v --lf)? Причина почти всегда в том, что один из предыдущих тестов оставил за собой «мусор» (неочищенный стейт, глобальную переменную или незакрытый ресурс). Но как найти виновника, если тестов сотни?

❓Как это работает.

Плагин автоматизирует поиск с помощью бинарного поиска (бисекции) — по аналогии с алгоритмом git bisect:

🔘Фиксация цели: При первом запуске с флагом --leak-finder упавший тест автоматически помечается как target.

🔘Деление пополам: На следующем шаге запускается первая половина тестов, предшествовавших цели, плюс сам целевой тест.

🔘Локализация:

✔️Если таргет снова упал — виновник в этой половине, диапазон поиска сужается еще вдвое.

✔️Если таргет прошел успешно — эта половина чистая, и плагин автоматически переключается на вторую часть сьюта.

🔘Результат: Итерации повторяются до тех пор, пока утилита не назовет точный тест, создающий утечку состояния.

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

Запуск поиска:

pytest -v --leak-finder demo/test_demo.py


После нескольких быстрых шагов бисекции плагин выдаст точный вердикт:

======================= Leak finder =======================
We found a leak!
Leak found in: tests/test_demo.py::test3


✅Инструмент экономит массу времени при отладке нестабильных (flaky) тестов и распутывании скрытых зависимостей в больших тест-паках.

#Python #Pytest #Testing #QA #Automation #Debugging #DevTools #OpenSource

📱Ссылка на репозиторий:
https://github.com/mgaitan/pytest-leak-finder
Please open Telegram to view this post
VIEW IN TELEGRAM
1⚡2🔥21
📱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
📱Pyrig.

Pyrig
- это пакет и CLI-инструмент, который стандартизирует и автоматизирует создание, настройку, разработку и поддержку Python-проектов под ключ.

В отличие от простых генераторов шаблонов (cookiecutter, copier, pyscaffold), pyrig не просто создает структуру папок, но и берет на себя управление конфигурацией, генерацию CLI, тестовую инфраструктуру и настройку CI/CD.

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

🔘Генерация проекта из коробки: Команда pyrig init разворачивает проект со стандартизированной структурой, полностью настроенными линтерами, форматтерами, тайп-чекерами, фреймворками для тестирования и Git-хуками.

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

🔘Автоматический CLI: Сразу создает рабочий интерфейс командной строки для вашего проекта. Добавлять новые команды можно в один клик: pyrig mk cmd <name>.

🔘Зеркальная генерация тестов: pyrig sync автоматически создает заготовки тестов для всех исходных модулей и актуализирует их по мере развития кодовой базы.

🔘CI/CD и защита репозитория: Генерирует пайплайны GitHub Actions для автоматического тестирования и релизов, а также настраивает правила защиты веток и репозитория.

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

Для работы требуются Python 3.12+, Git и пакетный менеджер uv:

# 1. Создаем проект
uv init my-project --python 3.12
cd my-project

# 2. Добавляем pyrig в dev-зависимости
uv add pyrig --dev

# 3. Инициализируем окружение
uv run pyrig init


После инициализации готовый CLI вашего проекта можно проверить командой my-project --help.

#Python #Pyrig #uv #DevTools #Automation #CICD #Testing #GitHubActions #OpenSource #Scaffolding

📱Ссылка на репозиторий:
https://github.com/Winipedia/pyrig
Please open Telegram to view this post
VIEW IN TELEGRAM
3⚡2🔥21
📱CogDB.

CogDB
- это встраиваемая (embedded) персистентная графовая база данных для Python, работающая прямо внутри процесса вашего приложения без необходимости поднимать отдельный сервер.

Вся база хранится локально на диске, не требует сложной инфраструктуры и легко запускается как в обычных бэкенд-скриптах, так и в интерактивных блокнотах Jupyter или Google Colab.

🔹Главные особенности:

🔘Модель триплстора (Triple Store): Данные моделируются в виде понятных троек «Узел → Связь → Узел» (alice → follows → bob), что дает выразительность графа при простоте key-value хранилища.

🔘Нативный язык запросов Torque: Забудьте о громоздких строках на Cypher или SPARQL. Запросы пишутся через понятный чейнинг методов прямо на чистом Python: g.v("alice").out("follows").all().

🔘Векторные эмбеддинги и семантический поиск: Поддерживает загрузку векторов (GloVe, Word2Vec) и быстрый поиск ближайших соседей (k-NN) на базе SIMD-оптимизированной библиотеки SimSIMD. Можно комбинировать обход графа с фильтрацией по косинусному сходству.

🔘Интерактивная визуализация: Метод g.v().out().show() на лету генерирует интерактивный 2D-граф прямо в браузере или ячейке блокнота.

🔘Поддержка JSON и RDF: Умеет индексировать сырые JSON-документы (putj), загружать CSV-таблицы и читать RDF-дампы в формате N-Triples.

🔘Опциональный HTTP-сервер: Если локального режима мало, граф можно расшарить по сети вызовом g.serve(port=8080) и опрашивать удаленно из другого микросервиса.

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

from cog.torque import Graph

# Создаем персистентный граф
g = Graph("social")

# Добавляем связи и свойства
g.put("alice", "follows", "bob")
g.put("bob", "follows", "charlie")
g.put("bob", "status", "active")

# Графовые запросы:
# Кто подписан на тех, на кого подписана Алиса?
result = g.v("alice").out("follows").out("follows").all()
print(result)
# -> {'result': [{'id': 'charlie'}]}

# Поиск с фильтрацией по свойствам
active_users = g.v().has("status", "active").all()


📦Установка:

pip install cogdb


#Python #CogDB #GraphDatabase #NoSQL #Embeddings #DataScience #Jupyter #OpenSource #DevTools #Database

📱Ссылка на репозиторий:
https://github.com/arun1729/cog
Please open Telegram to view this post
VIEW IN TELEGRAM
3⚡2🔥21
📱OpenFlight.

OpenFlight
- это открытый проект для создания собственного гольф-монитора (launch monitor) на базе доплеровского радара OPS243-A и микрокомпьютера Raspberry Pi.

В то время как профессиональные коммерческие трекеры ударов (вроде TrackMan или FlightScope) стоят тысячи долларов, OpenFlight предлагает собрать точный измерительный комплекс своими руками с бюджетом от ~$400 (базовая конфигурация) до ~$550 (с дополнительным радаром угла вылета).

❓Что измеряет система:

🔘Скорость мяча (Ball Speed): диапазон от 15 до 200 миль/ч с точностью $\pm 0.5\%$ (радар OPS243-A, 24 ГГц).

🔘Скорость клюшки (Club Speed) и Smash Factor: оценивает движение головки клюшки непосредственно перед ударом и вычисляет коэффициент передачи энергии.

🔘Угол вылета (Launch Angle) и траектория клюшки (Club Path): замеряется дополнительным миллиметровым радаром TI IWR6843.

🔘Дистанция полета (Carry Distance): расчетная баллистическая модель полета мяча.

🔘Скорость вращения (Spin Rate): экспериментальный расчет по спектральным I/Q-данным буфера.

🛠Аппаратная часть и архитектура:

🔘Доплеровский радар (OPS243-A): непрерывно опрашивает пространство и пишет данные в кольцевой I/Q-буфер.

🔘Акустический триггер (SparkFun SEN-14262): улавливает звук соударения клюшки с мячом с аппаратной задержкой всего ~10 мкс и мгновенно фиксирует срез данных радара в момент импакта.

🔘Вычислительный узел (Raspberry Pi 5): обрабатывает радиосигналы, запускает баллистический движок и WebSocket-сервер на Flask/Python.

🔘Интерфейс (React UI): отображает данные удара на локальном 7" тачскрине или транслирует их по локальной сети на планшет или экран телевизора ([http://openflight.local:8080/display](http://openflight.local:8080/display)).

🔘Режим тренировки скорости замаха: специальный режим --swing-speed для холостых махов и тренировочных утяжелителей (speed sticks) без необходимости бить по реальному мячу.

🔘Связь с симуляторами: поддерживает передачу данных удара в популярные гольф-симуляторы (GSPro, OpenGolfSim).

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

from openflight.rolling_buffer import RollingBufferMonitor

monitor = RollingBufferMonitor()
monitor.connect()
monitor.start()

print("Готов к удару...")
shot = monitor.wait_for_shot(timeout=60)
if shot:
print(f"Скорость мяча: {shot.ball_speed_mph:.1f} mph")
print(f"Расчетная дистанция: {shot.estimated_carry_yards:.0f} yards")

monitor.stop()
monitor.disconnect()


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

#OpenFlight #Golf #RaspberryPi #DopplerRadar #Hardware #DIY #Python #OpenSource #DevTools #SportsTech

📱Ссылка на репозиторий:
https://github.com/jewbetcha/openflight
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥4👍11
📱PySuricata.

PySuricata
- это быстрый и легковесный инструмент для исследовательского анализа данных (EDA) на Python, построенный на потоковых алгоритмах.

Главная проблема большинства инструментов профилирования данных — они требуют загрузки всего датасета в оперативную память и выполняют множество тяжелых прогонов. PySuricata считывает данные всего за один проход (single pass), сохраняя фиксированный расход RAM независимо от количества строк в таблице.

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

🔘Потоковая архитектура: Данные обрабатываются чанками. Обработка 1 миллиона строк требует не больше памяти, чем 20 тысяч, что позволяет анализировать датасеты, превышающие объем RAM.

🔘Глубокая интеграция с Arrow и экосистемой: Нативно работает с pandas, polars (включая LazyFrame), файлами Parquet, Arrow IPC (.arrow, .feather) и запросами DuckDB без промежуточной материализации всего фрейма.

🔘Честная математика и вероятностные структуры: Для моментов распределений (среднее, дисперсия, асимметрия) используется потоковый алгоритм Уэлфорда/Пебая, для подсчета уникальных значений — скетчи KMV, а для частых элементов — алгоритм Мизры-Гриса. В отчете честно указываются границы погрешностей приближенных оценок.

🔘Автономный HTML-отчет в один файл: На выходе получается единый self-contained HTML-файл со встроенными SVG, стилями и скриптами, который можно пересылать по почте и открывать без подключения к интернету.

🔘Контроль качества и дрейфа данных в CI/CD:

✔️summarize() — отдает чистый версионированный JSON со метриками;

✔️compare() — рассчитывает смещение признаков между двумя выборками;

✔️pysuricata check / официальный GitHub Action — блокирует пайплайн (exit code $\ne 0$), если превышен процент пропусков или обнаружен дрейф данных.

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

import pandas as pd
from pysuricata import profile

df = pd.read_csv("large_dataset.csv")

# Анализируем данные и сохраняем автономный отчет
profile(df).save_html("report.html")


Анализ файлов напрямую (без загрузки в DataFrame):


from pysuricata import profile

# Потоковое чтение Parquet-файла без перегрузки RAM
report = profile("data/events.parquet")
report.save_html("events_report.html")


📦Установка:

pip install pysuricata
# или через uv:
uv add pysuricata


#Python #PySuricata #DataScience #EDA #Pandas #Polars #DuckDB #DataEngineering #MachineLearning #OpenSource #DevTools

📱Ссылка на репозиторий:
https://github.com/alvarodiez20/pysuricata
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥3👍21
📱Apkfile.

Apkfile
- это мощная Python-библиотека и удобный CLI-инструмент для чтения метаданных, глубокого аудита безопасности и установки Android-приложений любых форматов (.apk, .apkm, .xapk, .apks, .apkv).

Библиотека парсит AndroidManifest.xml и resources.arsc напрямую через чистый Python (на базе androguard). Чтение метаданных происходит «лениво» прямо из байтов архива без распаковки на диск, а для работы больше не требуется утилита aapt.

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

🔘Поддержка всех форматов пакетов: Читает классические .apk, сплиты и бандлы (.apkm, .xapk, .apks), а также формат .apkv (включая зашифрованные архивы).

🔘Полный срез метаданных: Извлекает название пакета, версию, поддерживаемые ABI (ARM64, x86 и т.д.), языки, плотность экранов, структуру DEX-файлов и иконки всех разрешений (adaptive/anydpi/nodpi).

🔘Аудит безопасности манифеста:

✔️Находит незащищенные экспортированные компоненты (Activities, Services, Providers без разрешений).

✔️Подсвечивает опасные разрешения (dangerous permissions) и неявные доступы (implied permissions).

✔️Проверяет сертификаты подписи (схемы v1-v4, sha256-хеши, отладочную подпись debug_signed).

✔️Diff двух версий приложения: Умеет сравнивать старый и новый APK/бандл, возвращая разницу в правах, объеме кода, DEX-составе и изменениях в сертификатах.

✔️Параллельная установка через ADB: Устанавливает APK и бандлы на все подключенные устройства одновременно, автоматически подгружает OBB-файлы расширений (/sdcard/Android/obb/), проверяет совместимость ABI и умеет сразу запускать указанную Activity.

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

В коде Python:
from apkfile import ApkFile

apk = ApkFile("app.apk")

# Базовая информация
print(apk.package_name, apk.version_name, apk.version_code)

# Безопасность и компоненты
print("Опасные разрешения:", apk.security.dangerous_permissions)
print("Незащищенный экспорт:", apk.security.unprotected_exported_components)

# Сравнение двух версий приложения
old_apk, new_apk = ApkFile("v1.apk"), ApkFile("v2.apk")
diff = old_apk.diff(new_apk)
print("Добавленные права:", diff.permissions_added)

# Установка через ADB с последующим запуском
apk.install(upgrade=True, launch=True)


Через командную строку (CLI):

# Получить полную JSON-сводку о приложении
apkfile info app.apk --full

# Сравнить две версии APK
apkfile diff old.apk new.apk

# Установить и сразу запустить на устройстве
apkfile install app.xapk --launch


📦Установка:
pip install -U apkfile
# или через uv:
uv add apkfile


#Python #Android #APK #MobileSecurity #AppSec #QA #Automation #DevTools #OpenSource #ADB

📱Ссылка на репозиторий:
https://github.com/david-lev/apkfile
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥33
📱Pentestkit.

Pentestkit
- это мультиагентный фреймворк для автоматизированного проведения тестов на проникновение (пентестов) и решения CTF-задач, построенный на базе Claude Agent SDK.

Фреймворк объединяет команду специализированных ИИ-агентов, которые под управлением оркестратора исследуют цель, находят потенциальные уязвимости, подтверждают их реальным воспроизведением (PoC), оценивают критичность по стандарту CVSS v3.1 и формируют готовый клиентский отчет.

🔹Архитектура и пайплайн работы:

🔘Orchestrator: Проводит первичную разведку и формирует детальный план тестирования в общей базе знаний.

🔘Scope Agents: Набор узкопрофильных агентов для параллельного поиска по направлениям (разведка, аутентификация, инъекции, контроль доступа, SSRF/XXE, бизнес-логика и др.).

🔘Verifier (Агент-валидатор): Ключевой шлюз верификации. Скептически проверяет каждую найденную кандидатуру и пытается её воспроизвести. Если уязвимость не подтверждается — она отклоняется, что сводит к минимуму ложные срабатывания (False Positives).

🔘CVSS Scorer & Reporter: Присваивает проверенным багам обоснованный вектор CVSS v3.1 и генерирует структурированный отчет report.md с описанием шагов воспроизведения.

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

🔘100% на бенчмарках XBOW: Успешно решил 104 из 104 изолированных CTF веб-челленджей разной сложности с автоматическим захватом флагов.

🔘Scope Guard: Жесткий контроль области тестирования — каждый исходящий сетевой пакет проходит через единую точку фильтрации для предотвращения выхода за рамки согласованного скоупа.

🔘Встроенный OAST: Поддержка out-of-band коллбеков для надежной фиксации «слепых» уязвимостей (Blind SSRF, XXE, Blind SQLi, RCE).

🔘Воспроизводимые PoC: Сохранение всех запросов и ответов (evidence/), а также полный аудит каждого шага в context.json.

🔘Гибкость моделей: Из коробки настроен на работу с моделями kimi-k3 через API Moonshot, а также поддерживает всю линейку Claude (Anthropic).

💻Быстрый запуск:

# Проверка правил области видимости (Scope Guard)
python pentest.py check --engagement engagements/example.yaml --url http://127.0.0.1:3000/api

# Запуск полного аудита с интерактивным подтверждением авторизации
python pentest.py run --engagement engagements/example.yaml

# Запуск консоли мониторинга (Fleet, Benchmarks, Traces)
python pentest.py console --port 8500

⚠️Важно: Инструмент предназначен исключительно для аудита систем и инфраструктуры, на тестирование которых получено официальное разрешение владельца.

#Pentestkit #CyberSecurity #AppSec #Pentest #InfoSec #AIAgents #Claude #Python #OpenSource #DevSecOps #CTF

📱Ссылка на репозиторий:
https://github.com/lordx64/pentestkit
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡32🔥1
📱Matchify.

Matchify
- это CLI-утилита, которая автоматически преобразует длинные цепочки if/elif/else в современные конструкции match/case (сопоставление с образцом, появившееся в Python 3.10+), сохраняя логику работы и исходное форматирование кода.

Инструмент построен на базе LibCST, благодаря чему не ломает существующие отступы, комментарии и стиль оформления кодовой базы.

🔹Что умеет трансформировать:

🔘Базовые сравнения: Простые проверки равенства (x == 1, x == 2) и идентичности (x is None).

🔘Проверки типов и атрибутов: Превращает конструкции вида isinstance(p, Point) and p.x == 5 в элегантный case Point(x=5):.

🔘Последовательности и срезы: Заменяет громоздкие проверки длины и индексов (len(x) == 2 and x[0] == 0) на распаковку case 0, _:.

🔘Вложенные структуры: Распознает сложные комбинации списков, вложенных объектов и кортежей.

🔘Безопасность по умолчанию: В стандартном режиме (--safe) утилита переписывает код только тогда, когда семантика гарантированно сохраняется. Для спорных случаев есть флаги явных допущений (--assume pure-subjects, --assume identity-equality и др.).

🔘Параллелизм и CI: Поддерживает многопоточную обработку для больших репозиториев, проверку без изменения файлов (--check) и готовые хуки для pre-commit.

🔻Пример до и после:

До:

if isinstance(node, Point) and node.x == 5:
print("x is 5")
elif isinstance(node, Point):
print("other point")


После обработки Matchify:


match node:
case Point(x=5):
print("x is 5")
case Point():
print("other point")


🚀Быстрый запуск:

Запуск на проекте без предварительной установки:

uvx matchify path/to/project/


Или установка в качестве постоянной CLI-утилиты:

uv tool install matchify
# Проверить проект без записи изменений
matchify path/to/project/ --check


❗️Обратите внимание: проект создавался при содействии ИИ-инструментов, поэтому перед коммитом сгенерированных изменений обязательно прогоняйте тесты своего проекта)\.

#Python #Matchify #PatternMatching #Refactoring #DevTools #LibCST #CleanCode #OpenSource #Programming

📱Ссылка на репозиторий:
https://github.com/15r10nk/matchify
Please open Telegram to view this post
VIEW IN TELEGRAM
4⚡1🔥1
📱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
📱Arid.

Arid
- это сверхбыстрый инструмент для поиска дублирующегося кода в Python-проектах, написанный на Rust.

Проект создан как узкоспециализированная замена анализатору дубликатов из Pylint (правило R0801 / утилита symilar). Arid не пытается быть еще одним универсальным линтером, а идеально дополняет Ruff: пока Ruff форматирует и линтит код, Arid берет на себя строгий контроль принципа DRY (Don't Repeat Yourself).

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

🔘Производительность Rust: В бенчмарках на реальных кодовых базах (Requests, Pydantic, Polaris) отрабатывает в 190–250 раз быстрее, чем анализатор Pylint.

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

🔘Baselines: Позволяет зафиксировать текущий техдолг в легаси-проектах (--write-baseline arid-baseline.json). В CI проверяются только новые дубликаты, не ломая сборки на старом коде.

🔘Suppression audit: Намеренные дубликаты можно изолировать директивами # arid: disable / # arid: enable. Опция --suppression-status --fail-on-stale отслеживает и требует удалять комментарии подавления, если код вокруг изменился и дубликата больше нет.

🔘Машиночитаемые отчеты: Поддерживает вывод в Text, JSON, Markdown и стандартный формат SARIF (для бесшовной интеграции с GitHub Code Scanning).

🔘Готовая экосистема: Официальный GitHub Action, хук для pre-commit (анализирует весь проект целиком, а не только staged-файлы) и конфигурация через секцию [tool.arid] в pyproject.toml.

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

Установка:
# Через uv (изолированно):
uv tool install arid

# Или через pip:
pip install arid


Использование в связке с Ruff:

ruff check .
arid .


Пример конфигурации в
pyproject.toml:

Ini, TOML
[tool.arid]
min-lines = 5
ignore-comments = true
ignore-docstrings = true
ignore-imports = true
ignore-signatures = true
exclude = ["generated/**", "vendor/**"]


#Python #Rust #Arid #Ruff #Pylint #DRY #CodeQuality #CleanCode #DevTools #OpenSource #CICD

📱Ссылка на репозиторий:
https://github.com/sponge-b0b/arid
Please open Telegram to view this post
VIEW IN TELEGRAM
4⚡31
📱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
📱Tech-OA-Interview-Questions.

Tech-OA-Interview-Questions
- это открытая база актуальных задач с технических онлайн-ассессментов (Online Assessment, OA) и собеседований в ведущие IT-компании (FAANG, финтех-фонды, стартапы и бигтех).

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

🔹Что внутри базы:

🔘267+ компаний: от Google, Amazon, Microsoft, Apple до Stripe, Netflix, Citadel, Databricks и Jane Street.

🔘Тысячи реальных задач:

✔️Coding (Алгоритмы и структуры данных): более 1 800 задач.

✔️System Design: 270+ архитектурных сценариев (проектирование платформ, кэшей, потоковых очередей).

✔️Low-Level Design (LLD / OOD): 60+ задач на проектирование библиотек, concurrency, rate limiter'ов и классов.

✔️AI Coding: свежий формат заданий с рефакторингом агентов, RAG-пайплайнами и интеграцией LLM.

✔️SQL: аналитические и транзакционные запросы для дата-инженеров и квантов.

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

✅Подборка пригодится всем, кто готовится к осенним/весенним волнам найма, интерншипам или смене грейда за рубежом.

#интервью #собеседование #алгоритмы #leetcode #systemdesign #itкарьера #faang #разработка

📱Ссылка на репозиторий:
https://github.com/perixtar/Tech-OA-Interview-Questions
Please open Telegram to view this post
VIEW IN TELEGRAM
4⚡3👍3
📱Linecast.

Linecast
- это набор интерактивных CLI-приложений для терминала, превращающий открытые гео- и астрономические данные в стильные консольные дашборды с поддержкой мыши: от прогноза погоды и фаз Луны до анимированного радара и полноценных карт с навигацией.

Утилита написана на чистом Python, не требует внешних зависимостей (на macOS и Linux), не запрашивает API-ключи и автоматически подстраивает цвета под текущую палитру вашего терминала.

🔹Шесть встроенных инструментов:

🌦 linecast weather — детальная погода: текущие условия, почасовой прогноз с градиентом светового дня, прогноз на 7 дней, индекс качества воздуха (AQI) и официальные штормовые предупреждения.

☀️ linecast sunshine — движение Солнца по небосводу (по аналогии с циферблатом Solar в Apple Watch), расчет долготы дня, годовой календарь инсоляции (--year) и корректная обработка полярных дней и ночей.

🌑 linecast moon — отображение видимой части Луны с физически точными тенями, пепельным светом и реальными созвездиями вокруг из каталога Yale Bright Star. Поддерживает прокрутку времени, переключение на обратную сторону Луны и традиционные лунно-солнечные календари (иврит, исламский, восточноазиатские).

🌊 linecast tides — графики морских приливов и отливов с отметками пиковых значений и текущего уровня воды по базам NOAA и Open-Meteo.

📡 linecast radar — анимированная карта осадков и спутниковые инфракрасные снимки, отрисованные прямо в терминале с помощью символов Брайля.

🗺 linecast maps — векторные и рельефные карты, интерактивный 3D-глобус с линией терминатора (день/ночь) и облачностью из космоса, а также поиск адресов и пошаговая прокладка автомобильных, пеших и веломаршрутов.

💻Быстрый запуск и установка:

Попробовать в один клик без установки:

uvx linecast weather


Или через скрипт (задействует системный python3):

curl -sL https://raw.githubusercontent.com/ashuttl/linecast/main/get.sh | sh


Установка как постоянной утилиты:

# Через Homebrew
brew install linecast

# Через uv
uv tool install linecast

# Или через pipx
pipx install linecast


Инструмент поддерживает шрифты Nerd Font (linecast icons nerd), умеет отдавать данные в формате JSON (--json), а также выводить компактную строку для статус-баров tmux, Waybar или Polybar (--oneline).

#Python #Linecast #CLI #Terminal #Weather #Maps #OpenSource #Astronomy #Linux #macOS #DevTools

📱Ссылка на репозиторий:
https://github.com/ashuttl/linecast
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥22
📱Shed Skin.

Shed Skin
- это экспериментальный транспайлер, который переводит программы на чистом Python 3 с неявной статической типизацией в оптимизированный код на C++.

На выходе инструмент может собирать как автономные исполняемые файлы, так и скомпилированные C++ модули расширения, которые можно импортировать в обычный Python-код в качестве ускоренных библиотек. В отличие от Cython, Shed Skin не требует ручного описания типов в C-стиле — он выводит их автоматически из логики программы.

🔹Производительность и возможности:

🔘Ускорение в 1–100 раз: На наборе из 80+ нетривиальных программ (>25 000 строк кода) прирост скорости относительно CPython составляет в среднем 20× (медианное значение — 12×). На вычислительных задачах (например, алгоритмах решета Эратосфена) Shed Skin опережает PyPy и соревнуется по скорости с Numba.

🔘Два режима компиляции: Сборка в автономный бинарник (shedskin build my_script) или в нативный модуль расширения для вызова из стандартного CPython.

🔘Управление памятью: Под капотом использует сборщик мусора Boehm GC, избавляя от ручного контроля выделения памяти в сгенерированном C++ коде.

⚠️Ограничения и компромиссы:

Shed Skin поддерживает только строго ограниченное подмножество возможностей языка Python:

🔘Неявная статическая типизация: Переменные не могут менять свой тип во время выполнения.

🔘Ограниченная стандартная библиотека: Поддерживается около 25 базовых модулей (среди них random, re, math, time), произвольные тяжелые внешние зависимости подключить нельзя.

🔘Синтаксические рамки: Не поддерживаются некоторые динамические конструкции языка (например, вложенные функции, произвольное число аргументов *args / **kwargs).

💡Когда стоит использовать:

🔘У вас есть ресурсоемкий блок вычислений на несколько сотен или тысяч строк (рендеринг, симуляция, игровая физика, алгоритмическая математика).

🔘Код автономен и не привязан к внешним C-расширениям.

🔘Вы хотите остаться на CPython и не переписывать логику вручную на C++, Rust или Cython.

💻Пример сборки:

В Linux / macOS:

shedskin build test
./build/test


В Windows:


shedskin build test
build\test.exe


#Python #Cpp #ShedSkin #Transpiler #Compiler #Performance #Optimization #OpenSource #DevTools #Algorithms

📱Ссылка на репозиторий:
https://github.com/shedskin/shedskin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32⚡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
📱Praxist.

Praxist
- это автономная исследовательская система («персональная R&D-команда»), автоматизирующая процесс научного поиска и экспериментов.

В отличие от стандартного AutoML, который просто перебирает гиперпараметры в фиксированных рамках, или обычных LLM-промптов, Praxist берет на себя весь исследовательский цикл целиком. Система разворачивает команду параллельных агентов, которые выдвигают конкурирующие гипотезы, модифицируют код, валидируют результаты в изолированных тестах и передают доказанный опыт из поколения в поколение.

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

🔘Параллельные исследовательские агенты (Peers): Одновременное исследование альтернативных архитектур, алгоритмов и подходов без взаимной блокировки.

🔘Эволюционный синтез поколений: Накопленные артефакты и выводы предыдущего поколения структурируются в виде доказательной базы и определяют повестку следующей итерации исследований.

🔘Слои зрелости решений (Evidence Lanes): Кандидаты ранжируются по жестким контрактам валидации и распределяются по стадиям (инкубатор, фронтир, проверенные решения / Gems) с учетом компромиссов по Парето при оптимизации нескольких метрик.

🔘Quality-Diversity (QD) и Deep Innovation Gate (DIG): Встроенные эвристики диверсификации, которые не дают системе застрять в локальных оптимумах и стимулируют принципиально новые направления поиска.

🔘Глубокая интеграция с Codex и Claude Code: Практически бесшовная работа через агентские скиллы (команда $praxist-takeover в Codex берет существующий репозиторий, валидирует метрики и автоматически настраивает тестовый контур).

🔘Воспроизводимость и аудит: Исходный код проекта изолирован от случайных поломок, метрики фиксируются до начала прогона (preregistration), а каждый положительный результат сопровождается полной цепочкой воспроизведения (lineage).

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

Установка пакета и запуск мастера первоначальной настройки:

pip install "praxist[agents,codex]"
praxist setup --interactive --install-skills codex


Запуск задачи через Codex в корне готового проекта:

$praxist-takeover
Optimize <целевая метрика и направление> while preserving <ограничения>.
Use 4 peers for up to 5 generations within $50 budget.


Мониторинг и управление активными исследованиями:

# Просмотр статуса в реальном времени
praxist --monitor --latest

# Остановка или возобновление задачи
praxist stop <run_id>
praxist resume <run_dir>


✅Проект распространяется под лицензией Fair Source 1.0 (бесплатно для некоммерческих академических исследований и компаний с годовым доходом до $1 млн).

#Praxist #AIAgents #MachineLearning #Research #Codex #AutoML #Python #DataScience #OpenSource #DevTools #Algorithms

📱Ссылка на репозиторий:
https://github.com/sapientinc/PRAXIST
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33⚡2
📱SGLang.

SGLang
- это высокопроизводительный движок и фреймворк для инференса и развертывания больших языковых (LLM) и мультимодальных моделей (VLM), разработанный сообществом LMSYS.

Проект оптимизирован как для запуска моделей на одиночных потребительских видеокартах, так и для масштабирования на гигантские серверные кластеры. SGLang стал де-факто индустриальным стандартом для инференса MoE-архитектур (включая модели линейки DeepSeek) и генерации роллаутов (rollout engine) на этапе обучения с подкреплением (RL).

🔹Ключевые возможности и архитектурные решения:

🔘RadixAttention: Умное автоматическое кэширование KV-кэша по дереву префиксов (Radix tree). Ускоряет инференс в разы в сценариях с общими системными промптами, few-shot примерами, агентскими циклами и multi-turn диалогами.

🔘Архитектура PD Disaggregation: Разделение стадий prefill (обработка входного контекста) и decode (потоковая генерация токенов) по разным GPU-нодам для максимальной утилизации вычислительной мощности.

🔘Параллелизм масштаба дата-центров: Полная поддержка Tensor, Pipeline, Data и масштабируемого Expert Parallelism (EP) для MoE-моделей на десятках и сотнях GPU (включая стойки NVIDIA GB200/GB300 NVL72).

🔘Быстрый структурированный вывод: Генерация строгого JSON и следование схемам до 3 раз быстрее аналогов благодаря оптимизированным конечным автоматам (Compressed FSM).

🔘Day-0 поддержка новейших моделей: Мгновенная адаптация топовых открытых моделей (DeepSeek-V3/R1/V4, Kimi K3, Nemotron 3, GLM, LLaVA, диффузионных генераторов видео и изображений WAN и Qwen-Image).

🔘Аппаратная всеядность: Оптимизирован под архитектуры NVIDIA (от RTX 4090/5090 до H100/B200/GB300), AMD Instinct (MI300X, MI355), Google TPU (через бэкенд на JAX) и Intel Xeon.

🔘Основа для RL и Post-Training: Служит высокоскоростным бэкендом генерации ответов во фреймворках обучения с подкреплением (verl, Miles, AReaL, slime).

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

Установка:
pip install "sglang[all]"


Запуск OpenAI-совместимого сервера инференса:

python -m sglang.launch_server \
--model-path deepseek-ai/DeepSeek-V3 \
--port 30000 \
--tp 8


Отправка запроса через Python:

import openai

client = openai.Client(base_url="http://127.0.0.1:30000/v1", api_key="None")

response = client.chat.completions.create(
model="default",
messages=[{"role": "user", "content": "Объясни квантовые вычисления простыми словами."}],
temperature=0.7,
)
print(response.choices[0].message.content)


#SGLang #LLM #AI #Inference #MachineLearning #DeepSeek #NVIDIA #AMD #OpenSource #DevTools #Python #DataScience

📱Ссылка на репозиторий:
https://github.com/sgl-project/sglang
Please open Telegram to view this post
VIEW IN TELEGRAM
4⚡1👍1
📱Citry.

Citry
- это строго типизированный фронтенд-фреймворк для Python, объединяющий серверные события и Alpine.js для создания реактивных веб-интерфейсов без необходимости вести отдельный frontend-проект на JavaScript.

Архитектура проекта вдохновлена идеями Vue и Laravel Livewire: один Python-компонент инкапсулирует HTML-разметку, стили CSS, логику браузера, серверные обработчики событий и переводы интерфейса.

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

🔘Строгая типизация (Full Typing): Входные параметры компонентов валидируются через аннотации типов Python (Kwargs). Опечатки в свойствах или пропущенные поля отлавливаются на этапе статического анализа, а метод template_data() изолирует контекст, доступный шаблону.

🔘Реактивность без тяжелого JS-стека: Бесшовная связка с Alpine.js и серверными событиями (Server Events) позволяет обновлять части DOM-дерева на лету прямо из Python-кода без сборщиков Webpack/Vite.

🔘HTML-подобная композиция: Компоненты вкладываются друг в друга через наглядные теги <c-ComponentName>, а атрибуты с префиксом c- вычисляют Python-выражения (например, c-messages="user.inbox").

🔘Фреймворк-агностик: Легко монтируется в существующие бэкенды на FastAPI, Django, Flask, Starlette, а также в любые чистые ASGI- и WSGI-приложения.

🔘Развитая экосистема разработки:

✔️Официальное расширение для VS Code с автодополнением, диагностикой и подсветкой синтаксиса шаблонов.

✔️Встроенный CLI-анализатор (citry check --static).

✔️Библиотека готовых доступных UI-компонентов (citry-ui) — диалоги, формы, навигация и таблицы.

💻Пример компонента:
from citry import Component

class Welcome(Component):
class Kwargs:
name: str
messages: list[str]

def template_data(self, kwargs, slots):
return {
"name": kwargs.name,
"messages": kwargs.messages,
}

template = """
<section class="welcome">
<h1>С возвращением, {{ name }}!</h1>
<ul>
<li c-for="message in messages">{{ message }}</li>
<li c-empty>Новых сообщений нет.</li>
</ul>
</section>
"""

css = """
.welcome { border-top: 3px solid #2563eb; }
"""

# Рендеринг компонента в HTML-строку
html = str(Welcome(name="Алексей", messages=["Сборка завершена", "Отчет готов"]))


📦Установка:
pip install citry
# или через uv:
uv add citry


✅Фреймворк поддерживает Python от 3.10 до 3.14 и распространяется под свободной лицензией MIT.

#Citry #Python #Frontend #Fullstack #FastAPI #Django #Flask #AlpineJS #Livewire #WebDev #OpenSource #DevTools

📱Ссылка на репозиторий:
https://github.com/citry-dev/citry
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥1