mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-05-24 01:12:54 -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()
|