import datetime
from typing import List, Union
import gitlab
import github.PullRequest
import github.PullRequestComment
import github.IssueComment
from robota_core.string_processing import markdownify, clean, string_to_datetime, get_link
[docs]class MergeRequest:
"""A Merge Request"""
def __init__(self, merge_request, source: str):
self.number: Union[int, None] = None
self.source_branch = None
self.target_branch = None
self.author = None
self.url: str = ""
self.comments = None
self.state = None
if source == "gitlab":
self._merge_request_from_gitlab(merge_request)
elif source == "github":
self._merge_request_from_github(merge_request)
else:
raise TypeError("Merge request type not recognised.")
self.link = get_link(self.url, self.number)
def _merge_request_from_github(self, merge_request: github.PullRequest.PullRequest):
self.number = merge_request.number
self.source_branch = merge_request.head.ref
self.target_branch = merge_request.base.ref
self.author = merge_request.user.name
self.url = merge_request.html_url
comments = list(merge_request.get_issue_comments())
comments.extend(merge_request.get_comments())
self.comments = [MergeRequestComment(comment, "github") for comment in comments]
self.state = merge_request.state
def _merge_request_from_gitlab(self, gl_merge_request: gitlab.v4.objects.ProjectMergeRequest):
"""Convert a GitLab merge request into a RoboTA merge request"""
self.number = gl_merge_request.attributes['iid']
self.source_branch = gl_merge_request.attributes["source_branch"]
self.target_branch = gl_merge_request.attributes["target_branch"]
self.author = gl_merge_request.attributes['author']
self.url = gl_merge_request.attributes['web_url']
self.comments = [MergeRequestComment(note, "gitlab") for
note in gl_merge_request.notes.list()]
self.state = gl_merge_request.attributes['state']
[docs]class MergeRequestCache:
"""A cache of MergeRequest objects from a specific date range."""
def __init__(self, start: datetime.datetime, end: datetime.datetime,
merge_requests: List[MergeRequest]):
self.start = start
self.end = end
self.merge_requests = merge_requests
def __iter__(self):
yield from self.merge_requests
[docs] def add_merge_request(self, merge_request: MergeRequest):
"""Add a MergeRequest to a MergeRequestCache."""
self.merge_requests.append(merge_request)