Skip to content

Commit 1530739

Browse files
AsifNawaz-cnicKaiSchwarz-cnic
authored andcommitted
build(deps): bump black to v23<=v26, enhance dev experience by installing centralnicreseller local dependency and patching unit test cases
- Bump black to version 23<=v26 - Install centralnicreseller as a local dependency - Patch unit test cases to ensure all are passing - Improve overall containerization experience
1 parent cb0c439 commit 1530739

33 files changed

+1219
-1143
lines changed

.devcontainer/devcontainer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"mrmlnc.vscode-apache",
1515
"ms-azuretools.vscode-docker",
1616
"eamodio.gitlens",
17-
"GitHub.copilot"
17+
"GitHub.copilot",
18+
"bmewburn.vscode-intelephense-client"
1819
],
1920
"settings": {
2021
"terminal.integrated.defaultProfile.linux": "zsh",

.devcontainer/supporting_files/scripts/post-create.sh

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,18 @@ source ~/.zshrc
1010
pip install --upgrade pip
1111
pip install --upgrade setuptools
1212
pip -V
13-
#pip install -r requirements.txt
13+
14+
# Install pip-tools
15+
pip install pip-tools
16+
17+
# Generate requirements.txt from pyproject.toml
18+
pip-compile pyproject.toml
19+
20+
# Install dependencies from requirements.txt
21+
pip install -r requirements.txt
22+
23+
# Install the local centralnicreseller module as an editable package
24+
pip install -e .
1425

1526
echo "=> Generating Symlinks for Zsh History and Git config"
1627
# Create symlink for gitconfig and zsh history file

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,5 @@ venv.bak/
109109

110110
# node_modules
111111
node_modules
112+
113+
requirements.txt

centralnicreseller/apiconnector/apiclient.py

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010

1111
from centralnicreseller.apiconnector.logger import Logger
1212
from centralnicreseller.apiconnector.response import Response
13-
from centralnicreseller.apiconnector.responsetemplatemanager import ResponseTemplateManager as RTM
13+
from centralnicreseller.apiconnector.responsetemplatemanager import (
14+
ResponseTemplateManager as RTM,
15+
)
1416
from centralnicreseller.apiconnector.socketconfig import SocketConfig
1517
from centralnicreseller.apiconnector.idnaconverter import IDNAConverter
1618
from urllib.parse import quote, unquote, urlparse, urlencode
@@ -124,8 +126,9 @@ def getPOSTData(self, cmd, secured=False):
124126
tmp = cmd.rstrip("\n")
125127
else:
126128
tmp = "\n".join(
127-
"{}={}".format(key, re.sub(r'[\r\n]', '', str(cmd[key])))
128-
for key in sorted(cmd.keys()) if cmd[key] is not None
129+
"{}={}".format(key, re.sub(r"[\r\n]", "", str(cmd[key])))
130+
for key in sorted(cmd.keys())
131+
if cmd[key] is not None
129132
)
130133

131134
if secured:
@@ -134,7 +137,7 @@ def getPOSTData(self, cmd, secured=False):
134137
if tmp:
135138
return f"{data}{quote('s_command')}={quote(tmp)}"
136139
else:
137-
return data if not data.endswith('&') else data.rstrip('&')
140+
return data if not data.endswith("&") else data.rstrip("&")
138141

139142
def getURL(self):
140143
"""
@@ -203,7 +206,12 @@ def reuseSession(self, session):
203206
Use existing configuration out of session
204207
to rebuild and reuse connection settings
205208
"""
206-
if not session or "socketcfg" not in session or "login" not in session["socketcfg"] or "session" not in session["socketcfg"]:
209+
if (
210+
not session
211+
or "socketcfg" not in session
212+
or "login" not in session["socketcfg"]
213+
or "session" not in session["socketcfg"]
214+
):
207215
return self
208216
self.setCredentials(session["socketcfg"]["login"])
209217
self.__socketConfig.setSession(session["socketcfg"]["session"])
@@ -217,7 +225,7 @@ def setURL(self, value):
217225
return self
218226

219227
def setPersistent(self):
220-
"""echo
228+
"""echo
221229
Set persistent connection to be used for API communication
222230
"""
223231
self.__socketConfig.setPersistent()
@@ -231,24 +239,29 @@ def setCredentials(self, uid, pw=""):
231239
self.__socketConfig.setPassword(pw)
232240
return self
233241

234-
def setRoleCredentials(self, uid, role, pw = ""):
242+
def setRoleCredentials(self, uid, role, pw=""):
235243
"""
236244
Set Credentials to be used for API communication
237245
"""
238246
if role == "":
239247
return self.setCredentials(uid, pw)
240-
return self.setCredentials(("{0}{1}{2}").format(uid, self.__roleSeparator, role), pw)
248+
return self.setCredentials(
249+
("{0}{1}{2}").format(uid, self.__roleSeparator, role), pw
250+
)
241251

242252
def login(self):
243253
"""
244254
Perform API login to start session-based communication
245255
"""
246256
self.setPersistent()
247257
rr = self.request([], False)
248-
self.__socketConfig.setSession(None) # clean up all session related data
258+
self.__socketConfig.setSession(None) # clean up all session related data
249259
if rr.isSuccess():
250260
col = rr.getColumn("SESSIONID")
251-
self.__socketConfig.setSession(col.getData()[0] if (col is not None) else None)
261+
print("session id", col)
262+
self.__socketConfig.setSession(
263+
col.getData()[0] if (col is not None) else None
264+
)
252265
return rr
253266

254267
def logout(self):
@@ -261,7 +274,7 @@ def logout(self):
261274
}
262275
)
263276
if rr.isSuccess():
264-
self.__socketConfig.setSession(None) # clean up all session related data
277+
self.__socketConfig.setSession(None) # clean up all session related data
265278
return rr
266279

267280
def request(self, cmd=[], setUserView=True):
@@ -407,16 +420,21 @@ def __autoIDNConvert(self, cmd):
407420
"""
408421
key_pattern = re.compile(r"(?i)^(NAMESERVER|NS|DNSZONE)([0-9]*)$")
409422
obj_class_pattern = re.compile(
410-
r"(?i)^(DOMAIN(APPLICATION|BLOCKING)?|NAMESERVER|NS|DNSZONE)$")
423+
r"(?i)^(DOMAIN(APPLICATION|BLOCKING)?|NAMESERVER|NS|DNSZONE)$"
424+
)
411425
ascii_pattern = re.compile(r"^[A-Za-z0-9.\-]+$")
412426

413427
to_convert = []
414428
idxs = []
415429

416430
for key, val in cmd.items():
417-
if ((key_pattern.match(key) or
418-
(key.upper() == "OBJECTID" and obj_class_pattern.match(cmd.get("OBJECTCLASS", ""))))
419-
and not ascii_pattern.match(val)):
431+
if (
432+
key_pattern.match(key)
433+
or (
434+
key.upper() == "OBJECTID"
435+
and obj_class_pattern.match(cmd.get("OBJECTCLASS", ""))
436+
)
437+
) and not ascii_pattern.match(val):
420438
to_convert.append(val)
421439
idxs.append(key)
422440

centralnicreseller/apiconnector/column.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
:license: MIT, see LICENSE for more details.
99
"""
1010

11+
1112
class Column(object):
1213
"""
1314
The Column class covers all you need to access column data of a Backend API response.

centralnicreseller/apiconnector/idnaconverter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from centralnicreseller.apiconnector.idnaprocessor import IDNAProcessor
2+
3+
24
class IDNAConverter:
35
def __init__(self, idn=None, pc=None, idn_list=None, pc_list=None):
46
self.idn = idn
@@ -23,7 +25,9 @@ def convert_list(domain_names, use_transitional=None):
2325
for domain_name in domain_names:
2426
try:
2527
pc_results.append(IDNAProcessor.to_ascii(domain_name, use_transitional))
26-
idn_results.append(IDNAProcessor.to_unicode(domain_name, use_transitional))
28+
idn_results.append(
29+
IDNAProcessor.to_unicode(domain_name, use_transitional)
30+
)
2731
except Exception:
2832
pc_results.append(domain_name)
2933
idn_results.append(domain_name)
@@ -40,4 +44,4 @@ def get_idn_list(self):
4044
return self.idn_list
4145

4246
def get_pc_list(self):
43-
return self.pc_list
47+
return self.pc_list

centralnicreseller/apiconnector/idnaprocessor.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import idna
22
import re
33

4+
45
class IDNAProcessor:
56
NON_TRANSITIONAL_TLDS = re.compile(
67
r"\.(?:art|be|ca|de|swiss|fr|pm|re|tf|wf|yt)\.?$"
78
)
8-
9+
910
@staticmethod
1011
def is_transitional_processing(domain_name: str) -> bool:
1112
"""
@@ -20,7 +21,7 @@ def to_ascii(domain_name, use_transitional=None):
2021
try:
2122
if use_transitional:
2223
domain_name = idna.uts46_remap(domain_name, transitional=True)
23-
return idna.encode(domain_name).decode('ascii')
24+
return idna.encode(domain_name).decode("ascii")
2425
except idna.IDNAError as e:
2526
raise ValueError(f"Unable to translate {domain_name} to ASCII: {e}")
2627

centralnicreseller/apiconnector/response.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ def getCurrentRecord(self):
138138
Get Record of current record index
139139
"""
140140
return (
141-
self.__records[self.__recordIndex] if (
142-
self.__hasCurrentRecord()) else None
141+
self.__records[self.__recordIndex] if (self.__hasCurrentRecord()) else None
143142
)
144143

145144
def getFirstRecordIndex(self):
@@ -353,7 +352,11 @@ def isPending(self):
353352
"""
354353
# Check if the COMMAND is AddDomain (case-insensitive)
355354
cmd = self.getCommand()
356-
if cmd is None or not cmd.get("COMMAND") or cmd["COMMAND"].lower() != "adddomain":
355+
if (
356+
cmd is None
357+
or not cmd.get("COMMAND")
358+
or cmd["COMMAND"].lower() != "adddomain"
359+
):
357360
return False
358361

359362
# Retrieve the STATUS column and check if its data equals REQUESTED (case-insensitive)

centralnicreseller/apiconnector/responseparser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ def parse(raw):
3939
r["PROPERTY"][prop].append(value)
4040
else:
4141
r[attr.upper()] = value
42-
return r
42+
return r

centralnicreseller/apiconnector/responsetemplate.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ def __init__(self, response=""):
2222
self._raw = response
2323
if (response == "") or (response is None):
2424
descr = "Empty API response. Probably unreachable API end point {CONNECTION_URL}"
25-
self._raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % (
26-
descr)
25+
self._raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % (descr)
2726

2827
# try/except to support old versions of python (python2.5)
2928
try:
@@ -102,4 +101,4 @@ def isTmpError(self):
102101
"""
103102
Check if current API response represents a temporary error case (4xx)
104103
"""
105-
return self.__hash["CODE"][0] == "4"
104+
return self.__hash["CODE"][0] == "4"

0 commit comments

Comments
 (0)