22
33import ipaddress
44from typing import Any , Iterable , Optional , Sequence , Union
5- from urllib .parse import quote
65
76from .._base import Call
87from ..messages import text
@@ -15,14 +14,14 @@ def _domain(domain: str) -> str:
1514 value = domain .strip ().lower ().rstrip ("." )
1615 if not value :
1716 raise ValueError (text ("value.empty_domain" ))
18- return quote ( value , safe = "" )
17+ return value
1918
2019
2120def _name (name : str ) -> str :
2221 value = name .strip ()
2322 if not value :
2423 raise ValueError (text ("value.empty_name" ))
25- return quote ( value , safe = "@" )
24+ return value
2625
2726
2827def _records (payload : Any ) -> list [DNSRecord ]:
@@ -55,6 +54,9 @@ def __init__(self, client: Any) -> None:
5554 def _run (self , call : Call ) -> Any :
5655 return self ._client ._execute (call )
5756
57+ def _path (self , endpoint : str , ** params : str ) -> str :
58+ return self ._client .settings .path (endpoint , ** params )
59+
5860 def list (
5961 self ,
6062 domain : str ,
@@ -64,15 +66,17 @@ def list(
6466 offset : Optional [int ] = None ,
6567 limit : Optional [int ] = None ,
6668 ) -> Any :
67- path = f"/v1/domains/{ _domain (domain )} /records"
6869 wanted_name = name .strip () if name else None
6970
7071 if type is not None :
71- path += f"/{ quote (record_type (type ), safe = '' )} "
7272 if wanted_name :
73- path += f"/{ _name (wanted_name )} "
73+ path = self ._path ("record" , domain = _domain (domain ), type = record_type (type ), name = _name (wanted_name ))
74+ else :
75+ path = self ._path ("records_by_type" , domain = _domain (domain ), type = record_type (type ))
7476 parse = _records
7577 else :
78+ path = self ._path ("records" , domain = _domain (domain ))
79+
7680 def parse (payload : Any ) -> list [DNSRecord ]:
7781 records = _records (payload )
7882 if wanted_name :
@@ -82,18 +86,18 @@ def parse(payload: Any) -> list[DNSRecord]:
8286 return self ._run (Call ("GET" , path , params = {"offset" : offset , "limit" : limit }, parse = parse ))
8387
8488 def get (self , domain : str , type : RecordTypeLike , name : str ) -> Any :
85- path = f"/v1/domains/ { _domain (domain )} /records/ { quote ( record_type (type ), safe = '' ) } / { _name (name )} "
89+ path = self . _path ( "record" , domain = _domain (domain ), type = record_type (type ), name = _name (name ))
8690 return self ._run (Call ("GET" , path , parse = _records ))
8791
8892 def exists (self , domain : str , type : RecordTypeLike , name : str ) -> Any :
89- path = f"/v1/domains/ { _domain (domain )} /records/ { quote ( record_type (type ), safe = '' ) } / { _name (name )} "
93+ path = self . _path ( "record" , domain = _domain (domain ), type = record_type (type ), name = _name (name ))
9094 return self ._run (Call ("GET" , path , parse = lambda payload : bool (_records (payload ))))
9195
9296 def add (self , domain : str , * records : DNSRecord ) -> Any :
9397 if not records :
9498 raise ValueError (text ("value.add_needs_records" ))
9599 body = [record .to_api () for record in records ]
96- return self ._run (Call ("PATCH" , f"/v1/domains/ { _domain (domain )} /records" , json = body , parse = lambda _ : None ))
100+ return self ._run (Call ("PATCH" , self . _path ( "records" , domain = _domain (domain )) , json = body , parse = lambda _ : None ))
97101
98102 def replace (
99103 self ,
@@ -104,7 +108,7 @@ def replace(
104108 * ,
105109 ttl : int = 600 ,
106110 ) -> Any :
107- path = f"/v1/domains/ { _domain (domain )} /records/ { quote ( record_type (type ), safe = '' ) } / { _name (name )} "
111+ path = self . _path ( "record" , domain = _domain (domain ), type = record_type (type ), name = _name (name ))
108112 body = _record_bodies (values , ttl )
109113 return self ._run (Call ("PUT" , path , json = body , parse = lambda _ : None ))
110114
@@ -114,15 +118,15 @@ def replace_type(self, domain: str, type: RecordTypeLike, records: Sequence[DNSR
114118 if record .type != kind :
115119 raise ValueError (text ("value.type_mismatch" , name = record .name , actual = record .type , expected = kind ))
116120 body = [{"name" : r .name , ** r .to_api (include_identity = False )} for r in records ]
117- path = f"/v1/domains/ { _domain (domain )} /records/ { quote ( kind , safe = '' ) } "
121+ path = self . _path ( "records_by_type" , domain = _domain (domain ), type = kind )
118122 return self ._run (Call ("PUT" , path , json = body , parse = lambda _ : None ))
119123
120124 def replace_all (self , domain : str , records : Sequence [DNSRecord ]) -> Any :
121125 body = [record .to_api () for record in records ]
122- return self ._run (Call ("PUT" , f"/v1/domains/ { _domain (domain )} /records" , json = body , parse = lambda _ : None ))
126+ return self ._run (Call ("PUT" , self . _path ( "records" , domain = _domain (domain )) , json = body , parse = lambda _ : None ))
123127
124128 def delete (self , domain : str , type : RecordTypeLike , name : str , * , missing_ok : bool = False ) -> Any :
125- path = f"/v1/domains/ { _domain (domain )} /records/ { quote ( record_type (type ), safe = '' ) } / { _name (name )} "
129+ path = self . _path ( "record" , domain = _domain (domain ), type = record_type (type ), name = _name (name ))
126130 allow = frozenset ({404 }) if missing_ok else frozenset ()
127131 return self ._run (Call ("DELETE" , path , parse = lambda _ : None , allow_status = allow ))
128132
0 commit comments