From 490a0ece86f085e1227078e4e5037e9f6561ae9d Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 6 Jan 2023 23:15:59 -0800 Subject: [PATCH] chore: rewrite python script in go (#201) --- Taskfile.yml | 2 +- frontend/lib/api/types/data-contracts.ts | 2 +- scripts/process-types.py | 69 ---------------------- scripts/process-types/main.go | 73 ++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 71 deletions(-) delete mode 100644 scripts/process-types.py create mode 100644 scripts/process-types/main.go diff --git a/Taskfile.yml b/Taskfile.yml index 3dd05de..816077a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -26,7 +26,7 @@ tasks: --modular \ --path ./backend/app/api/static/docs/swagger.json \ --output ./frontend/lib/api/types - - python3 ./scripts/process-types.py ./frontend/lib/api/types/data-contracts.ts + - go run ./scripts/process-types/*.go ./frontend/lib/api/types/data-contracts.ts sources: - "./backend/app/api/**/*" - "./backend/internal/data/**" diff --git a/frontend/lib/api/types/data-contracts.ts b/frontend/lib/api/types/data-contracts.ts index 120a825..7e4fd54 100644 --- a/frontend/lib/api/types/data-contracts.ts +++ b/frontend/lib/api/types/data-contracts.ts @@ -1,4 +1,4 @@ -/* post-processed by ./scripts/process-types.py */ +/* post-processed by ./scripts/process-types.go */ /* eslint-disable */ /* tslint:disable */ /* diff --git a/scripts/process-types.py b/scripts/process-types.py deleted file mode 100644 index 1641987..0000000 --- a/scripts/process-types.py +++ /dev/null @@ -1,69 +0,0 @@ -import re -import sys -from pathlib import Path - -""" -This script is used in conjunction with the swagger-typescript-api NPM package. -This does some post processing on the generated typescript files to make them -more compatible with the rest of the codebase. This performs a series of regex -replacements to better align types with what the server has. - -The following replacements are performed: - 1. Replaces all module precies of `Types` with empty string - 2. Replaces all optional fields with `:` instead of `?:` (due to lack of detailed swagger docs) - 3. Replaces all known date fields with `Date` instead of `string` -""" - -CWD = Path(__file__).parent - - -def date_types(*names: list[str]) -> dict[re.Pattern, str]: - return {re.compile(rf"{name}: string;"): rf"{name}: Date;" for name in names} - - -regex_replace: dict[re.Pattern, str] = { - re.compile(r" PaginationResultRepo"): "PaginationResult", - re.compile(r" Repo"): " ", - re.compile(r" Services"): " ", - re.compile(r" V1"): " ", - re.compile(r"\?:"): ":", - **date_types( - "createdAt", - "updatedAt", - "soldTime", - "purchaseTime", - "warrantyExpires", - "expiresAt", - "date", - ), -} - - -def main(args: list[str]) -> bool: - path = Path(args[0]) - - print(f"Processing {path}") - - if not path.exists(): - print(f"File {path} does not exist") - return True - - text = "/* post-processed by ./scripts/process-types.py */\n" - with open(path, "r") as f: - text += f.read() - - for regex, replace in regex_replace.items(): - print(f"Replacing {regex} -> '{replace}'") - text = regex.sub(replace, text) - - with open(path, "w") as f: - f.write(text) - - return False - - -if __name__ == "__main__": - if error := main(sys.argv[1:]): - sys.exit(1) - - sys.exit(0) diff --git a/scripts/process-types/main.go b/scripts/process-types/main.go new file mode 100644 index 0000000..59c2530 --- /dev/null +++ b/scripts/process-types/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os" + "regexp" +) + +func dateTypes(names []string) map[*regexp.Regexp]string { + result := make(map[*regexp.Regexp]string) + for _, name := range names { + result[regexp.MustCompile(fmt.Sprintf(`%s: string`, name))] = fmt.Sprintf(`%s: Date`, name) + } + return result +} + +func main() { + if len(os.Args) != 2 { + fmt.Println("Please provide a file path as an argument") + os.Exit(1) + } + + path := os.Args[1] + + fmt.Printf("Processing %s\n", path) + + if _, err := os.Stat(path); os.IsNotExist(err) { + fmt.Printf("File %s does not exist\n", path) + os.Exit(1) + } + + text := "/* post-processed by ./scripts/process-types.go */\n" + data, err := ioutil.ReadFile(path) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + text += string(data) + + regexReplace := map[*regexp.Regexp]string{ + regexp.MustCompile(` PaginationResultRepo`): " PaginationResult", + regexp.MustCompile(` Repo`): " ", + regexp.MustCompile(` Services`): " ", + regexp.MustCompile(` V1`): " ", + regexp.MustCompile(`\?:`): ":", + } + + for regex, replace := range dateTypes([]string{ + "createdAt", + "updatedAt", + "soldTime", + "purchaseTime", + "warrantyExpires", + "expiresAt", + "date", + }) { + regexReplace[regex] = replace + } + + for regex, replace := range regexReplace { + fmt.Printf("Replacing '%v' -> '%s'\n", regex, replace) + text = regex.ReplaceAllString(text, replace) + } + + err = ioutil.WriteFile(path, []byte(text), 0644) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + os.Exit(0) +}