From a270ad85c5d371b08ac2715c98e97ed804b8763b Mon Sep 17 00:00:00 2001 From: Olivier Korach Date: Mon, 3 Nov 2025 09:04:58 +0100 Subject: [PATCH 1/4] Exclude gen dirs --- conf/.flake8 | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/.flake8 b/conf/.flake8 index d56588b0b..8e110bf63 100644 --- a/conf/.flake8 +++ b/conf/.flake8 @@ -3,4 +3,5 @@ ignore = E501,E401,W503,E128,C901,W504,E302,E265,E741,W291,W292,W293,W391,F401,E226,F841,F821,F541,D400,D401,E800,D102,D105,D107,I900,F632,E261,E731 max-line-length = 150 #exclude = tests/* +exclude = test/gen/* #max-complexity = 10 From da4711cfcbaf62f57d128988cff6c410aadab480 Mon Sep 17 00:00:00 2001 From: Olivier Korach Date: Mon, 3 Nov 2025 09:06:52 +0100 Subject: [PATCH 2/4] Exclude test gen dirs --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index db8c83ad0..5912e0334 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,7 +109,7 @@ dev = [ line-length = 150 target-version = "py39" indent-width = 4 - +exclude = ["test/gen"] [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" From 8422e3f49f3710dd93f7edb4787b613060c5457a Mon Sep 17 00:00:00 2001 From: Olivier Korach Date: Mon, 3 Nov 2025 09:07:01 +0100 Subject: [PATCH 3/4] Kill TD --- cli/config.py | 8 ++------ sonar/platform.py | 6 +++--- sonar/projects.py | 2 +- sonar/qualityprofiles.py | 3 +-- sonar/utilities.py | 8 ++++---- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/cli/config.py b/cli/config.py index bdbc803c0..9ba7dcb3f 100644 --- a/cli/config.py +++ b/cli/config.py @@ -124,7 +124,7 @@ def __parse_args(desc: str) -> object: def __normalize_json(json_data: dict[str, any], remove_empty: bool = True, remove_none: bool = True) -> dict[str, any]: """Sorts a JSON file and optionally remove empty and none values""" - SORT_FIELDS = {"users": "login", "groups": "name", "qualityGates": "name", "qualityProfiles": "language"} + sort_fields = {"users": "login", "groups": "name", "qualityGates": "name", "qualityProfiles": "language"} log.info("Normalizing JSON - remove empty = %s, remove nones = %s", str(remove_empty), str(remove_none)) json_data = utilities.clean_data(json_data, remove_none=remove_none, remove_empty=remove_empty) json_data = utilities.order_keys(json_data, *_SECTIONS_ORDER) @@ -192,12 +192,8 @@ def write_objects(queue: Queue[types.ObjectJsonRepr], fd: TextIO, object_type: s obj_json = __prep_json_for_write(obj_json, export_settings) key = "" if isinstance(obj_json, list) else obj_json.get("key", obj_json.get("login", obj_json.get("name", "unknown"))) log.debug("Writing %s key '%s'", object_type[:-1], key) - if object_type in objects_exported_as_lists: + if object_type in objects_exported_as_lists or object_type in objects_exported_as_whole: print(f"{prefix}{utilities.json_dump(obj_json)}", end="", file=fd) - elif object_type in objects_exported_as_whole: - print(f"{prefix}{utilities.json_dump(obj_json)}", end="", file=fd) - elif object_type in ("applications", "portfolios", "users"): - print(f'{prefix}"{key}": {utilities.json_dump(obj_json)}', end="", file=fd) else: log.debug("Writing %s", object_type) print(f"{prefix}{utilities.json_dump(obj_json)[2:-1]}", end="", file=fd) diff --git a/sonar/platform.py b/sonar/platform.py index bfa62a792..e83a1d337 100644 --- a/sonar/platform.py +++ b/sonar/platform.py @@ -505,19 +505,19 @@ def export(self, export_settings: types.ConfigSettings, full: bool = False) -> t # Convert dicts to lists special_categories = (settings.LANGUAGES_SETTINGS, settings.DEVOPS_INTEGRATION, "permissions", "permissionTemplates") - for categ in [c for c in settings.CATEGORIES if c not in special_categories]: + for categ in [cat for cat in settings.CATEGORIES if cat not in special_categories]: json_data[categ] = util.sort_list_by_key(util.dict_to_list(json_data[categ], "key"), "key") for k, v in json_data[settings.LANGUAGES_SETTINGS].items(): json_data[settings.LANGUAGES_SETTINGS][k] = util.sort_list_by_key(util.dict_to_list(v, "key"), "key") json_data[settings.LANGUAGES_SETTINGS] = util.dict_to_list(json_data[settings.LANGUAGES_SETTINGS], "language", "settings") json_data[settings.DEVOPS_INTEGRATION] = util.dict_to_list(json_data[settings.DEVOPS_INTEGRATION], "key") json_data["permissions"] = util.perms_to_list(json_data["permissions"]) - for k, v in json_data["permissionTemplates"].items(): + for v in json_data["permissionTemplates"].values(): if "permissions" in v: v["permissions"] = util.perms_to_list(v["permissions"]) json_data["permissionTemplates"] = util.dict_to_list(json_data["permissionTemplates"], "key") - return util.order_dict(json_data, list(settings.CATEGORIES) + ["permissions", "permissionTemplates"]) + return util.order_dict(json_data, [*settings.CATEGORIES, "permissions", "permissionTemplates"]) def set_webhooks(self, webhooks_data: types.ObjectJsonRepr) -> bool: """Sets global webhooks with a list of webhooks represented as JSON diff --git a/sonar/projects.py b/sonar/projects.py index 1e1873978..5d480be59 100644 --- a/sonar/projects.py +++ b/sonar/projects.py @@ -674,7 +674,7 @@ def export_zip(self, asynchronous: bool = False, timeout: int = 180) -> tuple[st ) try: resp = self.post("project_dump/export", params={"key": self.key}) - except exceptions.ObjectNotFound as e: + except exceptions.ObjectNotFound: Project.CACHE.pop(self) raise except exceptions.SonarException as e: diff --git a/sonar/qualityprofiles.py b/sonar/qualityprofiles.py index 33a2ee5ed..c9f9ffca8 100644 --- a/sonar/qualityprofiles.py +++ b/sonar/qualityprofiles.py @@ -287,8 +287,7 @@ def activate_rule(self, rule_key: str, severity: Optional[str] = None, **params) ok = self.post("qualityprofiles/activate_rule", params=api_params).ok except exceptions.SonarException: return False - if self._rules is None: - self._rules = {} + self._rules = self._rules or {} self._rules[rule_key] = rules.Rule.get_object(self.endpoint, rule_key) return ok diff --git a/sonar/utilities.py b/sonar/utilities.py index efa8bc3bb..f7befb7f5 100644 --- a/sonar/utilities.py +++ b/sonar/utilities.py @@ -288,7 +288,7 @@ def list_to_regexp(str_list: list[str]) -> str: return "(" + "|".join(str_list) + ")" if len(str_list) > 0 else "" -def list_to_csv(array: Union[None, str, int, float, list[str], set[str], tuple[str]], separator: str = ",", check_for_separator: bool = False) -> Any: +def list_to_csv(array: Union[None, str, float, list[str], set[str], tuple[str]], separator: str = ",", check_for_separator: bool = False) -> Any: """Converts a list of strings to CSV""" if isinstance(array, str): return csv_normalize(array, separator) if " " in array else array @@ -849,10 +849,10 @@ def order_dict(d: dict[str, Any], key_order: list[str]) -> dict[str, Any]: return new_d | {k: v for k, v in d.items() if k not in new_d} -def order_list(l: list[str], *key_order) -> list[str]: +def order_list(list_to_order: list[str], *key_order: str) -> list[str]: """Orders elements of a list in a given order""" - new_l = [k for k in key_order if k in l] - return new_l + [k for k in l if k not in new_l] + new_l = [k for k in key_order if k in list_to_order] + return new_l + [k for k in list_to_order if k not in new_l] def perms_to_list(perms: dict[str, Any]) -> list[str, Any]: From 0d3002d5c0fba6e1a63455bfed3b83d4d23de14f Mon Sep 17 00:00:00 2001 From: Olivier Korach Date: Mon, 3 Nov 2025 11:39:56 +0100 Subject: [PATCH 4/4] Kill TD --- cli/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/config.py b/cli/config.py index 9ba7dcb3f..04a80dc97 100644 --- a/cli/config.py +++ b/cli/config.py @@ -132,7 +132,7 @@ def __normalize_json(json_data: dict[str, any], remove_empty: bool = True, remov if isinstance(json_data[key], dict): json_data[key] = {k: json_data[key][k] for k in sorted(json_data[key])} else: - json_data[key] = utilities.sort_list_by_key(json_data[key], SORT_FIELDS.get(key, "key")) + json_data[key] = utilities.sort_list_by_key(json_data[key], sort_fields.get(key, "key")) return json_data