170 lines
5.5 KiB
Python
170 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Automated endpoint extraction and router generation script.
|
|
This script reads main.py and generates complete router files.
|
|
"""
|
|
|
|
import re
|
|
import os
|
|
from pathlib import Path
|
|
|
|
def extract_endpoint_function(content, endpoint_decorator):
|
|
"""
|
|
Extract the complete function code for an endpoint.
|
|
Finds the decorator and extracts everything until the next @app decorator or end of file.
|
|
"""
|
|
# Find the decorator position
|
|
start = content.find(endpoint_decorator)
|
|
if start == -1:
|
|
return None
|
|
|
|
# Find the next @app decorator or end of imports section
|
|
next_endpoint = content.find('\n@app.', start + len(endpoint_decorator))
|
|
next_section = content.find('\n# ===', start + len(endpoint_decorator))
|
|
|
|
# Use whichever comes first
|
|
if next_endpoint == -1 and next_section == -1:
|
|
end = len(content)
|
|
elif next_endpoint == -1:
|
|
end = next_section
|
|
elif next_section == -1:
|
|
end = next_endpoint
|
|
else:
|
|
end = min(next_endpoint, next_section)
|
|
|
|
return content[start:end].strip()
|
|
|
|
def generate_router_file(router_name, endpoints, has_models=False):
|
|
"""Generate a complete router file with all endpoints"""
|
|
|
|
# Base imports
|
|
imports = f'''"""
|
|
{router_name.replace('_', ' ').title()} router.
|
|
Auto-generated from main.py migration.
|
|
"""
|
|
from fastapi import APIRouter, HTTPException, Depends, status
|
|
from fastapi.security import HTTPAuthorizationCredentials
|
|
from typing import Optional, Dict, Any
|
|
from datetime import datetime
|
|
import random
|
|
import json
|
|
import logging
|
|
|
|
from ..core.security import get_current_user, security, verify_internal_key
|
|
from ..services.models import *
|
|
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity
|
|
from .. import database as db
|
|
from ..items import ItemsManager
|
|
from .. import game_logic
|
|
from ..core.websockets import manager
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# These will be injected by main.py
|
|
LOCATIONS = None
|
|
ITEMS_MANAGER = None
|
|
WORLD = None
|
|
|
|
def init_router_dependencies(locations, items_manager, world):
|
|
"""Initialize router with game data dependencies"""
|
|
global LOCATIONS, ITEMS_MANAGER, WORLD
|
|
LOCATIONS = locations
|
|
ITEMS_MANAGER = items_manager
|
|
WORLD = world
|
|
|
|
router = APIRouter(tags=["{router_name}"])
|
|
|
|
'''
|
|
|
|
# Add endpoints
|
|
router_content = imports + "\n\n# Endpoints\n\n" + "\n\n\n".join(endpoints)
|
|
|
|
return router_content
|
|
|
|
def main():
|
|
# Read main.py
|
|
main_path = Path('main.py')
|
|
if not main_path.exists():
|
|
print("ERROR: main.py not found!")
|
|
return
|
|
|
|
content = main_path.read_text()
|
|
|
|
# Define endpoint groups
|
|
endpoint_groups = {
|
|
'game_routes': [
|
|
'@app.get("/api/game/state")',
|
|
'@app.get("/api/game/profile")',
|
|
'@app.post("/api/game/spend_point")',
|
|
'@app.get("/api/game/location")',
|
|
'@app.post("/api/game/move")',
|
|
'@app.post("/api/game/inspect")',
|
|
'@app.post("/api/game/interact")',
|
|
'@app.post("/api/game/use_item")',
|
|
'@app.post("/api/game/pickup")',
|
|
'@app.get("/api/game/inventory")',
|
|
'@app.post("/api/game/item/drop")',
|
|
],
|
|
'equipment': [
|
|
'@app.post("/api/game/equip")',
|
|
'@app.post("/api/game/unequip")',
|
|
'@app.get("/api/game/equipment")',
|
|
'@app.post("/api/game/repair_item")',
|
|
'@app.get("/api/game/repairable")',
|
|
'@app.get("/api/game/salvageable")',
|
|
],
|
|
'crafting': [
|
|
'@app.get("/api/game/craftable")',
|
|
'@app.post("/api/game/craft_item")',
|
|
'@app.post("/api/game/uncraft_item")',
|
|
],
|
|
'loot': [
|
|
'@app.get("/api/game/corpse/{corpse_id}")',
|
|
'@app.post("/api/game/loot_corpse")',
|
|
],
|
|
'combat': [
|
|
'@app.get("/api/game/combat")',
|
|
'@app.post("/api/game/combat/initiate")',
|
|
'@app.post("/api/game/combat/action")',
|
|
'@app.post("/api/game/pvp/initiate")',
|
|
'@app.get("/api/game/pvp/status")',
|
|
'@app.post("/api/game/pvp/acknowledge")',
|
|
'@app.post("/api/game/pvp/action")',
|
|
],
|
|
'statistics': [
|
|
'@app.get("/api/statistics/{player_id}")',
|
|
'@app.get("/api/statistics/me")',
|
|
'@app.get("/api/leaderboard/{stat_name}")',
|
|
],
|
|
}
|
|
|
|
# Process each group
|
|
for router_name, decorators in endpoint_groups.items():
|
|
print(f"\nProcessing {router_name}...")
|
|
endpoints = []
|
|
|
|
for decorator in decorators:
|
|
func_code = extract_endpoint_function(content, decorator)
|
|
if func_code:
|
|
# Replace @app with @router
|
|
func_code = func_code.replace('@app.', '@router.')
|
|
endpoints.append(func_code)
|
|
print(f" ✓ Extracted: {decorator}")
|
|
else:
|
|
print(f" ✗ Not found: {decorator}")
|
|
|
|
if endpoints:
|
|
router_content = generate_router_file(router_name, endpoints)
|
|
output_path = Path(f'routers/{router_name}.py')
|
|
output_path.write_text(router_content)
|
|
print(f" ✅ Created routers/{router_name}.py with {len(endpoints)} endpoints")
|
|
else:
|
|
print(f" ⚠️ No endpoints found for {router_name}")
|
|
|
|
print("\n" + "="*60)
|
|
print("Router generation complete!")
|
|
print("Next step: Create new streamlined main.py")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|