Source code for dxaws_core.providers.aws
# dxaws_core/providers/aws.py
import re
import uuid
from dataclasses import dataclass
from ..aws_session import AwsSession
from dxaws_core.utils.tokens import token_hashed as _token_hashed
_SAFE = re.compile(r"[^a-zA-Z0-9.-]+")
def _clean(part: str) -> str:
return _SAFE.sub("-", part).strip("-").lower()
[docs]
@dataclass(frozen=False, slots=True, kw_only=True)
class AwsProviderBase:
"""
Minimal base class for AWS providers.
Purpose:
- Provide consistent access to AwsSession
- Provide a consistent idempotency token helper
Non-goals:
- No retries/backoff logic
- No caching
- No service-specific behavior
"""
aws: AwsSession
provider_ns: str # e.g. "dns.route53", "ssm", "acm"
[docs]
def client(self, service: str):
return self.aws.client(service)
[docs]
def token(self, *parts: str, prefix: str = "dxaws", rand_len: int = 6) -> str:
"""
Generate a readable short idempotency token, automatically namespaced.
Example:
self.token("create_zone", "example.com")
-> dxaws-dns.route53-create_zone-example.com-a1b2c3
"""
cleaned = [_clean(p) for p in parts if p]
suffix = uuid.uuid4().hex[:rand_len]
return "-".join([prefix, self.provider_ns, *cleaned, suffix])
[docs]
def token_hashed(
self,
*parts: str,
prefix: str = "dxaws",
algo: str = "sha256",
max_len: int = 32,
include_ns: bool = True,
) -> str:
"""Generate a deterministic, length-bounded token.
Implementation is delegated to `dxaws_core.utils.tokens.token_hashed`.
"""
return _token_hashed(
*parts,
prefix=prefix,
algo=algo,
max_len=max_len,
namespace=self.provider_ns if include_ns else None,
)