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

1from __future__ import annotations 

2 

3from arclith.domain.ports.secret_resolver import SecretResolver 

4 

5 

6class ChainSecretAdapter(SecretResolver): 

7 """Tries each adapter in order, returns the first non-None value. 

8 

9 Example chain: [VaultSecretAdapter, YamlSecretAdapter] 

10 → tries Vault first, falls back to secrets.yaml if Vault is unreachable. 

11 """ 

12 

13 def __init__(self, adapters: list[SecretResolver]) -> None: 

14 self._adapters = adapters 

15 

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 

22