Skip to content

Commit

Permalink
fix typing
Browse files Browse the repository at this point in the history
  • Loading branch information
cathteng committed Aug 27, 2024
1 parent e0bc549 commit 84e40a8
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 20 deletions.
14 changes: 8 additions & 6 deletions src/sentry/integrations/bitbucket/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import control_silo_endpoint
from sentry.integrations.bitbucket.integration import BitbucketIntegration
from sentry.integrations.mixins.issues import IssueBasicIntegration
from sentry.integrations.models.integration import Integration
from sentry.integrations.source_code_management.search import SourceCodeSearchEndpoint
from sentry.shared_integrations.exceptions import ApiError
Expand All @@ -33,12 +32,12 @@ def integration_provider(self):
def installation_class(self):
return BitbucketIntegration

def handle_search_issues(
self, installation: IssueBasicIntegration, query: str, repo: str
) -> Response:
def handle_search_issues(self, installation, query: str, repo: str) -> Response:
assert isinstance(installation, self.installation_class)

full_query = f'title~"{query}"'
try:
resp = installation.search_issues(query=full_query, repo=repo)
response = installation.search_issues(query=full_query, repo=repo)
except ApiError as e:
if "no issue tracker" in str(e):
logger.info(
Expand All @@ -49,16 +48,19 @@ def handle_search_issues(
{"detail": "Bitbucket Repository has no issue tracker."}, status=400
)
raise

assert isinstance(response, dict)
return Response(
[
{"label": "#{} {}".format(i["id"], i["title"]), "value": i["id"]}
for i in resp.get("values", [])
for i in response.get("values", [])
]
)

# TODO: somehow type installation with installation_class
def handle_search_repositories(
self, integration: Integration, installation, query: str
) -> Response:
assert isinstance(installation, self.installation_class)
result = installation.get_repositories(query)
return Response([{"label": i["name"], "value": i["name"]} for i in result])
11 changes: 7 additions & 4 deletions src/sentry/integrations/github/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from sentry.api.base import control_silo_endpoint
from sentry.integrations.github.integration import GitHubIntegration, build_repository_query
from sentry.integrations.github_enterprise.integration import GitHubEnterpriseIntegration
from sentry.integrations.mixins.issues import IssueBasicIntegration
from sentry.integrations.models.integration import Integration
from sentry.integrations.source_code_management.search import SourceCodeSearchEndpoint
from sentry.shared_integrations.exceptions import ApiError
Expand All @@ -25,15 +24,17 @@ def integration_provider(self):
def installation_class(self):
return (GitHubIntegration, GitHubEnterpriseIntegration)

def handle_search_issues(
self, installation: IssueBasicIntegration, query: str, repo: str
) -> Response:
def handle_search_issues(self, installation, query: str, repo: str) -> Response:
assert isinstance(installation, self.installation_class)

try:
response = installation.search_issues(query=f"repo:{repo} {query}")
except ApiError as err:
if err.code == 403:
return Response({"detail": "Rate limit exceeded"}, status=429)
raise

assert isinstance(response, dict)
return Response(
[
{"label": "#{} {}".format(i["number"], i["title"]), "value": i["number"]}
Expand All @@ -45,6 +46,8 @@ def handle_search_issues(
def handle_search_repositories(
self, integration: Integration, installation, query: str
) -> Response:
assert isinstance(installation, self.installation_class)

full_query = build_repository_query(integration.metadata, integration.name, query)
try:
response = installation.get_client().search_repositories(full_query)
Expand Down
14 changes: 8 additions & 6 deletions src/sentry/integrations/gitlab/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

from sentry.api.base import control_silo_endpoint
from sentry.integrations.gitlab.integration import GitlabIntegration
from sentry.integrations.mixins.issues import IssueBasicIntegration
from sentry.integrations.models.integration import Integration
from sentry.integrations.source_code_management.search import SourceCodeSearchEndpoint
from sentry.shared_integrations.exceptions import ApiError
Expand All @@ -22,20 +21,22 @@ def integration_provider(self):
def installation_class(self):
return GitlabIntegration

def handle_search_issues(
self, installation: IssueBasicIntegration, query: str, repo: str
) -> Response:
def handle_search_issues(self, installation, query: str, repo: str) -> Response:
assert isinstance(installation, self.installation_class)
full_query: str | None = query

try:
iids = [int(query)]
query = None
full_query = None
except ValueError:
iids = None

try:
response = installation.search_issues(query=query, project_id=repo, iids=iids)
response = installation.search_issues(query=full_query, project_id=repo, iids=iids)
except ApiError as e:
return Response({"detail": str(e)}, status=400)

Check warning

Code scanning / CodeQL

Information exposure through an exception Medium

Stack trace information
flows to this location and may be exposed to an external user.

assert isinstance(response, list)
return Response(
[
{
Expand All @@ -50,6 +51,7 @@ def handle_search_issues(
def handle_search_repositories(
self, integration: Integration, installation, query: str
) -> Response:
assert isinstance(installation, self.installation_class)
try:
response = installation.search_projects(query)
except ApiError as e:
Expand Down
14 changes: 10 additions & 4 deletions src/sentry/integrations/source_code_management/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import control_silo_endpoint
from sentry.integrations.api.bases.integration import IntegrationEndpoint
from sentry.integrations.base import IntegrationInstallation
from sentry.integrations.mixins.issues import IssueBasicIntegration
from sentry.integrations.models.integration import Integration
from sentry.integrations.source_code_management.repository import RepositoryIntegration
Expand Down Expand Up @@ -55,15 +56,15 @@ def installation_class(

@abstractmethod
def handle_search_issues(
self, installation: IssueBasicIntegration, query: str, repo: str
self, installation: IntegrationInstallation, query: str, repo: str
) -> Response:
raise NotImplementedError

# not used in VSTS
def handle_search_repositories(
self, integration: Integration, installation: IssueBasicIntegration, query: str
self, integration: Integration, installation: IntegrationInstallation, query: str
) -> Response:
pass
return Response()

def get(
self, request: Request, organization: RpcOrganization, integration_id: int, **kwds: Any
Expand All @@ -88,7 +89,12 @@ def get(

installation = integration.get_installation(organization.id)
if not isinstance(installation, self.installation_class):
raise NotFound(f"Integration by that id is not a {self.installation_class.__name__}.")
integration_provider = (
self.integration_provider if self.integration_provider else "github"
)
raise NotFound(f"Integration by that id is not of type {integration_provider}.")

assert isinstance(installation, self.installation_class)

if field == self.issue_field:
repo = request.GET.get(self.repository_field)
Expand Down
1 change: 1 addition & 0 deletions src/sentry/integrations/vsts/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ def handle_search_issues(self, installation, query: str, repo: str) -> Response:
if not query:
return Response([])

assert isinstance(installation, self.installation_class)
resp = installation.search_issues(query=query)
return Response(
[
Expand Down

0 comments on commit 84e40a8

Please sign in to comment.