mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 10:13:32 -04:00 
			
		
		
		
	
		
			
	
	
		
			160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import json | ||
|  | import re | ||
|  | from dataclasses import dataclass | ||
|  | from pathlib import Path | ||
|  | 
 | ||
|  | from slugify import slugify | ||
|  | 
 | ||
|  | CWD = Path(__file__).parent | ||
|  | 
 | ||
|  | PROJECT_BASE = CWD.parent.parent | ||
|  | 
 | ||
|  | server_side_msgs = PROJECT_BASE / "mealie" / "utils" / "error_messages.py" | ||
|  | en_us_msgs = PROJECT_BASE / "frontend" / "lang" / "errors" / "en-US.json" | ||
|  | client_side_msgs = PROJECT_BASE / "frontend" / "utils" / "error-messages.ts" | ||
|  | 
 | ||
|  | GENERATE_MESSAGES = [ | ||
|  |     # User Related | ||
|  |     "user", | ||
|  |     "webhook", | ||
|  |     "token", | ||
|  |     # Group Related | ||
|  |     "group", | ||
|  |     "cookbook", | ||
|  |     "mealplan", | ||
|  |     # Recipe Related | ||
|  |     "scraper", | ||
|  |     "recipe", | ||
|  |     "ingredient", | ||
|  |     "food", | ||
|  |     "unit", | ||
|  |     # Admin Related | ||
|  |     "backup", | ||
|  |     "migration", | ||
|  |     "event", | ||
|  | ] | ||
|  | 
 | ||
|  | 
 | ||
|  | class ErrorMessage: | ||
|  |     def __init__(self, prefix, verb) -> None: | ||
|  |         self.message = f"{prefix.title()} {verb.title()} Failed" | ||
|  |         self.snake = slugify(self.message, separator="_") | ||
|  |         self.kabab = slugify(self.message, separator="-") | ||
|  | 
 | ||
|  |     def factory(prefix) -> list["ErrorMessage"]: | ||
|  |         verbs = ["Create", "Update", "Delete"] | ||
|  |         return [ErrorMessage(prefix, verb) for verb in verbs] | ||
|  | 
 | ||
|  | 
 | ||
|  | @dataclass | ||
|  | class CodeGenLines: | ||
|  |     start: int | ||
|  |     end: int | ||
|  | 
 | ||
|  |     indentation: str | ||
|  |     text: list[str] | ||
|  | 
 | ||
|  |     _next_line = None | ||
|  | 
 | ||
|  |     def purge_lines(self) -> None: | ||
|  |         start = self.start + 1 | ||
|  |         end = self.end | ||
|  |         del self.text[start:end] | ||
|  | 
 | ||
|  |     def push_line(self, string: str) -> None: | ||
|  |         self._next_line = self._next_line or self.start + 1 | ||
|  |         self.text.insert(self._next_line, self.indentation + string) | ||
|  |         self._next_line += 1 | ||
|  | 
 | ||
|  | 
 | ||
|  | def find_start(file_text: list[str], gen_id: str): | ||
|  |     for x, line in enumerate(file_text): | ||
|  |         if "CODE_GEN_ID:" in line and gen_id in line: | ||
|  |             return x, line | ||
|  | 
 | ||
|  |     return None | ||
|  | 
 | ||
|  | 
 | ||
|  | def find_end(file_text: list[str], gen_id: str): | ||
|  |     for x, line in enumerate(file_text): | ||
|  |         if f"END {gen_id}" in line: | ||
|  |             return x, line | ||
|  |     return None | ||
|  | 
 | ||
|  | 
 | ||
|  | def get_indentation_of_string(line: str): | ||
|  |     return re.sub(r"#.*", "", line).removesuffix("\n") | ||
|  | 
 | ||
|  | 
 | ||
|  | def get_messages(message_prefix: str) -> str: | ||
|  |     prefix = message_prefix.lower() | ||
|  | 
 | ||
|  |     return [ | ||
|  |         f'{prefix}_create_failure = "{prefix}-create-failure"\n', | ||
|  |         f'{prefix}_update_failure = "{prefix}-update-failure"\n', | ||
|  |         f'{prefix}_delete_failure = "{prefix}-delete-failure"\n', | ||
|  |     ] | ||
|  | 
 | ||
|  | 
 | ||
|  | def code_gen_factory(file_path: Path) -> CodeGenLines: | ||
|  |     with open(file_path, "r") as file: | ||
|  |         text = file.readlines() | ||
|  |         start_num, line = find_start(text, "ERROR_MESSAGE_ENUMS") | ||
|  |         indentation = get_indentation_of_string(line) | ||
|  |         end_num, line = find_end(text, "ERROR_MESSAGE_ENUMS") | ||
|  | 
 | ||
|  |     return CodeGenLines( | ||
|  |         start=start_num, | ||
|  |         end=end_num, | ||
|  |         indentation=indentation, | ||
|  |         text=text, | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | def write_to_locals(messages: list[ErrorMessage]) -> None: | ||
|  |     with open(en_us_msgs, "r") as f: | ||
|  |         existing_msg = json.loads(f.read()) | ||
|  | 
 | ||
|  |     for msg in messages: | ||
|  |         if msg.kabab in existing_msg: | ||
|  |             continue | ||
|  | 
 | ||
|  |         existing_msg[msg.kabab] = msg.message | ||
|  |         print(f"Added Key {msg.kabab} to 'en-US.json'") | ||
|  | 
 | ||
|  |     with open(en_us_msgs, "w") as f: | ||
|  |         f.write(json.dumps(existing_msg, indent=4)) | ||
|  | 
 | ||
|  | 
 | ||
|  | def main(): | ||
|  |     print("Starting...") | ||
|  |     GENERATE_MESSAGES.sort() | ||
|  | 
 | ||
|  |     code_gen = code_gen_factory(server_side_msgs) | ||
|  |     code_gen.purge_lines() | ||
|  | 
 | ||
|  |     messages = [] | ||
|  |     for msg_type in GENERATE_MESSAGES: | ||
|  |         messages += get_messages(msg_type) | ||
|  |         messages.append("\n") | ||
|  | 
 | ||
|  |     for msg in messages: | ||
|  |         code_gen.push_line(msg) | ||
|  | 
 | ||
|  |     with open(server_side_msgs, "w") as file: | ||
|  |         file.writelines(code_gen.text) | ||
|  | 
 | ||
|  |     # Locals | ||
|  | 
 | ||
|  |     local_msgs = [] | ||
|  |     for msg_type in GENERATE_MESSAGES: | ||
|  |         local_msgs += ErrorMessage.factory(msg_type) | ||
|  | 
 | ||
|  |     write_to_locals(local_msgs) | ||
|  | 
 | ||
|  |     print("Done!") | ||
|  | 
 | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     main() |