A Python library for building modular applications with unified triggers
Project description
ModuLink Python ๐
A lightweight function composition framework for Python using universal types - simple, consistent patterns that work across multiple languages.
๐ Core Philosophy
- Universal Types: Simple function signatures that work across languages
- Functional Composition: Pure functions connected through context flow
- Minimal API: Only 5 core types you need to learn
- Context Flow: Rich context dictionaries carry data through function chains
๐ Quick Start
Installation
pip install -r requirements.txt
Basic Usage
from modulink import Ctx, chain
# Define simple functions that take context and return context
async def validate_user(ctx: Ctx) -> Ctx:
if not ctx.get('email'):
return {**ctx, 'errors': [{'message': 'Email is required', 'code': 'VALIDATION_ERROR'}]}
return ctx
async def send_welcome(ctx: Ctx) -> Ctx:
if not ctx.get('errors'):
print(f"Welcome email sent to {ctx.get('email')}")
return {**ctx, 'sent': True}
return ctx
# Compose functions into a chain
user_flow = chain(validate_user, send_welcome)
# Execute with context
result = await user_flow({'email': 'alice@example.com'})
print(result) # {'email': 'alice@example.com', 'sent': True}
๐ฏ Universal Types
ModuLink uses 5 simple universal types that create a consistent API:
1. Ctx - Context Dictionary
# Simple dictionary for passing data
ctx: Ctx = {
'user_id': 123,
'email': 'user@example.com',
'processed_at': '2024-01-01T12:00:00Z'
}
2. Link - Async Function
# Function that transforms context
async def process_user(ctx: Ctx) -> Ctx:
return {**ctx, 'processed': True}
3. Chain - Function Composition
# Compose multiple links
from modulink import chain
pipeline = chain(validate_input, process_data, save_result)
4. Trigger - Event Handler
# HTTP endpoint that returns a composed function
from modulink import http_trigger
@http_trigger('/api/users', method='POST')
async def handle_user_creation(ctx: Ctx) -> Ctx:
return await user_creation_pipeline(ctx)
5. Middleware - Function Wrapper
# Function that wraps other functions
from modulink import timing
timed_function = timing(process_user)
๐ง Functional Utilities
ModuLink provides utilities for common patterns:
Conditional Execution
from modulink import when
# Only execute if condition is met
premium_flow = when(
lambda ctx: ctx.get('user_type') == 'premium',
add_premium_features
)
Error Handling
from modulink import catch_errors
# Gracefully handle errors
safe_operation = catch_errors(risky_function, fallback_function)
Timing & Performance
from modulink import timing
# Track execution time
timed_flow = timing(expensive_operation)
Parallel Execution
from modulink import parallel
# Run functions in parallel
parallel_flow = parallel([process_images, generate_thumbnails, extract_metadata])
๐ Integration Examples
FastAPI Integration
from fastapi import FastAPI
from modulink import Ctx, chain, catch_errors
app = FastAPI()
# Define processing pipeline
user_pipeline = chain(
validate_user_data,
save_to_database,
send_confirmation_email
)
@app.post("/api/users")
async def create_user(request_data: dict):
# Convert to ModuLink context
ctx: Ctx = {'request_data': request_data}
# Run pipeline with error handling
safe_pipeline = catch_errors(user_pipeline)
result = await safe_pipeline(ctx)
if result.get('errors'):
return {"success": False, "errors": result['errors']}
return {"success": True, "user": result.get('user')}
CLI Integration
import click
from modulink import Ctx, chain
# File processing pipeline
file_pipeline = chain(
validate_input_directory,
scan_files,
process_files,
generate_report
)
@click.command()
@click.option('--input-dir', required=True)
@click.option('--output-dir', required=True)
def process_files(input_dir: str, output_dir: str):
"""Process files using ModuLink pipeline."""
ctx: Ctx = {
'input_dir': input_dir,
'output_dir': output_dir,
'start_time': datetime.utcnow().isoformat()
}
result = await file_pipeline(ctx)
if result.get('errors'):
print("Processing failed:", result['errors'])
exit(1)
print("Processing completed successfully!")
๐ Project Structure
modulink-py/
โโโ modulink/
โ โโโ __init__.py # Package exports
โ โโโ universal.py # Universal type definitions
โ โโโ universal_modulink.py # Core implementation
โ โโโ universal_utils.py # Utility functions
โโโ examples/
โ โโโ basic_example.py # Basic usage patterns
โ โโโ cli_example.py # CLI integration
โ โโโ fastapi_example.py # FastAPI integration
โ โโโ immutable_example.py # Functional patterns
โโโ tests/
โ โโโ test_universal.py # Universal types tests
โโโ README.md
๐งช Testing
# Run all tests
python -m pytest tests/test_universal.py -v
# Run examples
python examples/basic_example.py
python examples/cli_example.py demo
๐ Examples
The examples/ directory contains comprehensive examples:
basic_example.py- Core patterns and utilitiescli_example.py- Command-line integration with Clickfastapi_example.py- Web API integration with FastAPIimmutable_example.py- Functional programming patternsdevops_cicd_pipeline.py- Complex DevOps CI/CD workflow with comprehensive testingfinancial_trading_system.py- Financial trading system with risk management
๐งช Testing Guide
ModuLink provides comprehensive testing cookbooks to help you build robust test suites:
๐ Complete Testing Guide
Your roadmap to testing ModuLink workflows from simple functions to enterprise systems.
Learning Path:
-
๐ฑ Beginner Cookbook - Start here
- Basic testing setup and patterns
- Testing individual functions and simple chains
- Working with context and common patterns
-
๐ Intermediate Cookbook - Level up
- Advanced error handling and mocking
- Integration testing and async workflows
- Performance testing patterns
-
๐ข Advanced Cookbook - Master level
- Complex enterprise workflows (DevOps, Financial)
- Multi-environment and compliance testing
- Comprehensive test architecture
Real-World Test Examples:
- 570+ lines of DevOps CI/CD pipeline tests
- 400+ lines of Financial trading system tests
- Unit, integration, performance, and compliance testing patterns
- Mock strategies for external services
- Error handling and recovery testing
๐ Migration from v1.x
ModuLink 2.0 uses universal types instead of classes:
# v1.x (Legacy - No longer supported)
from modulink import ModuLink, Context
app = ModuLink()
ctx = Context.from_data({'user': 'alice'})
# v2.0 (Universal Types)
from modulink import Ctx, chain
ctx: Ctx = {'user': 'alice'}
pipeline = chain(validate, process, save)
Key Changes:
- โ Simple dictionaries instead of Context class
- โ Function composition instead of registration
- โ Consistent API across languages
- โ Better TypeScript compatibility
- โ Reduced complexity and dependencies
๐ค Contributing
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Run the test suite:
python -m pytest tests/test_universal.py -v - Submit a pull request
๐ License
Apache 2.0 - see LICENSE file for details.
โ ๏ธ Limitations
- Basic function composition only
- Limited middleware capabilities
- No sophisticated execution model
- Utilities are mostly stubs
๐๏ธ Architecture
ModuLink Python 2.0 uses universal types for consistency:
- Context as Data: Simple dictionaries for maximum compatibility
- Function Composition: Pure functions connected through
chain() - Async by Default: All functions are async for better performance
- Language Agnostic: Same patterns across multiple languages
- Minimal Dependencies: Lightweight with only essential features
The universal types approach provides:
- ๐ Better Performance: No class overhead, direct dictionary access
- ๐งช Easier Testing: Pure functions are simple to test
- ๐ง Better IDE Support: Full type hints and autocomplete
- ๐ Cross-Language: Same patterns across multiple languages
Project details
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 modulink_py-4.0.0.tar.gz.
File metadata
- Download URL: modulink_py-4.0.0.tar.gz
- Upload date:
- Size: 12.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce54e5348a4f4323d4691ea1f44375b4b95e072c1f79a531ae994fd6d79d00ce
|
|
| MD5 |
852b1559cd624bba43bc5b7cdc2b8280
|
|
| BLAKE2b-256 |
b4a1c8b35dfab6fa6c1d7caae61c819a11fd76a396683d6ef677d6c02c800a9b
|
File details
Details for the file modulink_py-4.0.0-py3-none-any.whl.
File metadata
- Download URL: modulink_py-4.0.0-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3d020777d03e6078c4fb6dad2ef93407f206685c4d8825b310fabb1cbb369f6
|
|
| MD5 |
a3d809a9296b9164ffdacc590df3e881
|
|
| BLAKE2b-256 |
21c851b4a63867c40b96c357b52ea39df19dee912ebae8e0497d97e3ea348b63
|