Last active
May 22, 2019 15:37
-
-
Save Nicolas-Constanty/aeafea84ae8ca62c0612d0935869b8a5 to your computer and use it in GitHub Desktop.
Get release download count
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import argparse | |
| import getpass | |
| import importlib.util | |
| # Install requests if not present | |
| package = 'requests' | |
| spec = importlib.util.find_spec(package) | |
| if spec is None: | |
| try: | |
| from pip import main as pipmain | |
| except: | |
| from pip._internal import main as pipmain | |
| pipmain(['install', "-q", package]) | |
| import requests | |
| PREFIX = 'https://' | |
| API_ENDPOINT = 'api.github.com' | |
| RELEASES = PREFIX + API_ENDPOINT + '/repos/{}/{}/releases' | |
| RELEASE = PREFIX + API_ENDPOINT + '/repos/{}/{}/releases/{}' | |
| class API: | |
| def __init__(self, user, repository, password=''): | |
| self.username = user | |
| self.repository = repository | |
| self.password = password | |
| self.logged = False | |
| self.session = requests.Session() | |
| def ask_password(self): | |
| self.password = getpass.getpass() | |
| def login(self): | |
| if not self.username: | |
| raise ValueError("User name must be defined with -u or --user") | |
| login_url = '{}{}/user'.format(PREFIX, API_ENDPOINT) | |
| tentative = 3 | |
| while tentative > 0 and not self.logged: | |
| self.ask_password() | |
| self.session.auth = (self.username, self.password) | |
| response = self.session.get(url=login_url) | |
| if response.status_code == 200: | |
| data = response.json() | |
| self.logged = True | |
| else: | |
| print(response.status_code) | |
| print(response.json()) | |
| tentative -= 1 | |
| def releases(self): | |
| url = RELEASES.format(self.username, self.repository) | |
| response = self.session.get(url=url) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| print(response.status_code) | |
| print(response.json()) | |
| raise ValueError('Repository {}/{} does not exist'.format(self.username, self.repository)) | |
| def release(self, repo_id: int): | |
| response = self.session.get(RELEASE.format(self.username, self.repository, repo_id)) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| print(response.status_code) | |
| print(response.json()) | |
| raise ValueError('Repository {}/{} does not exist'.format(self.username, self.repository)) | |
| def __del__(self): | |
| self.session.close() | |
| def download_stats(releases: []) -> ([], int): | |
| repos = [] | |
| total = 0 | |
| for release_data in releases: | |
| release_assets = release_data['assets'] | |
| sub_r = [] | |
| for release in release_assets: | |
| dl = release['download_count'] | |
| sub_r.append({ | |
| 'name': release['name'], | |
| 'download_count': dl, | |
| 'browser_download_url': release['browser_download_url'] | |
| }) | |
| total += dl | |
| repos.append(sub_r) | |
| return repos, total | |
| def print_stats(user_repo: API, releases: [], total: int): | |
| print('User {} => {}'.format(user_repo.username, user_repo.repository)) | |
| print('https://github.com/{}/{}'.format(user_repo.username, user_repo.repository)) | |
| for release in releases: | |
| for sub_release in release: | |
| print() | |
| print(sub_release['name'] + ':') | |
| print(' ' * 4, 'download count: {}'.format(sub_release['download_count'])) | |
| print(' ' * 4, 'url: {}'.format(sub_release['browser_download_url'])) | |
| print() | |
| print('Repository {} releases have been downloaded {} in total'.format( | |
| user_repo.repository, | |
| total | |
| )) | |
| def main(): | |
| parser = argparse.ArgumentParser(description='A python script that display the download count of your release.') | |
| parser.add_argument('--user', '-u', type=str, help='GitHub username', required=True) | |
| parser.add_argument('--repository', '-r', type=str, help='GitHub repository name', required=True) | |
| args = parser.parse_args() | |
| user_repo = API(args.user, args.repository) | |
| user_repo.login() | |
| releases = user_repo.releases() | |
| releases_infos, total = download_stats(releases) | |
| print_stats(user_repo, releases_infos, total) | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment