obabot 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. obabot-0.1.0/.github/SECRETS_SETUP.md +100 -0
  2. obabot-0.1.0/.github/workflows/test.yml +234 -0
  3. obabot-0.1.0/.gitignore +55 -0
  4. obabot-0.1.0/BUSINESS_VALUE.md +218 -0
  5. obabot-0.1.0/INTERFACE_COVERAGE.md +244 -0
  6. obabot-0.1.0/LICENSE +29 -0
  7. obabot-0.1.0/PKG-INFO +356 -0
  8. obabot-0.1.0/README.md +340 -0
  9. obabot-0.1.0/examples/aiogram_migrated.py +253 -0
  10. obabot-0.1.0/examples/aiogram_original.py +199 -0
  11. obabot-0.1.0/examples/dual_platform.py +185 -0
  12. obabot-0.1.0/examples/max_only.py +137 -0
  13. obabot-0.1.0/examples/telegram_only.py +139 -0
  14. obabot-0.1.0/examples/test_mode_example.py +81 -0
  15. obabot-0.1.0/obabot/__init__.py +39 -0
  16. obabot-0.1.0/obabot/adapters/__init__.py +29 -0
  17. obabot-0.1.0/obabot/adapters/keyboard.py +342 -0
  18. obabot-0.1.0/obabot/adapters/max_callback.py +365 -0
  19. obabot-0.1.0/obabot/adapters/max_file.py +159 -0
  20. obabot-0.1.0/obabot/adapters/message.py +1114 -0
  21. obabot-0.1.0/obabot/adapters/telegram_callback.py +211 -0
  22. obabot-0.1.0/obabot/adapters/user.py +93 -0
  23. obabot-0.1.0/obabot/config.py +296 -0
  24. obabot-0.1.0/obabot/context.py +61 -0
  25. obabot-0.1.0/obabot/detection.py +168 -0
  26. obabot-0.1.0/obabot/factory.py +160 -0
  27. obabot-0.1.0/obabot/filters.py +123 -0
  28. obabot-0.1.0/obabot/fsm.py +126 -0
  29. obabot-0.1.0/obabot/mixins.py +70 -0
  30. obabot-0.1.0/obabot/platforms/__init__.py +8 -0
  31. obabot-0.1.0/obabot/platforms/base.py +85 -0
  32. obabot-0.1.0/obabot/platforms/lazy.py +94 -0
  33. obabot-0.1.0/obabot/platforms/max.py +632 -0
  34. obabot-0.1.0/obabot/platforms/telegram.py +127 -0
  35. obabot-0.1.0/obabot/proxy/__init__.py +8 -0
  36. obabot-0.1.0/obabot/proxy/bot.py +1179 -0
  37. obabot-0.1.0/obabot/proxy/dispatcher.py +607 -0
  38. obabot-0.1.0/obabot/proxy/router.py +525 -0
  39. obabot-0.1.0/obabot/types.py +79 -0
  40. obabot-0.1.0/obabot/utils/__init__.py +21 -0
  41. obabot-0.1.0/obabot/utils/safe_send.py +107 -0
  42. obabot-0.1.0/obabot/utils/text_format.py +151 -0
  43. obabot-0.1.0/pyproject.toml +28 -0
  44. obabot-0.1.0/pytest.ini +21 -0
  45. obabot-0.1.0/tests/README.md +81 -0
  46. obabot-0.1.0/tests/__init__.py +2 -0
  47. obabot-0.1.0/tests/conftest.py +82 -0
  48. obabot-0.1.0/tests/test_aiogram_comparison.py +186 -0
  49. obabot-0.1.0/tests/test_basic.py +173 -0
  50. obabot-0.1.0/tests/test_bot_methods.py +250 -0
  51. obabot-0.1.0/tests/test_compatibility.py +97 -0
  52. obabot-0.1.0/tests/test_detection.py +253 -0
  53. obabot-0.1.0/tests/test_dispatcher.py +815 -0
  54. obabot-0.1.0/tests/test_e2e_migration.py +2116 -0
  55. obabot-0.1.0/tests/test_handlers.py +306 -0
  56. obabot-0.1.0/tests/test_integration.py +53 -0
  57. obabot-0.1.0/tests/test_integration_real.py +412 -0
  58. obabot-0.1.0/tests/test_router_handlers.py +366 -0
  59. obabot-0.1.0/tests/test_test_mode.py +128 -0
  60. obabot-0.1.0/tests/test_text_format.py +148 -0
  61. obabot-0.1.0/tests/test_umaxbot.py +740 -0
  62. obabot-0.1.0/tests/test_unified_interface.py +728 -0
  63. obabot-0.1.0/tests/test_webhook_telegram.py +53 -0
@@ -0,0 +1,100 @@
1
+ # Настройка секретов для тестов
2
+
3
+ Для запуска тестов в GitHub Actions необходимо добавить тестовые токены в секреты репозитория.
4
+
5
+ ## Шаги настройки
6
+
7
+ 1. Перейдите в настройки репозитория: **Settings** → **Secrets and variables** → **Actions**
8
+
9
+ 2. Добавьте следующие секреты:
10
+
11
+ - **TG_TEST_TOKEN** - токен Telegram бота для тестирования
12
+ - **MAX_TEST_TOKEN** - токен Max бота для тестирования
13
+
14
+ 3. Нажмите **New repository secret** для каждого токена
15
+
16
+ ## Получение тестовых токенов
17
+
18
+ ### Telegram
19
+ 1. Создайте бота через [@BotFather](https://t.me/BotFather)
20
+ 2. Получите токен командой `/newbot`
21
+ 3. Используйте этот токен как `TG_TEST_TOKEN`
22
+
23
+ ### Max
24
+ 1. Перейдите на [developers.max.ru](https://developers.max.ru)
25
+ 2. Создайте приложение и бота
26
+ 3. Получите токен бота
27
+ 4. Используйте этот токен как `MAX_TEST_TOKEN`
28
+
29
+ ## Структура тестов в CI
30
+
31
+ GitHub Actions запускает тесты параллельно для максимальной скорости:
32
+
33
+ ```
34
+ ┌─────────────────────────────────────────────────────────────┐
35
+ │ Unit Tests │
36
+ │ (Python 3.10, 3.13, 3.14 - параллельно) │
37
+ └─────────────────────┬───────────────────────────────────────┘
38
+
39
+ ┌─────────────┴─────────────┐
40
+ │ │
41
+ ▼ ▼
42
+ ┌───────────────────┐ ┌───────────────────┐
43
+ │ E2E Telegram │ │ E2E Max │
44
+ │ (параллельно) │ │ (параллельно) │
45
+ └─────────┬─────────┘ └─────────┬─────────┘
46
+ │ │
47
+ └───────────┬─────────────┘
48
+
49
+
50
+ ┌─────────────────────┐
51
+ │ Integration Tests │
52
+ │ (требуют токены) │
53
+ └─────────────────────┘
54
+ ```
55
+
56
+ ### Jobs в CI
57
+
58
+ | Job | Описание | Зависимости |
59
+ |-----|----------|-------------|
60
+ | `unit-tests` | Быстрые unit тесты без внешних зависимостей | - |
61
+ | `e2e-telegram` | E2E тесты для Telegram | `unit-tests` |
62
+ | `e2e-max` | E2E тесты для Max | `unit-tests` |
63
+ | `compatibility` | Тесты совместимости с разными версиями aiogram | `unit-tests` |
64
+ | `integration` | Интеграционные тесты с реальными API | `e2e-telegram`, `e2e-max` |
65
+
66
+ ## Тесты без токенов
67
+
68
+ Если токены не указаны:
69
+ - **Unit тесты** — выполняются полностью
70
+ - **E2E тесты** — выполняются с симулированными payload'ами
71
+ - **Integration тесты** — пропускаются (skip)
72
+
73
+ ## Локальный запуск тестов
74
+
75
+ ```bash
76
+ # Все тесты
77
+ pytest tests/ -v
78
+
79
+ # Только unit тесты
80
+ pytest tests/ -v --ignore=tests/test_e2e_migration.py --ignore=tests/test_integration.py
81
+
82
+ # Только E2E тесты для Telegram
83
+ pytest tests/test_e2e_migration.py -v -k "telegram"
84
+
85
+ # Только E2E тесты для Max
86
+ pytest tests/test_e2e_migration.py -v -k "max"
87
+
88
+ # Тесты для обеих платформ
89
+ pytest tests/test_e2e_migration.py -v -k "dual"
90
+ ```
91
+
92
+ ## Маркеры тестов
93
+
94
+ | Маркер | Описание |
95
+ |--------|----------|
96
+ | `@pytest.mark.e2e` | End-to-end тесты |
97
+ | `@pytest.mark.telegram` | Тесты для Telegram |
98
+ | `@pytest.mark.max` | Тесты для Max |
99
+ | `@pytest.mark.dual` | Тесты для обеих платформ |
100
+ | `@pytest.mark.integration` | Тесты с реальными API |
@@ -0,0 +1,234 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ # Unit tests - all Python versions in parallel
12
+ unit-tests:
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ python-version: ["3.10", "3.13", "3.14"]
18
+
19
+ name: Unit (Py ${{ matrix.python-version }})
20
+
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Set up Python ${{ matrix.python-version }}
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: ${{ matrix.python-version }}
28
+
29
+ - name: Install dependencies
30
+ run: |
31
+ python -m pip install --upgrade pip
32
+ pip install --upgrade "typing_extensions>=4.8.0"
33
+ pip install pytest pytest-asyncio pytest-cov
34
+ pip install "aiogram>=3.0.0"
35
+ pip install -e ".[dev]"
36
+ pip install --upgrade --force-reinstall "typing_extensions>=4.8.0"
37
+
38
+ - name: Run unit tests
39
+ run: |
40
+ pytest tests/ -v \
41
+ --ignore=tests/test_e2e_migration.py \
42
+ --ignore=tests/test_integration.py \
43
+ --ignore=tests/test_integration_real.py \
44
+ --ignore=tests/test_webhook_telegram.py \
45
+ -m "not integration and not e2e"
46
+
47
+ # Test mode (no tokens, no network) — always runs in CI.
48
+ # We do NOT install aiogram-test-framework: that is for the user's project.
49
+ # Our tests only need: pytest, pytest-asyncio, aiogram, obabot (and umaxbot via obabot).
50
+ test-mode:
51
+ runs-on: ubuntu-latest
52
+ strategy:
53
+ fail-fast: false
54
+ matrix:
55
+ python-version: ["3.10", "3.13"]
56
+
57
+ name: Test mode (Py ${{ matrix.python-version }})
58
+
59
+ steps:
60
+ - uses: actions/checkout@v4
61
+
62
+ - name: Set up Python ${{ matrix.python-version }}
63
+ uses: actions/setup-python@v5
64
+ with:
65
+ python-version: ${{ matrix.python-version }}
66
+
67
+ - name: Install dependencies
68
+ run: |
69
+ python -m pip install --upgrade pip
70
+ pip install pytest pytest-asyncio
71
+ pip install "aiogram>=3.0.0"
72
+ pip install -e .
73
+
74
+ - name: Run test-mode tests
75
+ run: |
76
+ pytest tests/test_test_mode.py tests/test_basic.py -v -k "test_mode or test_create_bot_no_tokens"
77
+
78
+ # E2E tests for Telegram
79
+ e2e-telegram:
80
+ runs-on: ubuntu-latest
81
+
82
+ name: E2E Telegram
83
+
84
+ steps:
85
+ - uses: actions/checkout@v4
86
+
87
+ - name: Set up Python 3.13
88
+ uses: actions/setup-python@v5
89
+ with:
90
+ python-version: "3.13"
91
+
92
+ - name: Install dependencies
93
+ run: |
94
+ python -m pip install --upgrade pip
95
+ pip install --upgrade "typing_extensions>=4.8.0"
96
+ pip install pytest pytest-asyncio pytest-cov
97
+ pip install "aiogram>=3.0.0"
98
+ pip install -e ".[dev]"
99
+ pip install --upgrade --force-reinstall "typing_extensions>=4.8.0"
100
+
101
+ - name: Run E2E Telegram tests
102
+ env:
103
+ TG_TOKEN: ${{ secrets.TG_TEST_TOKEN }}
104
+ run: |
105
+ pytest tests/test_e2e_migration.py tests/test_webhook_telegram.py -v \
106
+ -k "telegram or Telegram or tg or dual" \
107
+ --cov=obabot --cov-report=xml
108
+
109
+ - name: Upload coverage
110
+ uses: codecov/codecov-action@v3
111
+ with:
112
+ file: ./coverage.xml
113
+ flags: e2e-telegram
114
+
115
+ # E2E tests for Max
116
+ e2e-max:
117
+ runs-on: ubuntu-latest
118
+
119
+ name: E2E Max
120
+
121
+ steps:
122
+ - uses: actions/checkout@v4
123
+
124
+ - name: Set up Python 3.13
125
+ uses: actions/setup-python@v5
126
+ with:
127
+ python-version: "3.13"
128
+
129
+ - name: Install dependencies
130
+ run: |
131
+ python -m pip install --upgrade pip
132
+ pip install --upgrade "typing_extensions>=4.8.0"
133
+ pip install pytest pytest-asyncio pytest-cov
134
+ pip install "aiogram>=3.0.0"
135
+ pip install -e ".[dev]"
136
+ pip install --upgrade --force-reinstall "typing_extensions>=4.8.0"
137
+
138
+ - name: Run E2E Max tests
139
+ env:
140
+ MAX_TOKEN: ${{ secrets.MAX_TEST_TOKEN }}
141
+ run: |
142
+ pytest tests/test_e2e_migration.py -v \
143
+ -k "max or Max" \
144
+ --cov=obabot --cov-report=xml
145
+
146
+ - name: Upload coverage
147
+ uses: codecov/codecov-action@v3
148
+ with:
149
+ file: ./coverage.xml
150
+ flags: e2e-max
151
+
152
+ # Compatibility tests - different aiogram versions
153
+ compatibility:
154
+ runs-on: ubuntu-latest
155
+ strategy:
156
+ fail-fast: false
157
+ matrix:
158
+ include:
159
+ - python-version: "3.10"
160
+ aiogram-version: "3.0.0"
161
+ test-name: "aiogram-3.0"
162
+ - python-version: "3.13"
163
+ aiogram-version: "3.24"
164
+ test-name: "aiogram-3.24"
165
+ - python-version: "3.14"
166
+ aiogram-version: ""
167
+ test-name: "aiogram-latest"
168
+
169
+ name: Compat ${{ matrix.test-name }}
170
+
171
+ steps:
172
+ - uses: actions/checkout@v4
173
+
174
+ - name: Set up Python ${{ matrix.python-version }}
175
+ uses: actions/setup-python@v5
176
+ with:
177
+ python-version: ${{ matrix.python-version }}
178
+
179
+ - name: Install dependencies
180
+ run: |
181
+ python -m pip install --upgrade pip
182
+ pip install --upgrade "typing_extensions>=4.8.0"
183
+ pip install pytest pytest-asyncio pytest-cov
184
+
185
+ if [ "${{ matrix.aiogram-version }}" != "" ]; then
186
+ pip install "aiogram==${{ matrix.aiogram-version }}"
187
+ else
188
+ pip install "aiogram>=3.0.0"
189
+ fi
190
+
191
+ pip install -e ".[dev]"
192
+ pip install --upgrade --force-reinstall "typing_extensions>=4.8.0"
193
+
194
+ - name: Run compatibility tests
195
+ run: |
196
+ pytest tests/test_compatibility.py tests/test_aiogram_comparison.py -v
197
+
198
+ # Integration tests - require real tokens
199
+ integration:
200
+ runs-on: ubuntu-latest
201
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
202
+
203
+ name: Integration
204
+
205
+ steps:
206
+ - uses: actions/checkout@v4
207
+
208
+ - name: Set up Python 3.13
209
+ uses: actions/setup-python@v5
210
+ with:
211
+ python-version: "3.13"
212
+
213
+ - name: Install dependencies
214
+ run: |
215
+ python -m pip install --upgrade pip
216
+ pip install --upgrade "typing_extensions>=4.8.0"
217
+ pip install pytest pytest-asyncio pytest-cov
218
+ pip install "aiogram>=3.0.0"
219
+ pip install -e ".[dev]"
220
+ pip install --upgrade --force-reinstall "typing_extensions>=4.8.0"
221
+
222
+ - name: Run integration tests
223
+ env:
224
+ TG_TOKEN: ${{ secrets.TG_TEST_TOKEN }}
225
+ MAX_TOKEN: ${{ secrets.MAX_TEST_TOKEN }}
226
+ run: |
227
+ pytest tests/test_integration.py -v -m integration \
228
+ --cov=obabot --cov-report=xml
229
+
230
+ - name: Upload coverage
231
+ uses: codecov/codecov-action@v3
232
+ with:
233
+ file: ./coverage.xml
234
+ flags: integration
@@ -0,0 +1,55 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ venv/
25
+ env/
26
+ ENV/
27
+ .venv
28
+
29
+ # IDE
30
+ .vscode/
31
+ .idea/
32
+ *.swp
33
+ *.swo
34
+ *~
35
+
36
+ # Testing
37
+ .pytest_cache/
38
+ .coverage
39
+ htmlcov/
40
+ .tox/
41
+ coverage.xml
42
+ *.cover
43
+
44
+ # Environment variables
45
+ .env
46
+ .env.local
47
+
48
+ # OS
49
+ .DS_Store
50
+ Thumbs.db
51
+
52
+ # Project specific
53
+ *.log
54
+ .cursor/
55
+
@@ -0,0 +1,218 @@
1
+ # Бизнес-ценность obabot
2
+
3
+ ## Что видит новый пользователь
4
+
5
+ Когда разработчик открывает репозиторий obabot, он видит:
6
+
7
+ ### 🎯 Главная ценность: "Пиши один раз — работай везде"
8
+
9
+ **Проблема, которую решает библиотека:**
10
+
11
+ Разработчики ботов сталкиваются с необходимостью поддерживать код для разных мессенджеров (Telegram, Max и др.). Это означает:
12
+ - Дублирование кода
13
+ - Двойная поддержка
14
+ - Сложность миграции между платформами
15
+ - Разные API и подходы
16
+
17
+ **Решение obabot:**
18
+
19
+ Один код → работает на Telegram, Max или обеих платформах одновременно.
20
+
21
+ ---
22
+
23
+ ## Основные преимущества
24
+
25
+ ### 1. ⚡ Экономия времени разработки
26
+
27
+ **Без obabot:**
28
+ ```
29
+ Telegram бот: 1000 строк кода
30
+ Max бот: 1000 строк кода (почти идентичных)
31
+ Итого: 2000 строк, двойная поддержка
32
+ ```
33
+
34
+ **С obabot:**
35
+ ```
36
+ Универсальный бот: 1000 строк кода
37
+ Итого: 1000 строк, одна поддержка
38
+ ```
39
+
40
+ **Экономия: 50% кода и времени на поддержку**
41
+
42
+ ### 2. 🔄 Простота миграции
43
+
44
+ **Сценарий:** Вы написали бота для Telegram, но нужно запустить его на Max.
45
+
46
+ **Без obabot:**
47
+ - Переписывать все хендлеры под API Max
48
+ - Изучать новую библиотеку (aiomax)
49
+ - Адаптировать FSM, клавиатуры, медиа
50
+ - Тестировать заново
51
+ - **Время: дни/недели работы**
52
+
53
+ **С obabot:**
54
+ - Меняете одну строку: `tg_token` → `max_token`
55
+ - Всё остальное работает автоматически
56
+ - **Время: 30 секунд**
57
+
58
+ ### 3. 💰 Снижение затрат на поддержку
59
+
60
+ **Проблема:** Два кодабаза = двойные баги, двойные обновления, двойное тестирование
61
+
62
+ **Решение:** Один кодбаза = один багфикс исправляет обе платформы
63
+
64
+ **Пример:**
65
+ - Нашли баг в логике регистрации
66
+ - Исправили в одном месте
67
+ - Работает на Telegram и Max автоматически
68
+
69
+ ### 4. 🚀 Быстрый старт на новых платформах
70
+
71
+ **Сценарий:** У вас есть успешный Telegram-бот, хотите запустить на Max.
72
+
73
+ **Без obabot:**
74
+ - Нужен разработчик, знающий aiomax
75
+ - Нужно время на изучение API
76
+ - Риск ошибок при портировании
77
+ - **Срок: 1-2 недели**
78
+
79
+ **С obabot:**
80
+ - Меняете токен
81
+ - Запускаете
82
+ - **Срок: 5 минут**
83
+
84
+ ### 5. 🎛️ Гибкость: одна или обе платформы
85
+
86
+ **Вариант 1:** Только Telegram
87
+ ```python
88
+ bot, dp, router = create_bot(tg_token="TOKEN")
89
+ ```
90
+
91
+ **Вариант 2:** Только Max
92
+ ```python
93
+ bot, dp, router = create_bot(max_token="TOKEN")
94
+ ```
95
+
96
+ **Вариант 3:** Обе платформы одновременно
97
+ ```python
98
+ bot, dp, router = create_bot(tg_token="TG", max_token="MAX")
99
+ # Один код обрабатывает сообщения с обеих платформ!
100
+ ```
101
+
102
+ ---
103
+
104
+ ## Реальные сценарии использования
105
+
106
+ ### Сценарий 1: Стартап с ограниченным бюджетом
107
+
108
+ **Ситуация:** Нужен бот для Telegram и Max, но бюджет на разработку ограничен.
109
+
110
+ **С obabot:**
111
+ - Написали один раз
112
+ - Запустили на обеих платформах
113
+ - Экономия: 50% бюджета на разработку
114
+
115
+ ### Сценарий 2: Миграция с Telegram на Max
116
+
117
+ **Ситуация:** Решили перейти с Telegram на Max (или наоборот).
118
+
119
+ **Без obabot:**
120
+ - Переписывать весь код
121
+ - Риск потерять функциональность
122
+ - Долгий процесс миграции
123
+
124
+ **С obabot:**
125
+ - Меняете токен
126
+ - Всё работает
127
+ - Миграция за минуты
128
+
129
+ ### Сценарий 3: Мультиплатформенный бот
130
+
131
+ **Ситуация:** Нужен бот, который работает и в Telegram, и в Max одновременно.
132
+
133
+ **Без obabot:**
134
+ - Два отдельных бота
135
+ - Дублирование логики
136
+ - Сложная синхронизация данных
137
+
138
+ **С obabot:**
139
+ - Один бот, одна логика
140
+ - Автоматическая обработка обеих платформ
141
+ - Простота поддержки
142
+
143
+ ---
144
+
145
+ ## Технические преимущества
146
+
147
+ ### ✅ Совместимость с aiogram
148
+
149
+ Если вы уже знаете aiogram — вы уже знаете obabot. API идентичен.
150
+
151
+ ### ✅ Минимальные изменения при миграции
152
+
153
+ ```python
154
+ # Было (aiogram):
155
+ from aiogram import Bot, Dispatcher, Router
156
+ bot = Bot(token="...")
157
+ dp = Dispatcher()
158
+ router = Router()
159
+
160
+ # Стало (obabot):
161
+ from obabot import create_bot
162
+ bot, dp, router = create_bot(tg_token="...")
163
+ ```
164
+
165
+ **Изменения: 2 строки импорта + 1 строка инициализации**
166
+
167
+ ### ✅ Нативная производительность для Telegram
168
+
169
+ Telegram работает напрямую через aiogram — без накладных расходов.
170
+
171
+ ### ✅ Прозрачная адаптация для Max
172
+
173
+ Max автоматически адаптируется под API aiogram — вы не замечаете разницы.
174
+
175
+ ---
176
+
177
+ ## Итоговая ценность
178
+
179
+ ### Для разработчика:
180
+ - ⏱️ **Экономия времени:** пишете код один раз
181
+ - 🧠 **Меньше когнитивной нагрузки:** один API вместо двух
182
+ - 🐛 **Меньше багов:** один кодбаза = меньше мест для ошибок
183
+
184
+ ### Для бизнеса:
185
+ - 💵 **Экономия денег:** меньше разработки = меньше затрат
186
+ - ⚡ **Быстрее на рынок:** запуск на новой платформе за минуты
187
+ - 🔒 **Меньше рисков:** миграция между платформами безболезненна
188
+ - 📈 **Масштабируемость:** легко добавить третью платформу в будущем
189
+
190
+ ### Для проекта:
191
+ - 📦 **Один кодбаза:** проще поддерживать
192
+ - 🧪 **Одно тестирование:** тесты покрывают обе платформы
193
+ - 📝 **Одна документация:** не нужно дублировать
194
+
195
+ ---
196
+
197
+ ## Кому подходит obabot?
198
+
199
+ ✅ **Разработчикам ботов на aiogram** — минимальная миграция
200
+ ✅ **Стартапам** — экономия бюджета на разработку
201
+ ✅ **Компаниям с мультиплатформенными ботами** — упрощение поддержки
202
+ ✅ **Проектам, планирующим миграцию** — снижение рисков
203
+ ✅ **Командам с ограниченными ресурсами** — максимум результата при минимуме кода
204
+
205
+ ---
206
+
207
+ ## ROI (Return on Investment)
208
+
209
+ **Инвестиция:** Изучение obabot (30 минут) + миграция (1 час)
210
+
211
+ **Возврат:**
212
+ - Экономия 50% времени на разработку для второй платформы
213
+ - Экономия 50% времени на поддержку
214
+ - Возможность быстрого запуска на новых платформах
215
+ - Снижение рисков при миграции
216
+
217
+ **Вывод:** Инвестиция окупается уже при первом использовании.
218
+