chore: rewrite python script in go (#201)

This commit is contained in:
Hayden 2023-01-06 23:15:59 -08:00 committed by GitHub
parent 891d41b75f
commit 490a0ece86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 75 additions and 71 deletions

View file

@ -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/**"

View file

@ -1,4 +1,4 @@
/* post-processed by ./scripts/process-types.py */
/* post-processed by ./scripts/process-types.go */
/* eslint-disable */
/* tslint:disable */
/*

View file

@ -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)

View file

@ -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)
}