import yaml
import re
from pathlib import Path
CONFIG_FILE = "config.yaml"
def load_yaml(file_path):
with open(file_path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
def get_nested_value(data, path, default="-"):
"""Достаёт значение по пути вида 'some.properties.fieldA' или 'owners.0.name'."""
keys = path.split(".")
current = data
try:
for key in keys:
if isinstance(current, list) and key.isdigit():
current = current[int(key)]
elif isinstance(current, dict):
current = current.get(key, default)
else:
return default
if isinstance(current, list):
return ", ".join(map(str, current))
return str(current)
except Exception:
return default
def build_table(contracts, tags, columns):
filtered = []
for contract_id, contract in contracts.get("paths", {}).items():
if any(tag in contract.get("tags", []) for tag in tags):
contract["id"] = contract_id
filtered.append(contract)
if not filtered:
return f"*Нет контрактов с тегами {', '.join(tags)}*"
headers = [col["header"] for col in columns]
table_lines = ["| " + " | ".join(headers) + " |"]
table_lines.append("|" + "|".join(["------"] * len(columns)) + "|")
for c in filtered:
row = []
for col in columns:
value = get_nested_value(c, col["field"])
row.append(value)
table_lines.append("| " + " | ".join(row) + " |")
return "\n".join(table_lines)
def insert_table(md_content, table, section):
pattern = rf"({re.escape(section)}\s*\n)"
return re.sub(pattern, r"\1" + table + "\n\n", md_content, count=1)
def main():
config = load_yaml(CONFIG_FILE)
for mapping in config.get("mappings", []):
tags = mapping.get("tags") or [mapping["tag"]]
columns = mapping.get("columns", [])
section = mapping.get("section", "### Title")
input_md = Path(mapping["input_md"])
output_md = Path(mapping["output_md"])
yaml_file = Path(mapping["yaml_file"])
contracts = load_yaml(yaml_file)
table = build_table(contracts, tags, columns)
md_content = input_md.read_text(encoding="utf-8")
updated_md = insert_table(md_content, table, section)
output_md.write_text(updated_md, encoding="utf-8")
print(f"[+] Сгенерирован файл: {output_md} (tags={tags}, section={section})")
if __name__ == "__main__":
main()