From 81193387d9c58ee653568ea32486f6085386d9f4 Mon Sep 17 00:00:00 2001 From: AsifNawaz-cnic Date: Thu, 13 Feb 2025 14:17:00 +0100 Subject: [PATCH] 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 --- .devcontainer/devcontainer.json | 3 +- .../supporting_files/scripts/post-create.sh | 13 +- .gitignore | 2 + centralnicreseller/apiconnector/apiclient.py | 48 +- centralnicreseller/apiconnector/column.py | 1 + .../apiconnector/idnaconverter.py | 8 +- .../apiconnector/idnaprocessor.py | 5 +- centralnicreseller/apiconnector/response.py | 9 +- .../apiconnector/responseparser.py | 2 +- .../apiconnector/responsetemplate.py | 5 +- htmlcov/class_index.html | 32 +- htmlcov/function_index.html | 332 +++---- htmlcov/index.html | 16 +- htmlcov/status.json | 2 +- htmlcov/z_3be9ed5ea2d1fdeb_apiclient_py.html | 834 +++++++++--------- htmlcov/z_3be9ed5ea2d1fdeb_column_py.html | 75 +- .../z_3be9ed5ea2d1fdeb_customlogger_py.html | 8 +- .../z_3be9ed5ea2d1fdeb_idnaconverter_py.html | 96 +- .../z_3be9ed5ea2d1fdeb_idnaprocessor_py.html | 77 +- htmlcov/z_3be9ed5ea2d1fdeb_logger_py.html | 8 +- htmlcov/z_3be9ed5ea2d1fdeb_record_py.html | 8 +- htmlcov/z_3be9ed5ea2d1fdeb_response_py.html | 463 +++++----- .../z_3be9ed5ea2d1fdeb_responseparser_py.html | 8 +- ..._3be9ed5ea2d1fdeb_responsetemplate_py.html | 169 ++-- ...5ea2d1fdeb_responsetemplatemanager_py.html | 8 +- .../z_3be9ed5ea2d1fdeb_socketconfig_py.html | 8 +- pyproject.toml | 2 +- tests/app.py | 4 +- tests/test_apiclient.py | 81 +- tests/test_idnaconverter.py | 9 +- tests/test_response.py | 20 +- tests/test_responsetemplate.py | 2 +- tests/test_responsetemplatemanager.py | 4 +- 33 files changed, 1219 insertions(+), 1143 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 51fc77f..aa542c9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -14,7 +14,8 @@ "mrmlnc.vscode-apache", "ms-azuretools.vscode-docker", "eamodio.gitlens", - "GitHub.copilot" + "GitHub.copilot", + "bmewburn.vscode-intelephense-client" ], "settings": { "terminal.integrated.defaultProfile.linux": "zsh", diff --git a/.devcontainer/supporting_files/scripts/post-create.sh b/.devcontainer/supporting_files/scripts/post-create.sh index f2ecad0..e1a9df0 100755 --- a/.devcontainer/supporting_files/scripts/post-create.sh +++ b/.devcontainer/supporting_files/scripts/post-create.sh @@ -10,7 +10,18 @@ source ~/.zshrc pip install --upgrade pip pip install --upgrade setuptools pip -V -#pip install -r requirements.txt + +# Install pip-tools +pip install pip-tools + +# Generate requirements.txt from pyproject.toml +pip-compile pyproject.toml + +# Install dependencies from requirements.txt +pip install -r requirements.txt + +# Install the local centralnicreseller module as an editable package +pip install -e . echo "=> Generating Symlinks for Zsh History and Git config" # Create symlink for gitconfig and zsh history file diff --git a/.gitignore b/.gitignore index 16cc444..ad7044a 100644 --- a/.gitignore +++ b/.gitignore @@ -109,3 +109,5 @@ venv.bak/ # node_modules node_modules + +requirements.txt \ No newline at end of file diff --git a/centralnicreseller/apiconnector/apiclient.py b/centralnicreseller/apiconnector/apiclient.py index b89a71b..47d2ece 100644 --- a/centralnicreseller/apiconnector/apiclient.py +++ b/centralnicreseller/apiconnector/apiclient.py @@ -10,7 +10,9 @@ from centralnicreseller.apiconnector.logger import Logger from centralnicreseller.apiconnector.response import Response -from centralnicreseller.apiconnector.responsetemplatemanager import ResponseTemplateManager as RTM +from centralnicreseller.apiconnector.responsetemplatemanager import ( + ResponseTemplateManager as RTM, +) from centralnicreseller.apiconnector.socketconfig import SocketConfig from centralnicreseller.apiconnector.idnaconverter import IDNAConverter from urllib.parse import quote, unquote, urlparse, urlencode @@ -124,8 +126,9 @@ def getPOSTData(self, cmd, secured=False): tmp = cmd.rstrip("\n") else: tmp = "\n".join( - "{}={}".format(key, re.sub(r'[\r\n]', '', str(cmd[key]))) - for key in sorted(cmd.keys()) if cmd[key] is not None + "{}={}".format(key, re.sub(r"[\r\n]", "", str(cmd[key]))) + for key in sorted(cmd.keys()) + if cmd[key] is not None ) if secured: @@ -134,7 +137,7 @@ def getPOSTData(self, cmd, secured=False): if tmp: return f"{data}{quote('s_command')}={quote(tmp)}" else: - return data if not data.endswith('&') else data.rstrip('&') + return data if not data.endswith("&") else data.rstrip("&") def getURL(self): """ @@ -203,7 +206,12 @@ def reuseSession(self, session): Use existing configuration out of session to rebuild and reuse connection settings """ - if not session or "socketcfg" not in session or "login" not in session["socketcfg"] or "session" not in session["socketcfg"]: + if ( + not session + or "socketcfg" not in session + or "login" not in session["socketcfg"] + or "session" not in session["socketcfg"] + ): return self self.setCredentials(session["socketcfg"]["login"]) self.__socketConfig.setSession(session["socketcfg"]["session"]) @@ -217,7 +225,7 @@ def setURL(self, value): return self def setPersistent(self): - """echo + """echo Set persistent connection to be used for API communication """ self.__socketConfig.setPersistent() @@ -231,13 +239,15 @@ def setCredentials(self, uid, pw=""): self.__socketConfig.setPassword(pw) return self - def setRoleCredentials(self, uid, role, pw = ""): + def setRoleCredentials(self, uid, role, pw=""): """ Set Credentials to be used for API communication """ if role == "": return self.setCredentials(uid, pw) - return self.setCredentials(("{0}{1}{2}").format(uid, self.__roleSeparator, role), pw) + return self.setCredentials( + ("{0}{1}{2}").format(uid, self.__roleSeparator, role), pw + ) def login(self): """ @@ -245,10 +255,13 @@ def login(self): """ self.setPersistent() rr = self.request([], False) - self.__socketConfig.setSession(None) # clean up all session related data + self.__socketConfig.setSession(None) # clean up all session related data if rr.isSuccess(): col = rr.getColumn("SESSIONID") - self.__socketConfig.setSession(col.getData()[0] if (col is not None) else None) + print("session id", col) + self.__socketConfig.setSession( + col.getData()[0] if (col is not None) else None + ) return rr def logout(self): @@ -261,7 +274,7 @@ def logout(self): } ) if rr.isSuccess(): - self.__socketConfig.setSession(None) # clean up all session related data + self.__socketConfig.setSession(None) # clean up all session related data return rr def request(self, cmd=[], setUserView=True): @@ -407,16 +420,21 @@ def __autoIDNConvert(self, cmd): """ key_pattern = re.compile(r"(?i)^(NAMESERVER|NS|DNSZONE)([0-9]*)$") obj_class_pattern = re.compile( - r"(?i)^(DOMAIN(APPLICATION|BLOCKING)?|NAMESERVER|NS|DNSZONE)$") + r"(?i)^(DOMAIN(APPLICATION|BLOCKING)?|NAMESERVER|NS|DNSZONE)$" + ) ascii_pattern = re.compile(r"^[A-Za-z0-9.\-]+$") to_convert = [] idxs = [] for key, val in cmd.items(): - if ((key_pattern.match(key) or - (key.upper() == "OBJECTID" and obj_class_pattern.match(cmd.get("OBJECTCLASS", "")))) - and not ascii_pattern.match(val)): + if ( + key_pattern.match(key) + or ( + key.upper() == "OBJECTID" + and obj_class_pattern.match(cmd.get("OBJECTCLASS", "")) + ) + ) and not ascii_pattern.match(val): to_convert.append(val) idxs.append(key) diff --git a/centralnicreseller/apiconnector/column.py b/centralnicreseller/apiconnector/column.py index fdc9a3c..1cc03bf 100644 --- a/centralnicreseller/apiconnector/column.py +++ b/centralnicreseller/apiconnector/column.py @@ -8,6 +8,7 @@ :license: MIT, see LICENSE for more details. """ + class Column(object): """ The Column class covers all you need to access column data of a Backend API response. diff --git a/centralnicreseller/apiconnector/idnaconverter.py b/centralnicreseller/apiconnector/idnaconverter.py index f7eb021..1f357e6 100644 --- a/centralnicreseller/apiconnector/idnaconverter.py +++ b/centralnicreseller/apiconnector/idnaconverter.py @@ -1,4 +1,6 @@ from centralnicreseller.apiconnector.idnaprocessor import IDNAProcessor + + class IDNAConverter: def __init__(self, idn=None, pc=None, idn_list=None, pc_list=None): self.idn = idn @@ -23,7 +25,9 @@ def convert_list(domain_names, use_transitional=None): for domain_name in domain_names: try: pc_results.append(IDNAProcessor.to_ascii(domain_name, use_transitional)) - idn_results.append(IDNAProcessor.to_unicode(domain_name, use_transitional)) + idn_results.append( + IDNAProcessor.to_unicode(domain_name, use_transitional) + ) except Exception: pc_results.append(domain_name) idn_results.append(domain_name) @@ -40,4 +44,4 @@ def get_idn_list(self): return self.idn_list def get_pc_list(self): - return self.pc_list \ No newline at end of file + return self.pc_list diff --git a/centralnicreseller/apiconnector/idnaprocessor.py b/centralnicreseller/apiconnector/idnaprocessor.py index 0fcd744..185d51a 100644 --- a/centralnicreseller/apiconnector/idnaprocessor.py +++ b/centralnicreseller/apiconnector/idnaprocessor.py @@ -1,11 +1,12 @@ import idna import re + class IDNAProcessor: NON_TRANSITIONAL_TLDS = re.compile( r"\.(?:art|be|ca|de|swiss|fr|pm|re|tf|wf|yt)\.?$" ) - + @staticmethod def is_transitional_processing(domain_name: str) -> bool: """ @@ -20,7 +21,7 @@ def to_ascii(domain_name, use_transitional=None): try: if use_transitional: domain_name = idna.uts46_remap(domain_name, transitional=True) - return idna.encode(domain_name).decode('ascii') + return idna.encode(domain_name).decode("ascii") except idna.IDNAError as e: raise ValueError(f"Unable to translate {domain_name} to ASCII: {e}") diff --git a/centralnicreseller/apiconnector/response.py b/centralnicreseller/apiconnector/response.py index 4b1f814..560b73b 100755 --- a/centralnicreseller/apiconnector/response.py +++ b/centralnicreseller/apiconnector/response.py @@ -138,8 +138,7 @@ def getCurrentRecord(self): Get Record of current record index """ return ( - self.__records[self.__recordIndex] if ( - self.__hasCurrentRecord()) else None + self.__records[self.__recordIndex] if (self.__hasCurrentRecord()) else None ) def getFirstRecordIndex(self): @@ -353,7 +352,11 @@ def isPending(self): """ # Check if the COMMAND is AddDomain (case-insensitive) cmd = self.getCommand() - if cmd is None or not cmd.get("COMMAND") or cmd["COMMAND"].lower() != "adddomain": + if ( + cmd is None + or not cmd.get("COMMAND") + or cmd["COMMAND"].lower() != "adddomain" + ): return False # Retrieve the STATUS column and check if its data equals REQUESTED (case-insensitive) diff --git a/centralnicreseller/apiconnector/responseparser.py b/centralnicreseller/apiconnector/responseparser.py index 5c3ab06..81bc150 100644 --- a/centralnicreseller/apiconnector/responseparser.py +++ b/centralnicreseller/apiconnector/responseparser.py @@ -39,4 +39,4 @@ def parse(raw): r["PROPERTY"][prop].append(value) else: r[attr.upper()] = value - return r \ No newline at end of file + return r diff --git a/centralnicreseller/apiconnector/responsetemplate.py b/centralnicreseller/apiconnector/responsetemplate.py index df43c37..45c4612 100644 --- a/centralnicreseller/apiconnector/responsetemplate.py +++ b/centralnicreseller/apiconnector/responsetemplate.py @@ -22,8 +22,7 @@ def __init__(self, response=""): self._raw = response if (response == "") or (response is None): descr = "Empty API response. Probably unreachable API end point {CONNECTION_URL}" - self._raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % ( - descr) + self._raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % (descr) # try/except to support old versions of python (python2.5) try: @@ -102,4 +101,4 @@ def isTmpError(self): """ Check if current API response represents a temporary error case (4xx) """ - return self.__hash["CODE"][0] == "4" \ No newline at end of file + return self.__hash["CODE"][0] == "4" diff --git a/htmlcov/class_index.html b/htmlcov/class_index.html index cf8402e..ce781b2 100644 --- a/htmlcov/class_index.html +++ b/htmlcov/class_index.html @@ -54,8 +54,8 @@

Classes

- coverage.py v7.6.4, - created at 2024-11-12 13:27 +0000 + coverage.py v7.6.12, + created at 2025-02-12 14:52 +0100

@@ -73,12 +73,12 @@

- centralnicreseller/apiconnector/apiclient.py - APIClient - 180 + centralnicreseller/apiconnector/apiclient.py + APIClient + 181 9 0 - 95% + 95% centralnicreseller/apiconnector/apiclient.py @@ -89,8 +89,8 @@

100% - centralnicreseller/apiconnector/column.py - Column + centralnicreseller/apiconnector/column.py + Column 7 0 0 @@ -121,8 +121,8 @@

0% - centralnicreseller/apiconnector/idnaconverter.py - IDNAConverter + centralnicreseller/apiconnector/idnaconverter.py + IDNAConverter 24 5 0 @@ -137,8 +137,8 @@

100% - centralnicreseller/apiconnector/idnaprocessor.py - IDNAProcessor + centralnicreseller/apiconnector/idnaprocessor.py + IDNAProcessor 17 4 0 @@ -261,10 +261,10 @@

Total   - 658 + 659 37 0 - 94% + 94% @@ -275,8 +275,8 @@

diff --git a/htmlcov/z_3be9ed5ea2d1fdeb_response_py.html b/htmlcov/z_3be9ed5ea2d1fdeb_response_py.html index ed67cad..150ff24 100644 --- a/htmlcov/z_3be9ed5ea2d1fdeb_response_py.html +++ b/htmlcov/z_3be9ed5ea2d1fdeb_response_py.html @@ -64,8 +64,8 @@

^ index     » next       - coverage.py v7.6.4, - created at 2024-11-12 13:27 +0000 + coverage.py v7.6.12, + created at 2025-02-12 14:52 +0100