Skip to content

Commit c946e36

Browse files
authored
Repository pull request metadata retrieval added to Github service utility (#124)
1 parent 524c702 commit c946e36

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# [1.21.0](https://github.com/ComplianceAsCode/auditree-framework/releases/tag/v1.21.0)
2+
3+
- [ADDED] Repository pull request metadata retrieval added to Github service utility.
4+
15
# [1.20.0](https://github.com/ComplianceAsCode/auditree-framework/releases/tag/v1.20.0)
26

37
- [ADDED] Returned support for `DerivedEvidence`.

compliance/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
# limitations under the License.
1515
"""Compliance automation package."""
1616

17-
__version__ = '1.20.0'
17+
__version__ = '1.21.0'

compliance/utils/services/github.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import json
1818
import secrets
1919
from collections import OrderedDict
20+
from datetime import datetime
2021
from urllib.parse import parse_qs, urlparse
2122

2223
from compliance.utils.credentials import Config
@@ -413,6 +414,56 @@ def get_commit_details(self, repo, since, branch='master', path=None):
413414
opts['path'] = path
414415
return self._make_request('get', f'repos/{repo}/commits', params=opts)
415416

417+
def get_pull_requests(self, repo, since=None, **kwargs):
418+
"""
419+
Retrieve a repository's pull request information.
420+
421+
:param repo: the organization/repository as a string.
422+
:param since: the starting date/time of a pull request as a datetime.
423+
:param kwargs: key/value pairs of GH pulls API accepted params
424+
:returns: Repository pull request metadata
425+
"""
426+
api_url = f'repos/{repo.strip("/")}/pulls'
427+
self.session.headers.update(
428+
{'Accept': 'application/vnd.github.v3+json'}
429+
)
430+
if not since:
431+
return self._paginate_api(api_url, **kwargs)
432+
pull_requests = []
433+
params = {**kwargs}
434+
params['page'] = kwargs.get('page', 1)
435+
# Sort results by "created" in descending order
436+
params['sort'] = 'created'
437+
params['direction'] = 'desc'
438+
response = self._make_request(
439+
'get', api_url, parse=False, params=params
440+
)
441+
max_page = 1
442+
if 'Link' in response.headers:
443+
# Link is only present if there are multiple pages
444+
link = response.headers['Link']
445+
urls = link.replace('>', '').replace('<', '').split()
446+
parsed_url = urlparse(urls[2].strip(';'))
447+
max_page = int(parse_qs(parsed_url.query)['page'][0])
448+
while response:
449+
for pull_request in response.json():
450+
created_at = datetime.strptime(
451+
pull_request['created_at'], '%Y-%m-%dT%H:%M:%SZ'
452+
)
453+
# Filter based on provided since datetime
454+
if created_at < since:
455+
response = None
456+
break
457+
pull_requests.append(pull_request)
458+
params['page'] += 1
459+
if params['page'] > max_page:
460+
response = None
461+
else:
462+
response = self._make_request(
463+
'get', api_url, parse=False, params=params
464+
)
465+
return pull_requests
466+
416467
def get_branch_protection_details(self, repo, branch='master'):
417468
"""
418469
Retrieve a repository branch's branch protection details.

0 commit comments

Comments
 (0)