add --outdir argument, remove directory params from builder

This commit is contained in:
Emi Vasilek 2023-11-21 01:39:42 +01:00
parent 7fb3a1c0e9
commit 98c77cb102
2 changed files with 37 additions and 33 deletions

View file

@ -53,37 +53,37 @@ class Builder:
return self.load_file(f"{os.path.dirname(__file__)}/{file}") return self.load_file(f"{os.path.dirname(__file__)}/{file}")
def rendertemplate( def rendertemplate(
self, templatepath: str, format: str, file: str, dir: str, args: Any self, templatepath: str, format: str, file: str, outdir: str, args: Any
) -> None: ) -> None:
template = self.jinjaenv.get_template(templatepath) template = self.jinjaenv.get_template(templatepath)
print(f"rendering {file}") print(f"rendering {file}")
outstr = template.render(args) outstr = template.render(args)
os.makedirs(f"{dir}/out/{format}", exist_ok=True) os.makedirs(f"{outdir}/{format}", exist_ok=True)
with open(f"{dir}/out/{format}/{file}", "w", encoding="utf-8") as f: with open(f"{outdir}/{format}/{file}", "w", encoding="utf-8") as f:
f.write(outstr) f.write(outstr)
self.outfiles.add(file) self.outfiles.add(file)
def load(self, dir: str) -> int: def load(self, outdir: str) -> int:
if os.path.isfile(dir + "/settings.yaml"): if os.path.isfile("settings.yaml"):
settingsdct = self.load_file(dir + "/settings.yaml") settingsdct = self.load_file("settings.yaml")
settingsschema = self.load_pkgfile("schemas/settings.json") settingsschema = self.load_pkgfile("schemas/settings.json")
self.ctx.load_settings(settingsdct, settingsschema) self.ctx.load_settings(settingsdct, settingsschema)
retcode = self.ctx.issues.check() retcode = self.ctx.issues.check()
if retcode != 0: if retcode != 0:
return 1 return 1
if os.path.isfile(dir + "/units.yaml"): if os.path.isfile("units.yaml"):
unitsdct = self.load_file(dir + "/units.yaml") unitsdct = self.load_file("units.yaml")
unitsschema = self.load_pkgfile("schemas/units.json") unitsschema = self.load_pkgfile("schemas/units.json")
self.ctx.load_units(unitsdct, unitsschema) self.ctx.load_units(unitsdct, unitsschema)
retcode = self.ctx.issues.check() retcode = self.ctx.issues.check()
if retcode != 0: if retcode != 0:
return 1 return 1
if os.path.isfile(dir + "/ingredients.yaml"): if os.path.isfile("ingredients.yaml"):
ingredientsdct = self.load_file(dir + "/ingredients.yaml") ingredientsdct = self.load_file("ingredients.yaml")
ingredientsschema = self.load_pkgfile("schemas/ingredients.json") ingredientsschema = self.load_pkgfile("schemas/ingredients.json")
self.ctx.load_ingredients(ingredientsdct, ingredientsschema) self.ctx.load_ingredients(ingredientsdct, ingredientsschema)
retcode = self.ctx.issues.check() retcode = self.ctx.issues.check()
@ -92,9 +92,9 @@ class Builder:
return 0 return 0
def run(self, dir: str) -> int: def run(self, outdir: str) -> int:
files = [] files = []
for _, _, filesx in os.walk(dir + "/recipes"): for _, _, filesx in os.walk("recipes"):
files = filesx files = filesx
files.sort() files.sort()
@ -104,7 +104,7 @@ class Builder:
if not file.endswith(".yaml"): if not file.endswith(".yaml"):
print(f"unknown extension of {file}") print(f"unknown extension of {file}")
continue continue
recipedct = self.load_file(dir + "/recipes/" + file) recipedct = self.load_file("recipes/" + file)
jsonschema.validate(instance=recipedct, schema=recipeschema) jsonschema.validate(instance=recipedct, schema=recipeschema)
recipe = parsing.Recipe.from_dict(self.ctx, recipedct) recipe = parsing.Recipe.from_dict(self.ctx, recipedct)
recipe.srcpath = file recipe.srcpath = file
@ -121,7 +121,7 @@ class Builder:
templatepath="index.html", templatepath="index.html",
format="html", format="html",
file="index.html", file="index.html",
dir=dir, outdir=outdir,
args={"recipes": recipes}, args={"recipes": recipes},
) )
for recipe in recipes: for recipe in recipes:
@ -129,18 +129,18 @@ class Builder:
templatepath="recipe.html", templatepath="recipe.html",
format="html", format="html",
file=recipe.outpath, file=recipe.outpath,
dir=dir, outdir=outdir,
args={"recipe": recipe}, args={"recipe": recipe},
) )
return 0 return 0
def generate_units(self, dir: str) -> None: def generate_units(self) -> None:
def collect_unitnames(rec: parsing.Recipe) -> List[str]: def collect_unitnames(rec: parsing.Recipe) -> List[str]:
results: List[str] = [] results: List[str] = []
for ing in rec.ingredients: for ing in rec.ingredients:
results.append(ing.unit.name) results.append(ing.unit.name)
return results return results
unitnamelists = self.foreach_recipe(dir, collect_unitnames) unitnamelists = self.foreach_recipe(collect_unitnames)
unitnamesset: Set[str] = set() unitnamesset: Set[str] = set()
for unitnamelst in unitnamelists: for unitnamelst in unitnamelists:
for unitname in unitnamelst: for unitname in unitnamelst:
@ -152,18 +152,18 @@ class Builder:
for name in unitnames: for name in unitnames:
units.append({"name": name}) units.append({"name": name})
file = f"{dir}/units.yaml" file = "units.yaml"
with open(file, "w") as f: with open(file, "w") as f:
f.write(yaml.dump(units)) f.write(yaml.dump(units))
print("found units written to", file) print("found units written to", file)
def generate_ingredients(self, dir: str) -> None: def generate_ingredients(self) -> None:
def collect_ingnames(rec: parsing.Recipe) -> List[str]: def collect_ingnames(rec: parsing.Recipe) -> List[str]:
results: List[str] = [] results: List[str] = []
for ing in rec.ingredients: for ing in rec.ingredients:
results.append(ing.name) results.append(ing.name)
return results return results
ingredientnamelists = self.foreach_recipe(dir, collect_ingnames) ingredientnamelists = self.foreach_recipe(collect_ingnames)
ingredientnamesset: Set[str] = set() ingredientnamesset: Set[str] = set()
for ingredientnamelst in ingredientnamelists: for ingredientnamelst in ingredientnamelists:
for ingredientname in ingredientnamelst: for ingredientname in ingredientnamelst:
@ -175,14 +175,14 @@ class Builder:
for name in ingredientnames: for name in ingredientnames:
ingredients.append({"name": name}) ingredients.append({"name": name})
file = f"{dir}/ingredients.yaml" file = "ingredients.yaml"
with open(file, "w") as f: with open(file, "w") as f:
f.write(yaml.dump(ingredients)) f.write(yaml.dump(ingredients))
print("found ingredients written to", file) print("found ingredients written to", file)
def foreach_recipe(self, dir: str, func: Callable[[parsing.Recipe], T]) -> List[T]: def foreach_recipe(self, func: Callable[[parsing.Recipe], T]) -> List[T]:
files = [] files = []
for _, _, filesx in os.walk(dir + "/recipes"): for _, _, filesx in os.walk("recipes"):
files = filesx files = filesx
files.sort() files.sort()
@ -200,30 +200,31 @@ class Builder:
if not file.endswith(".yaml"): if not file.endswith(".yaml"):
print(f"unknown extension of {file}") print(f"unknown extension of {file}")
continue continue
recipedct = self.load_file(dir + "/recipes/" + file) recipedct = self.load_file("recipes/" + file)
recipe = parsing.Recipe.from_dict(self.ctx, recipedct) recipe = parsing.Recipe.from_dict(self.ctx, recipedct)
if self.ctx.issues.check() != 0: if self.ctx.issues.check() != 0:
continue continue
results += foreach_subrecipe(recipe) results += foreach_subrecipe(recipe)
return results return results
def finish(self, dir: str) -> int: def finish(self, outdir: str) -> int:
files = set() files = set()
for _, _, filesx in os.walk(f"{dir}/out/html"): for _, _, filesx in os.walk(f"{outdir}/html"):
files = set(filesx) files = set(filesx)
# files we did not generate, probably left by a previous run, but not valid anymore # files we did not generate, probably left by a previous run, but not valid anymore
extra_files = files - self.outfiles extra_files = files - self.outfiles
for file in extra_files: for file in extra_files:
print(f"removing obsolete {file}") print(f"removing obsolete {file}")
os.remove(f"{dir}/out/html/{file}") os.remove(f"{outdir}/html/{file}")
return 0 return 0
def build(self, path: str) -> int: def build(self, directory: str, outdir: str) -> int:
fcs = [self.load, self.run, self.finish] fcs = [self.load, self.run, self.finish]
os.chdir(directory)
for func in fcs: for func in fcs:
try: try:
ret = func(path) ret = func(outdir)
if ret != 0: if ret != 0:
return ret return ret
except jsonschema.exceptions.ValidationError as e: except jsonschema.exceptions.ValidationError as e:

View file

@ -13,11 +13,13 @@ def main() -> None:
parser_build = subparsers.add_parser("build") parser_build = subparsers.add_parser("build")
parser_build.add_argument("directory", type=str) parser_build.add_argument("directory", type=str)
parser_build.add_argument("--outdir", type=str, default="out")
parser_serve = subparsers.add_parser("serve") parser_serve = subparsers.add_parser("serve")
parser_serve.add_argument("directory", type=str) parser_serve.add_argument("directory", type=str)
parser_serve.add_argument("--port", type=int, default=8000) parser_serve.add_argument("--port", type=int, default=8000)
parser_serve.add_argument("--address", type=str, default="127.0.0.1") parser_serve.add_argument("--address", type=str, default="127.0.0.1")
parser_serve.add_argument("--outdir", type=str, default="out/html")
parser_generate_units = subparsers.add_parser("generate-units") parser_generate_units = subparsers.add_parser("generate-units")
parser_generate_units.add_argument("directory", type=str) parser_generate_units.add_argument("directory", type=str)
@ -32,9 +34,10 @@ def main() -> None:
ret = 0 ret = 0
builder = comfyrecipes.builder.Builder() builder = comfyrecipes.builder.Builder()
if args.subcommand == "build": if args.subcommand == "build":
ret = builder.build(args.directory) ret = builder.build(args.directory, args.outdir)
elif args.subcommand == "serve": elif args.subcommand == "serve":
os.chdir(f"{args.directory}/out/html") os.chdir(args.directory)
os.chdir(args.outdir)
httpd = socketserver.TCPServer( httpd = socketserver.TCPServer(
(args.address, args.port), http.server.SimpleHTTPRequestHandler (args.address, args.port), http.server.SimpleHTTPRequestHandler
) )
@ -48,13 +51,13 @@ def main() -> None:
print("units.yaml already exists, pass --force if you want to overwrite it", file=sys.stderr) print("units.yaml already exists, pass --force if you want to overwrite it", file=sys.stderr)
ret = 1 ret = 1
else: else:
builder.generate_units(args.directory) builder.generate_units()
elif args.subcommand == "generate-ingredients": elif args.subcommand == "generate-ingredients":
if not args.force and os.path.isfile(args.directory + "/ingredients.yaml"): if not args.force and os.path.isfile(args.directory + "/ingredients.yaml"):
print("ingredients.yaml already exists, pass --force if you want to overwrite it", file=sys.stderr) print("ingredients.yaml already exists, pass --force if you want to overwrite it", file=sys.stderr)
ret = 1 ret = 1
else: else:
builder.generate_ingredients(args.directory) builder.generate_ingredients()
else: else:
# unhandled, but valid subcommand # unhandled, but valid subcommand
assert False assert False