- python
- pip install requests
python fetch.py --organisation ministryofjustice --token ${token}
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
get the repositories of an organisation | |
""" | |
import os | |
import re | |
import json | |
import urllib.parse | |
import argparse | |
import requests | |
PWD = os.path.abspath(os.path.dirname(__file__)) | |
BASE_URL = 'https://api.github.com' | |
REGEX = ( | |
'<(?P<next_url>.*)>; rel="next", ' | |
'<(?P<last_url>.*?page=(?P<total>\d+))>; rel="last"' | |
) | |
def get_total(token, organisation): | |
rsp = requests.get( | |
urllib.parse.urljoin(BASE_URL, 'orgs/{}/repos'.format(organisation)), | |
headers={'Authorization': 'token {}'.format(token)}) | |
link = rsp.headers['Link'] | |
total = re.match(REGEX, link).groupdict()['total'] | |
return int(total) | |
def get_repos(token, organisation): | |
repos = [] | |
for page in range(1, get_total(token, organisation) + 1): | |
rsp = requests.get( | |
urllib.parse.urljoin( | |
BASE_URL, | |
'orgs/ministryofjustice/repos?page={}'.format(page) | |
), | |
headers={'Authorization': 'token {}'.format(token)} | |
) | |
repos += rsp.json() | |
return repos | |
def argument_parser(): | |
parser = argparse.ArgumentParser( | |
description='dfetch repo data from github') | |
parser.add_argument('--token', '-t', help='token', required=True) | |
parser.add_argument( | |
'--organisation', '-o', help='organisation', required=True) | |
return parser | |
def main(argv=None): | |
args = argument_parser().parse_args(argv) | |
print('fetch repo data from github') | |
repos = get_repos(args.token, args.organisation) | |
filename = os.path.join(PWD, 'repos.json') | |
print('{} repositories found'.format(len(repos))) | |
print('data saved to {}'.format(filename)) | |
with open(filename, 'w') as fp: | |
json.dump(repos, fp, indent=2) | |
if __name__ == '__main__': | |
main() |