|
@@ -0,0 +1,122 @@
|
|
|
|
+import json
|
|
|
|
+import shutil
|
|
|
|
+from collections import OrderedDict
|
|
|
|
+from pathlib import Path
|
|
|
|
+
|
|
|
|
+from src.pytemplate.resources import get_resources_path
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class Template:
|
|
|
|
+
|
|
|
|
+ variables = OrderedDict([
|
|
|
|
+ ("name", ("Nom du projet", )),
|
|
|
|
+ ("module", ("Nom du module", lambda data: data["name"].lower())),
|
|
|
|
+ ])
|
|
|
|
+
|
|
|
|
+ def __init__(self, root):
|
|
|
|
+ self.root = Path(root)
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ self.keys = json.loads((self.root / ".template_keys").read_text())
|
|
|
|
+ except FileNotFoundError:
|
|
|
|
+ self.keys = []
|
|
|
|
+ except json.decoder.JSONDecodeError:
|
|
|
|
+ self.keys = []
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ def list_files(self):
|
|
|
|
+ queue = [self.root]
|
|
|
|
+ files = []
|
|
|
|
+ while queue:
|
|
|
|
+ curr = queue.pop(0)
|
|
|
|
+ for file in curr.iterdir():
|
|
|
|
+ if file.is_file() and file.name != ".template_keys":
|
|
|
|
+ files.append(file)
|
|
|
|
+ elif not file.name == ".idea":
|
|
|
|
+ files.append(file)
|
|
|
|
+ queue.append(file)
|
|
|
|
+ return files
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ def _prompt(self, data):
|
|
|
|
+ if not data: data = {}
|
|
|
|
+ for name, (help, *args) in self.variables.items():
|
|
|
|
+ if data.get(name) is not None: continue
|
|
|
|
+ default_value = ""
|
|
|
|
+ if args:
|
|
|
|
+ default_value = f"[{args[0](data)}]"
|
|
|
|
+ ret = input(f"{help}{default_value}: ").split()
|
|
|
|
+ if ret: ret = ret[0]
|
|
|
|
+ if default_value and not ret:
|
|
|
|
+ ret = default_value
|
|
|
|
+ data[name] = ret
|
|
|
|
+ data["name_lower"] = data["name"].lower()
|
|
|
|
+ return data
|
|
|
|
+
|
|
|
|
+ def _str_replace(self, content, data):
|
|
|
|
+ assert isinstance(content, str)
|
|
|
|
+ for name, to_find in data.items():
|
|
|
|
+ content = content.replace(to_find, f"%({name})s")
|
|
|
|
+ return content
|
|
|
|
+
|
|
|
|
+ def mk_template(self, name, data):
|
|
|
|
+ data = self._prompt(data)
|
|
|
|
+ out_dir = get_resources_path(name)
|
|
|
|
+ if out_dir.exists():
|
|
|
|
+ shutil.rmtree(out_dir)
|
|
|
|
+
|
|
|
|
+ out_dir.mkdir(exist_ok=True, parents=True)
|
|
|
|
+ #data = {v: k for k,v in data.items()}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ for file in self.list_files():
|
|
|
|
+ file: Path
|
|
|
|
+ out_file = out_dir / self._str_replace(str(file.relative_to(self.root)), data)
|
|
|
|
+ out_file.parent.mkdir(exist_ok=True, parents=True)
|
|
|
|
+ if file.is_dir():
|
|
|
|
+ file.mkdir(exist_ok=True, parents=True)
|
|
|
|
+ continue
|
|
|
|
+ try:
|
|
|
|
+ file_in = file.read_text()
|
|
|
|
+ except UnicodeDecodeError:
|
|
|
|
+ shutil.copy(file, out_file)
|
|
|
|
+ continue
|
|
|
|
+ file_in = self._str_replace(file_in, data)
|
|
|
|
+
|
|
|
|
+ out_file.write_text(file_in)
|
|
|
|
+
|
|
|
|
+ def instanciate(self, output, data):
|
|
|
|
+ output = Path(output)
|
|
|
|
+ if not self.root.is_absolute():
|
|
|
|
+ self.root = get_resources_path(str(self.root))
|
|
|
|
+ if output.exists() and len(list(output.iterdir())):
|
|
|
|
+ print(f"Impossible d'intancier le template {self.root.name} le dossier {output} existe")
|
|
|
|
+ exit(-1)
|
|
|
|
+ if not self.root.exists():
|
|
|
|
+ print(f"Impossible d'intancier le template {self.root.name} est introuvable")
|
|
|
|
+ exit(-1)
|
|
|
|
+
|
|
|
|
+ output.mkdir(exist_ok=True, parents=True)
|
|
|
|
+
|
|
|
|
+ data = self._prompt(data)
|
|
|
|
+
|
|
|
|
+ for file in self.list_files():
|
|
|
|
+ file: Path
|
|
|
|
+ file.parent.mkdir(exist_ok=True, parents=True)
|
|
|
|
+ out_file = output / (str(file.relative_to(self.root)) % data)
|
|
|
|
+ if file.is_dir():
|
|
|
|
+ out_file.mkdir(exist_ok=True, parents=True)
|
|
|
|
+ continue
|
|
|
|
+ try:
|
|
|
|
+ file_in = file.read_text() % data
|
|
|
|
+ except UnicodeDecodeError:
|
|
|
|
+ shutil.copy(file, out_file)
|
|
|
|
+ continue
|
|
|
|
+ file_in = file_in % data
|
|
|
|
+ out_file.write_text(file_in)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|