Metadata-Version: 2.4
Name: assistagro-client
Version: 0.3.2
Summary: HTTP client for AssistAgro API
Author-email: Dmitriy Kazakov <dmitriyfile@yandex.ru>
License-Expression: MIT
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.28.1
Requires-Dist: pydantic>=2.12.5
Requires-Dist: pydantic-settings>=2.13.1
Requires-Dist: python-dateutil>=2.9.0.post0
Requires-Dist: python-dotenv>=1.0.0

# AssistAgro API Client

Синхронный и асинхронный HTTP-клиент для AssistAgro API.

## Установка

```bash
pip install assistagro-client
```

## Асинхронное использование

```python
import asyncio
from assistagro_client import AssistAgroClient

async def main():
    async with AssistAgroClient(base_url="https://gateway-frontend.agroassist.ru") as client:
        tokens = await client.auth.sign_in(
            email="user@example.com",
            password="password123"
        )
        print(f"Access token: {tokens.access_token[:20]}...")

        structures = await client.structures.list_()
        structure_guid = structures[0].structure_guid

        season = await client.seasons.get_current()

        fields = await client.fields.list_(
            structure_guids=[structure_guid],
            season_id=season.season_id,
        )
        print(f"Найдено полей: {len(fields)}")

        crops_response = await client.dictionaries.get_crops()
        print(f"Культур: {len(crops_response.crops)}")

        tasks = await client.tasks.list_(structure_guid=structure_guid)
        print(f"Найдено задач: {len(tasks)}")

if __name__ == "__main__":
    asyncio.run(main())
```

## Синхронное использование

```python
from assistagro_client import AssistAgroSyncClient

with AssistAgroSyncClient(base_url="https://gateway-frontend.agroassist.ru") as client:
    tokens = client.auth.sign_in(
        email="user@example.com",
        password="password123",
    )
    print(f"Access token: {tokens.access_token[:20]}...")

    structures = client.structures.list_()
    print(f"Найдено структур: {len(structures)}")
```

`AssistAgroClient` остается асинхронным клиентом для обратной совместимости.
`AssistAgroSyncClient` предоставляет тот же набор API-разделов для обычного синхронного кода.
Если нужно передать контекст пользователя в `x-user-data`, используйте `set_user_data(...)`;
заголовок сериализуется как компактный JSON, например
`{"company_guid":"...","user_guid":"..."}`.

## TLS/SSL сертификаты

По умолчанию клиент проверяет TLS-сертификат сервера. Если окружение использует свой
CA-bundle, передайте путь к нему:

```python
client = AssistAgroClient(verify="/path/to/ca-bundle.pem")
```

Если сервер временно отдает некорректную цепочку сертификатов, проверку можно отключить
явно:

```python
client = AssistAgroClient(verify=False)
```

То же доступно для `AssistAgroSyncClient` и через переменную окружения
`ASSISTAGRO_VERIFY_SSL=false`.

## API эндпоинты

| Модуль | Описание | Основные методы |
|--------|----------|-----------------|
| **auth** | Аутентификация | `sign_in`, `refresh_tokens`, `logout` |
| **accounts** | Пользователи | `get_current_user`, `get_users` |
| **companies** | Компании | `list_()`, `list_all`, `get`, `get_license`, `get_license_metadata`, `get_activities`, `get_dashboards` |
| **structures** | Структуры | `list_()`, `list_plain` |
| **seasons** | Сезоны | `list`, `get_current`, `get_by_name`, `get_season_id_by_name` |
| **fields** | Поля | `list_()`, `get_contours`, `get_phenophases`, `get_monitoring`, `list_meta` |
| **tasks** | Задачи | `list_()`, `create`, `get_list_meta` |
| **reports** | Отчёты | `list_()`, `create`, `get_metadata`, `get_problems`, `get_list_meta` |
| **techmaps** | Технологические карты | `list_()`, `create` |
| **meteostations** | Метеостанции | `list_()`, `get`, `get_by_field`, `get_manufacturers`, `get_providers`, `get_sensors`, `get_coordinates_history`, `get_history` |
| **dictionaries** | Справочники | `get_crops`, `get_crop_products`, `get_techoperations`, `get_pesticides`, `get_fertilizers`, `get_machines`, `get_tools`, `get_units`, `get_regions`, `get_countries`, и др. |

## Примеры

Скопируйте `.env.example` в `.env` и заполните переменные:

```bash
cp .env.example .env
```

```env
ASSISTAGRO_EMAIL=user@example.com
ASSISTAGRO_PASSWORD=your-password
ASSISTAGRO_BASE_URL=https://gateway-frontend.agroassist.ru
ASSISTAGRO_DEBUG=false
```

Запуск примеров:

```bash
# Запустить все модули
uv run python examples/run_tests.py

# Запустить конкретный модуль
uv run python examples/run_tests.py --module structures
uv run python examples/run_tests.py -m auth

# Доступные модули:
# auth, structures, companies, current_user, users,
# dictionaries, meteostations, tasks, fields, reports, techmaps, seasons
```

## Разработка

```bash
# Установить зависимости
uv sync

# Запустить тесты
uv run pytest

# Запустить линтер
uv run ruff check .
uv run ruff check --fix .

# Проверка типов
uv run mypy src/

# Форматирование
uv run black .
```

## Лицензия

MIT
