py-slack-notifier


Namepy-slack-notifier JSON
Version 2.0.0 PyPI version JSON
download
home_pagehttps://github.com/xerohome/py-slack-notifier
SummaryEnhanced multi-channel Slack notification system with rich formatting and environment detection
upload_time2025-08-27 10:15:14
maintainerNone
docs_urlNone
authorXeroHome Development Team
requires_python>=3.7
licenseMIT
keywords slack notifications monitoring alerts multi-channel webhook
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.72149s