# py-slack-notifier
A robust, reusable Python package for sending rich notifications to multiple Slack channels with advanced features like environment detection, progress tracking, and flexible configuration.
## Features
- **Multi-Channel Support**: Route different notifications to different Slack channels
- **Rich Message Formatting**: Support for code blocks, structured fields, and emoji indicators
- **Environment Detection**: Automatically detects database, hostname, and environment information
- **Progress Tracking**: Built-in progress notifications for long-running processes
- **Error Resilience**: Graceful fallback to logging when Slack is unavailable
- **Flexible Configuration**: Environment variables, direct configuration, or code-based setup
- **Script Lifecycle Support**: Specialized notifications for script start/completion
- **Project Agnostic**: Designed to work with any Python project
- **Python 3.7+ Support**: Compatible with Python 3.7 through 3.13+
## Installation
```bash
pip install py-slack-notifier
```
## Quick Start
### Single Channel Usage
```python
from enhanced_slack_notifier import SlackNotifier
# Simple single-channel setup
notifier = SlackNotifier(
default_webhook_url="https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
system_name="MyApp"
)
# Send notifications
notifier.send_success("Task completed successfully!")
notifier.send_error("Something went wrong!", error=exception)
notifier.send_warning("Performance degraded")
notifier.send_info("System status update")
```
### Multi-Channel Usage
```python
from enhanced_slack_notifier import SlackNotifier
# Configure multiple channels
channels = {
"system": "https://hooks.slack.com/services/.../system-channel",
"alerts": "https://hooks.slack.com/services/.../alerts-channel",
"logs": "https://hooks.slack.com/services/.../logs-channel"
}
notifier = SlackNotifier(channels=channels, system_name="MyApp")
# Route notifications to specific channels
notifier.send_error("Critical system failure!", channel="alerts")
notifier.send_info("Daily backup completed", channel="system")
notifier.send_debug("Processing batch 5", channel="logs")
```
### Environment-Based Configuration
```bash
# Set environment variables
export SLACK_CHANNELS='{"system":"webhook1","alerts":"webhook2","logs":"webhook3"}'
export SYSTEM_NAME="MyApplication"
export SLACK_NOTIFICATION_LOG="./logs/notifications.log"
```
```python
from enhanced_slack_notifier import SlackNotifier
# Auto-configure from environment
notifier = SlackNotifier.from_environment()
# Use with automatic channel routing
notifier.send_success("Started successfully", channel="system")
notifier.send_error("Database connection failed", channel="alerts")
```
## Advanced Features
### Rich Message Formatting
```python
# Send with structured fields
notifier.send_success(
message="Database backup completed",
title="Backup Process",
fields={
"Database": "production_db",
"Size": "2.5 GB",
"Duration": "15 minutes",
"Performance": {
"Compression Ratio": "75%",
"Transfer Speed": "10 MB/s"
}
},
channel="system"
)
# Send with code blocks
notifier.send_error(
message="Script execution failed",
title="Processing Error",
fields={
"Script": "data_processor.py",
"Batch": "batch_20250827"
},
fields_code_block={
"Error Details": "ValueError: Invalid input format\n at line 142",
"Configuration": "batch_size: 1000\nretry_count: 3"
},
channel="alerts"
)
```
### Script Lifecycle Notifications
```python
# Script started notification
notifier.send_script_started(
script_name="data_processor",
script_version="2.1",
additional_context={
"Environment": "production",
"Batch Size": 1000,
"Input Files": 150
},
channel="logs"
)
# Script completion notification
notifier.send_script_completed(
script_name="data_processor",
duration_seconds=1205.5,
records_processed=50000,
success_count=49850,
error_count=150,
additional_stats={
"Performance": "41.5 records/second",
"Output Files": "processed_data_20250827.json"
},
channel="logs"
)
```
### Progress Tracking
```python
# Set up progress tracking
notifier.set_total_items(10000)
# In your processing loop
for item in items:
# Process item
success = process_item(item)
# This will automatically send progress notifications at 20%, 40%, 60%, 80%, 100%
notifier.increment_progress(success=success, channel="logs")
```
### Error Handling with Context
```python
try:
risky_operation()
except Exception as e:
notifier.send_error(
message="Operation failed",
title="Critical Error",
error=e, # Automatically includes exception details and stack trace
context={
"operation": "data_transformation",
"batch_id": "B20250827_001",
"retry_count": 3
},
channel="alerts"
)
```
## Configuration Options
### Environment Variables
| Variable | Description | Example |
|----------|-------------|---------|
| `SLACK_CHANNELS` | JSON mapping of channel names to webhooks | `'{"alerts":"webhook1","logs":"webhook2"}'` |
| `SLACK_DEFAULT_WEBHOOK` | Default webhook URL | `https://hooks.slack.com/services/...` |
| `SYSTEM_NAME` | System identifier for notifications | `MyApplication` |
| `SLACK_NOTIFICATION_LOG` | Path for notification logs | `./logs/notifications.log` |
| `APP_SETTINGS` | Application environment settings | `myapp.config.production` |
| `DATABASE_URL` | Database connection URL (auto-detected) | `postgresql://...` |
### Programmatic Configuration
```python
# Create with full configuration
notifier = SlackNotifier(
channels={
"system": "webhook_url_1",
"alerts": "webhook_url_2",
"logs": "webhook_url_3"
},
system_name="MyApplication",
notification_log_path="./logs/slack_notifications.log",
enable_logging=True,
fallback_to_logging=True, # Fallback to file logging if Slack fails
timeout=10 # Request timeout in seconds
)
```
## Integration Examples
### Database Scripts
```python
from enhanced_slack_notifier import SlackNotifier
def main():
notifier = SlackNotifier.from_environment()
# Script started
notifier.send_script_started(
script_name="database_migration",
additional_context={
"Environment": os.getenv("APP_SETTINGS"),
"Tables": ["users", "orders", "products"]
},
channel="system"
)
try:
# Your database operations
run_migrations()
# Success notification
notifier.send_script_completed(
script_name="database_migration",
duration_seconds=time.time() - start_time,
records_processed=migration_count,
channel="system"
)
except Exception as e:
# Error notification
notifier.send_error(
message="Database migration failed",
error=e,
context={"stage": "migration", "current_table": current_table},
channel="alerts"
)
raise
```
### Web Application Integration
```python
from enhanced_slack_notifier import SlackNotifier
from flask import Flask
app = Flask(__name__)
notifier = SlackNotifier.from_environment()
@app.errorhandler(500)
def handle_server_error(error):
notifier.send_error(
message="Server error occurred",
title="Application Error",
error=error,
context={
"endpoint": request.endpoint,
"method": request.method,
"user_id": get_current_user_id()
},
channel="alerts"
)
return "Internal Server Error", 500
@app.route('/api/process')
def process_data():
notifier.send_info(
message="Data processing started",
fields={"user": get_current_user(), "timestamp": datetime.now()},
channel="logs"
)
# Process data...
```
### Background Job Monitoring
```python
from enhanced_slack_notifier import SlackNotifier
import celery
notifier = SlackNotifier.from_environment()
@celery.task(bind=True)
def process_large_dataset(self, dataset_id):
notifier.send_info(
message=f"Processing dataset {dataset_id}",
title="Background Job Started",
channel="jobs"
)
try:
# Set up progress tracking
total_records = get_record_count(dataset_id)
notifier.set_total_items(total_records)
for record in get_records(dataset_id):
success = process_record(record)
notifier.increment_progress(success=success, channel="jobs")
except Exception as e:
notifier.send_error(
message="Background job failed",
error=e,
context={"task_id": self.request.id, "dataset_id": dataset_id},
channel="alerts"
)
raise
```
## Channel Routing Strategy
### Recommended Channel Setup
```python
channels = {
"system": "webhook_for_system_events", # System lifecycle, deployments
"alerts": "webhook_for_critical_alerts", # Errors, failures, critical issues
"logs": "webhook_for_general_logs", # General information, debug info
"performance": "webhook_for_performance", # Performance metrics, slow queries
"security": "webhook_for_security" # Security events, access logs
}
notifier = SlackNotifier(channels=channels)
# Route appropriately
notifier.send_error("Database down!", channel="alerts")
notifier.send_info("Deployment started", channel="system")
notifier.send_debug("Query took 2.5s", channel="performance")
```
## Error Handling and Resilience
The package is designed to be resilient:
- **Network failures**: Automatically falls back to file logging
- **Invalid webhooks**: Logs errors and continues operation
- **Rate limiting**: Respects Slack's rate limits
- **Timeout protection**: Configurable request timeouts
- **Graceful degradation**: Never breaks your application
## Message Format
All notifications include:
- **Level indicator**: Emoji-based visual indicators (✅ ❌ ⚠️ ℹ️ 🔍)
- **System identification**: Shows which system/application sent the message
- **Environment context**: Database, hostname, environment information
- **Timestamp**: When the notification was sent
- **Rich formatting**: Code blocks, structured fields, proper formatting
## API Reference
### SlackNotifier Class
#### Constructor
```python
SlackNotifier(
channels: Optional[Dict[str, str]] = None,
default_webhook_url: Optional[str] = None,
system_name: Optional[str] = None,
notification_log_path: Optional[str] = None,
enable_logging: bool = True,
fallback_to_logging: bool = True,
timeout: int = 10
)
```
#### Core Methods
- `send_success(message, title=None, fields=None, fields_code_block=None, channel=None)`
- `send_error(message, title=None, fields=None, fields_code_block=None, channel=None, error=None, context=None)`
- `send_warning(message, title=None, fields=None, fields_code_block=None, channel=None)`
- `send_info(message, title=None, fields=None, fields_code_block=None, channel=None)`
- `send_debug(message, title=None, fields=None, fields_code_block=None, channel=None)`
#### Lifecycle Methods
- `send_script_started(script_name, script_version="1.0", additional_context=None, channel=None)`
- `send_script_completed(script_name, duration_seconds, records_processed=0, success_count=0, error_count=0, additional_stats=None, channel=None)`
#### Progress Tracking
- `set_total_items(total)`
- `increment_progress(success=True, channel=None)`
- `send_progress_notification(channel=None)`
#### Channel Management
- `get_channel_names()`
- `add_channel(name, webhook_url, description=None)`
- `remove_channel(name)`
## License
MIT License - see LICENSE file for details.
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Submit a pull request
## Support
For issues and questions:
- GitHub Issues: https://github.com/xerohome/enhanced-slack-notifier/issues
- Documentation: https://github.com/xerohome/enhanced-slack-notifier/blob/main/README.md
Raw data
{
"_id": null,
"home_page": "https://github.com/xerohome/py-slack-notifier",
"name": "py-slack-notifier",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "slack, notifications, monitoring, alerts, multi-channel, webhook",
"author": "XeroHome Development Team",
"author_email": "XeroHome Development Team <dev@xerohome.com>",
"download_url": "https://files.pythonhosted.org/packages/79/d8/9d931641b878b9a46a093f082d51fc8b12a051acef7fed9b123b6875d3d7/py-slack-notifier-2.0.0.tar.gz",
"platform": null,
"description": "# py-slack-notifier\n\nA robust, reusable Python package for sending rich notifications to multiple Slack channels with advanced features like environment detection, progress tracking, and flexible configuration.\n\n## Features\n\n- **Multi-Channel Support**: Route different notifications to different Slack channels\n- **Rich Message Formatting**: Support for code blocks, structured fields, and emoji indicators\n- **Environment Detection**: Automatically detects database, hostname, and environment information\n- **Progress Tracking**: Built-in progress notifications for long-running processes\n- **Error Resilience**: Graceful fallback to logging when Slack is unavailable\n- **Flexible Configuration**: Environment variables, direct configuration, or code-based setup\n- **Script Lifecycle Support**: Specialized notifications for script start/completion\n- **Project Agnostic**: Designed to work with any Python project\n- **Python 3.7+ Support**: Compatible with Python 3.7 through 3.13+\n\n## Installation\n\n```bash\npip install py-slack-notifier\n```\n\n## Quick Start\n\n### Single Channel Usage\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\n\n# Simple single-channel setup\nnotifier = SlackNotifier(\n default_webhook_url=\"https://hooks.slack.com/services/YOUR/WEBHOOK/URL\",\n system_name=\"MyApp\"\n)\n\n# Send notifications\nnotifier.send_success(\"Task completed successfully!\")\nnotifier.send_error(\"Something went wrong!\", error=exception)\nnotifier.send_warning(\"Performance degraded\")\nnotifier.send_info(\"System status update\")\n```\n\n### Multi-Channel Usage\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\n\n# Configure multiple channels\nchannels = {\n \"system\": \"https://hooks.slack.com/services/.../system-channel\",\n \"alerts\": \"https://hooks.slack.com/services/.../alerts-channel\",\n \"logs\": \"https://hooks.slack.com/services/.../logs-channel\"\n}\n\nnotifier = SlackNotifier(channels=channels, system_name=\"MyApp\")\n\n# Route notifications to specific channels\nnotifier.send_error(\"Critical system failure!\", channel=\"alerts\")\nnotifier.send_info(\"Daily backup completed\", channel=\"system\")\nnotifier.send_debug(\"Processing batch 5\", channel=\"logs\")\n```\n\n### Environment-Based Configuration\n\n```bash\n# Set environment variables\nexport SLACK_CHANNELS='{\"system\":\"webhook1\",\"alerts\":\"webhook2\",\"logs\":\"webhook3\"}'\nexport SYSTEM_NAME=\"MyApplication\"\nexport SLACK_NOTIFICATION_LOG=\"./logs/notifications.log\"\n```\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\n\n# Auto-configure from environment\nnotifier = SlackNotifier.from_environment()\n\n# Use with automatic channel routing\nnotifier.send_success(\"Started successfully\", channel=\"system\")\nnotifier.send_error(\"Database connection failed\", channel=\"alerts\")\n```\n\n## Advanced Features\n\n### Rich Message Formatting\n\n```python\n# Send with structured fields\nnotifier.send_success(\n message=\"Database backup completed\",\n title=\"Backup Process\",\n fields={\n \"Database\": \"production_db\",\n \"Size\": \"2.5 GB\",\n \"Duration\": \"15 minutes\",\n \"Performance\": {\n \"Compression Ratio\": \"75%\",\n \"Transfer Speed\": \"10 MB/s\"\n }\n },\n channel=\"system\"\n)\n\n# Send with code blocks\nnotifier.send_error(\n message=\"Script execution failed\",\n title=\"Processing Error\",\n fields={\n \"Script\": \"data_processor.py\",\n \"Batch\": \"batch_20250827\"\n },\n fields_code_block={\n \"Error Details\": \"ValueError: Invalid input format\\n at line 142\",\n \"Configuration\": \"batch_size: 1000\\nretry_count: 3\"\n },\n channel=\"alerts\"\n)\n```\n\n### Script Lifecycle Notifications\n\n```python\n# Script started notification\nnotifier.send_script_started(\n script_name=\"data_processor\",\n script_version=\"2.1\",\n additional_context={\n \"Environment\": \"production\",\n \"Batch Size\": 1000,\n \"Input Files\": 150\n },\n channel=\"logs\"\n)\n\n# Script completion notification\nnotifier.send_script_completed(\n script_name=\"data_processor\",\n duration_seconds=1205.5,\n records_processed=50000,\n success_count=49850,\n error_count=150,\n additional_stats={\n \"Performance\": \"41.5 records/second\",\n \"Output Files\": \"processed_data_20250827.json\"\n },\n channel=\"logs\"\n)\n```\n\n### Progress Tracking\n\n```python\n# Set up progress tracking\nnotifier.set_total_items(10000)\n\n# In your processing loop\nfor item in items:\n # Process item\n success = process_item(item)\n \n # This will automatically send progress notifications at 20%, 40%, 60%, 80%, 100%\n notifier.increment_progress(success=success, channel=\"logs\")\n```\n\n### Error Handling with Context\n\n```python\ntry:\n risky_operation()\nexcept Exception as e:\n notifier.send_error(\n message=\"Operation failed\",\n title=\"Critical Error\",\n error=e, # Automatically includes exception details and stack trace\n context={\n \"operation\": \"data_transformation\",\n \"batch_id\": \"B20250827_001\",\n \"retry_count\": 3\n },\n channel=\"alerts\"\n )\n```\n\n## Configuration Options\n\n### Environment Variables\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `SLACK_CHANNELS` | JSON mapping of channel names to webhooks | `'{\"alerts\":\"webhook1\",\"logs\":\"webhook2\"}'` |\n| `SLACK_DEFAULT_WEBHOOK` | Default webhook URL | `https://hooks.slack.com/services/...` |\n| `SYSTEM_NAME` | System identifier for notifications | `MyApplication` |\n| `SLACK_NOTIFICATION_LOG` | Path for notification logs | `./logs/notifications.log` |\n| `APP_SETTINGS` | Application environment settings | `myapp.config.production` |\n| `DATABASE_URL` | Database connection URL (auto-detected) | `postgresql://...` |\n\n### Programmatic Configuration\n\n```python\n# Create with full configuration\nnotifier = SlackNotifier(\n channels={\n \"system\": \"webhook_url_1\",\n \"alerts\": \"webhook_url_2\",\n \"logs\": \"webhook_url_3\"\n },\n system_name=\"MyApplication\",\n notification_log_path=\"./logs/slack_notifications.log\",\n enable_logging=True,\n fallback_to_logging=True, # Fallback to file logging if Slack fails\n timeout=10 # Request timeout in seconds\n)\n```\n\n## Integration Examples\n\n### Database Scripts\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\n\ndef main():\n notifier = SlackNotifier.from_environment()\n \n # Script started\n notifier.send_script_started(\n script_name=\"database_migration\",\n additional_context={\n \"Environment\": os.getenv(\"APP_SETTINGS\"),\n \"Tables\": [\"users\", \"orders\", \"products\"]\n },\n channel=\"system\"\n )\n \n try:\n # Your database operations\n run_migrations()\n \n # Success notification\n notifier.send_script_completed(\n script_name=\"database_migration\",\n duration_seconds=time.time() - start_time,\n records_processed=migration_count,\n channel=\"system\"\n )\n except Exception as e:\n # Error notification\n notifier.send_error(\n message=\"Database migration failed\",\n error=e,\n context={\"stage\": \"migration\", \"current_table\": current_table},\n channel=\"alerts\"\n )\n raise\n```\n\n### Web Application Integration\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\nfrom flask import Flask\n\napp = Flask(__name__)\nnotifier = SlackNotifier.from_environment()\n\n@app.errorhandler(500)\ndef handle_server_error(error):\n notifier.send_error(\n message=\"Server error occurred\",\n title=\"Application Error\",\n error=error,\n context={\n \"endpoint\": request.endpoint,\n \"method\": request.method,\n \"user_id\": get_current_user_id()\n },\n channel=\"alerts\"\n )\n return \"Internal Server Error\", 500\n\n@app.route('/api/process')\ndef process_data():\n notifier.send_info(\n message=\"Data processing started\",\n fields={\"user\": get_current_user(), \"timestamp\": datetime.now()},\n channel=\"logs\"\n )\n # Process data...\n```\n\n### Background Job Monitoring\n\n```python\nfrom enhanced_slack_notifier import SlackNotifier\nimport celery\n\nnotifier = SlackNotifier.from_environment()\n\n@celery.task(bind=True)\ndef process_large_dataset(self, dataset_id):\n notifier.send_info(\n message=f\"Processing dataset {dataset_id}\",\n title=\"Background Job Started\",\n channel=\"jobs\"\n )\n \n try:\n # Set up progress tracking\n total_records = get_record_count(dataset_id)\n notifier.set_total_items(total_records)\n \n for record in get_records(dataset_id):\n success = process_record(record)\n notifier.increment_progress(success=success, channel=\"jobs\")\n \n except Exception as e:\n notifier.send_error(\n message=\"Background job failed\",\n error=e,\n context={\"task_id\": self.request.id, \"dataset_id\": dataset_id},\n channel=\"alerts\"\n )\n raise\n```\n\n## Channel Routing Strategy\n\n### Recommended Channel Setup\n\n```python\nchannels = {\n \"system\": \"webhook_for_system_events\", # System lifecycle, deployments\n \"alerts\": \"webhook_for_critical_alerts\", # Errors, failures, critical issues\n \"logs\": \"webhook_for_general_logs\", # General information, debug info\n \"performance\": \"webhook_for_performance\", # Performance metrics, slow queries\n \"security\": \"webhook_for_security\" # Security events, access logs\n}\n\nnotifier = SlackNotifier(channels=channels)\n\n# Route appropriately\nnotifier.send_error(\"Database down!\", channel=\"alerts\")\nnotifier.send_info(\"Deployment started\", channel=\"system\")\nnotifier.send_debug(\"Query took 2.5s\", channel=\"performance\")\n```\n\n## Error Handling and Resilience\n\nThe package is designed to be resilient:\n\n- **Network failures**: Automatically falls back to file logging\n- **Invalid webhooks**: Logs errors and continues operation\n- **Rate limiting**: Respects Slack's rate limits\n- **Timeout protection**: Configurable request timeouts\n- **Graceful degradation**: Never breaks your application\n\n## Message Format\n\nAll notifications include:\n\n- **Level indicator**: Emoji-based visual indicators (\u2705 \u274c \u26a0\ufe0f \u2139\ufe0f \ud83d\udd0d)\n- **System identification**: Shows which system/application sent the message\n- **Environment context**: Database, hostname, environment information\n- **Timestamp**: When the notification was sent\n- **Rich formatting**: Code blocks, structured fields, proper formatting\n\n## API Reference\n\n### SlackNotifier Class\n\n#### Constructor\n```python\nSlackNotifier(\n channels: Optional[Dict[str, str]] = None,\n default_webhook_url: Optional[str] = None,\n system_name: Optional[str] = None,\n notification_log_path: Optional[str] = None,\n enable_logging: bool = True,\n fallback_to_logging: bool = True,\n timeout: int = 10\n)\n```\n\n#### Core Methods\n- `send_success(message, title=None, fields=None, fields_code_block=None, channel=None)`\n- `send_error(message, title=None, fields=None, fields_code_block=None, channel=None, error=None, context=None)`\n- `send_warning(message, title=None, fields=None, fields_code_block=None, channel=None)`\n- `send_info(message, title=None, fields=None, fields_code_block=None, channel=None)`\n- `send_debug(message, title=None, fields=None, fields_code_block=None, channel=None)`\n\n#### Lifecycle Methods\n- `send_script_started(script_name, script_version=\"1.0\", additional_context=None, channel=None)`\n- `send_script_completed(script_name, duration_seconds, records_processed=0, success_count=0, error_count=0, additional_stats=None, channel=None)`\n\n#### Progress Tracking\n- `set_total_items(total)`\n- `increment_progress(success=True, channel=None)`\n- `send_progress_notification(channel=None)`\n\n#### Channel Management\n- `get_channel_names()`\n- `add_channel(name, webhook_url, description=None)`\n- `remove_channel(name)`\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Submit a pull request\n\n## Support\n\nFor issues and questions:\n- GitHub Issues: https://github.com/xerohome/enhanced-slack-notifier/issues\n- Documentation: https://github.com/xerohome/enhanced-slack-notifier/blob/main/README.md\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Enhanced multi-channel Slack notification system with rich formatting and environment detection",
"version": "2.0.0",
"project_urls": {
"Bug Reports": "https://github.com/xerohome/py-slack-notifier/issues",
"Documentation": "https://github.com/xerohome/py-slack-notifier/blob/main/README.md",
"Homepage": "https://github.com/xerohome/py-slack-notifier",
"Source": "https://github.com/xerohome/py-slack-notifier"
},
"split_keywords": [
"slack",
" notifications",
" monitoring",
" alerts",
" multi-channel",
" webhook"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3d3c1a0b0ae05aadcb0f2075384e4ce1617c3408cd78ca7da486374eb9192cbc",
"md5": "16b49cd297816fb4aca32b43a2c3e129",
"sha256": "a73ecd5f1172d89aa0f60939afd5438bb1ae6ee65872998d4a50f2e0c411edb9"
},
"downloads": -1,
"filename": "py_slack_notifier-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "16b49cd297816fb4aca32b43a2c3e129",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 6285,
"upload_time": "2025-08-27T10:15:13",
"upload_time_iso_8601": "2025-08-27T10:15:13.316673Z",
"url": "https://files.pythonhosted.org/packages/3d/3c/1a0b0ae05aadcb0f2075384e4ce1617c3408cd78ca7da486374eb9192cbc/py_slack_notifier-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "79d89d931641b878b9a46a093f082d51fc8b12a051acef7fed9b123b6875d3d7",
"md5": "e2d74960b56697acbd5141b74e7912fd",
"sha256": "d80a73018df02681c3bd7e2f3cd903d33fc0a9f782eba1df385319fd38bf627a"
},
"downloads": -1,
"filename": "py-slack-notifier-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "e2d74960b56697acbd5141b74e7912fd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 6802,
"upload_time": "2025-08-27T10:15:14",
"upload_time_iso_8601": "2025-08-27T10:15:14.614544Z",
"url": "https://files.pythonhosted.org/packages/79/d8/9d931641b878b9a46a093f082d51fc8b12a051acef7fed9b123b6875d3d7/py-slack-notifier-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-27 10:15:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "xerohome",
"github_project": "py-slack-notifier",
"github_not_found": true,
"lcname": "py-slack-notifier"
}