architectai-mcp / create_demos.py
JawadBenali's picture
new commit
ee7688b
"""
Create demo projects for ArchitectAI hackathon
Speed is critical - these demos should work instantly!
"""
import os
import zipfile
from pathlib import Path
def create_demo_ecommerce():
"""Create a realistic e-commerce demo with 15 files"""
demo_dir = Path("demo_ecommerce")
demo_dir.mkdir(exist_ok=True)
# 1. User model
(demo_dir / "models" / "user.py").parent.mkdir(exist_ok=True)
(demo_dir / "models" / "user.py").write_text("""
class User:
def __init__(self, user_id, name, email):
self.user_id = user_id
self.name = name
self.email = email
self.orders = []
def add_order(self, order):
self.orders.append(order)
def get_total_spent(self):
return sum(order.total for order in self.orders)
""")
# 2. Product model
(demo_dir / "models" / "product.py").write_text("""
class Product:
def __init__(self, product_id, name, price, stock):
self.product_id = product_id
self.name = name
self.price = price
self.stock = stock
def is_available(self):
return self.stock > 0
def reduce_stock(self, quantity):
if self.stock >= quantity:
self.stock -= quantity
return True
return False
""")
# 3. Order model
(demo_dir / "models" / "order.py").write_text("""
from datetime import datetime
class Order:
def __init__(self, order_id, user_id):
self.order_id = order_id
self.user_id = user_id
self.items = []
self.status = "pending"
self.created_at = datetime.now()
self.total = 0
def add_item(self, product, quantity):
self.items.append({
"product": product,
"quantity": quantity,
"price": product.price
})
self.total += product.price * quantity
def process(self):
self.status = "processing"
def complete(self):
self.status = "completed"
""")
# 4. Payment processor with STRATEGY PATTERN opportunity!
(demo_dir / "services" / "payment.py").parent.mkdir(exist_ok=True)
(demo_dir / "services" / "payment.py").write_text("""
# BAD: Using if/else for different payment methods
# Should use Strategy pattern!
class PaymentProcessor:
def process_payment(self, order, payment_method):
if payment_method == "credit_card":
return self._process_credit_card(order)
elif payment_method == "paypal":
return self._process_paypal(order)
elif payment_method == "bitcoin":
return self._process_bitcoin(order)
elif payment_method == "bank_transfer":
return self._process_bank_transfer(order)
else:
raise ValueError("Unknown payment method")
def _process_credit_card(self, order):
# Credit card processing logic
print(f"Processing ${order.total} via Credit Card")
return True
def _process_paypal(self, order):
# PayPal processing logic
print(f"Processing ${order.total} via PayPal")
return True
def _process_bitcoin(self, order):
# Bitcoin processing logic
print(f"Processing ${order.total} via Bitcoin")
return True
def _process_bank_transfer(self, order):
# Bank transfer processing logic
print(f"Processing ${order.total} via Bank Transfer")
return True
""")
# 5. Inventory manager - SINGLETON opportunity!
(demo_dir / "services" / "inventory.py").write_text("""
# BAD: Multiple instances possible
# Should use Singleton pattern!
class InventoryManager:
def __init__(self):
self.products = {}
def add_product(self, product):
self.products[product.product_id] = product
def get_product(self, product_id):
return self.products.get(product_id)
def update_stock(self, product_id, quantity):
product = self.products.get(product_id)
if product:
product.stock += quantity
""")
# 6. Notification service - OBSERVER opportunity!
(demo_dir / "services" / "notification.py").write_text("""
# BAD: Tight coupling for notifications
# Should use Observer pattern!
class NotificationService:
def __init__(self):
self.email_service = EmailService()
self.sms_service = SMSService()
self.push_service = PushService()
def notify_order_created(self, order):
self.email_service.send_email(order.user_id, "Order created")
self.sms_service.send_sms(order.user_id, "Order created")
self.push_service.send_push(order.user_id, "Order created")
def notify_order_shipped(self, order):
self.email_service.send_email(order.user_id, "Order shipped")
self.sms_service.send_sms(order.user_id, "Order shipped")
class EmailService:
def send_email(self, user_id, message):
print(f"Email to {user_id}: {message}")
class SMSService:
def send_sms(self, user_id, message):
print(f"SMS to {user_id}: {message}")
class PushService:
def send_push(self, user_id, message):
print(f"Push to {user_id}: {message}")
""")
# 7. Product factory - showing good FACTORY pattern
(demo_dir / "factories" / "product_factory.py").parent.mkdir(exist_ok=True)
(demo_dir / "factories" / "product_factory.py").write_text("""
# GOOD: Factory pattern for product creation
from models.product import Product
class ProductFactory:
@staticmethod
def create_electronic(name, price):
return Product(
product_id=f"ELEC-{name}",
name=name,
price=price,
stock=10
)
@staticmethod
def create_clothing(name, price):
return Product(
product_id=f"CLOTH-{name}",
name=name,
price=price,
stock=50
)
@staticmethod
def create_book(name, price):
return Product(
product_id=f"BOOK-{name}",
name=name,
price=price,
stock=100
)
""")
# 8. Order builder
(demo_dir / "builders" / "order_builder.py").parent.mkdir(exist_ok=True)
(demo_dir / "builders" / "order_builder.py").write_text("""
# GOOD: Builder pattern for complex order creation
from models.order import Order
class OrderBuilder:
def __init__(self, user_id):
self.order = Order(order_id=None, user_id=user_id)
def add_product(self, product, quantity):
self.order.add_item(product, quantity)
return self
def set_shipping_address(self, address):
self.order.shipping_address = address
return self
def set_billing_address(self, address):
self.order.billing_address = address
return self
def build(self):
return self.order
""")
# 9. Shopping cart
(demo_dir / "cart.py").write_text("""
class ShoppingCart:
def __init__(self, user_id):
self.user_id = user_id
self.items = []
def add_item(self, product, quantity):
self.items.append({"product": product, "quantity": quantity})
def remove_item(self, product_id):
self.items = [item for item in self.items if item["product"].product_id != product_id]
def get_total(self):
return sum(item["product"].price * item["quantity"] for item in self.items)
def clear(self):
self.items = []
""")
# 10. Discount calculator
(demo_dir / "discount.py").write_text("""
class DiscountCalculator:
def apply_percentage_discount(self, total, percentage):
return total * (1 - percentage / 100)
def apply_fixed_discount(self, total, amount):
return max(0, total - amount)
def apply_bulk_discount(self, quantity, price):
if quantity >= 10:
return price * 0.9
return price
""")
# 11-15. More utility files
(demo_dir / "utils" / "validator.py").parent.mkdir(exist_ok=True)
(demo_dir / "utils" / "validator.py").write_text("""
import re
class Validator:
@staticmethod
def validate_email(email):
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
@staticmethod
def validate_phone(phone):
return len(phone) >= 10
""")
(demo_dir / "utils" / "logger.py").write_text("""
from datetime import datetime
class Logger:
def log(self, message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] {message}")
""")
(demo_dir / "config.py").write_text("""
DATABASE_URL = "postgresql://localhost/ecommerce"
REDIS_URL = "redis://localhost:6379"
SECRET_KEY = "your-secret-key"
DEBUG = True
""")
(demo_dir / "main.py").write_text("""
from models.user import User
from models.product import Product
from services.payment import PaymentProcessor
from cart import ShoppingCart
def main():
# Create user
user = User(1, "John Doe", "[email protected]")
# Create products
laptop = Product(1, "Laptop", 999.99, 5)
mouse = Product(2, "Mouse", 29.99, 50)
# Shopping
cart = ShoppingCart(user.user_id)
cart.add_item(laptop, 1)
cart.add_item(mouse, 2)
print(f"Total: ${cart.get_total()}")
if __name__ == "__main__":
main()
""")
(demo_dir / "__init__.py").write_text("")
(demo_dir / "models" / "__init__.py").write_text("")
(demo_dir / "services" / "__init__.py").write_text("")
(demo_dir / "factories" / "__init__.py").write_text("")
(demo_dir / "builders" / "__init__.py").write_text("")
(demo_dir / "utils" / "__init__.py").write_text("")
# Create ZIP
with zipfile.ZipFile("demo_ecommerce.zip", "w") as zf:
for root, dirs, files in os.walk(demo_dir):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, demo_dir.parent)
zf.write(file_path, arcname)
print("βœ… Created demo_ecommerce.zip (15 files)")
# Cleanup
import shutil
shutil.rmtree(demo_dir)
def create_demo_fastapi():
"""Create a fast FastAPI demo with 8 files"""
demo_dir = Path("demo_fastapi")
demo_dir.mkdir(exist_ok=True)
# 1. Main app
(demo_dir / "main.py").write_text("""
from fastapi import FastAPI, HTTPException
from models import User, Product, Order
from database import Database
app = FastAPI()
db = Database()
@app.get("/")
def read_root():
return {"message": "FastAPI E-commerce API"}
@app.get("/users/{user_id}")
def get_user(user_id: int):
user = db.get_user(user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
@app.post("/users")
def create_user(user: User):
return db.create_user(user)
@app.get("/products")
def list_products():
return db.get_all_products()
@app.post("/orders")
def create_order(order: Order):
return db.create_order(order)
""")
# 2. Models
(demo_dir / "models.py").write_text("""
from pydantic import BaseModel
from typing import List, Optional
class User(BaseModel):
user_id: Optional[int] = None
name: str
email: str
class Product(BaseModel):
product_id: Optional[int] = None
name: str
price: float
stock: int
class OrderItem(BaseModel):
product_id: int
quantity: int
class Order(BaseModel):
order_id: Optional[int] = None
user_id: int
items: List[OrderItem]
total: float = 0.0
""")
# 3. Database (Singleton opportunity!)
(demo_dir / "database.py").write_text("""
# BAD: Should be Singleton!
class Database:
def __init__(self):
self.users = {}
self.products = {}
self.orders = {}
self.next_user_id = 1
self.next_product_id = 1
self.next_order_id = 1
def get_user(self, user_id):
return self.users.get(user_id)
def create_user(self, user):
user.user_id = self.next_user_id
self.users[user.user_id] = user
self.next_user_id += 1
return user
def get_all_products(self):
return list(self.products.values())
def create_order(self, order):
order.order_id = self.next_order_id
self.orders[order.order_id] = order
self.next_order_id += 1
return order
""")
# 4. Authentication (Strategy opportunity!)
(demo_dir / "auth.py").write_text("""
# BAD: Multiple if/else for auth methods
# Should use Strategy pattern!
class AuthService:
def authenticate(self, credentials, method):
if method == "jwt":
return self._verify_jwt(credentials)
elif method == "oauth":
return self._verify_oauth(credentials)
elif method == "api_key":
return self._verify_api_key(credentials)
else:
return False
def _verify_jwt(self, token):
print(f"Verifying JWT: {token}")
return True
def _verify_oauth(self, token):
print(f"Verifying OAuth: {token}")
return True
def _verify_api_key(self, key):
print(f"Verifying API Key: {key}")
return True
""")
# 5. Repository pattern
(demo_dir / "repository.py").write_text("""
from abc import ABC, abstractmethod
class Repository(ABC):
@abstractmethod
def find_by_id(self, id):
pass
@abstractmethod
def save(self, entity):
pass
@abstractmethod
def delete(self, id):
pass
class UserRepository(Repository):
def __init__(self):
self.storage = {}
def find_by_id(self, id):
return self.storage.get(id)
def save(self, entity):
self.storage[entity.user_id] = entity
def delete(self, id):
if id in self.storage:
del self.storage[id]
""")
# 6. Service layer
(demo_dir / "services.py").write_text("""
class UserService:
def __init__(self, repository):
self.repository = repository
def register_user(self, name, email):
from models import User
user = User(name=name, email=email)
self.repository.save(user)
return user
def get_user_profile(self, user_id):
return self.repository.find_by_id(user_id)
class OrderService:
def __init__(self):
self.orders = []
def create_order(self, user_id, items):
from models import Order
order = Order(user_id=user_id, items=items)
self.orders.append(order)
return order
""")
# 7. Config
(demo_dir / "config.py").write_text("""
import os
class Config:
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./test.db")
SECRET_KEY = os.getenv("SECRET_KEY", "dev-secret-key")
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
""")
# 8. Utils
(demo_dir / "utils.py").write_text("""
from datetime import datetime
def get_timestamp():
return datetime.now().isoformat()
def validate_email(email):
return "@" in email
def hash_password(password):
# Simplified for demo
return f"hashed_{password}"
""")
# Create ZIP
with zipfile.ZipFile("demo_fastapi.zip", "w") as zf:
for root, dirs, files in os.walk(demo_dir):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, demo_dir.parent)
zf.write(file_path, arcname)
print("βœ… Created demo_fastapi.zip (8 files)")
# Cleanup
import shutil
shutil.rmtree(demo_dir)
if __name__ == "__main__":
print("πŸ—οΈ Creating demo projects for hackathon...")
print()
create_demo_ecommerce()
create_demo_fastapi()
print()
print("πŸŽ‰ Done! Demo projects ready:")
print(" - demo_ecommerce.zip (15 files, realistic patterns)")
print(" - demo_fastapi.zip (8 files, fast API)")
print()
print("⚑ These will give instant results in the demo!")