Source code for octodns.record.chunked

#
#
#

import re

from .base import ValuesMixin


[docs] class _ChunkedValuesMixin(ValuesMixin): CHUNK_SIZE = 255
[docs] def chunked_value(self, value): value = value.replace('"', '\\"') vs = [] i = 0 n = len(value) # until we've processed the whole string while i < n: # start with a full chunk size c = min(self.CHUNK_SIZE, n - i) # make sure that we don't break on escape chars while value[i + c - 1] == '\\': c -= 1 # we have our chunk now vs.append(value[i : i + c]) # and can step over if i += c vs = '" "'.join(vs) return self._value_type(f'"{vs}"')
@property def chunked_values(self): values = [] for v in self.values: values.append(self.chunked_value(v)) return values @property def rr_values(self): return self.chunked_values
[docs] class _ChunkedValue(str): _unescaped_semicolon_re = re.compile(r'\w;') _double_escaped_semicolon_re = re.compile(r'\\\\;')
[docs] @classmethod def parse_rdata_text(cls, value): try: return value.replace(';', '\\;') except AttributeError: return value
[docs] @classmethod def validate(cls, data, _type): if not data: return ['missing value(s)'] elif not isinstance(data, (list, tuple)): data = (data,) reasons = [] for value in data: if cls._unescaped_semicolon_re.search(value): reasons.append(f'unescaped ; in "{value}"') if cls._double_escaped_semicolon_re.search(value): reasons.append(f'double escaped ; in "{value}"') try: value.encode('ascii') except UnicodeEncodeError: reasons.append(f'non ASCII character in "{value}"') return reasons
[docs] @classmethod def process(cls, values): ret = [] for v in values: if v and v[0] == '"': v = v[1:-1] ret.append(cls(v.replace('" "', ''))) return ret
@property def rdata_text(self): return self
[docs] def template(self, params): if '{' not in self: return self return self.__class__(self.format(**params))