An adaptation for slack
Project description
TNSlack - Modern Slack App Builder for Python
A modern, type-safe Slack app builder for Python that makes building Slack apps faster and more maintainable. Built on top of the official Slack SDK with a router-based architecture and comprehensive async support.
Features
- 🚀 Modern Python: Full type hints, async/await support, Python 3.10+
- 🔒 Type Safe: Complete type safety with mypy support
- 🎯 Router Pattern: Clean, organized interaction handling
- ⚡ Official Slack SDK: Built on the official Slack SDK for Python
- 🧱 Block Builder: Intuitive Block Kit component builder
- 📦 No Dependencies: Minimal external dependencies
- 🧪 Well Tested: Comprehensive test suite with 95%+ coverage
- 📚 Great Docs: Clear documentation and examples
Installation
pip install tn-slack-py-module
For development:
pip install tn-slack-py-module[dev]
Quick Start
Basic App Setup
from tnslack import SlackApp
# Create app instance
app = SlackApp(
client_id="your_client_id",
client_secret="your_client_secret",
signing_secret="your_signing_secret",
bot_scopes=["chat:write", "commands"]
)
# Register a button handler
@app.register_route("block_actions", name="hello_button")
def handle_hello_button(payload, params):
return {
"text": f"Hello {payload['user']['name']}!"
}
# Process incoming interactions
def handle_slack_event(request):
# Verify request authenticity
if not app.authenticate_incoming_request(request.body, request.headers):
return {"error": "Invalid signature"}, 401
# Parse payload and route to handler
payload = json.loads(request.form["payload"])
response = app.slack_interaction_consumer(payload)
return response
Using Block Builder
from tnslack import BlockBuilder
builder = BlockBuilder()
# Create interactive components
blocks = [
builder.header_block("Welcome to TNSlack!"),
builder.simple_section_block("Click the button below:"),
builder.section_with_button_block(
button_label="Say Hello",
button_value="hello_clicked",
section_text="Interactive demo:",
action_id="hello_button"
),
builder.divider_block()
]
# Send message with blocks
app.send_channel_message(
channel="#general",
access_token="xoxb-your-bot-token",
text="Fallback text",
block_set=blocks
)
Async Support
from tnslack import AsyncSlackApp
async_app = AsyncSlackApp(
client_id="your_client_id",
client_secret="your_client_secret",
signing_secret="your_signing_secret"
)
# Async route handlers
@async_app.register_route("block_actions", name="async_button")
async def handle_async_button(payload, params):
# Perform async operations
user_info = await async_app.async_get_user_info(
user_id=payload["user"]["id"],
access_token="xoxb-your-bot-token"
)
return {
"text": f"Hello {user_info['user']['real_name']}!"
}
# Process interactions asynchronously
async def handle_slack_event_async(request):
payload = json.loads(request.form["payload"])
response = await async_app.async_slack_interaction_consumer(payload)
return response
Block Sets with Context Validation
from tnslack.decorators import block_set
@block_set(required_context=["user_id", "user_name"])
def user_profile_blocks(context):
builder = BlockBuilder()
return [
builder.header_block(f"Profile: {context['user_name']}"),
builder.simple_section_block(f"User ID: {context['user_id']}"),
# ... more blocks
]
# Register and use block set
app.register_block_set(user_profile_blocks)
# Use with context
blocks = app.get_block_set("user_profile_blocks", {
"user_id": "U123456",
"user_name": "John Doe"
})
Architecture
TNSlack uses a router-based architecture that makes it easy to organize your Slack app's interactions:
SlackApp
├── Route Registration (by interaction type)
│ ├── block_actions
│ ├── view_submission
│ ├── view_closed
│ └── block_suggestion
├── Block Set Management
│ └── Reusable UI components
├── OAuth Flow Support
└── Official Slack SDK Integration
Route Types
| Route Type | Description | Example Use Case |
|---|---|---|
block_actions |
Button clicks, select menus | Interactive buttons, dropdowns |
view_submission |
Modal form submissions | Form processing, data collection |
view_closed |
Modal/home tab closed | Cleanup, analytics |
block_suggestion |
External select options | Dynamic dropdowns, search |
Examples
Check out the examples/ directory for complete working examples:
- Basic Bot - Simple button interactions
- Modal Forms - Form handling with validation
- Async Bot - Full async/await example
- Django Integration - Django app example
- FastAPI Integration - FastAPI app example
Development
Setup
git clone https://github.com/thinknimble/tn-slack-py-module.git
cd tn-slack-py-module
pip install -e ".[dev]"
pre-commit install
Running Tests
pytest
Type Checking
mypy src/tnslack
Linting and Formatting
ruff check .
ruff format .
Key Changes
- Removed singleton pattern - use regular instantiation
- Added type hints throughout
- Replaced custom HTTP client with official Slack SDK
- Added async support
- Modernized error handling
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
License
MIT License - see LICENSE file for details.
Changelog
See CHANGELOG.md for version history.
Support
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tn_slack_py_module-0.2.3.tar.gz.
File metadata
- Download URL: tn_slack_py_module-0.2.3.tar.gz
- Upload date:
- Size: 176.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66422a1f492055035156ad079c6c130403836c05b9717fd362853fdbcc43def7
|
|
| MD5 |
5c9076f5eb93608191116992938fe9df
|
|
| BLAKE2b-256 |
718f9fc59de6f9bcd5a49f595acdee2c2501e28ae554aee3d664fe2416ec0b57
|
File details
Details for the file tn_slack_py_module-0.2.3-py3-none-any.whl.
File metadata
- Download URL: tn_slack_py_module-0.2.3-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8deaea4ab9914ba4bb7f3016bb0b0f51a8440dcab7bc4e3b61e4000baf829033
|
|
| MD5 |
31c331dc437c5d49d64d4aa09c44871e
|
|
| BLAKE2b-256 |
1e8d1b891bcb55c898585f53ecbca3c9f609636cca5642e82eda4e78218240ad
|