mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
#
|
|
#
|
|
#
|
|
|
|
from .base import ValuesMixin
|
|
import re
|
|
|
|
|
|
class _ChunkedValuesMixin(ValuesMixin):
|
|
CHUNK_SIZE = 255
|
|
_unescaped_semicolon_re = re.compile(r'\w;')
|
|
|
|
def chunked_value(self, value):
|
|
value = value.replace('"', '\\"')
|
|
vs = [
|
|
value[i : i + self.CHUNK_SIZE]
|
|
for i in range(0, len(value), self.CHUNK_SIZE)
|
|
]
|
|
vs = '" "'.join(vs)
|
|
return f'"{vs}"'
|
|
|
|
@property
|
|
def chunked_values(self):
|
|
values = []
|
|
for v in self.values:
|
|
values.append(self.chunked_value(v))
|
|
return values
|
|
|
|
|
|
class _ChunkedValue(str):
|
|
_unescaped_semicolon_re = re.compile(r'\w;')
|
|
|
|
@classmethod
|
|
def parse_rdata_text(cls, value):
|
|
try:
|
|
return value.replace(';', '\\;')
|
|
except AttributeError:
|
|
return value
|
|
|
|
@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}"')
|
|
return reasons
|
|
|
|
@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
|