[Code Quality] Side effects при импорте: load_dotenv() в config.py и глобальная мутация email.charset в mailer.py #64

Closed
opened 2026-07-16 18:25:03 +07:00 by artem.kokos · 0 comments
Owner

Проблема

1. load_dotenv() выполняется при импорте config.py (redmine_reporter/config.py:13):

load_dotenv(override=False)

Любой import redmine_reporter.config (в том числе из тестов или при использовании пакета как библиотеки) читает .env из текущей рабочей директории и мутирует os.environ. Результат импорта модуля зависит от CWD — это затрудняет тестирование и переиспользование пакета.

2. Глобальная мутация реестра кодировок stdlib при импорте mailer.py (redmine_reporter/mailer.py:17):

_charset.add_charset("utf-8", _charset.SHORTEST, None, "utf-8")

Меняет поведение модуля email для всего процесса, а не только для redmine-reporter: любая другая библиотека, формирующая письма в том же процессе, начнёт кодировать UTF-8 как 8bit вместо base64. Хак нужен для корректной отправки русского текста, но его радиус действия избыточен.

Рекомендации

  1. Перенести load_dotenv() с уровня модуля в явную инициализацию (например, в main() или отдельную функцию init()), чтобы импорт пакета был чистым.
  2. Вместо глобальной мутации email.charset задавать кодировку точечно при построении письма (например, через MIMEText(..., _charset="utf-8") или set_charset() на уровне конкретного сообщения), либо как минимум вынести мутацию в build_message().
  3. Проверить, что существующие тесты mailer (русская тема и тело письма) остаются зелёными без глобального хака.

Связанные места

  • redmine_reporter/config.py:13
  • redmine_reporter/mailer.py:15-20

Критерии приёмки

  • import redmine_reporter.config и import redmine_reporter.mailer не имеют side effects.
  • Поведение CLI и формат писем не изменились; тесты зелёные.
## Проблема **1. `load_dotenv()` выполняется при импорте `config.py`** (`redmine_reporter/config.py:13`): ```python load_dotenv(override=False) ``` Любой `import redmine_reporter.config` (в том числе из тестов или при использовании пакета как библиотеки) читает `.env` из текущей рабочей директории и мутирует `os.environ`. Результат импорта модуля зависит от CWD — это затрудняет тестирование и переиспользование пакета. **2. Глобальная мутация реестра кодировок stdlib при импорте `mailer.py`** (`redmine_reporter/mailer.py:17`): ```python _charset.add_charset("utf-8", _charset.SHORTEST, None, "utf-8") ``` Меняет поведение модуля `email` для **всего процесса**, а не только для redmine-reporter: любая другая библиотека, формирующая письма в том же процессе, начнёт кодировать UTF-8 как 8bit вместо base64. Хак нужен для корректной отправки русского текста, но его радиус действия избыточен. ## Рекомендации 1. Перенести `load_dotenv()` с уровня модуля в явную инициализацию (например, в `main()` или отдельную функцию `init()`), чтобы импорт пакета был чистым. 2. Вместо глобальной мутации `email.charset` задавать кодировку точечно при построении письма (например, через `MIMEText(..., _charset="utf-8")` или `set_charset()` на уровне конкретного сообщения), либо как минимум вынести мутацию в `build_message()`. 3. Проверить, что существующие тесты mailer (русская тема и тело письма) остаются зелёными без глобального хака. ## Связанные места - `redmine_reporter/config.py:13` - `redmine_reporter/mailer.py:15-20` ## Критерии приёмки - [ ] `import redmine_reporter.config` и `import redmine_reporter.mailer` не имеют side effects. - [ ] Поведение CLI и формат писем не изменились; тесты зелёные.
artem.kokos added the refactoring label 2026-07-16 18:25:03 +07:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: artem.kokos/redmine-reporter#64