Metadata-Version: 2.1
Name: partest-atlas
Version: 0.1.0
Summary: Сбор наблюдений о системе и о прогоне тестов в версионированные артефакты — агент карты «Веха»
Author: dec01
License: MIT
Keywords: testing,coverage,observability,pytest,openapi
Classifier: Development Status :: 3 - Alpha
Classifier: Framework :: Pytest
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Software Development :: Testing
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: partest >=1.8
Requires-Dist: PyYAML >=6.0.2
Provides-Extra: all
Requires-Dist: partest-atlas[kafka,postgres,ui] ; extra == 'all'
Provides-Extra: kafka
Requires-Dist: kafka-python >=2.0.2 ; extra == 'kafka'
Provides-Extra: postgres
Requires-Dist: psycopg[binary] >=3.2.0 ; extra == 'postgres'
Provides-Extra: specs
Provides-Extra: ui
Requires-Dist: playwright >=1.40.0 ; extra == 'ui'

# partest-atlas

Агент сбора для **«Вехи»** — карты системы, раскрашенной тестами.

Пакет снимает наблюдения на прогоне автотестов и рядом с ним, складывает их в
версионированные JSON-артефакты и на этом останавливается. Выводы из артефактов делает
сервер «Веха» — отдельная программа, которая этот пакет не импортирует и не требуется ему
для работы.

**PyPI:** `partest-atlas` · **Лицензия:** MIT

```bash
pip install partest-atlas
```

## Зачем разделено так

Агент — измерительные приборы: он записывает, что клик ушёл в такой-то запрос, что за тест
изменилось в счётчиках таблиц, какие смещения были у топиков до и после. Каждое наблюдение
само по себе бесполезно.

Сервер — тот, кто из наблюдений делает вывод: «в таблицу писал не API, а консьюмер, потому
что между последним пишущим запросом теста и изменением прошло событие шины».

Поэтому агент открыт: он ходит в базу, шину и логи заказчика, и его должна иметь
возможность прочитать служба безопасности. Защищать здесь нечего — ценность не в сборе.

## Что внутри

```text
partest_atlas/
  artifacts.py      контракт артефактов: version, kind, scope, атомарная запись
  collect/          сборщики: схема БД, эффекты в БД, шина, логи контейнеров,
                    контракт OpenAPI, требования из спецификаций, поток UI
  adapters/         доступ к чужим системам: db/ bus/ containers/ ci/ tests/ contract/
  plugins/          pytest-плагины (entry point pytest11), молчат без переменных окружения
  wrap.py           `atlas wrap -- <любая команда>` — снимки до и после чужого прогона
```

## Три уровня внедрения

| Уровень | Что делает проект | Что даёт |
|---|---|---|
| **Обёртка** | `atlas wrap -- <своя команда прогона>` | состояние до и после прогона; работает с любым раннером, включая не-Python |
| **Агент** | ставит пакет, выставляет `ATLAS_*` | наблюдения вокруг каждого теста (pytest) |
| **Маркеры** | `@pytest.mark.req(...)`, `@pytest.mark.db_effects` | трассируемость требований и точный отбор тестов под замер |

Плагины подключаются через `pytest11` и **молчат, пока не выставлена соответствующая
переменная окружения** — обычный прогон не платит за их присутствие ничего.

## Раскладка артефактов

```text
atlas/<система>/<контур>/db_schema.json
atlas/<система>/<контур>/ui_flow.json
...
```

Заголовок каждого файла несёт `version`, `kind`, `scope` и время сбора, поэтому потребитель
может честно сказать «артефакт старого формата», а не упасть на отсутствующем поле.

## Отношение к partest

`partest-atlas` зависит от [`partest`](https://pypi.org/project/partest/) и переиспользует
её, а не дублирует: сопоставление URL с шаблоном OpenAPI (`partest.path_match`), разбор
контракта, редактирование секретов (`partest.redact`), маркер тестовых данных, покрытие по
методике. Обратной зависимости нет и не будет: `partest` про `partest-atlas` не знает.

## Статус

Ранняя разработка. Код переносится из прототипа (`src/atlas` проекта-прародителя) по плану
в документации сервера.
