Skip to content

Commit 7b778f8

Browse files
committed
Use helpers and change conversion function names
1 parent 079f6e7 commit 7b778f8

File tree

13 files changed

+235
-197
lines changed

13 files changed

+235
-197
lines changed

cli/config.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
from cli import options
3333
from sonar import exceptions, errcodes, utilities, version
3434
from sonar.util import types, constants as c
35+
from sonar.util import platform_helper as pfhelp
36+
from sonar.util import project_helper as pjhelp
37+
from sonar.util import portfolio_helper as foliohelp
38+
from sonar.util import qualityprofile_helper as qphelp
39+
3540
import sonar.logging as log
3641
from sonar import platform, rules, qualityprofiles, qualitygates, users, groups
3742
from sonar import projects, portfolios, applications
@@ -309,16 +314,16 @@ def convert_json(**kwargs) -> dict[str, Any]:
309314
with open(kwargs["convertFrom"], encoding="utf-8") as fd:
310315
old_json = json.loads(fd.read())
311316
mapping = {
312-
"platform": platform.old_to_new_json,
313-
"globalSettings": platform.global_settings_old_to_new_json,
314-
"qualityProfiles": qualityprofiles.old_to_new_json,
315-
"qualityGates": qualitygates.old_to_new_json,
316-
"projects": projects.old_to_new_json,
317-
"portfolios": portfolios.old_to_new_json,
317+
"platform": pfhelp.convert_basics_json,
318+
"globalSettings": pfhelp.convert_global_settings_json,
319+
"qualityProfiles": qphelp.convert_qps_json,
320+
"qualityGates": qualitygates.convert_qgs_json,
321+
"projects": pjhelp.convert_projects_json,
322+
"portfolios": foliohelp.convert_portfolios_json,
318323
"applications": applications.old_to_new_json,
319-
"users": users.old_to_new_json,
320-
"groups": groups.old_to_new_json,
321-
"rules": rules.old_to_new_json,
324+
"users": users.convert_users_json,
325+
"groups": groups.convert_groups_json,
326+
"rules": rules.convert_rules_json,
322327
}
323328
new_json = {}
324329
for k, func in mapping.items():

sonar/applications.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ def export(endpoint: pf.Platform, export_settings: types.ConfigSettings, **kwarg
518518
"""
519519
check_supported(endpoint)
520520
write_q = kwargs.get("write_q", None)
521-
key_regexp = kwargs.get("key_list", ".*")
521+
key_regexp = kwargs.get("key_list", ".+")
522522

523523
app_list = {k: v for k, v in get_list(endpoint).items() if not key_regexp or re.match(key_regexp, k)}
524524
apps_settings = []
@@ -547,7 +547,7 @@ def audit(endpoint: pf.Platform, audit_settings: types.ConfigSettings, **kwargs)
547547
return []
548548
log.info("--- Auditing applications ---")
549549
problems = []
550-
key_regexp = kwargs.get("key_list", None) or ".*"
550+
key_regexp = kwargs.get("key_list", ".+")
551551
for obj in [o for o in get_list(endpoint).values() if not key_regexp or re.match(key_regexp, o.key)]:
552552
problems += obj.audit(audit_settings, **kwargs)
553553
return problems

sonar/groups.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,6 @@ def exists(endpoint: pf.Platform, name: str) -> bool:
434434
return Group.get_object(endpoint=endpoint, name=name) is not None
435435

436436

437-
def old_to_new_json(old_json: dict[str, Any]) -> dict[str, Any]:
437+
def convert_groups_json(old_json: dict[str, Any]) -> dict[str, Any]:
438438
"""Converts sonar-config old groups JSON report format to new format"""
439439
return util.dict_to_list(old_json, "name", "description")

sonar/portfolios.py

Lines changed: 6 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -455,26 +455,20 @@ def set_manual_mode(self) -> Portfolio:
455455

456456
def set_tags_mode(self, tags: list[str], branch: Optional[str] = None) -> Portfolio:
457457
"""Sets a portfolio to tags mode"""
458-
if branch is None:
459-
branch = c.DEFAULT_BRANCH
460-
self.post("views/set_tags_mode", params={"portfolio": self.key, "tags": util.list_to_csv(tags), "branch": get_api_branch(branch)})
461-
self._selection_mode = {_SELECTION_MODE_TAGS: tags, "branch": branch}
458+
self.post("views/set_tags_mode", params={"portfolio": self.key, "tags": util.list_to_csv(tags), "branch": branch})
459+
self._selection_mode = {_SELECTION_MODE_TAGS: tags, "branch": branch or c.DEFAULT_BRANCH}
462460
return self
463461

464462
def set_regexp_mode(self, regexp: str, branch: Optional[str] = None) -> Portfolio:
465463
"""Sets a portfolio to regexp mode"""
466-
if branch is None:
467-
branch = c.DEFAULT_BRANCH
468-
self.post("views/set_regexp_mode", params={"portfolio": self.key, "regexp": regexp, "branch": get_api_branch(branch)})
469-
self._selection_mode = {_SELECTION_MODE_REGEXP: regexp, "branch": branch}
464+
self.post("views/set_regexp_mode", params={"portfolio": self.key, "regexp": regexp, "branch": branch})
465+
self._selection_mode = {_SELECTION_MODE_REGEXP: regexp, "branch": branch or c.DEFAULT_BRANCH}
470466
return self
471467

472468
def set_remaining_projects_mode(self, branch: Optional[str] = None) -> Portfolio:
473469
"""Sets a portfolio to remaining projects mode"""
474-
if branch is None:
475-
branch = c.DEFAULT_BRANCH
476-
self.post("views/set_remaining_projects_mode", params={"portfolio": self.key, "branch": get_api_branch(branch)})
477-
self._selection_mode = {"rest": True, "branch": branch}
470+
self.post("views/set_remaining_projects_mode", params={"portfolio": self.key, "branch": branch})
471+
self._selection_mode = {"rest": True, "branch": branch or c.DEFAULT_BRANCH}
478472
return self
479473

480474
def set_none_mode(self) -> Portfolio:
@@ -808,17 +802,6 @@ def recompute(endpoint: pf.Platform) -> None:
808802
endpoint.post(Portfolio.API["REFRESH"])
809803

810804

811-
def _find_sub_portfolio(key: str, data: types.ApiPayload) -> types.ApiPayload:
812-
"""Finds a subportfolio in a JSON hierarchy"""
813-
for subp in data.get("subViews", []):
814-
if subp["key"] == key:
815-
return subp
816-
child = _find_sub_portfolio(key, subp)
817-
if child is not None:
818-
return child
819-
return {}
820-
821-
822805
def __create_portfolio_hierarchy(endpoint: pf.Platform, data: types.ApiPayload, parent_key: str) -> int:
823806
"""Creates the hierarchy of portfolios that are new defined by reference"""
824807
nbr_creations = 0
@@ -840,34 +823,3 @@ def __create_portfolio_hierarchy(endpoint: pf.Platform, data: types.ApiPayload,
840823
o.root_portfolio = o_parent.root_portfolio
841824
nbr_creations += __create_portfolio_hierarchy(endpoint, subp, parent_key=key)
842825
return nbr_creations
843-
844-
845-
def get_api_branch(branch: str) -> str:
846-
"""Returns the value to pass to the API for the branch parameter"""
847-
return branch if branch != c.DEFAULT_BRANCH else None
848-
849-
850-
def clear_cache(endpoint: pf.Platform) -> None:
851-
"""Clears the cache of an endpoint"""
852-
Portfolio.clear_cache(endpoint)
853-
854-
855-
def old_to_new_json_one(old_json: dict[str, Any]) -> dict[str, Any]:
856-
"""Converts the sonar-config old JSON report format for a single portfolio to the new one"""
857-
new_json = old_json.copy()
858-
for key in "children", "portfolios":
859-
if key in new_json:
860-
new_json[key] = old_to_new_json(new_json[key])
861-
if "permissions" in old_json:
862-
new_json["permissions"] = util.perms_to_list(old_json["permissions"])
863-
if "branches" in old_json:
864-
new_json["branches"] = util.dict_to_list(old_json["branches"], "name")
865-
return new_json
866-
867-
868-
def old_to_new_json(old_json: dict[str, Any]) -> dict[str, Any]:
869-
"""Converts the sonar-config portfolios old JSON report format to the new one"""
870-
new_json = old_json.copy()
871-
for k, v in new_json.items():
872-
new_json[k] = old_to_new_json_one(v)
873-
return util.dict_to_list(new_json, "key")

sonar/projects.py

Lines changed: 3 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
from sonar.audit.rules import get_rule, RuleId
5353
from sonar.audit.problem import Problem
5454
import sonar.util.constants as c
55+
import sonar.util.project_helper as phelp
5556

5657
_CLASS_LOCK = Lock()
5758

@@ -87,45 +88,6 @@
8788

8889
_PROJECT_QUALIFIER = "qualifier=TRK"
8990

90-
_UNNEEDED_CONTEXT_DATA = (
91-
"sonar.announcement.message",
92-
"sonar.auth.github.allowUsersToSignUp",
93-
"sonar.auth.github.apiUrl",
94-
"sonar.auth.github.appId",
95-
"sonar.auth.github.enabled",
96-
"sonar.auth.github.groupsSync",
97-
"sonar.auth.github.organizations",
98-
"sonar.auth.github.webUrl",
99-
"sonar.builtInQualityProfiles.disableNotificationOnUpdate",
100-
"sonar.core.id",
101-
"sonar.core.serverBaseURL",
102-
"sonar.core.startTime",
103-
"sonar.dbcleaner.branchesToKeepWhenInactive",
104-
"sonar.forceAuthentication",
105-
"sonar.host.url",
106-
"sonar.java.jdkHome",
107-
"sonar.links.ci",
108-
"sonar.links.homepage",
109-
"sonar.links.issue",
110-
"sonar.links.scm",
111-
"sonar.links.scm_dev",
112-
"sonar.plugins.risk.consent",
113-
)
114-
115-
_UNNEEDED_TASK_DATA = (
116-
"analysisId",
117-
"componentId",
118-
"hasScannerContext",
119-
"id",
120-
"warningCount",
121-
"componentQualifier",
122-
"nodeName",
123-
"componentName",
124-
"componentKey",
125-
"submittedAt",
126-
"executedAt",
127-
"type",
128-
)
12991

13092
# Keys to exclude when applying settings in update()
13193
_SETTINGS_WITH_SPECIFIC_IMPORT = (
@@ -980,10 +942,10 @@ def migration_export(self, export_settings: types.ConfigSettings) -> types.Objec
980942
if last_task:
981943
ctxt = last_task.scanner_context()
982944
if ctxt:
983-
ctxt = {k: v for k, v in ctxt.items() if k not in _UNNEEDED_CONTEXT_DATA}
945+
ctxt = {k: v for k, v in ctxt.items() if k not in phelp.UNNEEDED_CONTEXT_DATA}
984946
t_hist = []
985947
for t in self.task_history():
986-
t_hist.append({k: v for k, v in t.sq_json.items() if k not in _UNNEEDED_TASK_DATA})
948+
t_hist.append({k: v for k, v in t.sq_json.items() if k not in phelp.UNNEEDED_TASK_DATA})
987949
json_data["backgroundTasks"] = {
988950
"lastTaskScannerContext": ctxt,
989951
# "lastTaskWarnings": last_task.warnings(),
@@ -1343,9 +1305,6 @@ def count(endpoint: pf.Platform, params: types.ApiParams = None) -> int:
13431305
"""Counts projects
13441306
13451307
:param params: list of parameters to filter projects to search
1346-
:type params: dict
1347-
:return: Count of projects
1348-
:rtype: int
13491308
"""
13501309
new_params = {} if params is None else params.copy()
13511310
new_params.update({"ps": 1, "p": 1})
@@ -1696,23 +1655,3 @@ def import_zips(endpoint: pf.Platform, project_list: list[str], threads: int = 2
16961655
log.info("%d/%d imports (%d%%) - Latest: %s - %s", i, nb_projects, int(i * 100 / nb_projects), proj_key, status)
16971656
log.info("%s", ", ".join([f"{k}:{v}" for k, v in statuses_count.items()]))
16981657
return statuses
1699-
1700-
1701-
def old_to_new_json_one(old_json: dict[str, Any]) -> dict[str, Any]:
1702-
"""Converts the sonar-config projects old JSON report format for a single project to the new one"""
1703-
new_json = old_json.copy()
1704-
if "permissions" in old_json:
1705-
new_json["permissions"] = util.perms_to_list(old_json["permissions"])
1706-
if "branches" in old_json:
1707-
new_json["branches"] = util.dict_to_list(old_json["branches"], "name")
1708-
if "settings" in old_json:
1709-
new_json["settings"] = util.dict_to_list(old_json["settings"], "key")
1710-
return new_json
1711-
1712-
1713-
def old_to_new_json(old_json: dict[str, Any]) -> dict[str, Any]:
1714-
"""Converts the sonar-config projects old JSON report format to the new one"""
1715-
new_json = old_json.copy()
1716-
for k, v in new_json.items():
1717-
new_json[k] = old_to_new_json_one(v)
1718-
return util.dict_to_list(new_json, "key")

sonar/qualitygates.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,6 @@ def search_by_name(endpoint: pf.Platform, name: str) -> dict[str, QualityGate]:
563563
return util.search_by_name(endpoint, name, QualityGate.API[c.LIST], "qualitygates")
564564

565565

566-
def old_to_new_json(old_json: dict[str, Any]) -> dict[str, Any]:
566+
def convert_qgs_json(old_json: dict[str, Any]) -> dict[str, Any]:
567567
"""Converts the sonar-config quality gates old JSON report format to the new one"""
568568
return util.dict_to_list(old_json, "name")

sonar/qualityprofiles.py

Lines changed: 8 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import sonar.logging as log
3333
import sonar.platform as pf
3434
from sonar.util import types, cache, constants as c
35+
from sonar.util import qualityprofile_helper as qphelp
3536
from sonar import exceptions
3637
from sonar import rules, languages
3738
import sonar.permissions.qualityprofile_permissions as permissions
@@ -41,9 +42,6 @@
4142
from sonar.audit.rules import get_rule, RuleId
4243
from sonar.audit.problem import Problem
4344

44-
_KEY_PARENT = "parent"
45-
_CHILDREN_KEY = "children"
46-
4745
_IMPORTABLE_PROPERTIES = ("name", "language", "parentName", "isBuiltIn", "isDefault", "rules", "permissions", "prioritizedRules")
4846

4947
_CLASS_LOCK = Lock()
@@ -363,20 +361,20 @@ def update(self, data: types.ObjectJsonRepr) -> QualityProfile:
363361
QualityProfile.CACHE.pop(self)
364362
self.name = data["name"]
365363
QualityProfile.CACHE.put(self)
366-
self.set_parent(data.pop(_KEY_PARENT, None))
364+
self.set_parent(data.pop(qphelp.KEY_PARENT, None))
367365
self.set_rules(data.get("rules", []) + data.get("addedRules", []))
368366
self.activate_rules(data.get("modifiedRules", []))
369367
self.set_permissions(data.get("permissions", []))
370368
self.is_built_in = data.get("isBuiltIn", False)
371369
if data.get("isDefault", False):
372370
self.set_as_default()
373371

374-
for child_name, child_data in data.get(_CHILDREN_KEY, {}).items():
372+
for child_name, child_data in data.get(qphelp.KEY_CHILDREN, {}).items():
375373
try:
376374
child_qp = get_object(self.endpoint, child_name, self.language)
377375
except exceptions.ObjectNotFound:
378376
child_qp = QualityProfile.create(self.endpoint, child_name, self.language)
379-
child_qp.update(child_data | {_KEY_PARENT: self.name})
377+
child_qp.update(child_data | {qphelp.KEY_PARENT: self.name})
380378
return self
381379

382380
def to_json(self, export_settings: types.ConfigSettings) -> types.ObjectJsonRepr:
@@ -430,7 +428,6 @@ def rule_impacts(self, rule_key: str, substitute_with_default: bool = True) -> d
430428
431429
:param str rule_key: The rule key to get severities for
432430
:return: The impacts of the rule in the quality profile
433-
:rtype: dict[str, str]
434431
"""
435432
return rules.Rule.get_object(self.endpoint, rule_key).impacts(self.key, substitute_with_default=substitute_with_default)
436433

@@ -439,7 +436,6 @@ def rule_severity(self, rule_key: str, substitute_with_default: bool = True) ->
439436
440437
:param str rule_key: The rule key to get severities for
441438
:return: The severity
442-
:rtype: str
443439
"""
444440
return rules.Rule.get_object(self.endpoint, rule_key).rule_severity(self.key, substitute_with_default=substitute_with_default)
445441

@@ -742,12 +738,12 @@ def hierarchize_language(qp_list: dict[str, str], endpoint: pf.Platform, languag
742738
continue
743739
parent_qp_name = qp_json_data.pop("parentName")
744740
parent_qp = hierarchy[parent_qp_name]
745-
if _CHILDREN_KEY not in parent_qp:
746-
parent_qp[_CHILDREN_KEY] = {}
741+
if qphelp.KEY_CHILDREN not in parent_qp:
742+
parent_qp[qphelp.KEY_CHILDREN] = {}
747743
this_qp = get_object(endpoint=endpoint, name=qp_name, language=language)
748744
qp_json_data |= this_qp.diff(get_object(endpoint=endpoint, name=parent_qp_name, language=language))
749745
qp_json_data.pop("rules", None)
750-
parent_qp[_CHILDREN_KEY][qp_name] = qp_json_data
746+
parent_qp[qphelp.KEY_CHILDREN][qp_name] = qp_json_data
751747
to_remove.append(qp_name)
752748
for qp_name in to_remove:
753749
hierarchy.pop(qp_name)
@@ -766,29 +762,6 @@ def hierarchize(qp_list: types.ObjectJsonRepr, endpoint: pf.Platform) -> types.O
766762
return {lang: hierarchize_language(lang_qp_list, endpoint=endpoint, language=lang) for lang, lang_qp_list in qp_list.items()}
767763

768764

769-
def flatten_language(language: str, qp_list: types.ObjectJsonRepr) -> types.ObjectJsonRepr:
770-
"""Converts a hierarchical list of QP of a given language into a flat list"""
771-
flat_list = {}
772-
for qp_name, qp_data in qp_list.copy().items():
773-
if _CHILDREN_KEY in qp_data:
774-
children = flatten_language(language, qp_data[_CHILDREN_KEY])
775-
for child in children.values():
776-
if "parent" not in child:
777-
child["parent"] = f"{language}:{qp_name}"
778-
qp_data.pop(_CHILDREN_KEY)
779-
flat_list.update(children)
780-
flat_list[f"{language}:{qp_name}"] = qp_data
781-
return flat_list
782-
783-
784-
def flatten(qp_list: types.ObjectJsonRepr) -> types.ObjectJsonRepr:
785-
"""Organize a hierarchical list of QP in a flat list"""
786-
flat_list = {}
787-
for lang, lang_qp_list in qp_list.items():
788-
flat_list.update(flatten_language(lang, lang_qp_list))
789-
return flat_list
790-
791-
792765
def export(endpoint: pf.Platform, export_settings: types.ConfigSettings, **kwargs) -> types.ObjectJsonRepr:
793766
"""Exports all or a list of quality profiles configuration as dict
794767
@@ -807,7 +780,7 @@ def export(endpoint: pf.Platform, export_settings: types.ConfigSettings, **kwarg
807780
qp_list[lang] = {}
808781
qp_list[lang][name] = json_data
809782
qp_list = hierarchize(qp_list, endpoint=endpoint)
810-
qp_list = __convert_profiles_to_list(qp_list)
783+
qp_list = qphelp.convert_qps_json(qp_list)
811784
if write_q := kwargs.get("write_q", None):
812785
write_q.put(qp_list)
813786
write_q.put(util.WRITE_END)
@@ -893,27 +866,3 @@ def exists(endpoint: pf.Platform, name: str, language: str) -> bool:
893866
return True
894867
except exceptions.ObjectNotFound:
895868
return False
896-
897-
898-
def convert_one_qp_yaml(qp: types.ObjectJsonRepr) -> types.ObjectJsonRepr:
899-
"""Converts a QP in a modified version more suitable for YAML export"""
900-
901-
if _CHILDREN_KEY in qp:
902-
qp[_CHILDREN_KEY] = {k: convert_one_qp_yaml(q) for k, q in qp[_CHILDREN_KEY].items()}
903-
qp[_CHILDREN_KEY] = util.dict_to_list(qp[_CHILDREN_KEY], "name")
904-
return qp
905-
906-
907-
def __convert_children_to_list(qp_json: dict[str, Any]) -> list[dict[str, Any]]:
908-
"""Converts a profile's children profiles to list"""
909-
for v in qp_json.values():
910-
if "children" in v:
911-
v["children"] = __convert_children_to_list(v["children"])
912-
return util.dict_to_list(qp_json, "name")
913-
914-
915-
def old_to_new_json(qp_json: dict[str, Any]) -> list[dict[str, Any]]:
916-
"""Converts a language top level list of profiles to list"""
917-
for k, v in qp_json.items():
918-
qp_json[k] = __convert_children_to_list(v)
919-
return util.dict_to_list(qp_json, "language", "profiles")

0 commit comments

Comments
 (0)