From b3ba45f6f7b05682ea7274204369307e5f296224 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Tue, 10 Jun 2025 11:57:25 -0700 Subject: [PATCH] wip Value.template functions --- octodns/record/caa.py | 7 +++++++ octodns/record/ds.py | 7 +++++++ octodns/record/ip.py | 5 +++++ octodns/record/loc.py | 3 +++ octodns/record/mx.py | 7 +++++++ octodns/record/naptr.py | 13 +++++++++++++ octodns/record/srv.py | 7 +++++++ octodns/record/sshfp.py | 7 +++++++ octodns/record/svcb.py | 8 ++++++++ octodns/record/target.py | 5 +++++ octodns/record/tlsa.py | 9 +++++++++ octodns/record/urlfwd.py | 8 ++++++++ 12 files changed, 86 insertions(+) diff --git a/octodns/record/caa.py b/octodns/record/caa.py index a9d048e..b02a1f0 100644 --- a/octodns/record/caa.py +++ b/octodns/record/caa.py @@ -87,6 +87,13 @@ class CaaValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.flags} {self.tag} {self.value}' + def template(self, params): + if '{' not in self.value: + return self + new = self.__class__(self) + new.value = new.value.format(**params) + return new + def _equality_tuple(self): return (self.flags, self.tag, self.value) diff --git a/octodns/record/ds.py b/octodns/record/ds.py index 2e8bfe4..5cfc569 100644 --- a/octodns/record/ds.py +++ b/octodns/record/ds.py @@ -164,6 +164,13 @@ class DsValue(EqualityTupleMixin, dict): f'{self.key_tag} {self.algorithm} {self.digest_type} {self.digest}' ) + def template(self, params): + if '{' not in self.digest: + return self + new = self.__class__(self) + new.digest = new.digest.format(**params) + return new + def _equality_tuple(self): return (self.key_tag, self.algorithm, self.digest_type, self.digest) diff --git a/octodns/record/ip.py b/octodns/record/ip.py index 6b3fe3c..8ce605b 100644 --- a/octodns/record/ip.py +++ b/octodns/record/ip.py @@ -45,5 +45,10 @@ class _IpValue(str): def rdata_text(self): return self + def template(self, params): + if '{' not in self: + return self + return self.__class__(self.format(**params)) + _IpAddress = _IpValue diff --git a/octodns/record/loc.py b/octodns/record/loc.py index babbb93..59d55c5 100644 --- a/octodns/record/loc.py +++ b/octodns/record/loc.py @@ -305,6 +305,9 @@ class LocValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.lat_degrees} {self.lat_minutes} {self.lat_seconds} {self.lat_direction} {self.long_degrees} {self.long_minutes} {self.long_seconds} {self.long_direction} {self.altitude}m {self.size}m {self.precision_horz}m {self.precision_vert}m' + def template(self, params): + return self + def __hash__(self): return hash( ( diff --git a/octodns/record/mx.py b/octodns/record/mx.py index 36b48b5..5b11dc4 100644 --- a/octodns/record/mx.py +++ b/octodns/record/mx.py @@ -101,6 +101,13 @@ class MxValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.preference} {self.exchange}' + def template(self, params): + if '{' not in self.exchange: + return self + new = self.__class__(self) + new.exchange = new.exchange.format(**params) + return new + def __hash__(self): return hash((self.preference, self.exchange)) diff --git a/octodns/record/naptr.py b/octodns/record/naptr.py index 5dc9605..6469311 100644 --- a/octodns/record/naptr.py +++ b/octodns/record/naptr.py @@ -138,6 +138,19 @@ class NaptrValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.order} {self.preference} {self.flags} {self.service} {self.regexp} {self.replacement}' + def template(self, params): + if ( + '{' not in self.service + and '{' not in self.regexp + and '{' not in self.replacement + ): + return self + new = self.__class__(self) + new.service = new.service.format(**params) + new.regexp = new.regexp.format(**params) + new.replacement = new.replacement.format(**params) + return new + def __hash__(self): return hash(self.__repr__()) diff --git a/octodns/record/srv.py b/octodns/record/srv.py index e885735..9a49c47 100644 --- a/octodns/record/srv.py +++ b/octodns/record/srv.py @@ -135,6 +135,13 @@ class SrvValue(EqualityTupleMixin, dict): def rdata_text(self): return f"{self.priority} {self.weight} {self.port} {self.target}" + def template(self, params): + if '{' not in self.target: + return self + new = self.__class__(self) + new.target = new.target.format(**params) + return new + def __hash__(self): return hash(self.__repr__()) diff --git a/octodns/record/sshfp.py b/octodns/record/sshfp.py index e1c9de0..4665aa8 100644 --- a/octodns/record/sshfp.py +++ b/octodns/record/sshfp.py @@ -105,6 +105,13 @@ class SshfpValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.algorithm} {self.fingerprint_type} {self.fingerprint}' + def template(self, params): + if '{' in self.fingerprint: + return self + new = self.__class__(self) + new.fingerprint = new.fingerprint.format(**params) + return new + def __hash__(self): return hash(self.__repr__()) diff --git a/octodns/record/svcb.py b/octodns/record/svcb.py index 399414c..b286d1c 100644 --- a/octodns/record/svcb.py +++ b/octodns/record/svcb.py @@ -287,6 +287,14 @@ class SvcbValue(EqualityTupleMixin, dict): params += f'={svcparamvalue}' return f'{self.svcpriority} {self.targetname}{params}' + def template(self, params): + if '{' not in self.targetname: + return self + new = self.__class__(self) + new.targetname = new.targetname.format(**params) + # TODO: what, if any of the svcparams should be templated + return new + def __hash__(self): return hash(self.__repr__()) diff --git a/octodns/record/target.py b/octodns/record/target.py index db1c7c3..b1d954b 100644 --- a/octodns/record/target.py +++ b/octodns/record/target.py @@ -80,3 +80,8 @@ class _TargetsValue(str): @property def rdata_text(self): return self + + def template(self, params): + if '{' not in self: + return self + return self.__class__(self.format(**params)) diff --git a/octodns/record/tlsa.py b/octodns/record/tlsa.py index ed7b267..904afc8 100644 --- a/octodns/record/tlsa.py +++ b/octodns/record/tlsa.py @@ -136,6 +136,15 @@ class TlsaValue(EqualityTupleMixin, dict): def rdata_text(self): return f'{self.certificate_usage} {self.selector} {self.matching_type} {self.certificate_association_data}' + def template(self, params): + if '{' in self.certificate_association_data: + return self + new = self.__class__(self) + new.certificate_association_data = ( + new.certificate_association_data.format(**params) + ) + return new + def _equality_tuple(self): return ( self.certificate_usage, diff --git a/octodns/record/urlfwd.py b/octodns/record/urlfwd.py index e735725..2d7d0fe 100644 --- a/octodns/record/urlfwd.py +++ b/octodns/record/urlfwd.py @@ -132,6 +132,14 @@ class UrlfwdValue(EqualityTupleMixin, dict): def rdata_text(self): return f'"{self.path}" "{self.target}" {self.code} {self.masking} {self.query}' + def template(self, params): + if '{' not in self.path and '{' not in self.target: + return self + new = self.__class__(self) + new.path = new.path.format(**params) + new.target = new.target.format(**params) + return new + def _equality_tuple(self): return (self.path, self.target, self.code, self.masking, self.query)