mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-04 03:03:18 -05: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()
							 |