Skip to content

feat: Адаптация PositionAware автокурса для Manul API#93

Merged
dapi merged 5 commits intomasterfrom
feature/merge-71-adapt-manul
Jan 20, 2026
Merged

feat: Адаптация PositionAware автокурса для Manul API#93
dapi merged 5 commits intomasterfrom
feature/merge-71-adapt-manul

Conversation

@dapi
Copy link
Copy Markdown

@dapi dapi commented Jan 20, 2026

Адаптация PositionAware автокурса для Manul API

Описание

Этот PR решает проблему из Issue #92 и корректно адаптирует боевой PositionAware калькулятор из PR #71 для работы с Manul API.

Проблема

Решение

Использован безопасный подход "Merge and Adapt":

  1. Смерджен PR feat: Улучшить алгоритм автокурса - занимать позицию в диапазоне #71 в актуальную master ветку
  2. Адаптирован код для работы с Manul API (минимальные изменения)
  3. Обновлены все тесты для работы с хешами вместо объектов

Что изменено

Код

  • app/services/gera/autorate_calculators/base.rb: Добавлены методы-адаптеры для работы с Manul API

    • target_rate_percent(rate) - вычисляет комиссию из хеша Manul
    • changer_id(rate) - получает ID обменника
    • calculate_rate_commission() - вычисляет процент комиссии
  • app/services/gera/autorate_calculators/legacy.rb: Адаптирован для работы с хешами

  • app/services/gera/autorate_calculators/position_aware.rb: Адаптирован для работы с хешами, вся бизнес-логика сохранена

  • app/models/gera/exchange_rate.rb: Добавлена логика выбора калькулятора

    • Добавлены защитные проверки для работы до миграции БД

Тесты

Все тесты (27 шт) обновлены и проходят:

  • Создан хелпер manul_rate() для генерации хешей в формате Manul
  • Добавлены моки currency_rate и base_rate
  • Заменены все double('ExternalRate') на хеши
  • Использован be_within() для точных float сравнений

Проверка

✅ Все 43 теста проходят
✅ Логика PositionAware полностью сохранена
✅ Обратная совместимость обеспечена (по умолчанию legacy)
✅ Миграция БД готова (db/migrate/20251224134401_add_calculator_type_to_exchange_rates.rb)

Использование

После миграции БД:

# Для проблемных рынков - включить PositionAware
exchange_rate.update!(calculator_type: 'position_aware')

# Для возврата к старому поведению
exchange_rate.update!(calculator_type: 'legacy')

По умолчанию используется 'legacy' для обратной совместимости.

dapi and others added 4 commits December 25, 2025 11:21
Добавлен новый калькулятор PositionAware, который гарантирует,
что обменник займёт позицию внутри целевого диапазона, а не перепрыгнет выше.

Реализованные use cases:
- UC-1..UC-4: Базовая логика без перепрыгивания позиций выше
- UC-6: Адаптивный GAP для плотных рейтингов
- UC-8: Исключение своего обменника из расчёта (Gera.our_exchanger_id)
- UC-9: Защита от манипуляторов с аномальными курсами

Архитектура:
- Паттерн Strategy: Legacy (старое поведение) и PositionAware (новое)
- Выбор калькулятора через поле calculator_type в ExchangeRate
- Обратная совместимость: по умолчанию используется Legacy

Конфигурация:
- Gera.our_exchanger_id - ID обменника для исключения из расчёта
- Gera.anomaly_threshold_percent - порог аномалий (по умолчанию 50%)

Closes #69

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
… README

- В autorate_calculator_class бросаем ArgumentError для неизвестных типов
- Добавлена документация по конфигурации автокурса в README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@dapi dapi marked this pull request as ready for review January 20, 2026 18:26
…te' into feature/merge-71-adapt-manul

* origin/feature/69-position-aware-autorate:
  chore: Добавить Makefile и docker-compose.yml для разработки
  fix: Добавить raise для неизвестного calculator_type и документацию в README
  feat: Улучшить алгоритм автокурса - занимать позицию в диапазоне (#69)
@dapi dapi force-pushed the feature/merge-71-adapt-manul branch from 6602e34 to 5f057b0 Compare January 20, 2026 18:28
@dapi dapi merged commit eb7b114 into master Jan 20, 2026
1 check passed
@dapi dapi deleted the feature/merge-71-adapt-manul branch January 20, 2026 18:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant