Maweng Framework
A lightweight, modern Python web framework designed for building scalable backend systems with ease. Maweng combines the simplicity of Flask with the power of FastAPI, featuring an intuitive ORM, auto-generated API documentation, and developer-friendly tooling.
🚀 Features
- Lightning Fast: Built on top of FastAPI and Uvicorn for exceptional performance
- Intuitive ORM: SQLAlchemy-based ORM with automatic migrations
- Auto-Generated API Docs: OpenAPI/Swagger documentation out of the box
- Type Safety: Full type hints and Pydantic integration
- Dependency Injection: Clean architecture with built-in DI container
- CLI Tools: Project scaffolding and management utilities
- Testing Framework: Built-in testing utilities and fixtures
- Modern Python: Python 3.8+ with async/await support
📦 Installation
# Install from PyPI (when available)
pip install maweng
# Or install from source
git clone https://github.com/maweng/framework.git
cd framework
pip install -e .
🎯 Quick Start
1. Create a New Project
maweng new myapp
cd myapp
2. Define Your Models
# models.py
from maweng.orm import Model, Field
from datetime import datetime
class User(Model):
__tablename__ = "users"
id = Field.Integer(primary_key=True)
email = Field.String(unique=True, max_length=255)
name = Field.String(max_length=100)
created_at = Field.DateTime(default=datetime.utcnow)
is_active = Field.Boolean(default=True)
3. Create Your Views
# views.py
from maweng import View, Response
from maweng.orm import query
from .models import User
class UserView(View):
@query.get("/users")
async def list_users(self):
users = await User.all()
return Response.json(users)
@query.post("/users")
async def create_user(self, user_data: dict):
user = await User.create(**user_data)
return Response.json(user, status=201)
@query.get("/users/{user_id}")
async def get_user(self, user_id: int):
user = await User.get(user_id)
if not user:
return Response.json({"error": "User not found"}, status=404)
return Response.json(user)
4. Run Your Application
maweng run
Visit http://localhost:8000/docs to see your auto-generated API documentation!
🏗️ Project Structure
myapp/
├── app/
│ ├── __init__.py
│ ├── models.py # Database models
│ ├── views.py # API endpoints
│ ├── services.py # Business logic
│ └── middleware.py # Custom middleware
├── migrations/ # Database migrations
├── tests/ # Test files
├── static/ # Static files
├── templates/ # HTML templates
├── config.py # Configuration
└── main.py # Application entry point
🔧 Configuration
# config.py
from maweng.config import Config
class DevelopmentConfig(Config):
DEBUG = True
DATABASE_URL = "sqlite:///./dev.db"
SECRET_KEY = "your-secret-key"
class ProductionConfig(Config):
DEBUG = False
DATABASE_URL = "postgresql://user:pass@localhost/db"
SECRET_KEY = "your-production-secret"
🗄️ ORM Usage
Basic CRUD Operations
# Create
user = await User.create(name="John Doe", email="john@example.com")
# Read
user = await User.get(1)
users = await User.filter(is_active=True)
all_users = await User.all()
# Update
await user.update(name="Jane Doe")
# or
await User.filter(id=1).update(name="Jane Doe")
# Delete
await user.delete()
# or
await User.filter(id=1).delete()
Relationships
class Post(Model):
__tablename__ = "posts"
id = Field.Integer(primary_key=True)
title = Field.String(max_length=200)
content = Field.Text()
author_id = Field.Integer(foreign_key="users.id")
# Define relationship
author = Relationship("User", back_populates="posts")
class User(Model):
# ... existing fields ...
posts = Relationship("Post", back_populates="author")
🧪 Testing
# tests/test_users.py
import pytest
from maweng.testing import TestClient
from app.models import User
@pytest.mark.asyncio
async def test_create_user():
client = TestClient()
response = await client.post("/users", json={
"name": "Test User",
"email": "test@example.com"
})
assert response.status_code == 201
assert response.json()["name"] == "Test User"
📚 Documentation
🤝 Contributing
We welcome contributions! Please see our Contributing Guide for details.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🆚 Comparison with Other Frameworks
| Feature | Maweng | FastAPI | Django | Flask |
|---|---|---|---|---|
| Performance | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| Ease of Use | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| ORM | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| Auto Docs | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ |
| Type Safety | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| Learning Curve | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
🚀 Roadmap
- GraphQL support
- WebSocket support
- Background task queue
- Admin interface
- Plugin system
- Microservices support
- Kubernetes deployment tools
Built with ❤️ by Paul Ndambo
Metadata
Release files for maweng 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| maweng-0.2.2.tar.gz | 48.2 kB | Without provenance | Details for maweng-0.2.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| maweng-0.2.2-py3-none-any.whl | Python 3 | none | any | Details for maweng-0.2.2-py3-none-any.whl |
Total release size: 101.4 kB
Release files / maweng-0.2.2.tar.gz
| Download URL | maweng-0.2.2.tar.gz |
|---|---|
| Size | 48.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0160f59838f0e6922809ab25f2e70fa12e45ba57d460b16e78b9e0214af2c79
|
|
BLAKE2b-256 checksum How to use checksums |
cdf84866a51325b255331d292badbed2275639271cb2c7f9313b89180ca61ecd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|
Release files / maweng-0.2.2-py3-none-any.whl
| Download URL | maweng-0.2.2-py3-none-any.whl |
|---|---|
| Size | 53.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
097df28735c68e42b82f595bd7db8f5676472550f2ec1bb15b51a64bd43cd30a
|
|
BLAKE2b-256 checksum How to use checksums |
e79aad889fe8adf7357975d4a20688566aaf43c61474ef8c12f7ca8ae7d29b4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|
Security for maweng 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.