Files
healthlog/internal/hae/testdata/README.md
T
av 01d0de59df разбор метрик HAE: фикстуры, канонизация, парсер
- tmp/research/fixtures.py собирает фикстуры из архива, вычищая измерения и
  сохраняя порядок ключей, форму литералов, выравнивание меток и невидимые
  символы; шесть фикстур в internal/hae/testdata
- internal/canon — общий дом канонической формы, полноты и хеша: числа читаются
  литералом через json.Number, округление до 12 значащих цифр
- internal/hae — разбор секции metrics, вывод слоя по метрике, разделение схем
  сна, координаты интервалом; recover внутри Parse, фаззинг
- миграция bucket и docs/database.md
2026-08-01 17:31:41 +03:00

46 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Фикстуры разбора Health Auto Export
Конвенция требует тестов на **реальных** пакетах: документация формата тонкая и
местами расходится с тем, что приложение шлёт на самом деле. Инвариант при этом
запрещает данным о здоровье попадать под контроль версий. Поэтому фикстуры
собраны из живого архива скриптом `tmp/research/fixtures.py`, который сохраняет
всё, на чём работает разбор, и уничтожает всё, что является измерением.
Сохранено дословно: порядок ключей, форма числового литерала, выравнивание
меток по секундам и минутам, смещение зоны, длительности интервалов, невидимые
символы в именах устройств, категориальные значения. Заменено: числа (цифры
переставлены с сохранением формы), даты (сдвинуты на постоянную величину),
имена устройств.
| Файл | Что проверяет |
|---|---|
| `minute.json` | минутная доставка; плотные метрики минутные, одна (`apple_stand_hour`) часовая — классификация **по метрике**, а не по доставке; редкие наследуют минутный слой; суточная сводка сна |
| `hour.json` | часовая доставка целиком |
| `raw.json` | посекундная доставка |
| `mixed.json` | одна доставка с минутными, посекундными и часовыми метриками — перенастройка автоматизации |
| `heartbeat_series.json` | точка с `heartbeatSeries`: третий формат времени, серия проходит исходными байтами |
| `sparse_sleep.json` | доставка **без плотных метрик** (заголовок `Default` не спасает) и поэпизодный сон с задвоенной меткой — интервальная идентичность |
| `handmade_edge.json` | случаи, которых живой поток не даёт (см. ниже) |
`handmade_edge.json` собран руками, скриптом не воспроизводится:
- `mixed_alignment` — плотная метрика, где 10 меток часовые и одна минутная:
слой обязан выйти минутным, потому что слой метрики — **самое мелкое**
встретившееся выравнивание;
- `unknown_shape` — незнакомое поле точки (в том числе вложенное), `1.0`, целое
больше 2⁵³ и дробь длиннее двенадцати значащих цифр: всё это обязано пережить
хранение дословно;
- `broken_timestamps` — RFC 3339 вместо формата HAE, пустая строка, отсутствие
`date` и число вместо строки: каждая точка пропускается со счётчиком, разбор
не падает;
- `interval_points` — три записи с одной меткой и разными интервалами: ключ по
метке схлопнул бы их в одну.
Обновить набор:
```
python3 tmp/research/fixtures.py --list
python3 tmp/research/fixtures.py <файл из data/raw> --metrics a,b --limit 14 \
--out internal/hae/testdata/<имя>.json
```