11from __future__ import annotations
22
33import re
4- from pathlib import Path
54
65from pydantic import TypeAdapter
76
@@ -20,49 +19,23 @@ class _NonstandardPythonVersionError(Exception):
2019 """Raised when a non-standard Python version is detected."""
2120
2221
23- def get_sonar_project_properties () -> str : # noqa: PLR0912
22+ def get_sonar_project_properties () -> str :
2423 """Get contents for (or from) the sonar-project.properties file."""
2524 path = usethis_config .cpd () / "sonar-project.properties"
2625 if path .exists () and path .is_file ():
2726 return path .read_text (encoding = "utf-8" )
2827
2928 # Get Python version
3029 try :
31- python_version = _get_short_version (Path (".python-version" ).read_text ().strip ())
30+ python_version = _get_short_version (
31+ (usethis_config .cpd () / ".python-version" ).read_text ().strip ()
32+ )
3233 except (FileNotFoundError , _NonstandardPythonVersionError ):
3334 python_version = get_python_version ()
3435
35- # Get Project key
36- try :
37- project_key = PyprojectTOMLManager ()[
38- ["tool" , "usethis" , "sonarqube" , "project-key" ]
39- ]
40- except KeyError :
41- msg = "Could not find SonarQube project key at 'tool.usethis.sonarqube.project-key' in 'pyproject.toml'."
42- raise MissingProjectKeyError (msg ) from None
43- except FileNotFoundError :
44- msg = "Could not find 'pyproject.toml' for SonarQube project key at 'tool.usethis.sonarqube.project-key'."
45- raise MissingProjectKeyError (msg ) from None
46- _validate_project_key (project_key )
47-
48- # Get verbosity setting
49- try :
50- verbose = PyprojectTOMLManager ()[["tool" , "usethis" , "sonarqube" , "verbose" ]]
51- except (FileNotFoundError , KeyError ):
52- verbose = False
53- verbose = TypeAdapter (bool ).validate_python (verbose )
54-
55- # Get exclusions
56- try :
57- exclusions = PyprojectTOMLManager ()[
58- ["tool" , "usethis" , "sonarqube" , "exclusions" ]
59- ]
60- except (FileNotFoundError , KeyError ):
61- exclusions = []
62- # TypeAdapter(list).validate_python() ensures we have a list and returns a new list
63- exclusions = TypeAdapter (list ).validate_python (exclusions )
64- for exclusion in exclusions :
65- TypeAdapter (str ).validate_python (exclusion )
36+ project_key = _get_sonarqube_project_key ()
37+ verbose = _is_sonarqube_verbose ()
38+ exclusions = _get_sonarqube_exclusions ()
6639
6740 # Get coverage report output path
6841 try :
@@ -107,6 +80,46 @@ def _get_short_version(version: str) -> str:
10780 return match .group (1 )
10881
10982
83+ def _get_sonarqube_project_key () -> str :
84+ try :
85+ project_key = PyprojectTOMLManager ()[
86+ ["tool" , "usethis" , "sonarqube" , "project-key" ]
87+ ]
88+ except KeyError :
89+ msg = "Could not find SonarQube project key at 'tool.usethis.sonarqube.project-key' in 'pyproject.toml'."
90+ raise MissingProjectKeyError (msg ) from None
91+ except FileNotFoundError :
92+ msg = "Could not find 'pyproject.toml' for SonarQube project key at 'tool.usethis.sonarqube.project-key'."
93+ raise MissingProjectKeyError (msg ) from None
94+ _validate_project_key (project_key )
95+ return project_key
96+
97+
98+ def _is_sonarqube_verbose () -> bool :
99+ try :
100+ verbose = PyprojectTOMLManager ()[["tool" , "usethis" , "sonarqube" , "verbose" ]]
101+ except (FileNotFoundError , KeyError ):
102+ verbose = False
103+ verbose = TypeAdapter (bool ).validate_python (verbose )
104+
105+ return verbose
106+
107+
108+ def _get_sonarqube_exclusions () -> list [str ]:
109+ try :
110+ exclusions = PyprojectTOMLManager ()[
111+ ["tool" , "usethis" , "sonarqube" , "exclusions" ]
112+ ]
113+ except (FileNotFoundError , KeyError ):
114+ exclusions = []
115+ # TypeAdapter(list).validate_python() ensures we have a list and returns a new list
116+ exclusions = TypeAdapter (list ).validate_python (exclusions )
117+ for exclusion in exclusions :
118+ TypeAdapter (str ).validate_python (exclusion )
119+
120+ return exclusions
121+
122+
110123def _validate_project_key (project_key : str ) -> None :
111124 """Validate the SonarQube project key.
112125
0 commit comments