{"id":28221730,"url":"https://github.com/skyrocketstan/adphonematcher","last_synced_at":"2025-10-11T19:10:41.810Z","repository":{"id":288993630,"uuid":"969755187","full_name":"SkyrocketStan/ADPhoneMatcher","owner":"SkyrocketStan","description":"Python-приложение для сопоставления номеров из выгрузки Active Directory с данными из .csv/.txt, с выводом в CSV и логированием.","archived":false,"fork":false,"pushed_at":"2025-04-30T18:32:47.000Z","size":92,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-30T20:20:07.945Z","etag":null,"topics":["active-directory","automation","csv-processing","phone-matching","python","telephony"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SkyrocketStan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-20T21:24:15.000Z","updated_at":"2025-05-08T14:15:16.000Z","dependencies_parsed_at":"2025-04-20T23:24:55.087Z","dependency_job_id":"69bd592c-3141-4ea8-a8fb-5a959be185b1","html_url":"https://github.com/SkyrocketStan/ADPhoneMatcher","commit_stats":null,"previous_names":["skyrocketstan/adphonematcher"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/SkyrocketStan/ADPhoneMatcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyrocketStan%2FADPhoneMatcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyrocketStan%2FADPhoneMatcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyrocketStan%2FADPhoneMatcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyrocketStan%2FADPhoneMatcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SkyrocketStan","download_url":"https://codeload.github.com/SkyrocketStan/ADPhoneMatcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyrocketStan%2FADPhoneMatcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279008443,"owners_count":26084459,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["active-directory","automation","csv-processing","phone-matching","python","telephony"],"created_at":"2025-05-18T06:09:06.932Z","updated_at":"2025-10-11T19:10:41.791Z","avatar_url":"https://github.com/SkyrocketStan.png","language":"Python","readme":"# ADPhoneMatcher\n\n[![GitHub release](https://img.shields.io/github/v/release/SkyrocketStan/ADPhoneMatcher?style=flat-square\u0026logo=github)](https://github.com/SkyrocketStan/ADPhoneMatcher/releases)\n[![Pylint](https://img.shields.io/github/actions/workflow/status/SkyrocketStan/ADPhoneMatcher/pylint.yml?label=Pylint\u0026style=flat-square\u0026logo=pylint)](https://github.com/SkyrocketStan/ADPhoneMatcher/actions/workflows/pylint.yml)\n[![License](https://img.shields.io/github/license/SkyrocketStan/ADPhoneMatcher?style=flat-square)](https://github.com/SkyrocketStan/ADPhoneMatcher/blob/main/LICENSE)\n\nADPhoneMatcher — это Python-приложение для сопоставления телефонных номеров из CSV-выгрузки Active Directory (AD) с данными из других источников (`.csv` или `.txt`). Проект работает на чистом Python без сторонних библиотек, обрабатывает входные файлы, нормализует номера, создаёт выходные CSV с результатами, архивирует обработанные файлы и ведёт логирование.\n\n## Основные возможности\n\n- **Обработка AD-выгрузки**: Чтение CSV с настраиваемыми полями (`name`, `phone`, `email`, `active`) через `config.py`.\n- **Поиск выгрузок**: Обработка `.csv` и `.txt` в папке `data/phone_data/`, исключая `data/results/` и `data/archive/`.\n- **Нормализация номеров**: Удаление символов `+-() \" \"` (настраивается в `config.py`).\n- **Обнаружение аномалий**: Проверка номеров в поле `telephoneNumber` на соответствие стандартам (цифровые номера длиной, заданной в `config.py`). Аномалии (например, наличие букв или неверная длина) записываются в лог `logs/anomalies_YYYY-MM-DD_HH-MM-SS.log`. Общее количество аномалий выводится в консоль.\n- **Вывод**: CSV в `data/results/` с настраиваемыми полями (`phone`, `name`, `email`, `active`).\n- **Логирование**:\n  - Логи в `logs/log_YYYY-MM-DD_HH-MM-SS.log` (до 5 файлов, настраивается в `config.py`).\n  - Консоль: относительные пути (`./data/ad_input/...`), `INFO` без `-v`, `DEBUG` с `-v`.\n  - Лог: абсолютные пути (`[BASE_DIR]/...`), всегда `DEBUG`.\n- **Архивирование**: Перемещение обработанных файлов в `data/archive/` с уникальными именами.\n- **Права**: Выходные файлы и логи с правами `0o666`.\n- **Производительность**: Обработка 1000 номеров за ~0.1 секунды.\n\n## Требования\n\n- Python 3.7+\n- ОС: Linux (тестировалось в Astra Linux и Linux Mint)\n- Podman (для контейнеризированного запуска)\n\n## Установка\n\n1. Клонируйте репозиторий:\n\n   ```bash\n   git clone https://github.com/SkyrocketStan/ADPhoneMatcher.git\n   cd ADPhoneMatcher\n   ```\n\n2. Очистите старое виртуальное окружение (если существует):\n\n   ```bash\n   rm -rf .venv\n   ```\n\n3. Создайте необходимые папки:\n\n   ```bash\n   mkdir -p data/ad_input data/phone_data data/results data/archive logs\n   ```\n\n4. Убедитесь, что Podman установлен:\n\n   ```bash\n   podman --version\n   ```\n\n   Если Podman не установлен:\n\n   ```bash\n   sudo apt-get install podman  # Для Debian/Ubuntu-based систем\n   ```\n\n## Использование\n\n### Вариант 1: Запуск с системным Python\n\n1. Подготовьте входной файл (`data/ad_input/ad_input.csv`) с колонками, указанными в `config.py`:\n   - `name` (имя пользователя)\n   - `phone` (номера, разделённые `;` или `#`)\n   - `email` (электронная почта)\n   - `active` (True/False)\n\n   Пример:\n\n   ```plaintext\n   name,phone,email,active\n   Иванов Иван,123456;789012,ivanov.ivan@company.com,True\n   ```\n\n2. Поместите выгрузки (`.csv` или `.txt`) в `data/phone_data/`.\n\n3. Запустите скрипт:\n\n   ```bash\n   python3 -m phone_matcher.main data/ad_input/ad_input.csv\n   ```\n\n   С флагом `-v` для подробного вывода:\n\n   ```bash\n   python3 -m phone_matcher.main data/ad_input/ad_input.csv -v\n   ```\n\n### Вариант 2: Запуск с Podman\n\n1. Убедитесь, что входной файл `data/ad_input/ad_input.csv` существует (или укажите другое имя).\n\n2. Запустите скрипт `run-podman.sh`:\n\n   ```bash\n   bash scripts/run-podman.sh [имя_файла.csv]\n   ```\n\n   Пример с другим файлом:\n\n   ```bash\n   bash scripts/run-podman.sh data/ad_input/my_ad_file.csv\n   ```\n\n   Скрипт:\n   - Очищает `.venv/` (для продакшена).\n   - Создаёт необходимые директории.\n   - Запускает проект в контейнере Podman с Python 3.7.\n\n3. Результаты:\n   - CSV в `data/results/output_YYYY-MM-DD_HH-MM-SS.csv`\n   - Логи в `logs/log_YYYY-MM-DD_HH-MM-SS.log`\n   - Лог аномалий в `logs/anomalies_YYYY-MM-DD_HH-MM-SS.log` (если обнаружены аномалии)\n   - Обработанные файлы в `data/archive/`\n\n## Пример вывода\n\n**Консоль** (с `-v`):\n\n```plaintext\n[2025-04-26 12:00:00] === Начало работы ===\n[2025-04-26 12:00:00] Обработка файла: ./data/ad_input/ad_input.csv\n[2025-04-26 12:00:00] Обнаружено аномалий в номерах AD: 3\n[2025-04-26 12:00:00] Найдено уникальных номеров: 1000\n[2025-04-26 12:00:00] Некорректный номер: содержит буквы\n...\n```\n\n**Лог** (`logs/log_2025-04-26_12-00-00.log`):\n\n```plaintext\n[2025-04-26 12:00:00] === Начало работы ===\n[2025-04-26 12:00:00] Обработка файла: /path/to/ADPhoneMatcher/data/ad_input/ad_input.csv\n[2025-04-26 12:00:00] Обнаружено аномалий в номерах AD: 3\n[2025-04-26 12:00:00] Некорректный номер: содержит буквы\n...\n```\n\n**Лог аномалий** (`logs/anomalies_2025-04-26_12-00-00.log`):\n\n```plaintext\n[2025-04-26 12:00:00] Некорректный номер в строке: \"Пользователь Иван Иванович\";\"XX123\";\"1-23-45\";\"Отдел ИТ\";\"False\";;\"ivan.ivanov@company.com\"\n[2025-04-26 12:00:00] Некорректный номер в строке: \"Пользователь Анна Петрова\";\"12345\";\"2-34-56\";\"Отдел продаж\";\"True\";;\"anna.petрова@company.com\"\n```\n\n**CSV** (`data/results/output_2025-04-26_12-00-00.csv`):\n\n```plaintext\nphone,name,email,active\n123456,Иванов Иван,ivanov.ivan@company.com,True\n...\n```\n\n## Тестирование\n\nПроект включает юнит-тесты для всех основных модулей (`main`, `utils`, `output`, `parse_ad`, `parse_phone`, `match`) в директории `tests/`.\n\n### Локальное тестирование\n\n1. Установите зависимости для разработки:\n\n   ```bash\n   pip install pytest pylint\n   ```\n\n2. Запустите тесты:\n\n   ```bash\n   python3 -m unittest discover -s tests\n   ```\n\n3. Проверьте код с `pylint`:\n\n   ```bash\n   pylint phone_matcher/*.py tests/*.py\n   ```\n\n### Тестирование в Podman\n\n1. Запустите скрипт `run-tests-podman.sh`:\n\n   ```bash\n   bash scripts/run-tests-podman.sh\n   ```\n\n   Скрипт устанавливает `pytest` и `pylint` в контейнере и запускает тесты и линтер.\n\nТесты покрывают критическую функциональность и обеспечивают оценку `pylint` 10/10.\n\n## Структура проекта\n\n```plaintext\nADPhoneMatcher/\n├── logs/                    # Логи (log_YYYY-MM-DD_HH-MM-SS.log, anomalies_YYYY-MM-DD_HH-MM-SS.log)\n├── phone_matcher/           # Пакет Python\n│   ├── __init__.py         # Инициализация пакета\n│   ├── main.py             # Точка входа\n│   ├── utils.py            # Утилиты (логирование, пути)\n│   ├── config.py           # Конфигурация\n│   ├── parse_ad.py         # Парсинг входного файла\n│   ├── normalize.py        # Нормализация номеров\n│   ├── parse_phone.py      # Парсинг номеров\n│   ├── output.py           # Формирование CSV\n│   ├── match.py            # Сопоставление номеров\n├── data/ad_input/           # Входной файл AD (например, ad_input.csv)\n├── data/phone_data/         # Файлы выгрузок номеров (.csv, .txt)\n├── data/results/            # Выходные CSV\n├── data/archive/            # Архив обработанных файлов\n├── tests/                   # Юнит-тесты\n│   ├── __init__.py\n│   ├── test_main.py\n│   ├── test_utils.py\n│   ├── test_output.py\n│   ├── test_parse_ad.py\n│   ├── test_parse_phone.py\n│   ├── test_match.py\n├── docs/                    # Документация\n│   ├── Technical_Specification.md  # Техническое задание\n├── scripts/                 # Утилиты для развертывания\n│   ├── pack_project.py     # Упаковка проекта\n│   ├── pack_full_project.py # Полный листинг\n│   ├── deploy.py           # Развёртывание\n│   ├── run.sh              # Скрипт запуска\n│   ├── run-podman.sh       # Запуск в Podman\n│   ├── run-tests-podman.sh # Тесты в Podman\n├── .gitignore               # Игнорируемые файлы\n├── README.md                # Основная документация\n├── LICENSE                  # Лицензия (MIT)\n├── CHANGELOG.md             # История изменений\n├── CONTRIBUTING.md          # Инструкции для контрибьюторов\n```\n\n## Утилиты для развертывания\n\nВ директории `scripts/` находятся:\n\n- `pack_project.py`: Упаковывает файлы `phone_matcher/*.py` и `run.sh` в `project_files.txt`.\n- `pack_full_project.py`: Создаёт полный листинг проекта в `full_project_files.txt`.\n- `deploy.py`: Разворачивает проект, создавая `phone_matcher/` и `data/phone_data/`.\n- `run.sh`: Запускает `main.py` с файлом `ad_input.csv`.\n- `run-podman.sh`: Запускает проект в контейнере Podman.\n- `run-tests-podman.sh`: Запускает тесты и линтер в Podman.\n\nИспользование:\n\n1. Упаковка: `python3 scripts/pack_project.py`\n2. Полный листинг: `python3 scripts/pack_full_project.py`\n3. Копия `deploy.py`: `cp scripts/deploy.py deploy.txt`\n4. Отправка: Перешлите `project_files.txt` и `deploy.txt`.\n5. Развёртывание: `python3 deploy.py project_files.txt`\n6. Запуск в Podman: `bash scripts/run-podman.sh [имя_файла.csv]`\n7. Тесты в Podman: `bash scripts/run-tests-podman.sh`\n\n## Лицензия\n\nMIT License (см. `LICENSE`).\n\n## Контакты\n\n- Разработчик: Stanislav Rakitov\n- Репозиторий: \u003chttps://github.com/SkyrocketStan/ADPhoneMatcher\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskyrocketstan%2Fadphonematcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskyrocketstan%2Fadphonematcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskyrocketstan%2Fadphonematcher/lists"}