mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 02:03:35 -04:00 
			
		
		
		
	
		
			
	
	
		
			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() |