Files
tudo-para-ia-mais-humana-pl…/src/mais_humana/paths.py
2026-05-01 15:34:39 -03:00

158 lines
5.0 KiB
Python

"""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-platform",
)
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)
if project_root.name == "tudo-para-ia-mais-humana":
return f"{ordinal:02d}_repo_tudo-para-ia-mais-humana-platform"
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)