Coverage for arclith / adapters / output / chain / secret_adapter.py: 100%
11 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 15:02 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 15:02 +0100
1from __future__ import annotations
3from arclith.domain.ports.secret_resolver import SecretResolver
6class ChainSecretAdapter(SecretResolver):
7 """Tries each adapter in order, returns the first non-None value.
9 Example chain: [VaultSecretAdapter, YamlSecretAdapter]
10 → tries Vault first, falls back to secrets.yaml if Vault is unreachable.
11 """
13 def __init__(self, adapters: list[SecretResolver]) -> None:
14 self._adapters = adapters
16 def get(self, field_path: str, secret_key: str) -> str | None:
17 for adapter in self._adapters:
18 value = adapter.get(field_path, secret_key)
19 if value is not None:
20 return value
21 return None