amochka 0.3.0__py3-none-any.whl → 0.3.1__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amochka
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Python library for working with amoCRM API with ETL capabilities
5
5
  Author-email: Timur <timurdt@gmail.com>
6
6
  License: MIT
@@ -39,88 +39,167 @@ Requires-Dist: python-dotenv>=1.0.0
39
39
  - Редактирование сделок, включая обновление стандартных и кастомных полей
40
40
  - Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
41
41
  - Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
42
+ - **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
42
43
 
43
- ### Основные функции
44
+ ## Возможности
45
+
46
+ ### API клиент
44
47
 
45
48
  - `get_deal_by_id(deal_id)` — получение детальной информации по сделке
46
49
  - `get_pipelines()` — список воронок и статусов
47
50
  - `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
48
51
 
52
+ ### ETL модуль
53
+
54
+ - **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
55
+ - **Transformers**: преобразование в табличный формат для БД
56
+ - **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
57
+ - **Migrations**: автоматическое создание таблиц и схем
58
+ - **Incremental sync**: инкрементальная синхронизация по updated_at
59
+ - Интеграция с **Apache Airflow** для автоматизации ETL процессов
60
+
49
61
  ## Требования к окружению
50
62
 
51
- Python 3.8 или новее. Потребуются пакеты `requests` и `ratelimit`.
63
+ Python 3.6 или новее.
52
64
 
53
65
  ## Установка
54
66
 
55
- Установите зависимости командой:
56
-
57
67
  ```bash
58
- pip install requests ratelimit
68
+ pip install amochka
59
69
  ```
60
70
 
61
- Затем скопируйте репозиторий или установите пакет из PyPI (после публикации):
71
+ Для использования ETL модуля установите дополнительные зависимости:
62
72
 
63
73
  ```bash
64
- pip install amochka
74
+ pip install amochka psycopg2-binary python-dotenv
65
75
  ```
66
76
 
67
77
  ## Кэширование кастомных полей
68
78
 
69
79
  Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
70
80
 
71
- ## Выгрузка обновленных сделок
81
+ ## Примеры использования
72
82
 
73
- Метод `fetch_updated_leads_raw()` позволяет получить все сделки из указанной воронки, которые были изменены в заданный промежуток времени. Результат можно сохранить в JSON-файл без какой‑либо обработки:
83
+ ### Быстрый старт: выгрузка обновленных сделок
74
84
 
75
85
  ```python
76
86
  from datetime import datetime, timedelta
77
87
  from amochka import AmoCRMClient, CacheConfig
78
88
 
79
89
  client = AmoCRMClient(
80
- base_url="https://bneginskogo.amocrm.ru",
81
- token_file="/path/to/token.json",
90
+ base_url="https://example.amocrm.ru",
91
+ token_file="token.json",
82
92
  cache_config=CacheConfig.disabled(),
83
93
  disable_logging=True
84
94
  )
85
95
 
86
96
  three_hours_ago = datetime.utcnow() - timedelta(hours=3)
87
- client.fetch_updated_leads_raw(6241334, updated_from=three_hours_ago, save_to_file="leads.json")
97
+ leads = client.fetch_updated_leads_raw(
98
+ pipeline_id=123456,
99
+ updated_from=three_hours_ago,
100
+ save_to_file="leads.json",
101
+ include_contacts=True
102
+ )
88
103
  ```
89
104
 
90
- Пример получаемого JSON (укороченный):
105
+ ### ETL: синхронизация в PostgreSQL
106
+
107
+ ```python
108
+ from etl.config import DatabaseConfig, AmoCRMAccount
109
+ from etl.extractors import AmoCRMExtractor
110
+ from etl.loaders import PostgresLoader
111
+ from etl.run_etl import sync_leads_with_contacts
112
+ from datetime import datetime, timezone
113
+
114
+ # Настройка БД
115
+ db_config = DatabaseConfig(
116
+ host="localhost",
117
+ port=5432,
118
+ dbname="amocrm",
119
+ user="postgres",
120
+ password="password",
121
+ schema="public"
122
+ )
123
+
124
+ # Настройка amoCRM аккаунта
125
+ account = AmoCRMAccount(
126
+ id=1,
127
+ name="main",
128
+ base_url="https://example.amocrm.ru",
129
+ token_path="token.json",
130
+ mybi_account_id=1,
131
+ pipeline_ids=[123456]
132
+ )
133
+
134
+ # ETL процесс
135
+ loader = PostgresLoader(db_config)
136
+ extractor = AmoCRMExtractor(account)
137
+
138
+ result = sync_leads_with_contacts(
139
+ extractor=extractor,
140
+ loader=loader,
141
+ mybi_account_id=1,
142
+ updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
143
+ updated_to=datetime.now(timezone.utc),
144
+ pipeline_ids=[123456]
145
+ )
146
+
147
+ print(f"Загружено сделок: {result['leads_count']}")
148
+ print(f"Загружено контактов: {result['contacts_count']}")
149
+ ```
150
+
151
+ ### Пример структуры данных
91
152
 
92
153
  ```json
93
154
  [
94
155
  {
95
- "id": 26282337,
96
- "name": "Автосделка: Заявка от (Максим Брокер Дубай Бюро Негинского)",
156
+ "id": 12345678,
157
+ "name": "Сделка: Заявка от клиента",
97
158
  "custom_fields_values": [
98
159
  {
99
- "field_name": "roistat",
100
- "values": [{"value": "2026"}]
160
+ "field_name": "utm_source",
161
+ "values": [{"value": "google"}]
101
162
  }
102
163
  ],
103
164
  "_embedded": {
104
165
  "tags": [
105
- {"id": 179813, "name": "WZ (Федор 971568113315)"}
166
+ {"id": 123, "name": "Приоритетный клиент"}
106
167
  ]
107
168
  }
108
169
  }
109
170
  ]
110
171
  ```
111
172
 
112
- Для подключения к реальному аккаунту сохраните JSON с OAuth‑токеном и укажите его путь в параметре `token_file` при создании клиента. Базовый URL можно взять из переменной окружения `AMO_BASE_URL`.
173
+ ## Интеграция с Apache Airflow
174
+
175
+ Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
176
+
177
+ ```python
178
+ from airflow.decorators import dag, task
179
+ from etl.config import DatabaseConfig, AmoCRMAccount
180
+ from etl.run_etl import sync_leads_with_contacts
181
+
182
+ @dag(schedule_interval=None)
183
+ def amocrm_sync():
184
+ @task
185
+ def sync_data():
186
+ db_config = DatabaseConfig.from_env()
187
+ account = AmoCRMAccount.from_env()
188
+ # ... ETL процесс
189
+
190
+ amocrm_sync()
191
+ ```
113
192
 
114
193
  ## Тесты
115
194
 
116
- Файл `tests/test_client.py` содержит небольшой набор автоматических тестов, написанных на [pytest](https://docs.pytest.org/). Они запускают методы клиента на подставном классе `DummyClient` и проверяют, что функции работают так, как ожидается. Запустить тесты можно командой:
195
+ Запустить тесты можно командой:
117
196
 
118
197
  ```bash
119
198
  pytest -q
120
199
  ```
121
200
 
122
- Эти тесты помогают убедиться, что изменения в коде не ломают основную функциональность.
201
+ Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
123
202
 
124
- ## Пример использования `fetch_updated_leads_raw`
203
+ ## Лицензия
125
204
 
126
- Кроме примера в разделе выше, код из `example_fetch.py` демонстрирует полный процесс получения сделок и сохранения их в файл.
205
+ MIT
@@ -8,7 +8,7 @@ etl/loaders.py,sha256=nQx6TDwnuHVWzjmuKY9v-23hmmk4Ex6ZoGtb3PApO1k,31974
8
8
  etl/run_etl.py,sha256=p_2NxJwXMiACMETvRsjrozMgz66U9ezDNSWZXUieNMs,26262
9
9
  etl/transformers.py,sha256=OwYJ_9l3oqvy2Y3-umXjAGweOIqlfRI0iSiCFPrcQ8E,17867
10
10
  etl/migrations/001_create_tables.sql,sha256=YrSaZjpofC1smjYx0bM4eHQumboruIBY3fwRDlJLLSo,15749
11
- amochka-0.3.0.dist-info/METADATA,sha256=5dZFPOs2wupzc0VsYVXyk1pJ-F4Kwm997N9EA_Z7htE,6371
12
- amochka-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
13
- amochka-0.3.0.dist-info/top_level.txt,sha256=grRX8aLFG-yYKPsAqCD6sUBmdLSQeOMHsc9Dl6S7Lzo,12
14
- amochka-0.3.0.dist-info/RECORD,,
11
+ amochka-0.3.1.dist-info/METADATA,sha256=CF7UAIgc6PvyJv9I8CULTlBQOV8BITZlwscrUo3BM10,7562
12
+ amochka-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
13
+ amochka-0.3.1.dist-info/top_level.txt,sha256=grRX8aLFG-yYKPsAqCD6sUBmdLSQeOMHsc9Dl6S7Lzo,12
14
+ amochka-0.3.1.dist-info/RECORD,,