home / skills / bobmatnyc / claude-mpm-skills / good-self-contained-skill

good-self-contained-skill skill

/examples/good-self-contained-skill

This skill helps you build a self-contained Example Framework project with inlined patterns, tests, and deployment readiness for any directory.

npx playbooks add skill bobmatnyc/claude-mpm-skills --skill good-self-contained-skill

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
12.7 KB
---
name: example-framework-skill
description: Example of a properly self-contained skill following all best practices
category: framework
toolchain: python
tags: [self-contained, example, template, best-practice]
version: 1.0.0
author: claude-mpm-skills
updated: 2025-11-30
progressive_disclosure:
  entry_point:
    summary: "Example of a properly self-contained skill following all best practices"
    when_to_use: "When working with example-framework-skill or related functionality."
    quick_start: "1. Review the core concepts below. 2. Apply patterns to your use case. 3. Follow best practices for implementation."
---
# Example Framework Skill

A complete example demonstrating proper self-containment patterns for Claude Code skills.

**When to Use**: Building applications with Example Framework - includes setup, patterns, testing, and deployment.

---

## Overview

This skill demonstrates the **correct approach** to self-contained skill development:

✅ **Self-Contained**: All essential content inlined - works standalone
✅ **No Dependencies**: No relative paths to other skills
✅ **Complete Examples**: Working code, not fragments
✅ **Graceful Degradation**: Notes optional enhancements without requiring them
✅ **Flat Deployment Ready**: Works in any directory structure

---

## Quick Start

### Installation

```bash
# Install framework
pip install example-framework

# Create new project
example-framework init my-project
cd my-project

# Install dependencies
pip install -r requirements.txt

# Run development server
example-framework dev
```

### Minimal Example (Self-Contained)

```python
"""
Minimal Example Framework application.
Self-contained - no external skill dependencies.
"""
from example_framework import App, route

app = App()

@route("/")
def home():
    """Homepage route."""
    return {"message": "Hello, World!"}

@route("/users/{user_id}")
def get_user(user_id: int):
    """Get user by ID."""
    return {
        "id": user_id,
        "username": f"user_{user_id}"
    }

if __name__ == "__main__":
    # Development server
    app.run(host="0.0.0.0", port=8000, debug=True)
```

**Run it:**
```bash
python app.py
# Visit: http://localhost:8000
```

---

## Core Patterns

### 1. Application Setup (Self-Contained)

**Complete setup pattern** - no external dependencies:

```python
from example_framework import App, Config
from example_framework.middleware import CORSMiddleware, LoggingMiddleware

# Configuration
config = Config(
    DEBUG=True,
    SECRET_KEY="your-secret-key-here",
    DATABASE_URL="sqlite:///./app.db"
)

# Application instance
app = App(config=config)

# Middleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"]
)

app.add_middleware(LoggingMiddleware)

# Health check endpoint
@app.route("/health")
def health_check():
    """Health check endpoint."""
    return {"status": "healthy"}
```

### 2. Database Integration (Self-Contained)

**Essential database pattern** - inlined for self-containment:

```python
from example_framework import Database
from contextlib import contextmanager

# Database configuration
db = Database("sqlite:///./app.db")

@contextmanager
def get_db_session():
    """
    Database session context manager.

    Usage:
        with get_db_session() as session:
            users = session.query(User).all()
    """
    session = db.create_session()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

# Model example
class User(db.Model):
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def to_dict(self):
        """Convert to dictionary."""
        return {
            "id": self.id,
            "username": self.username,
            "email": self.email
        }

# CRUD operations
@app.route("/users", methods=["POST"])
def create_user(data):
    """Create new user."""
    with get_db_session() as session:
        user = User(
            username=data["username"],
            email=data["email"]
        )
        session.add(user)
        return user.to_dict(), 201

@app.route("/users/{user_id}")
def get_user(user_id: int):
    """Get user by ID."""
    with get_db_session() as session:
        user = session.query(User).filter_by(id=user_id).first()
        if not user:
            return {"error": "User not found"}, 404
        return user.to_dict()
```

### 3. Testing Pattern (Self-Contained)

**Essential testing patterns** - inlined from testing best practices:

```python
"""
Test suite for Example Framework application.
Self-contained testing patterns - no external skill dependencies.
"""
import pytest
from example_framework.testing import TestClient

# Test client fixture
@pytest.fixture
def client():
    """Create test client."""
    return TestClient(app)

# Database fixture
@pytest.fixture
def db_session():
    """Create test database session."""
    db.create_all()
    session = db.create_session()
    yield session
    session.close()
    db.drop_all()

# Test examples
def test_home_route(client):
    """Test homepage returns correct response."""
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello, World!"}

def test_create_user(client, db_session):
    """Test user creation."""
    response = client.post("/users", json={
        "username": "testuser",
        "email": "[email protected]"
    })
    assert response.status_code == 201
    data = response.json()
    assert data["username"] == "testuser"
    assert data["email"] == "[email protected]"

def test_get_user(client, db_session):
    """Test get user by ID."""
    # Create user
    user = User(username="testuser", email="[email protected]")
    db_session.add(user)
    db_session.commit()

    # Get user
    response = client.get(f"/users/{user.id}")
    assert response.status_code == 200
    assert response.json()["username"] == "testuser"

def test_user_not_found(client):
    """Test 404 for nonexistent user."""
    response = client.get("/users/999")
    assert response.status_code == 404
```

**Run tests:**
```bash
pytest tests/
```

---

## Error Handling

### Standard Error Handler Pattern (Self-Contained)

```python
from example_framework import HTTPException

@app.error_handler(404)
def not_found_handler(error):
    """Handle 404 errors."""
    return {
        "error": "Not Found",
        "message": str(error)
    }, 404

@app.error_handler(500)
def server_error_handler(error):
    """Handle 500 errors."""
    return {
        "error": "Internal Server Error",
        "message": "An unexpected error occurred"
    }, 500

@app.error_handler(HTTPException)
def http_exception_handler(error):
    """Handle HTTP exceptions."""
    return {
        "error": error.name,
        "message": error.description
    }, error.status_code

# Custom validation error
class ValidationError(Exception):
    """Validation error."""
    pass

@app.error_handler(ValidationError)
def validation_error_handler(error):
    """Handle validation errors."""
    return {
        "error": "Validation Error",
        "message": str(error)
    }, 400
```

---

## Best Practices

### 1. Configuration Management

```python
# environment-based configuration
import os
from example_framework import Config

class DevelopmentConfig(Config):
    DEBUG = True
    DATABASE_URL = "sqlite:///./dev.db"

class ProductionConfig(Config):
    DEBUG = False
    DATABASE_URL = os.getenv("DATABASE_URL")
    SECRET_KEY = os.getenv("SECRET_KEY")

# Load config based on environment
env = os.getenv("ENV", "development")
config = DevelopmentConfig() if env == "development" else ProductionConfig()

app = App(config=config)
```

### 2. Dependency Injection

```python
# Dependency injection pattern
from example_framework import Depends

def get_current_user(token: str = Depends("Authorization")):
    """Get current user from token."""
    # Token validation logic
    user_id = validate_token(token)
    return User.query.get(user_id)

@app.route("/profile")
def get_profile(user: User = Depends(get_current_user)):
    """Get current user profile."""
    return user.to_dict()
```

### 3. Request Validation

```python
from example_framework import validate_request

# Request schema
user_schema = {
    "username": {"type": "string", "minLength": 3, "maxLength": 80},
    "email": {"type": "string", "format": "email"},
    "age": {"type": "integer", "minimum": 0}
}

@app.route("/users", methods=["POST"])
@validate_request(user_schema)
def create_user(data):
    """Create user with validated data."""
    # Data is already validated
    user = User(**data)
    db.session.add(user)
    db.session.commit()
    return user.to_dict(), 201
```

---

## Deployment

### Production Deployment (Self-Contained)

```python
"""
Production deployment configuration.
Self-contained - all necessary patterns included.
"""

# 1. Use production server (e.g., gunicorn)
# requirements.txt:
# gunicorn>=20.1.0

# 2. Production configuration
import os

class ProductionConfig:
    DEBUG = False
    TESTING = False
    SECRET_KEY = os.getenv("SECRET_KEY")
    DATABASE_URL = os.getenv("DATABASE_URL")
    ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")

app = App(config=ProductionConfig())

# 3. Run with gunicorn
# gunicorn -w 4 -b 0.0.0.0:8000 app:app

# 4. Environment variables (.env)
# SECRET_KEY=your-production-secret-key
# DATABASE_URL=postgresql://user:pass@localhost/dbname
# ALLOWED_HOSTS=example.com,www.example.com
```

---

## Complementary Skills

When using this skill, consider these related skills (if deployed):

- **pytest-patterns**: Advanced testing patterns and fixtures
  - *Use case*: Comprehensive test suites with parametrization
  - *Integration*: Enhance basic testing patterns shown above
  - *Status*: Optional - basic testing patterns included in this skill

- **database-orm-patterns**: Advanced ORM patterns and optimization
  - *Use case*: Complex queries, relationships, performance tuning
  - *Integration*: Builds on basic database pattern shown above
  - *Status*: Optional - basic CRUD patterns included in this skill

- **api-security**: Authentication, authorization, security best practices
  - *Use case*: Production-ready security implementation
  - *Integration*: Adds security layer to routes
  - *Status*: Recommended for production - basic examples shown above

- **deployment-patterns**: Docker, CI/CD, monitoring, scaling
  - *Use case*: Production deployment and operations
  - *Integration*: Deployment strategies and tooling
  - *Status*: Optional - basic deployment shown above

**Note**: All complementary skills are independently deployable. This skill is fully functional without them.

---

## Common Pitfalls

### ❌ Don't: Relative Imports
```python
# DON'T DO THIS
from ..other_skill.patterns import setup
```

### ✅ Do: Self-Contained Patterns
```python
# Include pattern directly
def setup():
    """Setup pattern (self-contained)."""
    # Implementation here
    pass
```

### ❌ Don't: External Skill Dependencies
```python
# DON'T DO THIS
# This requires pytest-patterns skill
from skills.pytest_patterns import fixture_factory
```

### ✅ Do: Inline Essential Patterns
```python
# Include essential pattern
def fixture_factory(name, default=None):
    """Fixture factory pattern (inlined)."""
    @pytest.fixture
    def _fixture():
        return default
    _fixture.__name__ = name
    return _fixture
```

---

## Progressive Disclosure

For more advanced topics, see the `references/` directory:

- **[references/advanced-patterns.md](references/advanced-patterns.md)**: Advanced framework patterns
- **[references/performance.md](references/performance.md)**: Performance optimization
- **[references/api-reference.md](references/api-reference.md)**: Complete API documentation

**Note**: Main SKILL.md is self-sufficient. References provide optional deep dives.

---

## Resources

**Official Documentation**:
- Example Framework Docs: https://example-framework.readthedocs.io
- API Reference: https://example-framework.readthedocs.io/api
- Community: https://github.com/example-framework/community

**Related Technologies**:
- Python: https://docs.python.org
- SQLite: https://www.sqlite.org
- Pytest: https://docs.pytest.org

---

## Summary

This skill demonstrates **self-contained skill development**:

✅ **Complete**: All essential patterns included inline
✅ **Independent**: Works without other skills
✅ **Tested**: Verified in isolation
✅ **Deployable**: Works in flat directory structure
✅ **Graceful**: Notes optional enhancements without requiring them

**Use this as a template** for creating new skills.

---

**Version**: 1.0.0
**Last Updated**: 2025-11-30
**Self-Containment**: ✅ Fully Compliant

Overview

This skill is a self-contained example framework guide showing practical patterns for building, testing, and deploying a Python web application. It includes complete, ready-to-run examples for app setup, database integration, testing, error handling, and production deployment. The content focuses on patterns that work without external skill dependencies and is suitable as a template for real projects.

How this skill works

The skill provides inlined code snippets and configuration examples that you can copy into a new project and run immediately. It demonstrates a minimal app, middleware setup, a database session pattern with models and CRUD endpoints, a testing suite using a test client, and standard error handlers. Deployment notes show production configuration and server invocation (e.g., gunicorn) while maintaining graceful degradation when optional tools are absent.

When to use it

  • Starting a new Python web project and needing a self-contained reference implementation
  • Learning or teaching best practices for app setup, DB sessions, testing, and error handling
  • Bootstrapping a small service where you prefer minimal external dependencies
  • Creating reproducible examples for CI, demos, or documentation
  • Preparing a deployable app structure for staging or production with clear configuration patterns

Best practices

  • Keep essential patterns inline so examples run without cross-references or external skills
  • Use environment-based configuration classes for development and production separation
  • Encapsulate DB sessions with context managers to ensure commit/rollback and proper cleanup
  • Write self-contained tests with fixtures that create and teardown a test database
  • Provide clear error handlers for common HTTP and validation errors to standardize responses

Example use cases

  • Create a minimal API server with routes, middleware, and a health endpoint for rapid prototyping
  • Implement simple user CRUD backed by SQLite and use provided session patterns for safety
  • Add a test suite that runs locally or in CI using the included TestClient and pytest fixtures
  • Prepare a production-ready deployment using a production config and running under gunicorn
  • Use the templates as a starting point to add authentication, advanced ORM patterns, or monitoring

FAQ

Do I need other skills or packages to use these examples?

No. The examples are written to be self-contained; they assume only the example-framework package and standard Python tooling. Optional tools like gunicorn or advanced complementary skills are recommended but not required.

How do I run tests included in the examples?

Install pytest, then run pytest against the tests directory. The examples include fixtures to create and tear down a test database so tests remain isolated.