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