разбор метрик HAE: фикстуры, канонизация, парсер
- tmp/research/fixtures.py собирает фикстуры из архива, вычищая измерения и сохраняя порядок ключей, форму литералов, выравнивание меток и невидимые символы; шесть фикстур в internal/hae/testdata - internal/canon — общий дом канонической формы, полноты и хеша: числа читаются литералом через json.Number, округление до 12 значащих цифр - internal/hae — разбор секции metrics, вывод слоя по метрике, разделение схем сна, координаты интервалом; recover внутри Parse, фаззинг - миграция bucket и docs/database.md
This commit is contained in:
Vendored
+45
@@ -0,0 +1,45 @@
|
||||
# Фикстуры разбора 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
|
||||
```
|
||||
Reference in New Issue
Block a user