mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 02:54:26 +00:00
3529 invalid comments in 528 files, grandfathered in while the linter only saw the working-tree diff. Removal ran through the linter's own collectors, so detection and deletion cannot drift: a comment whose opener line is blank before it and whose closer line is blank after it loses all its lines, anything else loses only the comment region, and a line left holding a bare delimiter goes with it. Five files keep their comments behind a nocheck marker instead. Four are upstream configs whose inline docs are upstream's own (mautrix, systemd journald, nextcloud-oidc-login, MediaWiki). In littlejs the commented-out entries ARE the deactivation mechanism for an example tile, so deleting them would delete configuration. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
28 lines
1018 B
Python
28 lines
1018 B
Python
from typing import Any
|
|
|
|
import yaml
|
|
from yaml.loader import SafeLoader
|
|
|
|
from utils.cache.files import read_text
|
|
from utils.handler.vault import VaultScalar
|
|
|
|
|
|
class YamlHandler:
|
|
@staticmethod
|
|
def load_yaml(path) -> dict:
|
|
"""Load the YAML file and wrap existing !vault entries."""
|
|
text = read_text(str(path))
|
|
data = yaml.load(text, Loader=SafeLoader) or {} # nocheck: direct-yaml
|
|
return YamlHandler.wrap_existing_vaults(data)
|
|
|
|
@staticmethod
|
|
def wrap_existing_vaults(node: Any) -> Any:
|
|
"""Recursively wrap any str that begins with '$ANSIBLE_VAULT' in a VaultScalar so it dumps as a literal block."""
|
|
if isinstance(node, dict):
|
|
return {k: YamlHandler.wrap_existing_vaults(v) for k, v in node.items()}
|
|
if isinstance(node, list):
|
|
return [YamlHandler.wrap_existing_vaults(v) for v in node]
|
|
if isinstance(node, str) and node.lstrip().startswith("$ANSIBLE_VAULT"):
|
|
return VaultScalar(node)
|
|
return node
|