# Build 042 — Удаление MarketPriceCache ## Статус **Завершён** --- ## 1. Цель Build 042 Целью Build 042 было провести аудит зависимостей legacy-компонента `MarketPriceCache`, определить безопасный способ его удаления и устранить compatibility facade без нарушения работы существующего Quotes Feed, REST fallback, WebSocket runtime и потребителей котировок. Основное ограничение миграции: > Legacy-компонент может быть удалён только после подтверждения, что его поведение полностью покрывается целевым `QuoteStore` и что все runtime-потребители переведены без изменения существующих контрактов. --- ## 2. Исходное состояние До Build 042 в проекте существовал legacy-компонент: ```text src/integrations/exchange/market_cache.py ``` с классом: ```text MarketPriceCache ``` `MarketPriceCache` использовался как compatibility facade над: ```text src/storage/quote_store.py ``` и внутренне содержал общий экземпляр `InMemoryQuoteStore`. Основными потребителями были: ```text src/integrations/exchange/service.py src/integrations/exchange/market_stream.py src/integrations/exchange/market_data_runner.py ``` --- ## 3. Результаты аудита Аудит подтвердил, что `MarketPriceCache` не содержал самостоятельной бизнес-логики хранения котировок. Его обязанности ограничивались делегированием операций `set`, `get` и `clear` в `QuoteStore`, нормализацией `runtime_key`, использованием фиксированного `source_name` и предоставлением глобального shared store через class-level `_store`. Фактическое хранение данных уже выполнялось через: ```text src/storage/quote_store.py ``` Основные контракты: ```text QuoteStoreProtocol InMemoryQuoteStore ``` Таким образом, `MarketPriceCache` являлся промежуточным compatibility facade и не был необходим как самостоятельный архитектурный слой. --- ## 4. Критические семантики, сохранённые при удалении ### 4.1. Общий shared Quote Store Все основные производители и потребители котировок продолжают работать с одним общим экземпляром `QuoteStore`. ```text WebSocket / REST ↓ Quote model ↓ shared QuoteStore ↓ ExchangeService / runtime consumers ``` ### 4.2. Изоляция по runtime_key Сохранена изоляция котировок между runtime-контекстами, включая: ```text auto debug_auto default ``` Ключ хранения остаётся логически эквивалентным: ```text (source_name, runtime_key, symbol) ``` ### 4.3. Нормализация runtime_key Сохранена нормализация: ```text " AUTO " → "auto" " Debug_Auto " → "debug_auto" ``` ### 4.4. Нормализация symbol Сохранена нормализация символов при операциях чтения, записи и очистки. ```text " btc/usd_leverage " → "BTC/USD_LEVERAGE" ``` ### 4.5. Семантика clear() Сохранена возможность точечной и общей очистки `QuoteStore` по `source_name`, `runtime_key`, `symbol`, комбинации фильтров и полной очистке store. ### 4.6. REST fallback Удаление `MarketPriceCache` не нарушило восстановленный в Build 040 REST fallback. Если свежая котировка отсутствует в shared `QuoteStore`, `ExchangeService` сохраняет возможность загрузить котировку через новый Quotes Feed acquisition pipeline и сохранить полученный `Quote` в общий store. --- ## 5. Выполненные изменения В рамках Build 042: - удалён compatibility facade `MarketPriceCache`; - удалён файл `src/integrations/exchange/market_cache.py`; - удалён legacy-набор тестов `tests/unit/integrations/exchange/test_market_cache.py`; - `ExchangeService` переведён на прямую работу с shared `QuoteStore`; - `MarketDataRunner` переведён на прямую работу с shared `QuoteStore`; - `market_stream` переведён на прямую работу с shared `QuoteStore`; - сохранена runtime isolation; - сохранена нормализация символов и runtime keys; - сохранена семантика очистки; - сохранён REST fallback; - сохранены существующие публичные контракты получения котировок. --- ## 6. Архитектурный результат До Build 042: ```text WebSocket / REST ↓ Quote ↓ MarketPriceCache ↓ InMemoryQuoteStore ``` После Build 042: ```text WebSocket / REST ↓ Quote ↓ shared QuoteStore ↓ ExchangeService / runtime consumers ``` Удалён лишний промежуточный слой `MarketPriceCache`. `QuoteStore` теперь является непосредственным storage-контрактом для канонических моделей `Quote`. --- ## 7. Проверка тестами ### Quote Store ```text python -m pytest -q tests/unit/storage/test_quote_store.py ``` Результат: ```text 64 passed in 0.04s ``` ### ExchangeService quote contracts ```text python -m pytest -q tests/unit/integrations/exchange/test_service_quote.py tests/unit/integrations/exchange/test_service_execution_quote.py ``` Результат: ```text 11 passed in 0.11s ``` ### Market runtime ```text python -m pytest -q tests/unit/integrations/exchange/test_market_data_runner.py tests/unit/integrations/exchange/test_market_stream.py ``` Результат: ```text 15 passed in 0.09s ``` ### Полный regression suite ```text python -m pytest -q ``` Результат: ```text 613 passed in 2.37s ``` Уменьшение общего количества тестов с `614` до `613` является ожидаемым результатом удаления legacy-файла: ```text tests/unit/integrations/exchange/test_market_cache.py ``` --- ## 8. Контроль отсутствия legacy-зависимостей Выполнена финальная проверка: ```text grep -RIn --exclude-dir="__pycache__" --exclude="*.pyc" -E "\bMarketPriceCache\b|integrations\.exchange\.market_cache|market_cache" src tests ``` Результат: ```text пусто ``` Это подтверждает отсутствие оставшихся ссылок на `MarketPriceCache`, `src.integrations.exchange.market_cache` и `market_cache`. --- ## 9. Итог Build 042 Build 042 завершён успешно. Подтверждено: - legacy `MarketPriceCache` полностью удалён; - прямые зависимости от `market_cache.py` отсутствуют; - shared `QuoteStore` стал непосредственным storage-механизмом котировок; - WebSocket и REST пути используют каноническую модель `Quote`; - runtime isolation сохранена; - REST fallback сохранён; - полный regression suite проходит без ошибок; - архитектура готова к финальной проверке Quotes Feed. --- ## 10. Следующий этап ```text Build 043 — Финальная архитектурная проверка Quotes Feed ``` Цель Build 043: - проверить целостность всей архитектурной цепочки Quotes Feed; - подтвердить отсутствие legacy quote parsing; - подтвердить отсутствие legacy quote cache facade; - проверить REST и WebSocket пути получения котировок; - проверить единый canonical `Quote`; - проверить Feed → Handler → Adapter → Validation → Mapper → Storage → Consumer flow; - проверить границы ответственности модулей; - подтвердить готовность Quotes Feed к завершению миграции.