mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-03 18:53:17 -05:00 
			
		
		
		
	* upgrade sqlalchemy to 2.0 * rewrite all db models to sqla 2.0 mapping api * fix some importing and typing weirdness * fix types of a lot of nullable columns * remove get_ref methods * fix issues found by tests * rewrite all queries in repository_recipe to 2.0 style * rewrite all repository queries to 2.0 api * rewrite all remaining queries to 2.0 api * remove now-unneeded __allow_unmapped__ flag * remove and fix some unneeded cases of "# type: ignore" * fix formatting * bump black version * run black * can this please be the last one. okay. just. okay. * fix repository errors * remove return * drop open API validator --------- Co-authored-by: Sören Busch <fleshgolem@gmx.net>
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						|
from pathlib import Path
 | 
						|
 | 
						|
from fastapi import FastAPI
 | 
						|
from jinja2 import Template
 | 
						|
from pydantic import BaseModel
 | 
						|
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject
 | 
						|
 | 
						|
CWD = Path(__file__).parent
 | 
						|
 | 
						|
OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
 | 
						|
 | 
						|
 | 
						|
class PathObject(BaseModel):
 | 
						|
    route_object: RouteObject
 | 
						|
    http_verbs: list[HTTPRequest]
 | 
						|
 | 
						|
    class Config:
 | 
						|
        arbitrary_types_allowed = True
 | 
						|
 | 
						|
 | 
						|
def get_path_objects(app: FastAPI):
 | 
						|
    paths = []
 | 
						|
 | 
						|
    for key, value in app.openapi().items():
 | 
						|
        if key == "paths":
 | 
						|
            for key, value in value.items():
 | 
						|
                paths.append(
 | 
						|
                    PathObject(
 | 
						|
                        route_object=RouteObject(key),
 | 
						|
                        http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()],
 | 
						|
                    )
 | 
						|
                )
 | 
						|
 | 
						|
    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()
 |