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.
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chutils
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
5
5
  License: MIT
6
6
  License-File: LICENSE
7
- Author: Sergo
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
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
25
27
  [![Python](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/)
26
28
  [![PyPI version](https://badge.fury.io/py/chutils.svg)](https://badge.fury.io/py/chutils)
29
+ [![Documentation](https://img.shields.io/badge/документация-читать-brightgreen)](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
- получения секретов через системное хранилище ключей (Keyring).
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("db_password", "MySuperSecretDbPassword123!")
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("db_password")
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.