aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/paths.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cru-py/cru/paths.py')
-rw-r--r--tools/cru-py/cru/paths.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/tools/cru-py/cru/paths.py b/tools/cru-py/cru/paths.py
new file mode 100644
index 0000000..df5042b
--- /dev/null
+++ b/tools/cru-py/cru/paths.py
@@ -0,0 +1,63 @@
+from pathlib import Path
+import os
+
+from .excp import CruException
+
+
+class ApplicationPathError(CruException):
+ def __init__(self, message: str, p: str | Path, *args, **kwargs):
+ super().__init__(message, *args, path=str(p), **kwargs)
+
+
+def check_parents_dir(p: str | Path, /, must_exist: bool = False) -> bool:
+ p = Path(p) if isinstance(p, str) else p
+ for p in reversed(p.parents):
+ if not p.exists() and not must_exist:
+ return False
+ if not p.is_dir():
+ raise ApplicationPathError("Parents path should be a dir.", p)
+ return True
+
+
+class ApplicationPath:
+ def __init__(self, p: str | Path, is_dir: bool) -> None:
+ self._path = Path(p) if isinstance(p, str) else p
+ self._is_dir = is_dir
+
+ @property
+ def path(self) -> Path:
+ return self._path
+
+ @property
+ def is_dir(self) -> bool:
+ return self._is_dir
+
+ def check_parents(self, must_exist: bool = False) -> bool:
+ return check_parents_dir(self._path.parent, must_exist)
+
+ def check_self(self, must_exist: bool = False) -> bool:
+ if not self.check_parents(must_exist):
+ return False
+ if not self.path.exists():
+ if not must_exist: return False
+ raise ApplicationPathError("Mot exist.", self.path)
+ if self.is_dir:
+ if not self.path.is_dir():
+ raise ApplicationPathError("Should be a directory, but not.", self.path)
+ else:
+ return False
+ else:
+ if not self.path.is_file():
+ raise ApplicationPathError("Should be a file, but not.", self.path)
+ else:
+ return False
+
+ def ensure(self, create_file: bool = False) -> None:
+ e = self.check_self(False)
+ if not e:
+ os.makedirs(self.path.parent, exist_ok=True)
+ if self.is_dir:
+ os.mkdir(self.path)
+ elif create_file:
+ with open(self.path, "w") as f:
+ f.write("")