Skip to content

Merge legacy branch into master#80

Closed
dapi wants to merge 33 commits intomasterfrom
feature/merge-legacy-to-master
Closed

Merge legacy branch into master#80
dapi wants to merge 33 commits intomasterfrom
feature/merge-legacy-to-master

Conversation

@dapi
Copy link
Copy Markdown

@dapi dapi commented Dec 30, 2025

Summary

  • Merge all features and fixes from legacy branch into master
  • Resolve conflicts between Ruby 3.4/Rails 8 updates in master and legacy functionality
  • Bump version to 0.5.0

Key changes from legacy:

  1. PositionAware autorate calculator - intelligent rate positioning based on competitor analysis
  2. Legacy autorate calculator - simplified rate calculation mode
  3. Optimized DirectionsRatesWorker - bulk insert instead of individual creates
  4. New currencies - CNY (юань), INR, AVAX added
  5. Improved documentation - CLAUDE.md, autorate_system.md
  6. Comprehensive test coverage - isolated specs for autorate calculators

Conflicts resolved:

File Resolution
.ruby-version Updated to Ruby 3.4.7 from master
mise.toml Updated to Ruby 3.4.7
lib/gera/version.rb Bumped to 0.5.0
CLAUDE.md Kept legacy additions (isolated tests docs, stage server)
directions_rates_worker.rb Kept legacy optimizations (bulk insert)
money_support_spec.rb Kept 40 currencies from legacy

Ruby 3.4 compatibility fixes:

  • Added observer gem (removed from stdlib)
  • Added mutex_m gem (removed from stdlib)
  • Added ostruct gem (will be removed in Ruby 3.5)
  • Updated load_defaults to 8.0

Test plan

  • Run full test suite after DatabaseRewinder compatibility fix
  • Verify autorate calculators work correctly
  • Test new currency rates fetching
  • Validate DirectionsRatesWorker bulk insert performance

Known issues requiring attention

  1. DatabaseRewinder - uses deprecated silence method, needs update or replacement
  2. Test suite - requires additional work for Rails 8 compatibility

🤖 Generated with Claude Code

m1ndg8mer and others added 30 commits October 20, 2025 14:01
Добавлен новый калькулятор 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>
…нии диапазонов)

Покрытые сценарии:
- Курсы конкурентов выше допустимого диапазона
- Курсы конкурентов ниже допустимого диапазона
- Нет курсов на целевых позициях (список короче)
- Частичное совпадение: часть позиций вне диапазона

Связано с: #69

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Исправлена проблема с плавающей точкой при расчёте комиссии.
После вычитания GAP получались числа вида -2.8346999999999998.

- Добавлена константа COMMISSION_PRECISION = 4
- Добавлен метод round_commission() в Base
- Применено округление в PositionAware калькуляторе
- Добавлены тесты на округление
- Версия: 0.3.3 → 0.4.0

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

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

При position_from=1 если курс первой позиции совпадает с курсом
второй позиции — не вычитаем GAP. Позволяем BestChange определить
позицию по резервам/времени обновления.

- Добавлен метод should_skip_gap?
- Добавлена проверка в метод call
- Добавлены тесты для UC-12 и UC-11
- Версия: 0.4.0 → 0.4.1

Closes #77

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Добавлено debug-логирование для отладки UC-11 на stage:
- Логирование входных параметров и промежуточных значений в call()
- Логирование в calculate_adaptive_gap() с выводом diff и выбранного GAP
- Логирование в adjust_for_position_above() с сравнением комиссий
- Логирование в find_non_anomalous_rate_above() с deviation для каждого курса

Конфигурация: Gera.autorate_debug_enabled = true (по умолчанию)
Логи помечены тегом [PositionAware] для удобного поиска.

🤖 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>
- Исправлена логика UC-12: теперь работает для position_from > 1
- При одинаковых курсах на позициях position_from и position_from-1
  GAP не вычитается (BestChange определит позицию по резервам)
- Добавлены тесты UC-12 для position_from=1,2,3,5 в isolated_spec.rb
- Исправлены тесты: GAP = 0.0001 (не 0.001)
- Добавлен stub для PaymentServices::Base::Client (issue #78)
- Документация по запуску изолированных тестов в CLAUDE.md
- Bump version to 0.4.3

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Тесты использовали неправильное значение GAP (0.001) вместо
фактического AUTO_COMISSION_GAP = 0.0001 из base.rb.

Изменения:
- position_aware_spec.rb: 0.001 → 0.0001 (9 мест)
- legacy_spec.rb: 0.001 → 0.0001 (2 места)
- standalone_spec.rb: 0.001 → 0.0001 (5 мест)

Обновлены комментарии для соответствия реальной логике.

🤖 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>
- Защита от деления на ноль при median=0 в find_non_anomalous_rate_above
- Обработка nil calculator_type как 'legacy' для обратной совместимости
- Добавлены тесты для edge cases

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…e-based-on-legacy

feat: Position-aware автокурс с округлением комиссии (#69, #75)
Resolved conflicts:
- .ruby-version: updated to Ruby 3.4.7 from master
- mise.toml: updated to Ruby 3.4.7
- lib/gera/version.rb: bumped to 0.5.0
- CLAUDE.md: kept legacy documentation additions
- app/workers/gera/directions_rates_worker.rb: kept legacy optimizations
- spec/lib/money_support_spec.rb: kept 40 currencies from legacy

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add observer, mutex_m, ostruct gems (removed from Ruby 3.4 stdlib)
- Update load_defaults to 8.0 for Rails 8 compatibility

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use Gemfile.lock from master (database_rewinder 1.1.0)
- Fix rate_comission_calculator to use find_by instead of detect
- Restore directions_rates_worker from master (auto_rate_settings not available)
- Update AUTO_COMISSION_GAP test expectation to 0.0001

Remaining issues:
- VCR cassettes need updating for new currencies (CNY, INR)
- position_aware_spec UC-6 needs investigation

Tests: 471 passing, 1 failing (excluding VCR-dependent tests)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Убрано allow_nil: true из валидации calculator_type -
   теперь соответствует миграции (null: false, default: 'legacy')

2. Исправлен метод autorate_calculator_class - убрана
   обработка nil (невозможна при null: false)

3. Обновлен тест: вместо ожидания Legacy для nil теперь
   проверяется невалидность nil и default value

4. Исправлено значение AUTO_COMISSION_GAP в документации
   с 0.01 на 0.0001

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
dapi and others added 3 commits December 30, 2025 23:56
1. BybitFetcher (6 тестов): Добавлены методы http_request и
   safely_parse в PaymentServices::Base::Client stub

2. position_aware UC-6: Исправлено ожидание теста с 2.49995 на 2.5
   (2.49995.round(4) = 2.5 из-за COMMISSION_PRECISION = 4)

3. CbrRatesWorker: Добавлены отсутствующие валюты CNY и INR в mock

Все 484 теста теперь проходят.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Изменен autorate_debug_enabled default на false для production
- Добавлено логирование в пустой rescue блок DirectionsRatesWorker
- Добавлено логирование в build_currency_rate (CurrencyRateModeBuilderSupport)
- Централизована константа AUTO_COMISSION_GAP через ссылку на Base
- Добавлен интеграционный тест для делегирования калькуляторов
- Обновлен тест логгера для поддержки warn/error

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@dapi dapi closed this Jan 20, 2026
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.

2 participants