|
|
""" |
|
|
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) |
|
|
|
|
|
|
|
|
(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) |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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" |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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}") |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
) |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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 = [] |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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("") |
|
|
|
|
|
|
|
|
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)") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
(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) |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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] |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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 |
|
|
""") |
|
|
|
|
|
|
|
|
(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}" |
|
|
""") |
|
|
|
|
|
|
|
|
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)") |
|
|
|
|
|
|
|
|
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!") |
|
|
|