chutils 2.1.0__tar.gz → 2.2.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.
- {chutils-2.1.0 → chutils-2.2.0}/PKG-INFO +131 -10
- {chutils-2.1.0 → chutils-2.2.0}/README.md +364 -245
- {chutils-2.1.0 → chutils-2.2.0}/pyproject.toml +19 -2
- {chutils-2.1.0 → chutils-2.2.0}/src/chutils/__init__.py +107 -102
- {chutils-2.1.0 → chutils-2.2.0}/src/chutils/config.py +510 -440
- chutils-2.2.0/src/chutils/decorators.py +55 -0
- chutils-2.2.0/src/chutils/logger.py +433 -0
- chutils-2.2.0/src/chutils/secret_manager.py +247 -0
- chutils-2.1.0/src/chutils/decorators.py +0 -16
- chutils-2.1.0/src/chutils/logger.py +0 -226
- chutils-2.1.0/src/chutils/secret_manager.py +0 -166
- {chutils-2.1.0 → chutils-2.2.0}/LICENSE +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: chutils
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
7
|
-
Author:
|
|
7
|
+
Author: Chu4hel
|
|
8
8
|
Author-email: sergeiivanov636@gmail.com
|
|
9
9
|
Requires-Python: >=3.9
|
|
10
10
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -15,7 +15,9 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Requires-Dist: dotenv (>=0.9.9,<0.10.0)
|
|
18
19
|
Requires-Dist: keyring (>=25.6.0,<26.0.0)
|
|
20
|
+
Requires-Dist: python-dotenv (>=1.2.1,<2.0.0)
|
|
19
21
|
Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
|
|
20
22
|
Description-Content-Type: text/markdown
|
|
21
23
|
|
|
@@ -24,12 +26,15 @@ Description-Content-Type: text/markdown
|
|
|
24
26
|
[](https://opensource.org/licenses/MIT)
|
|
25
27
|
[](https://www.python.org/downloads/)
|
|
26
28
|
[](https://badge.fury.io/py/chutils)
|
|
29
|
+
[](https://Chu4hel.github.io/chutils/)
|
|
27
30
|
|
|
28
31
|
**chutils** — это набор простых утилит для Python, который избавляет от повторяющейся настройки конфигурации,
|
|
29
32
|
логирования и секретов в ваших проектах.
|
|
30
33
|
|
|
31
34
|
Начните новый проект и сразу сфокусируйтесь на главном, а не на рутине.
|
|
32
35
|
|
|
36
|
+
Полная документация доступна на [нашем сайте](https://Chu4hel.github.io/chutils/).
|
|
37
|
+
|
|
33
38
|
## Проблема
|
|
34
39
|
|
|
35
40
|
Каждый раз, начиная новый проект, приходится решать одни и те же задачи:
|
|
@@ -44,12 +49,12 @@ Description-Content-Type: text/markdown
|
|
|
44
49
|
## Ключевые возможности
|
|
45
50
|
|
|
46
51
|
- **✨ Ноль конфигурации:** Библиотека **автоматически** находит корень вашего проекта и файл `config.yml` или
|
|
47
|
-
`config.ini`.
|
|
52
|
+
`config.ini`. Если файл не найден, используются безопасные настройки по умолчанию (например, логирование только в консоль).
|
|
48
53
|
- **⚙️ Гибкая конфигурация:** Поддержка `YAML` и `INI` форматов. Простые функции для получения типизированных данных.
|
|
49
54
|
- **✍️ Продвинутый логгер:** Функция `setup_logger()` "из коробки" настраивает логирование в консоль и в ротируемые
|
|
50
55
|
файлы. Возвращает кастомный логгер с дополнительными уровнями отладки (`devdebug`, `mediumdebug`).
|
|
51
56
|
- **🔒 Безопасное хранилище секретов:** Модуль `secret_manager` предоставляет простой интерфейс для сохранения и
|
|
52
|
-
получения
|
|
57
|
+
получения секретов. Поддерживает системное хранилище `keyring` и может использовать `.env` файлы как запасной вариант.
|
|
53
58
|
- **🚀 Готовность к работе:** Просто установите и используйте.
|
|
54
59
|
|
|
55
60
|
## Установка
|
|
@@ -81,7 +86,7 @@ pip install -e .
|
|
|
81
86
|
|
|
82
87
|
### 1. Работа с конфигурацией
|
|
83
88
|
|
|
84
|
-
1. Создайте файл `config.yml` в корне вашего
|
|
89
|
+
1. (Опционально) Создайте файл `config.yml` в корне вашего проекта. Если этого не сделать, библиотека будет использовать настройки по умолчанию:
|
|
85
90
|
|
|
86
91
|
```yaml
|
|
87
92
|
# config.yml
|
|
@@ -105,6 +110,45 @@ pip install -e .
|
|
|
105
110
|
```
|
|
106
111
|
`chutils` автоматически найдет `config.yml` и прочитает из него данные.
|
|
107
112
|
|
|
113
|
+
#### Переопределение конфигурации локальным файлом (`config.local.yml`)
|
|
114
|
+
|
|
115
|
+
Вы можете создать локальный файл конфигурации (например, `config.local.yml` или `config.local.ini`) рядом с основным
|
|
116
|
+
файлом (`config.yml` или `config.ini`). Значения из локального файла будут **переопределять** соответствующие
|
|
117
|
+
значения из основного файла. Это удобно для:
|
|
118
|
+
- Хранения чувствительных данных, которые не должны попадать в систему контроля версий (добавьте `config.local.yml` в `.gitignore`).
|
|
119
|
+
- Переопределения настроек для локальной разработки без изменения основного файла.
|
|
120
|
+
|
|
121
|
+
Пример:
|
|
122
|
+
Если `config.yml` содержит:
|
|
123
|
+
```yaml
|
|
124
|
+
# config.yml
|
|
125
|
+
Database:
|
|
126
|
+
host: production_db.com
|
|
127
|
+
port: 5432
|
|
128
|
+
App:
|
|
129
|
+
debug: false
|
|
130
|
+
```
|
|
131
|
+
А `config.local.yml` содержит:
|
|
132
|
+
```yaml
|
|
133
|
+
# config.local.yml
|
|
134
|
+
Database:
|
|
135
|
+
host: localhost
|
|
136
|
+
App:
|
|
137
|
+
debug: true
|
|
138
|
+
developer_mode: true
|
|
139
|
+
```
|
|
140
|
+
Тогда `get_config()` вернет:
|
|
141
|
+
```yaml
|
|
142
|
+
Database:
|
|
143
|
+
host: localhost # Переопределено локальным файлом
|
|
144
|
+
port: 5432 # Взято из основного файла
|
|
145
|
+
App:
|
|
146
|
+
debug: true # Переопределено локальным файлом
|
|
147
|
+
developer_mode: true # Добавлено из локального файла
|
|
148
|
+
```
|
|
149
|
+
**Важно:** Убедитесь, что вы добавили `config.local.yml` (или `config.local.ini`) в ваш `.gitignore`, чтобы случайно
|
|
150
|
+
не закоммитить локальные или чувствительные настройки.
|
|
151
|
+
|
|
108
152
|
### 2. Настройка логирования
|
|
109
153
|
|
|
110
154
|
1. Добавьте секцию `Logging` в ваш `config.yml` (опционально):
|
|
@@ -131,8 +175,46 @@ pip install -e .
|
|
|
131
175
|
```
|
|
132
176
|
Папка `logs` будет создана автоматически.
|
|
133
177
|
|
|
178
|
+
Вы также можете указать имя файла лога напрямую при вызове `setup_logger`, переопределив значение из конфигурации:
|
|
179
|
+
```python
|
|
180
|
+
# main.py
|
|
181
|
+
from chutils import setup_logger, ChutilsLogger
|
|
182
|
+
|
|
183
|
+
# Логгер будет писать в custom.log, игнорируя log_file_name из config.yml
|
|
184
|
+
logger: ChutilsLogger = setup_logger(log_file_name="custom.log")
|
|
185
|
+
|
|
186
|
+
logger.info("Сообщение в кастомном файле.")
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### Создание нескольких логгеров
|
|
190
|
+
|
|
191
|
+
Вы можете создавать разные логгеры для разных частей вашего приложения, передавая уникальное имя в `setup_logger`. Это
|
|
192
|
+
помогает фильтровать и разделять логи.
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
# main.py
|
|
196
|
+
from chutils import setup_logger
|
|
197
|
+
|
|
198
|
+
# Основной логгер приложения будет писать в main_app.log
|
|
199
|
+
main_logger = setup_logger("main_app", log_file_name="main_app.log")
|
|
200
|
+
# Логгер для модуля, отвечающего за работу с базой данных, будет писать в database.log
|
|
201
|
+
db_logger = setup_logger("database", log_file_name="database.log")
|
|
202
|
+
|
|
203
|
+
main_logger.info("Приложение запущено.")
|
|
204
|
+
db_logger.debug("Инициализация подключения к БД...")
|
|
205
|
+
```
|
|
206
|
+
В лог-файлах вы увидите сообщения от соответствующих логгеров.
|
|
207
|
+
Более подробный пример можно найти в [`/examples/05_different_log_levels.py`](./examples/05_different_log_levels.py).
|
|
208
|
+
|
|
134
209
|
### 3. Управление секретами
|
|
135
210
|
|
|
211
|
+
`SecretManager` ищет секреты в следующем порядке:
|
|
212
|
+
1. **Системное хранилище (`keyring`)**: Наиболее безопасный способ.
|
|
213
|
+
2. **Файл `.env`**: Если секрет не найден в `keyring`, менеджер будет искать его в файле `.env` в корне вашего проекта.
|
|
214
|
+
3. **Переменные окружения**: Если секрета нет и там, будет произведен поиск в переменных окружения ОС.
|
|
215
|
+
|
|
216
|
+
#### Способ 1: Keyring (рекомендуемый)
|
|
217
|
+
|
|
136
218
|
1. Инициализируйте `SecretManager` и сохраните ваш секрет. **Это нужно сделать один раз.**
|
|
137
219
|
|
|
138
220
|
```python
|
|
@@ -140,7 +222,7 @@ pip install -e .
|
|
|
140
222
|
from chutils import SecretManager
|
|
141
223
|
|
|
142
224
|
secrets = SecretManager("my_awesome_app")
|
|
143
|
-
secrets.save_secret("
|
|
225
|
+
secrets.save_secret("DB_PASSWORD", "MySuperSecretDbPassword123!")
|
|
144
226
|
print("Пароль от БД сохранен в системном хранилище!")
|
|
145
227
|
```
|
|
146
228
|
|
|
@@ -154,7 +236,7 @@ pip install -e .
|
|
|
154
236
|
db_user = get_config_value("Database", "user")
|
|
155
237
|
|
|
156
238
|
# Получаем пароль из безопасного хранилища
|
|
157
|
-
db_password = secrets.get_secret("
|
|
239
|
+
db_password = secrets.get_secret("DB_PASSWORD")
|
|
158
240
|
|
|
159
241
|
if db_password:
|
|
160
242
|
print(f"Получен пароль для пользователя {db_user}.")
|
|
@@ -162,6 +244,28 @@ pip install -e .
|
|
|
162
244
|
print("Пароль не найден!")
|
|
163
245
|
```
|
|
164
246
|
|
|
247
|
+
#### Способ 2: Файл .env (удобно для Docker и CI/CD)
|
|
248
|
+
|
|
249
|
+
1. Создайте файл `.env` в корне вашего проекта:
|
|
250
|
+
```dotenv
|
|
251
|
+
# .env
|
|
252
|
+
DB_PASSWORD="AnotherSecretPassword"
|
|
253
|
+
API_KEY="abcdef123456"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
2. `SecretManager` автоматически найдет этот файл и прочитает из него переменные, если не найдет их в `keyring`.
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
# main.py
|
|
260
|
+
from chutils import SecretManager
|
|
261
|
+
|
|
262
|
+
secrets = SecretManager("my_awesome_app")
|
|
263
|
+
|
|
264
|
+
# Этот секрет будет взят из .env, если его нет в keyring
|
|
265
|
+
api_key = secrets.get_secret("API_KEY")
|
|
266
|
+
print(f"Найден API ключ: {api_key}")
|
|
267
|
+
```
|
|
268
|
+
|
|
165
269
|
## Комплексный пример
|
|
166
270
|
|
|
167
271
|
Этот пример показывает, как все компоненты `chutils` работают вместе.
|
|
@@ -240,16 +344,20 @@ pip install -e .
|
|
|
240
344
|
### Настройка логирования (`chutils.logger`)
|
|
241
345
|
|
|
242
346
|
- `setup_logger(name='app_logger', log_level_str='')`: Настраивает и возвращает экземпляр `ChutilsLogger`.
|
|
243
|
-
- `logger.mediumdebug("message")`: Логирование с уровнем 15.
|
|
244
|
-
- `logger.devdebug("message")`: Логирование с уровнем 9.
|
|
347
|
+
- `logger.mediumdebug("message")`: Логирование с уровнем 15. Промежуточный уровень между `DEBUG` и `INFO`.
|
|
348
|
+
- `logger.devdebug("message")`: Логирование с уровнем 9. Самый подробный уровень для глубокой отладки (например, для вывода дампов переменных).
|
|
245
349
|
|
|
246
350
|
### Управление секретами (`chutils.secret_manager`)
|
|
247
351
|
|
|
248
|
-
- `SecretManager(service_name)`: Создает менеджер, изолированный по имени сервиса.
|
|
352
|
+
- `SecretManager(service_name, prefix="Chutils_")`: Создает менеджер, изолированный по имени сервиса.
|
|
249
353
|
- `secrets.save_secret(key, value)`: Сохраняет секрет.
|
|
250
354
|
- `secrets.get_secret(key)`: Получает секрет.
|
|
251
355
|
- `secrets.delete_secret(key)`: Удаляет секрет.
|
|
252
356
|
|
|
357
|
+
### Декораторы (`chutils.decorators`)
|
|
358
|
+
|
|
359
|
+
- `log_function_details`: Декоратор для логирования деталей вызова функции (аргументы, время выполнения, результат).
|
|
360
|
+
|
|
253
361
|
### Ручная инициализация (`chutils.init`)
|
|
254
362
|
|
|
255
363
|
В 99% случаев вам это **не понадобится**. Но если автоматика не справилась, вы можете один раз указать путь к проекту
|
|
@@ -261,6 +369,19 @@ import chutils
|
|
|
261
369
|
chutils.init(base_dir="/path/to/my/project/root")
|
|
262
370
|
```
|
|
263
371
|
|
|
372
|
+
### Особенности `secret_manager` (Keyring)
|
|
373
|
+
|
|
374
|
+
Модуль `SecretManager` использует библиотеку `keyring` для безопасного хранения секретов в системном хранилище.
|
|
375
|
+
|
|
376
|
+
- На **Windows** и **macOS** это работает "из коробки".
|
|
377
|
+
- **Требования для Linux**: На Linux для безопасной работы `keyring` требуется установленный и настроенный "бэкенд"
|
|
378
|
+
(хранилище секретов), например, `GNOME Keyring` (Seahorse) или `KWallet`. На серверах или минималистичных сборках его
|
|
379
|
+
может понадобиться установить вручную.
|
|
380
|
+
Подробнее — в [официальной документации `keyring`](https://keyring.readthedocs.io/en/latest/).
|
|
381
|
+
- **Использование на мобильных ОС**: Этот модуль **не предназначен** для использования на мобильных операционных
|
|
382
|
+
системах (Android, iOS). `keyring` с высокой вероятностью не найдет системного хранилища и будет использовать
|
|
383
|
+
**незащищенный** способ хранения ваших секретов.
|
|
384
|
+
|
|
264
385
|
## Лицензия
|
|
265
386
|
|
|
266
387
|
Проект распространяется под лицензией MIT.
|