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

3.8 KiB
Raw Blame History

Фикстуры разбора 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