feat: fundar plataforma mais humana
This commit is contained in:
155
src/mais_humana/paths.py
Normal file
155
src/mais_humana/paths.py
Normal file
@@ -0,0 +1,155 @@
|
||||
"""Path conventions for the Mais Humana platform."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
||||
from .models import as_plain_data
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class PlatformPaths:
|
||||
ecosystem_root: Path
|
||||
project_root: Path
|
||||
central_folder: Path
|
||||
|
||||
@property
|
||||
def sqlite_path(self) -> Path:
|
||||
return self.central_folder / "controle-semantico.sqlite"
|
||||
|
||||
@property
|
||||
def reports_dir(self) -> Path:
|
||||
return self.central_folder / "reports"
|
||||
|
||||
@property
|
||||
def orders_executive_dir(self) -> Path:
|
||||
return self.central_folder / "orders" / "executivas"
|
||||
|
||||
@property
|
||||
def orders_managerial_dir(self) -> Path:
|
||||
return self.central_folder / "orders" / "gerenciais"
|
||||
|
||||
@property
|
||||
def project_data_dir(self) -> Path:
|
||||
return self.project_root / "dados"
|
||||
|
||||
@property
|
||||
def project_docx_dir(self) -> Path:
|
||||
return self.project_root / "relatorios-docx"
|
||||
|
||||
def ensure(self) -> None:
|
||||
for path in (
|
||||
self.project_root,
|
||||
self.central_folder,
|
||||
self.reports_dir,
|
||||
self.orders_executive_dir,
|
||||
self.orders_managerial_dir,
|
||||
self.project_data_dir,
|
||||
self.project_docx_dir,
|
||||
):
|
||||
path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
def to_dict(self) -> dict[str, object]:
|
||||
return as_plain_data(
|
||||
{
|
||||
"ecosystem_root": self.ecosystem_root,
|
||||
"project_root": self.project_root,
|
||||
"central_folder": self.central_folder,
|
||||
"sqlite_path": self.sqlite_path,
|
||||
"reports_dir": self.reports_dir,
|
||||
"orders_executive_dir": self.orders_executive_dir,
|
||||
"orders_managerial_dir": self.orders_managerial_dir,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def default_paths(root: str | Path = "G:/_codex-git") -> PlatformPaths:
|
||||
base = Path(root)
|
||||
return PlatformPaths(
|
||||
ecosystem_root=base,
|
||||
project_root=base / "tudo-para-ia-mais-humana",
|
||||
central_folder=base
|
||||
/ "nucleo-gestao-operacional"
|
||||
/ "central-de-ordem-de-servico"
|
||||
/ "projects"
|
||||
/ "15_repo_tudo-para-ia-mais-humana",
|
||||
)
|
||||
|
||||
|
||||
def assert_real_repo_name(path: Path) -> None:
|
||||
if path.name.startswith("15_") or path.name.startswith("01_"):
|
||||
raise ValueError("numero da pasta gerencial nao pode fazer parte do nome do repositorio real")
|
||||
if " " in path.name:
|
||||
raise ValueError("nome do repositorio real deve ser slug sem espacos")
|
||||
|
||||
|
||||
def central_project_folder_name(project_root: Path, ordinal: int = 15) -> str:
|
||||
assert_real_repo_name(project_root)
|
||||
return f"{ordinal:02d}_repo_{project_root.name}"
|
||||
|
||||
|
||||
def expected_remote_url(repo_name: str) -> str:
|
||||
if repo_name.startswith("http://") or repo_name.startswith("https://"):
|
||||
return repo_name
|
||||
clean = repo_name.strip().removeprefix("admin/")
|
||||
return f"https://git.ami.app.br/admin/{clean}.git"
|
||||
|
||||
|
||||
def platform_relative(path: Path, base: Path) -> str:
|
||||
try:
|
||||
return str(path.relative_to(base)).replace("\\", "/")
|
||||
except ValueError:
|
||||
return str(path).replace("\\", "/")
|
||||
|
||||
|
||||
def describe_paths(paths: PlatformPaths) -> tuple[str, ...]:
|
||||
return (
|
||||
f"ecosystem_root={paths.ecosystem_root}",
|
||||
f"project_root={paths.project_root}",
|
||||
f"central_folder={paths.central_folder}",
|
||||
f"sqlite_path={paths.sqlite_path}",
|
||||
f"reports_dir={paths.reports_dir}",
|
||||
f"orders_executive_dir={paths.orders_executive_dir}",
|
||||
f"orders_managerial_dir={paths.orders_managerial_dir}",
|
||||
)
|
||||
|
||||
|
||||
def path_health(paths: PlatformPaths) -> dict[str, bool]:
|
||||
return {
|
||||
"ecosystem_root_exists": paths.ecosystem_root.exists(),
|
||||
"project_root_exists": paths.project_root.exists(),
|
||||
"central_folder_exists": paths.central_folder.exists(),
|
||||
"sqlite_parent_exists": paths.sqlite_path.parent.exists(),
|
||||
"reports_dir_exists": paths.reports_dir.exists(),
|
||||
"orders_executive_dir_exists": paths.orders_executive_dir.exists(),
|
||||
"orders_managerial_dir_exists": paths.orders_managerial_dir.exists(),
|
||||
}
|
||||
|
||||
|
||||
def path_health_markdown(paths: PlatformPaths) -> str:
|
||||
lines = ["# Path Health Mais Humana", ""]
|
||||
for key, value in path_health(paths).items():
|
||||
lines.append(f"- {key}: `{value}`")
|
||||
lines.append("")
|
||||
lines.append("## Caminhos")
|
||||
lines.append("")
|
||||
for line in describe_paths(paths):
|
||||
lines.append(f"- `{line}`")
|
||||
return "\n".join(lines) + "\n"
|
||||
|
||||
|
||||
def missing_required_paths(paths: PlatformPaths) -> tuple[str, ...]:
|
||||
health = path_health(paths)
|
||||
return tuple(key for key, exists in health.items() if not exists)
|
||||
|
||||
|
||||
def path_ready(paths: PlatformPaths) -> bool:
|
||||
return not missing_required_paths(paths)
|
||||
|
||||
|
||||
def path_action_hint(paths: PlatformPaths) -> str:
|
||||
missing = missing_required_paths(paths)
|
||||
if not missing:
|
||||
return "caminhos essenciais prontos"
|
||||
return "criar ou validar: " + ", ".join(missing)
|
||||
Reference in New Issue
Block a user