Ready
This commit is contained in:
commit
95cacc79c2
34 files changed
+1394
No files matched your search
@@ -0,0 +1,17 @@
|
||||
# Передача data-engineer
|
||||
Владение: src/, scripts/generate_data.py, data/raw/, output/sales.sqlite, reports/etl/. Реализованы stdlib генератор seed=42 и строгий ETL согласно контракту v1 (уточнение corrected_rows согласовано с тимлидом: канонические представления всех 6 полей).
|
||||
|
||||
Выполнено Python 3.12.14 из bundled runtime:
|
||||
```
|
||||
python scripts/generate_data.py --output data/raw/orders.csv --seed 42
|
||||
python -m src.pipeline --input data/raw/orders.csv --db output/sales.sqlite --reports reports/etl
|
||||
```
|
||||
Фактический результат: 301 входных = 290 принятых + 11 отклоненных. Причины: missing_required 2, invalid_date 2, invalid_quantity 2, invalid_price 3, duplicate 1, conflicting_key 1. corrected_rows=290. Выручка 99119395 копеек. Вход SHA256 a7816b666a8b3dc8833f937970cab2bc7206b6fd44ea3413547eb06f17e1cfe5.
|
||||
|
||||
Повторный запуск через run_pipeline и сравнение SELECT * ORDER BY бизнес-ключи: PASS; 290 фактов, 87 агрегатов. PRAGMA integrity_check=ok. SUM(facts)=SUM(daily_category)=99119395.
|
||||
|
||||
Стратегия: CSV проверяется полностью до БД, SQLite BEGIN IMMEDIATE включает CREATE IF NOT EXISTS, DELETE и INSERT, rollback при ошибке. Тестировщику сообщен интерфейс и возможность инъекции сбоя BEFORE INSERT trigger. Номера исходных строк физические; многострочные значения запрещены ошибкой всего запуска. Нулевой байтовый вход допустим, ошибочный заголовок нет.
|
||||
|
||||
Ограничения: вся выгрузка в памяти; полная замена, не инкрементальная загрузка. Публикация filesystem отчетов после commit БД не имеет общей транзакции с SQLite: при сбое публикации повторить CLI. Итоговая БД и reports/etl могут перезаписываться повторным запуском осознанно, пользовательские файлы не затронуты. Отсутствие 13 января и пик 23 января намеренно заложены в синтетические валидные продажи.
|
||||
|
||||
Далее: независимые тесты, SQL и документация; владелец итоговой БД передает право интеграционного запуска тимлиду.
|
||||
@@ -0,0 +1,7 @@
|
||||
# Передача документации
|
||||
|
||||
Созданы README.md на русском, docs/INTERVIEW.md и docs/verification/RUN_LOG.md. В README перечислены источники артефактов, схема и семантика, форматы дат, политика дублей/конфликтов, точные деньги, фактическое качество, все три SQL и результаты, границы атомарности SQLite/файловых отчетов, ограниченность учебного решения.
|
||||
|
||||
Чистый запуск выполнен на Python 3.12.14 в docs/verification/: генератор → ETL → SQL, все exit 0; 301/290/11, 99119395 копеек, SQL 3/30/1. После этого повторены 6 unittest: OK, 0.132s, exit 0. Команды и выходные артефакты сохранены в docs/verification/.
|
||||
|
||||
Существующие пользовательские файлы и итоговая БД не изменялись этой ролью. Фактическое общее время и финальная приемка оформляются тимлидом в coordination/ACCEPTANCE.md.
|
||||
@@ -0,0 +1,14 @@
|
||||
# Передача sql-pro
|
||||
Владение второй волны: sql/, reports/sql/, этот handoff. Итоговая БД открывается URI mode=ro; runner использует одну read transaction на все три запроса.
|
||||
|
||||
Выполнено Python 3.12.14:
|
||||
```
|
||||
python sql/run_queries.py --db output/sales.sqlite --output reports/sql
|
||||
```
|
||||
Результат: top_categories 3 строки, daily_dynamics 30 строк, anomalies 1 строка. Категории (копейки): книги 39904885; электроника 33008050; дом 26206460. Динамика покрывает 2026-01-01..2026-01-30, 2026-01-13 = 0; изменение первого дня NULL (в CSV пусто).
|
||||
|
||||
Аномалия: 2026-01-23, выручка 45144920 коп., сумма предыдущих семи календарных дней 13009083 коп. Порог: выручка > трех средних предыдущих 7 дней при 7 днях истории и ненулевой базе. Точный целочисленный порог floor(13009083*3/7)=5575321 коп. Это аналитический сигнал намеренно заложенного синтетического пика, не дефект строки.
|
||||
|
||||
Дополнительный фактический запуск в tempfile: пустой ETL дает все три SQL результата по 0 строк с CSV заголовками; повторный SQL запуск дает те же CSV байты. PASS. Сравниваются CSV, а не SQLite-файлы.
|
||||
|
||||
SQL использует SQLite window functions и рекурсивный календарь; полный диапазон дат строится в памяти/SQLite, для огромных диапазонов не оптимизирован. Денежные итоги остаются INTEGER. Сравнение аномалии делит сумму на 7 до умножения на 3, предотвращая SQLite integer overflow и уход во float.
|
||||
@@ -0,0 +1,6 @@
|
||||
# Передача тестов
|
||||
Владелец: test-automator. Созданы tests/__init__.py и tests/test_pipeline.py. Все входы/БД/отчеты тестов изолированы в TemporaryDirectory.
|
||||
Ручная фикстура из 9 строк: приняты 2 факта, 2080 копеек (2×1025 + 3×10), отклонены 7; проверены точные факты, агрегат, номера и основные причины каждой отброшенной строки. Остальные проверки: первая валидная запись ключа; отдельные line_id; повторный запуск со сравнением отсортированных логических данных; пустой и полностью отклоненный вход после непустого; откат при реальном SQL trigger RAISE(ABORT); отрицательные, нулевые, дробные, NaN/Infinity и переполнение цены.
|
||||
Фактическая команда PowerShell: `& 'C:\Program Files\WindowsApps\OpenAI.CodexPrimaryRuntime.v26-1112-737-0_26.1112.737.0_x64__3k8sg7r9htsxt\dependencies\python\python.exe' -m unittest discover -s tests -v`.
|
||||
Результат второго запуска: 6 tests, 0.123s, OK, exit 0. Первое выполнение: все контрактные assertions прошли, но 4 cleanup errors Windows WinError 32 в самих тестах. Причина: sqlite3 connection context manager не закрывает connection. Исправление тестов: contextlib.closing. Это ошибка тестовой инфраструктуры, не подтвержденный дефект ETL.
|
||||
Ограничения: не нагрузочные тесты; SQL следующей волны не входит во владение. Следующий шаг: интеграционная приемка тимлидом и SQL.
|
||||
Reference in new issue
Block a user