# Практическая работа 2. Разделите один файл на модули

## Что в архиве

- `main.py` — шестнадцать функций и точка запуска в одном файле;
- `tests/` — четыре файла с проверками.

Программа рабочая: запустите `python main.py` и посмотрите, что она печатает.
После разделения файла вывод должен остаться прежним — по нему проверяется,
что код не сломан.

Тесты сейчас не проходят: они написаны под структуру, которой ещё нет.

## Что нужно сделать

Разложить функции из `main.py` по отдельным модулям и папкам так, чтобы каждый
файл отвечал за одну тему, а `main.py` остался только точкой запуска.

Сами функции менять не нужно: тело каждой переносится как есть. Меняются
расположение функций, импорты и `main.py`.

## Куда какие функции

Откройте файлы из `tests/`. В первых строках каждого написан импорт — он
и говорит, где должна оказаться функция. Например, строка

```python
from app.services.statistics import average, count_values, median, spread
```

означает: четыре функции расчётов лежат в файле `app/services/statistics.py`.

Всего должно получиться четыре модуля с функциями:

| Тема | Что лежит внутри |
|------|------------------|
| строки | `clean_spaces`, `shorten`, `initials`, `slug` |
| даты | `parse_date`, `format_date`, `is_weekend`, `days_between` |
| расчёты по числам | `average`, `median`, `spread`, `count_values` |
| проверка данных | `is_email`, `normalize_phone`, `is_phone`, `password_problems` |

Строки и даты — это мелкие функции, которые пригодятся в любом проекте:
они идут в `app/utils/`. Расчёты и проверка данных — правила этого проекта:
они идут в `app/services/`.

## Требования

1. **Корень проекта.** Работайте в новой папке `text-kit`.
2. **Четыре модуля** в папках `app/utils/` и `app/services/`, имена файлов
   возьмите из импортов в тестах.
3. **Пакеты.** В `app/`, `app/utils/` и `app/services/` положите пустой
   файл `__init__.py`.
4. **`main.py` переезжает в `app/`** и оставляет себе только точку запуска:
   константы с примерами данных, функцию `main()` и строку
   `if __name__ == "__main__":`. Определений функций в нём остаться не должно —
   только импорты из своих модулей.
5. **Импорт между модулями.** Одна из функций проверки данных пользуется
   функцией из модуля строк. Найдите её и допишите импорт: модули могут
   обращаться друг к другу, но `services` и `utils` не должны импортировать
   `main`.
6. **Импорты в каждом файле — только нужные.** Если модуль не работает
   с датами, строки `from datetime import date` в нём быть не должно.
7. **README.md** в корне: назначение программы, дерево проекта с назначением
   каждого файла, команды запуска и ожидаемый вывод.

## Проверка

Из корня проекта:

```
python -m app.main
python -m unittest discover -s tests -v
```

Работа считается выполненной, если:

- программа печатает то же самое, что печатал исходный `main.py`;
- выполняются девятнадцать тестов, в конце стоит `OK`;
- в `app/main.py` нет ни одного определения функции, кроме `main`.

## Что сдать

Папку `text-kit` в своём репозитории дисциплины. В `README.md` добавьте
короткий раздел: по какому признаку функции разделены на четыре модуля.

## Частые ошибки

- **`ImportError: cannot import name ...`** — функция лежит в другом файле,
  чем ждёт тест, или в её имени опечатка.
- **`NameError: name 'clean_spaces' is not defined`** — функция вызывается
  из другого модуля, а импорт не дописан.
- **`ModuleNotFoundError: No module named 'app'`** — команда запускается не из
  корня проекта или нет файла `__init__.py`.
- **Тесты проходят, а программа не печатает ничего** — в `app/main.py` потерялся
  вызов `main()` в блоке `if __name__ == "__main__":`.
