ADPhoneMatcher — это Python-приложение для сопоставления телефонных номеров из CSV-выгрузки Active Directory (AD) с данными из других источников (.csv или .txt). Проект работает на чистом Python без сторонних библиотек, обрабатывает входные файлы, нормализует номера, создаёт выходные CSV с результатами, архивирует обработанные файлы и ведёт логирование.
- Обработка AD-выгрузки: Чтение CSV с настраиваемыми полями (
name,phone,email,active) черезconfig.py. - Поиск выгрузок: Обработка 
.csvи.txtв папкеdata/phone_data/, исключаяdata/results/иdata/archive/. - Нормализация номеров: Удаление символов 
+-() " "(настраивается вconfig.py). - Обнаружение аномалий: Проверка номеров в поле 
telephoneNumberна соответствие стандартам (цифровые номера длиной, заданной вconfig.py). Аномалии (например, наличие букв или неверная длина) записываются в логlogs/anomalies_YYYY-MM-DD_HH-MM-SS.log. Общее количество аномалий выводится в консоль. - Вывод: CSV в 
data/results/с настраиваемыми полями (phone,name,email,active). - Логирование:
- Логи в 
logs/log_YYYY-MM-DD_HH-MM-SS.log(до 5 файлов, настраивается вconfig.py). - Консоль: относительные пути (
./data/ad_input/...),INFOбез-v,DEBUGс-v. - Лог: абсолютные пути (
[BASE_DIR]/...), всегдаDEBUG. 
 - Логи в 
 - Архивирование: Перемещение обработанных файлов в 
data/archive/с уникальными именами. - Права: Выходные файлы и логи с правами 
0o666. - Производительность: Обработка 1000 номеров за ~0.1 секунды.
 
- Python 3.7+
 - ОС: Linux (тестировалось в Astra Linux и Linux Mint)
 - Podman (для контейнеризированного запуска)
 
- 
Клонируйте репозиторий:
git clone https://github.com/SkyrocketStan/ADPhoneMatcher.git cd ADPhoneMatcher - 
Очистите старое виртуальное окружение (если существует):
rm -rf .venv
 - 
Создайте необходимые папки:
mkdir -p data/ad_input data/phone_data data/results data/archive logs
 - 
Убедитесь, что Podman установлен:
podman --version
Если Podman не установлен:
sudo apt-get install podman # Для Debian/Ubuntu-based систем 
- 
Подготовьте входной файл (
data/ad_input/ad_input.csv) с колонками, указанными вconfig.py:name(имя пользователя)phone(номера, разделённые;или#)email(электронная почта)active(True/False)
Пример:
name,phone,email,active Иванов Иван,123456;789012,ivanov.ivan@company.com,True - 
Поместите выгрузки (
.csvили.txt) вdata/phone_data/. - 
Запустите скрипт:
python3 -m phone_matcher.main data/ad_input/ad_input.csv
С флагом
-vдля подробного вывода:python3 -m phone_matcher.main data/ad_input/ad_input.csv -v
 
- 
Убедитесь, что входной файл
data/ad_input/ad_input.csvсуществует (или укажите другое имя). - 
Запустите скрипт
run-podman.sh:bash scripts/run-podman.sh [имя_файла.csv]
Пример с другим файлом:
bash scripts/run-podman.sh data/ad_input/my_ad_file.csv
Скрипт:
- Очищает 
.venv/(для продакшена). - Создаёт необходимые директории.
 - Запускает проект в контейнере Podman с Python 3.7.
 
 - Очищает 
 - 
Результаты:
- CSV в 
data/results/output_YYYY-MM-DD_HH-MM-SS.csv - Логи в 
logs/log_YYYY-MM-DD_HH-MM-SS.log - Лог аномалий в 
logs/anomalies_YYYY-MM-DD_HH-MM-SS.log(если обнаружены аномалии) - Обработанные файлы в 
data/archive/ 
 - CSV в 
 
Консоль (с -v):
[2025-04-26 12:00:00] === Начало работы ===
[2025-04-26 12:00:00] Обработка файла: ./data/ad_input/ad_input.csv
[2025-04-26 12:00:00] Обнаружено аномалий в номерах AD: 3
[2025-04-26 12:00:00] Найдено уникальных номеров: 1000
[2025-04-26 12:00:00] Некорректный номер: содержит буквы
...
Лог (logs/log_2025-04-26_12-00-00.log):
[2025-04-26 12:00:00] === Начало работы ===
[2025-04-26 12:00:00] Обработка файла: /path/to/ADPhoneMatcher/data/ad_input/ad_input.csv
[2025-04-26 12:00:00] Обнаружено аномалий в номерах AD: 3
[2025-04-26 12:00:00] Некорректный номер: содержит буквы
...
Лог аномалий (logs/anomalies_2025-04-26_12-00-00.log):
[2025-04-26 12:00:00] Некорректный номер в строке: "Пользователь Иван Иванович";"XX123";"1-23-45";"Отдел ИТ";"False";;"ivan.ivanov@company.com"
[2025-04-26 12:00:00] Некорректный номер в строке: "Пользователь Анна Петрова";"12345";"2-34-56";"Отдел продаж";"True";;"anna.petрова@company.com"
CSV (data/results/output_2025-04-26_12-00-00.csv):
phone,name,email,active
123456,Иванов Иван,ivanov.ivan@company.com,True
...
Проект включает юнит-тесты для всех основных модулей (main, utils, output, parse_ad, parse_phone, match) в директории tests/.
- 
Установите зависимости для разработки:
pip install pytest pylint
 - 
Запустите тесты:
python3 -m unittest discover -s tests
 - 
Проверьте код с
pylint:pylint phone_matcher/*.py tests/*.py
 
- 
Запустите скрипт
run-tests-podman.sh:bash scripts/run-tests-podman.sh
Скрипт устанавливает
pytestиpylintв контейнере и запускает тесты и линтер. 
Тесты покрывают критическую функциональность и обеспечивают оценку pylint 10/10.
ADPhoneMatcher/
├── logs/                    # Логи (log_YYYY-MM-DD_HH-MM-SS.log, anomalies_YYYY-MM-DD_HH-MM-SS.log)
├── phone_matcher/           # Пакет Python
│   ├── __init__.py         # Инициализация пакета
│   ├── main.py             # Точка входа
│   ├── utils.py            # Утилиты (логирование, пути)
│   ├── config.py           # Конфигурация
│   ├── parse_ad.py         # Парсинг входного файла
│   ├── normalize.py        # Нормализация номеров
│   ├── parse_phone.py      # Парсинг номеров
│   ├── output.py           # Формирование CSV
│   ├── match.py            # Сопоставление номеров
├── data/ad_input/           # Входной файл AD (например, ad_input.csv)
├── data/phone_data/         # Файлы выгрузок номеров (.csv, .txt)
├── data/results/            # Выходные CSV
├── data/archive/            # Архив обработанных файлов
├── tests/                   # Юнит-тесты
│   ├── __init__.py
│   ├── test_main.py
│   ├── test_utils.py
│   ├── test_output.py
│   ├── test_parse_ad.py
│   ├── test_parse_phone.py
│   ├── test_match.py
├── docs/                    # Документация
│   ├── Technical_Specification.md  # Техническое задание
├── scripts/                 # Утилиты для развертывания
│   ├── pack_project.py     # Упаковка проекта
│   ├── pack_full_project.py # Полный листинг
│   ├── deploy.py           # Развёртывание
│   ├── run.sh              # Скрипт запуска
│   ├── run-podman.sh       # Запуск в Podman
│   ├── run-tests-podman.sh # Тесты в Podman
├── .gitignore               # Игнорируемые файлы
├── README.md                # Основная документация
├── LICENSE                  # Лицензия (MIT)
├── CHANGELOG.md             # История изменений
├── CONTRIBUTING.md          # Инструкции для контрибьюторов
В директории scripts/ находятся:
pack_project.py: Упаковывает файлыphone_matcher/*.pyиrun.shвproject_files.txt.pack_full_project.py: Создаёт полный листинг проекта вfull_project_files.txt.deploy.py: Разворачивает проект, создаваяphone_matcher/иdata/phone_data/.run.sh: Запускаетmain.pyс файломad_input.csv.run-podman.sh: Запускает проект в контейнере Podman.run-tests-podman.sh: Запускает тесты и линтер в Podman.
Использование:
- Упаковка: 
python3 scripts/pack_project.py - Полный листинг: 
python3 scripts/pack_full_project.py - Копия 
deploy.py:cp scripts/deploy.py deploy.txt - Отправка: Перешлите 
project_files.txtиdeploy.txt. - Развёртывание: 
python3 deploy.py project_files.txt - Запуск в Podman: 
bash scripts/run-podman.sh [имя_файла.csv] - Тесты в Podman: 
bash scripts/run-tests-podman.sh 
MIT License (см. LICENSE).
- Разработчик: Stanislav Rakitov
 - Репозиторий: https://github.com/SkyrocketStan/ADPhoneMatcher