mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-03 18:53:17 -05:00 
			
		
		
		
	* Add ability to inject into Python files * Update outdated references to gen_global_components.py * Add code gen for registration locale validation * sort validators * update for pydantic 2 * run generator again --------- Co-authored-by: Gasper Gril <gasper@gril.si> Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						|
from pathlib import Path
 | 
						|
 | 
						|
from fastapi import FastAPI
 | 
						|
from jinja2 import Template
 | 
						|
from pydantic import BaseModel, ConfigDict
 | 
						|
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject, RequestType
 | 
						|
 | 
						|
CWD = Path(__file__).parent
 | 
						|
 | 
						|
OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
 | 
						|
 | 
						|
 | 
						|
class PathObject(BaseModel):
 | 
						|
    model_config = ConfigDict(arbitrary_types_allowed=True)
 | 
						|
    route_object: RouteObject
 | 
						|
    http_verbs: list[HTTPRequest]
 | 
						|
 | 
						|
 | 
						|
def get_path_objects(app: FastAPI):
 | 
						|
    paths = []
 | 
						|
 | 
						|
    for key, value in app.openapi().items():
 | 
						|
        if key == "paths":
 | 
						|
            for key, value2 in value.items():
 | 
						|
                verbs = []
 | 
						|
                for k, v in value2.items():
 | 
						|
                    verbs.append(HTTPRequest(request_type=k, **v))
 | 
						|
 | 
						|
                paths.append(
 | 
						|
                    PathObject(
 | 
						|
                        route_object=RouteObject(key),
 | 
						|
                        http_verbs=verbs,
 | 
						|
                    )
 | 
						|
                )
 | 
						|
 | 
						|
    return paths
 | 
						|
 | 
						|
 | 
						|
def dump_open_api(app: FastAPI):
 | 
						|
    """Writes the Open API as JSON to a json file"""
 | 
						|
    OPEN_API_FILE = CWD / "openapi.json"
 | 
						|
 | 
						|
    with open(OPEN_API_FILE, "w") as f:
 | 
						|
        f.write(json.dumps(app.openapi()))
 | 
						|
 | 
						|
 | 
						|
def read_template(file: Path):
 | 
						|
    with open(file) as f:
 | 
						|
        return f.read()
 | 
						|
 | 
						|
 | 
						|
def generate_python_templates(static_paths: list[PathObject], function_paths: list[PathObject]):
 | 
						|
    template = Template(read_template(CodeTemplates.pytest_routes))
 | 
						|
    content = template.render(
 | 
						|
        paths={
 | 
						|
            "prefix": "/api",
 | 
						|
            "static_paths": static_paths,
 | 
						|
            "function_paths": function_paths,
 | 
						|
        }
 | 
						|
    )
 | 
						|
    with open(OUTFILE, "w") as f:
 | 
						|
        f.write(content)
 | 
						|
 | 
						|
    return
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    from mealie.app import app
 | 
						|
 | 
						|
    dump_open_api(app)
 | 
						|
    paths = get_path_objects(app)
 | 
						|
 | 
						|
    static_paths = [x.route_object for x in paths if not x.route_object.is_function]
 | 
						|
    function_paths = [x.route_object for x in paths if x.route_object.is_function]
 | 
						|
 | 
						|
    static_paths.sort(key=lambda x: x.router_slug)
 | 
						|
    function_paths.sort(key=lambda x: x.router_slug)
 | 
						|
 | 
						|
    generate_python_templates(static_paths, function_paths)
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |