Skip to content

Instantly share code, notes, and snippets.

@juandebravo
Created July 16, 2012 19:52
Show Gist options
  • Save juandebravo/3124648 to your computer and use it in GitHub Desktop.
Save juandebravo/3124648 to your computer and use it in GitHub Desktop.
Retrieve user gists using a generator
import sys
import json
import requests
import re
from urlparse import urlparse, parse_qs
GITHUB_URL = 'https://api.github.com'
GIST_URL = GITHUB_URL + "/users/{0}/gists"
def get_number_of_gists(user_id):
link_url = '\A(?P<next>.*),(?P<last>.*)\Z'
link_url_regex = re.compile(link_url)
def get_url(value):
_url = '\A.*<(?P<url>.*)>.*$'
_url_regex = re.compile(_url)
m = _url_regex.match(value)
return dict(m.groupdict().iteritems())['url']
url = GIST_URL.format(user_id)
first_gist = requests.get(url, params={'page': 1, 'per_page': 1 })
links = first_gist.headers['link']
m = link_url_regex.match(links)
if m:
page_url = get_url(dict(m.groupdict().iteritems())['last'])
parsed = urlparse(page_url)
return int(parse_qs(parsed.query)['page'].pop())
else:
raise ValueError("Unable to retrieve the number of gists")
def xgists(user_id):
"""
Creates a generator returning a user gist in every iteration
"""
url = GIST_URL.format(user_id)
_params = {'per_page': 1}
for i in xrange(get_number_of_gists(user_id)):
response = requests.get(url, params=_params.update({'page': i+1}))
if response.status_code == 200:
gist = json.loads(response.content)
yield gist
else:
raise ValuError("Error while retrieving a gist")
if len(sys.argv) < 2:
print "Please include as argument the github user id"
exit(1)
user_id = sys.argv[1]
for gist in xgists(user_id):
print json.dumps(gist, indent=2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment