Issues
API for managing SonarQube issues.
Issues API for SonarQube SDK.
This module provides methods to search, update, and manage issues found by SonarQube analysis.
Example
Using the Issues API:
from sonarqube import SonarQubeClient
client = SonarQubeClient(base_url="...", token="...")
# Search for issues
issues = client.issues.search(
project_keys=["my-project"], severities=["CRITICAL", "BLOCKER"]
)
for issue in issues.issues:
print(f"{issue.severity}: {issue.message}")
- class sonarqube.api.issues.IssuesAPI(client)[source]
Bases:
BaseAPIAPI for managing SonarQube issues.
Issues are problems found by SonarQube during code analysis. This API provides methods to search, assign, comment, and transition issues.
- API_PATH
Base path for issues API (“/api/issues”).
Example
Using the issues API:
# Search for critical issues issues = client.issues.search( project_keys=["my-project"], severities=["CRITICAL"] ) # Assign an issue client.issues.assign(issue="AXoN-12345", assignee="john") # Transition an issue client.issues.do_transition(issue="AXoN-12345", transition="resolve")
- Parameters:
client (
HTTPClient)
- add_comment(issue, text)[source]
Add a comment to an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
- Raises:
SonarQubeNotFoundError – If issue not found.
SonarQubePermissionError – If lacking required permissions.
Example
>>> issue = client.issues.add_comment( ... issue="AXoN-12345", text="This should be fixed in the next sprint." ... )
- assign(issue, assignee=None)[source]
Assign or unassign an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
- Raises:
SonarQubeNotFoundError – If issue not found.
SonarQubePermissionError – If lacking required permissions.
Example
>>> # Assign to a user >>> issue = client.issues.assign(issue="AXoN-12345", assignee="john") >>> # Unassign >>> issue = client.issues.assign(issue="AXoN-12345")
- authors(project, ps=None, q=None)[source]
Get list of issue authors.
Requires ‘Browse’ permission on the project.
- Parameters:
- Return type:
IssueAuthorsResponse- Returns:
Response containing list of authors.
Example
>>> response = client.issues.authors(project="my-project") >>> for author in response.authors: ... print(author)
- bulk_change(issues, add_tags=None, assign=None, comment=None, do_transition=None, remove_tags=None, set_severity=None, set_type=None)[source]
Bulk change issues.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
- Returns:
Response containing bulk change results.
Example
>>> result = client.issues.bulk_change( ... issues=["AXoN-12345", "AXoN-12346"], add_tags=["team-a"], assign="john" ... )
- changelog(issue)[source]
Get changelog for an issue.
Requires ‘Browse’ permission on the project.
- Parameters:
issue (
str) – Issue key.- Return type:
IssueChangelogResponse- Returns:
Response containing changelog entries.
Example
>>> changelog = client.issues.changelog(issue="AXoN-12345") >>> for entry in changelog.changelog: ... print(entry)
- delete_comment(comment)[source]
Delete a comment from an issue.
Requires authentication and ownership of the comment.
- Parameters:
comment (
str) – Comment key.- Return type:
Issue- Returns:
The updated issue.
Example
>>> issue = client.issues.delete_comment(comment="AU-Tpxb")
- do_transition(issue, transition)[source]
Perform a transition on an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
- Raises:
SonarQubeNotFoundError – If issue not found.
SonarQubeValidationError – If transition is not valid.
Example
>>> issue = client.issues.do_transition(issue="AXoN-12345", transition="resolve")
- edit_comment(comment, text)[source]
Edit a comment on an issue.
Requires authentication and ownership of the comment.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
Example
>>> issue = client.issues.edit_comment(comment="AU-Tpxb", text="Updated comment")
- search(additional_fields=None, asc=None, assigned=None, assignees=None, author=None, branch=None, clean_code_attribute_categories=None, code_variants=None, component_keys=None, created_after=None, created_at=None, created_before=None, created_in_last=None, directories=None, facets=None, files=None, impact_severities=None, impact_software_qualities=None, in_new_code_period=None, issue_statuses=None, issues=None, languages=None, on_component_only=None, p=None, project_keys=None, ps=None, pull_request=None, resolutions=None, resolved=None, rules=None, s=None, scopes=None, severities=None, statuses=None, tags=None, types=None)[source]
Search for issues.
Requires ‘Browse’ permission on the project.
- Parameters:
additional_fields (
Optional[list[str]], default:None) – Additional fields to return.assigned (
Optional[bool], default:None) – Filter by assigned status.assignees (
Optional[list[str]], default:None) – Filter by assignees.clean_code_attribute_categories (
Optional[list[str]], default:None) – Clean code attribute categories.code_variants (
Optional[list[str]], default:None) – Code variants.component_keys (
Optional[list[str]], default:None) – Component keys.created_after (
Optional[str], default:None) – Issues created after this date.created_at (
Optional[str], default:None) – Issues created at this date.created_before (
Optional[str], default:None) – Issues created before this date.created_in_last (
Optional[str], default:None) – Issues created in last period (e.g., “1m”).directories (
Optional[list[str]], default:None) – Filter by directories.facets (
Optional[list[str]], default:None) – Facets to return.files (
Optional[list[str]], default:None) – Filter by files.impact_severities (
Optional[list[str]], default:None) – Impact severities.impact_software_qualities (
Optional[list[str]], default:None) – Impact software qualities.in_new_code_period (
Optional[bool], default:None) – Issues in new code period.issue_statuses (
Optional[list[str]], default:None) – Issue statuses.languages (
Optional[list[str]], default:None) – Filter by languages.on_component_only (
Optional[bool], default:None) – Only issues on the component.project_keys (
Optional[list[str]], default:None) – Project keys.pull_request (
Optional[str], default:None) – Pull request ID.resolutions (
Optional[list[str]], default:None) – Filter by resolutions.resolved (
Optional[bool], default:None) – Filter by resolved status.rules (
Optional[list[str]], default:None) – Filter by rules.scopes (
Optional[list[str]], default:None) – Filter by scopes.severities (
Optional[list[str]], default:None) – Filter by severities.statuses (
Optional[list[str]], default:None) – Filter by statuses.types (
Optional[list[str]], default:None) – Filter by types.
- Return type:
IssueSearchResponse- Returns:
Response containing list of issues and paging info.
Example
>>> response = client.issues.search( ... project_keys=["my-project"], severities=["CRITICAL", "BLOCKER"] ... ) >>> for issue in response.issues: ... print(f"{issue.severity}: {issue.message}")
- set_severity(issue, severity)[source]
Set severity for an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
Example
>>> issue = client.issues.set_severity(issue="AXoN-12345", severity="CRITICAL")
- set_tags(issue, tags)[source]
Set tags for an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
Example
>>> issue = client.issues.set_tags(issue="AXoN-12345", tags=["team-a", "priority"])
- set_type(issue, type_)[source]
Set type for an issue.
Requires authentication and ‘Browse’ permission on the project.
- Parameters:
- Return type:
Issue- Returns:
The updated issue.
Example
>>> issue = client.issues.set_type(issue="AXoN-12345", type_="BUG")
- tags(project=None, ps=None, q=None)[source]
Get list of issue tags.
Requires ‘Browse’ permission on the project.
- Parameters:
- Return type:
IssueTagsResponse- Returns:
Response containing list of tags.
Example
>>> response = client.issues.tags(project="my-project") >>> for tag in response.tags: ... print(tag)
Models
Pydantic models for Issues API.
This module provides models for the /api/issues endpoints including searching, updating, and managing issues.
Example
Using issue models:
from sonarqube.models.issues import IssueSearchResponse
response = client.issues.search(project_keys=["my-project"])
for issue in response.issues:
print(f"{issue.severity}: {issue.message}")
- class sonarqube.models.issues.TextRange(**data)[source]
Bases:
SonarQubeModelText range within a file.
- start_line
Starting line number.
- end_line
Ending line number.
- start_offset
Starting character offset.
- end_offset
Ending character offset.
- Parameters:
- start_line: int
- end_line: int
- start_offset: Optional[int]
- end_offset: Optional[int]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueLocation(**data)[source]
Bases:
SonarQubeModelA location within an issue flow.
- component
Component key.
- text_range
Text range in the component.
- msg
Message for this location.
- component: Optional[str]
- text_range: Optional[TextRange]
- msg: Optional[str]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueFlow(**data)[source]
Bases:
SonarQubeModelA flow of locations for an issue.
- locations
List of locations in the flow.
- locations: list[IssueLocation]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueComment(**data)[source]
Bases:
SonarQubeModelA comment on an issue.
- key
Comment key.
- login
User login who made the comment.
- html_text
HTML-formatted comment text.
- markdown
Markdown-formatted comment text.
- created_at
Comment creation date.
- Parameters:
- key: str
- login: str
- html_text: Optional[str]
- markdown: Optional[str]
- created_at: Optional[str]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.Issue(**data)[source]
Bases:
SonarQubeModelA SonarQube issue.
- key
Unique issue key.
- rule
Rule key that raised the issue.
- severity
Issue severity (BLOCKER, CRITICAL, MAJOR, MINOR, INFO).
- component
Component key where issue was found.
- project
Project key.
- line
Line number in the file.
- message
Issue message.
- status
Issue status (OPEN, CONFIRMED, REOPENED, RESOLVED, CLOSED).
- resolution
Issue resolution if resolved.
- type
Issue type (BUG, VULNERABILITY, CODE_SMELL).
- effort
Effort to fix the issue.
- debt
Technical debt.
- author
Author of the code.
- tags
Issue tags.
- creation_date
Issue creation date.
- update_date
Issue last update date.
- text_range
Text range in the file.
- flows
Issue flows for complex issues.
- comments
Issue comments.
Example
>>> issue = Issue( ... key="AXoN-12345", ... rule="python:S1234", ... severity="MAJOR", ... component="my-project:src/main.py", ... project="my-project", ... message="Remove this unused variable", ... )
- Parameters:
data (
Any)key (str)
rule (str)
severity (str | None)
component (str)
project (str)
line (int | None)
message (str | None)
status (str | None)
resolution (str | None)
type (str | None)
effort (str | None)
debt (str | None)
author (str | None)
creationDate (str | None)
updateDate (str | None)
closeDate (str | None)
textRange (TextRange | None)
flows (list[IssueFlow] | None)
comments (list[IssueComment] | None)
assignee (str | None)
hash (str | None)
scope (str | None)
quickFixAvailable (bool | None)
ruleDescriptionContextKey (str | None)
cleanCodeAttribute (str | None)
cleanCodeAttributeCategory (str | None)
- key: str
- rule: str
- severity: Optional[str]
- component: str
- project: str
- line: Optional[int]
- message: Optional[str]
- status: Optional[str]
- resolution: Optional[str]
- type: Optional[str]
- effort: Optional[str]
- debt: Optional[str]
- author: Optional[str]
- tags: Optional[list[str]]
- creation_date: Optional[str]
- update_date: Optional[str]
- close_date: Optional[str]
- text_range: Optional[TextRange]
- flows: Optional[list[IssueFlow]]
- comments: Optional[list[IssueComment]]
- assignee: Optional[str]
- hash: Optional[str]
- scope: Optional[str]
- quick_fix_available: Optional[bool]
- rule_description_context_key: Optional[str]
- message_formattings: Optional[list[dict[str, Any]]]
- code_variants: Optional[list[str]]
- clean_code_attribute: Optional[str]
- clean_code_attribute_category: Optional[str]
- impacts: Optional[list[dict[str, Any]]]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueSearchResponse(**data)[source]
Bases:
SonarQubeModelResponse from searching issues.
- paging
Paging information.
- issues
List of issues.
- components
List of components referenced by issues.
- rules
List of rules referenced by issues.
- facets
Facet information for filtering.
Example
>>> response = client.issues.search(project_keys=["my-project"]) >>> for issue in response.issues: ... print(f"{issue.severity}: {issue.message}")
- Parameters:
- paging: Optional[Paging]
- issues: list[Issue]
- components: Optional[list[Component]]
- rules: Optional[list[dict[str, Any]]]
- facets: Optional[list[dict[str, Any]]]
- p: Optional[int]
- ps: Optional[int]
- total: Optional[int]
- effort_total: Optional[int]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueChangelogResponse(**data)[source]
Bases:
SonarQubeModelResponse from getting issue changelog.
- changelog
List of changelog entries.
- changelog: list[dict[str, Any]]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueAuthorsResponse(**data)[source]
Bases:
SonarQubeModelResponse from getting issue authors.
- authors
List of author names.
- authors: list[str]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class sonarqube.models.issues.IssueTagsResponse(**data)[source]
Bases:
SonarQubeModelResponse from getting issue tags.
- tags
List of tags.
- tags: list[str]
- model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].