ADC AppKit - библиотека для управления компонентами и состоянием приложения
Project description
ADC AppKit
Библиотека для управления компонентами и состоянием приложения с поддержкой dependency injection, декларативного объявления компонентов и request scope.
Основные возможности
- Декларативное объявление компонентов с IDE-подсказками
- Dependency Injection с автоматическим разрешением зависимостей
- Две стратегии компонентов: Singleton и Request
- Request Scope для управления жизненным циклом компонентов
- Автоматическое управление состоянием приложения
- Healthcheck для мониторинга состояния компонентов
Архитектура
Стратегии компонентов
- SINGLETON: создается один раз при старте приложения, закрывается при остановке
- REQUEST: создается при обращении, кэшируется в request scope, закрывается при выходе из scope
Состояния компонентов
- REGISTERED: компонент зарегистрирован в контейнере
- CONFIGURED: компонент настроен конфигурацией
- STARTED: компонент запущен и готов к работе
- STOPPED: компонент остановлен
- ERROR: ошибка в работе компонента
Быстрый старт
Простое приложение
import asyncio
from adc_appkit import BaseApp, component, ComponentStrategy
from adc_appkit.components.pg import PG
from adc_appkit.components.http import HTTP
from adc_appkit.components.s3 import S3
class MyApp(BaseApp):
# HTTP клиент - создается на каждый запрос
http = component(
HTTP,
strategy=ComponentStrategy.REQUEST,
config_key="http"
)
# PostgreSQL соединение - singleton
pg = component(
PG,
strategy=ComponentStrategy.SINGLETON,
config_key="pg",
depends_on=[HTTP]
)
# S3 клиент - singleton
s3 = component(
S3,
strategy=ComponentStrategy.SINGLETON,
config_key="s3"
)
async def business_logic(self):
# Использование компонентов вне scope
print("PG pool:", self.pg)
# Использование компонентов в request scope
async with self.request_scope() as req:
http_client = req.http
print("HTTP client:", http_client)
# Конфигурация
config = {
"http": {"timeout": 30},
"pg": {"dsn": "postgresql://user:pass@localhost/db"},
"s3": {"endpoint_url": "https://s3.amazonaws.com"}
}
app = MyApp(components_config=config)
async def main():
await app.start()
await app.business_logic()
await app.stop()
asyncio.run(main())
Сложное приложение с несколькими компонентами
from adc_appkit import BaseApp, component, ComponentStrategy
from adc_appkit.components.pg import PG
from adc_appkit.components.http import HTTP
class ComplexApp(BaseApp):
# Несколько HTTP клиентов
main_http = component(
HTTP,
strategy=ComponentStrategy.REQUEST,
config_key="main_http"
)
api_http = component(
HTTP,
strategy=ComponentStrategy.REQUEST,
config_key="api_http"
)
# Несколько PG соединений
main_pg = component(
PG,
strategy=ComponentStrategy.SINGLETON,
config_key="main_pg",
depends_on=["main_http"]
)
analytics_pg = component(
PG,
strategy=ComponentStrategy.SINGLETON,
config_key="analytics_pg",
depends_on=["api_http"]
)
# Конфигурация
config = {
"main_http": {"timeout": 5, "base_url": "https://api.main.com"},
"api_http": {"timeout": 10, "base_url": "https://api.external.com"},
"main_pg": {"dsn": "postgresql://user:pass@localhost/main_db"},
"analytics_pg": {"dsn": "postgresql://user:pass@localhost/analytics_db"}
}
app = ComplexApp(components_config=config)
Создание собственных компонентов
from adc_appkit.components.component import Component
from typing import Any, Dict
class MyComponent(Component[MyObject]):
async def _start(self, **kwargs) -> MyObject:
# Инициализация компонента
return MyObject(**kwargs)
async def _stop(self) -> None:
# Очистка ресурсов
await self.obj.close()
async def is_alive(self) -> bool:
# Проверка состояния
return await self.obj.is_healthy()
Request Scope
Request scope позволяет управлять жизненным циклом REQUEST компонентов:
async with app.request_scope() as req:
# Все REQUEST компоненты создаются один раз на весь scope
http1 = req.http
http2 = req.http # Тот же экземпляр
# При выходе из scope все REQUEST компоненты автоматически закрываются
Управление приложением
# Запуск приложения
await app.start()
# Проверка состояния компонентов
health = await app.healthcheck()
print(health) # {"pg": True, "s3": True, ...}
# Остановка приложения
await app.stop()
Доступные компоненты
- HTTP: HTTP клиент на основе aiohttp (
adc_appkit.components.http.HTTP) - PG: PostgreSQL соединение на основе asyncpg (
adc_appkit.components.pg.PG) - S3: S3 клиент на основе boto3 (
adc_appkit.components.s3.S3) - PGDataAccessLayer: DAO слой для работы с PostgreSQL (
adc_appkit.components.dao.PGDataAccessLayer)
Запуск тестов
Для запуска тестов используйте uv:
# Установка зависимостей для разработки
uv sync --dev
# Запуск всех тестов
uv run pytest
# Запуск тестов с подробным выводом
uv run pytest -v
# Запуск конкретного теста
uv run pytest tests/test_architecture.py::test_simple_app_lifecycle
Запуск примеров
Для запуска примеров использования:
# Простые примеры с мок-компонентами
uv run python examples/basic_examples.py
# Или запуск через модуль
uv run python -m examples.basic_examples
Структура проекта
adc_appkit/
├── __init__.py # Основные экспорты
├── base_app.py # BaseApp класс
├── component_manager.py # Управление компонентами
├── di_container.py # DI контейнер
├── app.py # Примеры приложений
├── service.py # Базовый Service класс
└── components/
├── component.py # Базовый Component класс
├── pg.py # PostgreSQL компонент
├── http.py # HTTP клиент
├── s3.py # S3 клиент
└── dao.py # DAO слой
tests/ # Unit тесты
├── __init__.py
└── test_architecture.py # Тесты архитектуры
examples/ # Примеры использования
├── __init__.py
└── basic_examples.py # Базовые примеры
Разработка
Для разработки установите зависимости:
# Установка всех зависимостей
uv sync --dev
# Форматирование кода
uv run black adc_appkit tests examples
# Сортировка импортов
uv run isort adc_appkit tests examples
# Проверка типов
uv run mypy adc_appkit
Установка
pip install adc-appkit
Лицензия
Этот проект лицензирован под MIT License - см. файл LICENSE для деталей.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file adc_appkit-0.1.0.tar.gz.
File metadata
- Download URL: adc_appkit-0.1.0.tar.gz
- Upload date:
- Size: 56.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd7ccae63235455672c8d36f4ceaadd5509343d7f9e0fca9723881a617f583da
|
|
| MD5 |
e2e5e2c4a13e40ba42275ccdd6405277
|
|
| BLAKE2b-256 |
a7ac3c624ccf70cea4c80a4f8420b86c3f5a9e1e661fa1498dd012ef4446483e
|
File details
Details for the file adc_appkit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: adc_appkit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b76bad043bd227cc6e74750650b2eaf7b33d8b4e0e07513c7813d94c8d944a60
|
|
| MD5 |
671a60ef30d8be8e6609f3cb4798e2bb
|
|
| BLAKE2b-256 |
657de1c9db6aec5f4e9e8b456ccdf571c0b1653bc83a09dab4071055f770cc28
|