Skip to content

Instantly share code, notes, and snippets.

@Nicolas-Constanty
Last active May 22, 2019 15:37
Show Gist options
  • Select an option

  • Save Nicolas-Constanty/aeafea84ae8ca62c0612d0935869b8a5 to your computer and use it in GitHub Desktop.

Select an option

Save Nicolas-Constanty/aeafea84ae8ca62c0612d0935869b8a5 to your computer and use it in GitHub Desktop.
Get release download count
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