Small refactor

This commit is contained in:
Ori Kotek
2023-07-18 10:17:09 +03:00
parent 51e08c3c2b
commit e5259e2f5c
5 changed files with 34 additions and 4 deletions

View File

@ -25,6 +25,11 @@ class BitbucketProvider:
if pr_url: if pr_url:
self.set_pr(pr_url) self.set_pr(pr_url)
def is_supported(self, capability: str) -> bool:
if capability == 'get_issue_comments':
return False
return True
def set_pr(self, pr_url: str): def set_pr(self, pr_url: str):
self.workspace_slug, self.repo_slug, self.pr_num = self._parse_pr_url(pr_url) self.workspace_slug, self.repo_slug, self.pr_num = self._parse_pr_url(pr_url)
self.pr = self._get_pr() self.pr = self._get_pr()
@ -74,6 +79,9 @@ class BitbucketProvider:
def get_user_id(self): def get_user_id(self):
return 0 return 0
def get_issue_comments(self):
raise NotImplementedError("Bitbucket provider does not support issue comments yet")
@staticmethod @staticmethod
def _parse_pr_url(pr_url: str) -> Tuple[str, int]: def _parse_pr_url(pr_url: str) -> Tuple[str, int]:
parsed_url = urlparse(pr_url) parsed_url = urlparse(pr_url)

View File

@ -21,6 +21,10 @@ class FilePatchInfo:
class GitProvider(ABC): class GitProvider(ABC):
@abstractmethod
def is_supported(self, capability: str) -> bool:
pass
@abstractmethod @abstractmethod
def get_diff_files(self) -> list[FilePatchInfo]: def get_diff_files(self) -> list[FilePatchInfo]:
pass pass
@ -62,6 +66,10 @@ class GitProvider(ABC):
def get_pr_description(self): def get_pr_description(self):
pass pass
@abstractmethod
def get_issue_comments(self):
pass
def get_main_pr_language(languages, files) -> str: def get_main_pr_language(languages, files) -> str:
""" """

View File

@ -23,6 +23,9 @@ class GithubProvider(GitProvider):
self.set_pr(pr_url) self.set_pr(pr_url)
self.last_commit_id = list(self.pr.get_commits())[-1] self.last_commit_id = list(self.pr.get_commits())[-1]
def is_supported(self, capability: str) -> bool:
return True
def set_pr(self, pr_url: str): def set_pr(self, pr_url: str):
self.repo, self.pr_num = self._parse_pr_url(pr_url) self.repo, self.pr_num = self._parse_pr_url(pr_url)
self.pr = self._get_pr() self.pr = self._get_pr()
@ -161,6 +164,9 @@ class GithubProvider(GitProvider):
notifications = self.github_client.get_user().get_notifications(since=since) notifications = self.github_client.get_user().get_notifications(since=since)
return notifications return notifications
def get_issue_comments(self):
return self.pr.get_issue_comments()
@staticmethod @staticmethod
def _parse_pr_url(pr_url: str) -> Tuple[str, int]: def _parse_pr_url(pr_url: str) -> Tuple[str, int]:
parsed_url = urlparse(pr_url) parsed_url = urlparse(pr_url)

View File

@ -31,6 +31,11 @@ class GitLabProvider(GitProvider):
self.RE_HUNK_HEADER = re.compile( self.RE_HUNK_HEADER = re.compile(
r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@[ ]?(.*)") r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@[ ]?(.*)")
def is_supported(self, capability: str) -> bool:
if capability == 'get_issue_comments':
return False
return True
@property @property
def pr(self): def pr(self):
'''The GitLab terminology is merge request (MR) instead of pull request (PR)''' '''The GitLab terminology is merge request (MR) instead of pull request (PR)'''
@ -203,6 +208,9 @@ class GitLabProvider(GitProvider):
def get_pr_description(self): def get_pr_description(self):
return self.mr.description return self.mr.description
def get_issue_comments(self):
raise NotImplementedError("GitLab provider does not support issue comments yet")
def _parse_merge_request_url(self, merge_request_url: str) -> Tuple[int, int]: def _parse_merge_request_url(self, merge_request_url: str) -> Tuple[int, int]:
parsed_url = urlparse(merge_request_url) parsed_url = urlparse(merge_request_url)

View File

@ -9,7 +9,7 @@ from pr_agent.algo.pr_processing import get_pr_diff
from pr_agent.algo.token_handler import TokenHandler from pr_agent.algo.token_handler import TokenHandler
from pr_agent.algo.utils import convert_to_markdown, try_fix_json from pr_agent.algo.utils import convert_to_markdown, try_fix_json
from pr_agent.config_loader import settings from pr_agent.config_loader import settings
from pr_agent.git_providers import get_git_provider, GithubProvider from pr_agent.git_providers import get_git_provider
from pr_agent.git_providers.git_provider import get_main_pr_language from pr_agent.git_providers.git_provider import get_main_pr_language
from pr_agent.servers.help import bot_help_text, actions_help_text from pr_agent.servers.help import bot_help_text, actions_help_text
@ -22,8 +22,8 @@ class PRReviewer:
self.git_provider.get_languages(), self.git_provider.get_files() self.git_provider.get_languages(), self.git_provider.get_files()
) )
self.is_answer = is_answer self.is_answer = is_answer
if self.is_answer and type(self.git_provider) != GithubProvider: if self.is_answer and not self.git_provider.is_supported("get_issue_comments"):
raise Exception("Answer mode is only supported for Github for now") raise Exception(f"Answer mode is not supported for {settings.config.git_provider} for now")
answer_str = question_str = self._get_user_answers() answer_str = question_str = self._get_user_answers()
self.ai_handler = AiHandler() self.ai_handler = AiHandler()
self.patches_diff = None self.patches_diff = None
@ -139,7 +139,7 @@ class PRReviewer:
def _get_user_answers(self): def _get_user_answers(self):
answer_str = question_str = "" answer_str = question_str = ""
if self.is_answer: if self.is_answer:
discussion_messages = self.git_provider.pr.get_issue_comments() discussion_messages = self.git_provider.get_issue_comments()
for message in discussion_messages.reversed: for message in discussion_messages.reversed:
if "Questions to better understand the PR:" in message.body: if "Questions to better understand the PR:" in message.body:
question_str = message.body question_str = message.body