{"id":31727198,"url":"https://github.com/coore/glping","last_synced_at":"2026-04-11T20:40:21.012Z","repository":{"id":316791494,"uuid":"1064832264","full_name":"CoOre/glping","owner":"CoOre","description":null,"archived":false,"fork":false,"pushed_at":"2025-10-04T12:32:45.000Z","size":253,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-04T14:30:49.298Z","etag":null,"topics":["gitlab","notifications"],"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/CoOre.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"CoOre","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2025-09-26T16:10:05.000Z","updated_at":"2025-10-04T12:32:47.000Z","dependencies_parsed_at":"2025-10-04T14:20:29.475Z","dependency_job_id":null,"html_url":"https://github.com/CoOre/glping","commit_stats":null,"previous_names":["coore/glping"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/CoOre/glping","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoOre%2Fglping","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoOre%2Fglping/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoOre%2Fglping/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoOre%2Fglping/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CoOre","download_url":"https://codeload.github.com/CoOre/glping/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoOre%2Fglping/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000851,"owners_count":26082950,"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-09T02:00:07.460Z","response_time":59,"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":["gitlab","notifications"],"created_at":"2025-10-09T06:19:09.427Z","updated_at":"2025-10-09T06:19:11.030Z","avatar_url":"https://github.com/CoOre.png","language":"Python","funding_links":["https://github.com/sponsors/CoOre"],"categories":[],"sub_categories":[],"readme":"# GitLab Ping\n\n[![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Tests](https://img.shields.io/badge/tests-passing-brightgreen.svg)](tests/)\n[![CI/CD](https://img.shields.io/badge/CI%2FCD-Automated-brightgreen.svg)](.github/workflows/ci.yml)\n[![PyPI Version](https://img.shields.io/pypi/v/glping.svg)](https://pypi.org/project/glping/)\n[![Docker](https://img.shields.io/badge/docker-ready-blue.svg)](https://hub.docker.com/r/coore/glping)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/CoOre?color=ff69b4)](https://github.com/sponsors/CoOre)\n\nCLI-утилита для отслеживания событий в GitLab с push-уведомлениями.\n\n## Функциональность\n\n- Отслеживание событий во всех проектах GitLab\n- Поддержка коммитов, Merge Requests, Issues, Pipeline и комментариев\n- Кроссплатформенные push-уведомления с правильным стекированием\n- Работа в режиме демона или однократный запуск\n- Унифицированная система кэширования для предотвращения дублирования уведомлений\n- Асинхронный режим для улучшенной производительности\n\n## Установка\n\n### Требования\n- Python 3.9+\n- GitLab personal access token\n\n### Быстрая установка с помощью Makefile\n\n**Для конечных пользователей:**\n```bash\ngit clone https://github.com/CoOre/glping.git\ncd glping\nmake prod-setup\n```\n\n**Для разработчиков:**\n```bash\ngit clone https://github.com/CoOre/glping.git\ncd glping\nmake dev-setup\n```\n\n### Ручная установка\n\n```bash\ngit clone https://github.com/CoOre/glping.git\ncd glping\npip install -e .\n```\n\n### Установка зависимостей\n```bash\npip install -r requirements.txt\n```\n\n### Установка бинарника\n```bash\n# Установка пакета в системную директорию\npip install -e .\n```\n\n### Установка для macOS (рекомендуется)\n\nДля правильной работы уведомлений на macOS установите `terminal-notifier`:\n\n```bash\n# Через Homebrew\nbrew install terminal-notifier\n\n# Или вручную\ncurl -L https://github.com/julienXX/terminal-notifier/releases/download/2.0.0/terminal-notifier-2.0.0.zip -o terminal-notifier.zip\nunzip terminal-notifier.zip\nsudo cp terminal-notifier-2.0.0/terminal-notifier.app/Contents/MacOS/terminal-notifier /usr/local/bin/\n```\n\n## Конфигурация\n\n1. Скопируйте файл конфигурации:\n```bash\ncp .env.example .env\n```\n\n2. Отредактируйте `.env` файл:\n```env\nGITLAB_URL=https://gitlab.example.com\nGITLAB_TOKEN=your_private_token_here\nCHECK_INTERVAL=60\nCACHE_FILE=glping_cache.json\n```\n\n3. Создайте GitLab personal access token:\n   - Перейдите в Settings → Access Tokens\n   - Создайте токен с правами `read_api` и `read_repository`\n\n## Использование\n\n### Основные команды\n\n```bash\n# Запуск в режиме демона (по умолчанию)\nglping\n\n# Однократная проверка\nglping --once\n\n# Запуск с детальным логированием\nglping --verbose\n\n# Изменить интервал проверки\nglping --interval 120\n\n# Отслеживать только конкретный проект\nglping --project 12345\n\n# Сбросить кеш\nglping --reset-cache\n\n# Тестовое уведомление\nglping --test-notification\n\n# Тест стекирования уведомлений\nglping --test-stacking\n```\n\n### Примеры использования\n\n```bash\n# Мониторинг всех проектов с интервалом 30 секунд\nglping --daemon --interval 30 --verbose\n\n# Проверка конкретного проекта один раз\nglping --once --project 12345 --verbose\n\n# Тестирование уведомлений\nglping --test-notification\n\n# Тестирование стекирования уведомлений\nglping --test-stacking\n```\n\n### Автоматический запуск\n\n#### Рекомендуемый способ: launchd (macOS)\n\nДля macOS рекомендуется использовать встроенную систему launchd вместо crontab:\n\n```bash\n# Быстрая настройка\n./launchd_setup.sh\n\n# Проверить статус\nlaunchctl list | grep glping\n\n# Посмотреть логи\ntail -f ~/glping/logs/glping.log\n```\n\n**Преимущества launchd:**\n- ✅ Идеальные уведомления без \"редактора скриптов\"\n- ✅ Автоматический перезапуск при сбоях\n- ✅ Встроенное логирование\n- ✅ Нативный для macOS\n\n#### Альтернатива: crontab\n\nДля использования в crontab указывайте полный путь к команде:\n\n```bash\n# Редактирование crontab\ncrontab -e\n\n# Добавить строку (используйте полный путь):\n* * * * * /usr/local/bin/glping --async --optimized --once --verbose \u003e\u003e ~/glping.log 2\u003e\u00261\n```\n\n**Важно:** crontab использует ограниченное окружение, поэтому уведомления могут появляться \"от редактора скриптов\". Для правильных уведомлений используйте launchd.\n\n### Управление сервисом (launchd)\n\n```bash\n# Запустить сервис\nlaunchctl start com.glping.daemon\n\n# Остановить сервис\nlaunchctl stop com.glping.daemon\n\n# Перезапустить сервис\nlaunchctl kickstart -k gui/$(id -u)/com.glping.daemon\n\n# Удалить сервис\n./launchd_cleanup.sh\n\n# Просмотр логов\ntail -f ~/glping/logs/glping.log\ntail -f ~/glping/logs/glping.error.log\n```\n\n### Использование Makefile\n\nMakefile предоставляет удобные скрипты для установки и управления:\n\n```bash\n# Показать доступные команды\nmake help\n\n# Проверить системные требования\nmake check-reqs\n\n# Установка для конечных пользователей\nmake prod-setup\n\n# Установка для разработчиков\nmake dev-setup\n\n# Запустить все тесты\nmake test\n\n# Тестировать уведомления\nmake test-notif\n\n# Тестировать стекирования уведомлений\nmake test-stacking\n\n# Удалить приложение\nmake uninstall\n\n# Очистить артефакты сборки\nmake clean\n```\n\n## Поддерживаемые события\n\n- **Коммиты** - новые коммиты и сообщения\n- **Merge Requests** - создание, обновление, комментарии, закрытие, мёрдж\n- **Issues** - создание, комментарии, закрытие, reopen\n- **Pipeline** - успешное выполнение и падение\n- **Комментарии** - ко всем сатегориям сущностей\n\n## Архитектура\n\n```\nglping/\n├── __init__.py              # Пакетная информация и версия\n├── main.py                  # Точка входа CLI\n├── config.py                # Конфигурация из .env\n├── cache.py                 # Унифицированная система кэширования\n├── lock.py                  # Утилиты файловой блокировки\n├── base_gitlab_api.py       # Базовый класс GitLab API\n├── base_watcher.py          # Базовый класс наблюдателя\n├── gitlab_api.py            # Синхронная обёртка для GitLab API\n├── async_gitlab_api.py      # Асинхронная обёртка для GitLab API\n├── notifier.py              # Push-уведомления с поддержкой стекирования\n├── optimized_notifier.py    # Оптимизированные уведомления\n├── watcher.py               # Синхронная основная логика\n├── async_watcher.py         # Асинхронная основная логика\n├── assets/                  # Ресурсы приложения\n│   ├── glping-icon.png      # Основная иконка\n│   ├── glping-icon-128.png  # Иконка 128px\n│   └── glping-icon-256.png  # Иконка 256px\n├── utils/                   # Утилиты\n│   ├── __init__.py          # Пакет утилит\n│   ├── date_utils.py        # Работа с датами и временем\n│   ├── event_utils.py       # Обработка событий\n│   └── url_utils.py         # Обработка URL\n├── requirements.txt         # Зависимости\n├── setup.py                 # Установка пакета\n├── pyproject.toml           # Современная конфигурация проекта\n├── .env.example             # Пример конфигурации\n├── com.glping.daemon.plist  # launchd конфигурация для macOS\n├── launchd_setup.sh         # Скрипт настройки launchd\n├── launchd_cleanup.sh       # Скрипт очистки launchd\n└── ~/glping/logs/           # Директория для логов launchd\n```\n\n### Ключевые компоненты\n\n- **Базовые классы**: `BaseGitLabApi` и `BaseWatcher` обеспечивают переиспользование кода\n- **Утилиты**: Модуль `utils` содержит функции для работы с датами, событиями и URL\n- **Асинхронная поддержка**: Полная поддержка асинхронных операций для улучшенной производительности\n- **Оптимизированные уведомления**: Умная система фильтрации и стекирования уведомлений\n\n## Кэширование\n\nУтилита использует унифицированный JSON файл (`glping_cache.json`) для хранения:\n- Метаданных (дата установки, время последней проверки)\n- ID последнего обработанного события для каждого проекта\n- Времени последней активности проектов\n\nЭто предотвращает дублирование уведомлений и позволяет отслеживать только новые события. Система автоматически мигрирует данные из старых форматов кэша.\n\n## Уведомления\n\nПоддерживаются кроссплатформенные уведомления:\n- **macOS** - системные уведомления с правильным стекированием через terminal-notifier\n- **Linux** - notify2/libnotify с автоматическим определением DISPLAY\n- **Windows** - win10toast\n\n### Особенности реализации:\n- **Стекирование уведомлений** на macOS - все уведомления остаются видимыми\n- **Уникальные группы** для каждого уведомления предотвращают замену\n- **Поддержка URL** - при клике на уведомление открывается соответствующая страница в GitLab\n- **Кроссплатформенность** - единый API для всех операционных систем\n- **Умное определение окружения** - автоматически адаптируется для cron/launchd\n- **Оптимизация для macOS** - в cron окружении использует Finder вместо Terminal\n\n### Устранение неполадок с уведомлениями\n\n#### macOS: уведомления \"от редактора скриптов\"\nИспользуйте launchd вместо crontab:\n```bash\n./launchd_setup.sh\n```\n\n#### Linux: нет уведомлений в cron\nУбедитесь что установлен notify2:\n```bash\npip install notify2\nsudo apt-get install libnotify-bin\n```\n\n## Разработка\n\n### Запуск в режиме разработки\n```bash\npython -m glping.main --once --verbose\n```\n\n### Тестирование\n```bash\n# Тестирование уведомлений\npython -m glping.main --test-notification\n\n# Тестирование стекирования уведомлений\npython tests/test_notification_stacking.py\n\n# Тестирование подключения\npython -m glping.main --once --verbose\n\n# Запуск всех тестов\nmake test\n```\n\n## Лицензия\n\nMIT License - Copyright (c) 2025 Vladimir Nosov\n\n## Управление сервисом\n\n### Остановка и удаление launchd\n```bash\n./launchd_cleanup.sh\n```\n\n### Переход с crontab на launchd\n```bash\n# 1. Сохраните текущую crontab\ncrontab -l \u003e crontab_backup.txt\n\n# 2. Удалите glping из crontab\ncrontab -e\n# Удалите строку с glping\n\n# 3. Настройте launchd\n./launchd_setup.sh\n\n# 4. Проверьте работу\ntail -f ~/glping/logs/glping.log\n```\n\n## Автор\n\nVladimir Nosov \u003cinosovvv@gmail.com\u003e\n\n## Репозиторий\n\nhttps://github.com/CoOre/glping\n\n## Дополнительная документация\n\n- [LAUNCHD_SETUP.md](LAUNCHD_SETUP.md) - Подробная инструкция по настройке launchd\n- [DEVELOPMENT.md](DEVELOPMENT.md) - Руководство для разработчиков\n- [CONTRIBUTING.md](CONTRIBUTING.md) - Как внести вклад в проект\n- [CHANGELOG.md](CHANGELOG.md) - Список изменений\n- [ARCHITECTURE.md](ARCHITECTURE.md) - Архитектура проекта\n\n## Установка через PyPI\n\n```bash\npip install glping\n```\n\n## Скачивание бинарных файлов\n\nГотовые бинарные файлы доступны в [релизах GitHub](https://github.com/CoOre/glping/releases):\n- `glping-linux` - для Linux\n- `glping-macos` - для macOS  \n- `glping-windows.exe` - для Windows","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoore%2Fglping","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoore%2Fglping","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoore%2Fglping/lists"}