mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-30 09:43:43 -04: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()
 |