python-dependency-injector/examples/applications/ghnav-flask/githubnavigator/github.py
2020-07-09 19:01:27 -04:00

68 lines
2.0 KiB
Python

"""Github API module."""
import requests
class GitHubApiClient:
"""GitHub API client performs operations with Github API."""
API_URL = 'https://api.github.com/'
DEFAULT_LIMIT = 5
def __init__(self, auth_token, request_timeout):
"""Initialize search."""
self._auth_token = auth_token
self._request_timeout = request_timeout
def search_repositories(self, search_term, limit):
"""Search repositories."""
if not search_term:
return []
repositories = self._make_search('repositories', search_term, limit)
latest_commits = [
self._get_latest_commit(repository, search_term)
for repository in repositories
]
return list(zip(repositories, latest_commits))
def _make_search(self, entity, search_term, limit):
headers = {}
if self._auth_token:
headers['authorization'] = f'token {self._auth_token}'
response = requests.get(
url=f'{self.API_URL}search/{entity}',
params={
'q': f'{search_term} in:name',
'sort': 'updated',
'order': 'desc',
'page': 1,
'per_page': limit,
},
headers=headers,
timeout=self._request_timeout,
)
data = response.json()
return data['items']
def _get_latest_commit(self, repository, search_term):
headers = {}
if self._auth_token:
headers['authorization'] = f'token {self._auth_token}'
response = requests.get(
url=repository['commits_url'].replace('{/sha}', ''),
params={
'q': f'{search_term} in:name',
'sort': 'updated',
'order': 'desc',
'page': 1,
'per_page': 1,
},
headers=headers,
timeout=self._request_timeout,
)
data = response.json()
return data[0]