Auto-Generated Github User Page With py-github
Update (2010-06-30)
So I got antsy about this and I upgraded to using pystache instead of my homebrew templating system. This was my first run in with mustache, and I have to say I like it, even though I used the bare minimum feature set.
New code is at http://github.com/jmhobbs/jmhobbs.github.com
Github has a cool feature called "Github Pages" that let you host static content on a subdomain of github, e.g. http://jmhobbs.github.com/.
They also provide an auto-generator for project pages that has a nice clean format which I really like. So I decided to make my user page match the look and feel of the project pages. And to boot I wanted to be able have it auto-generate since I want it to be "hands free", otherwise I'll forget to update it.
To make this happen I whipped up my template and then grabbed the excellent py-github from Dustin Sallings, which I have used before.
Without furthur ado I'll just show you the source. It's not complicated, just some API calls then search replace on a template file. If you want to use it, be sure to get the most recent version from http://github.com/jmhobbs/jmhobbs.github.com.
Throw in a cron job and you are set. Beware of lot's of "page build" notices from Github though.
# -*- coding: utf-8 -*-
import github.github as github
import yaml
import time
from datetime import datetime
def repo_date_to_epoch ( date ):
epoch = time.mktime(
time.strptime(
date[0:-6],
"%Y-%m-%dT%H:%M:%S"
)
)
return int( epoch )
def main ():
print "Loading settings...."
f = open( 'settings.yaml' )
settings = yaml.load( f )
f.close()
gh = github.GitHub()
print "Fetching user information..."
user = gh.users.show( settings['username'] )
print "Fetching repository information..."
repos = gh.repos.forUser( settings['username'] )
print "Sorting repositories..."
repos = sorted( repos, cmp=lambda a, b: repo_date_to_epoch( b.pushed_at ) - repo_date_to_epoch( a.pushed_at ) )
print "Loading template..."
f = open( 'index.html.tpl' )
template = f.read()
f.close()
print "Mangling template..."
template = template.replace( '<% username %>', settings['username'] )
template = template.replace( '<% fullname %>', user.name )
template = template.replace( '<% email %>', user.email )
template = template.replace( '<% following %>', str( user.following_count ) )
template = template.replace( '<% followers %>', str( user.followers_count ) )
template = template.replace( '<% publicrepos %>', str( user.public_repo_count ) )
repo_string = ''
for repo in repos:
if repo.private:
continue
repo_string = repo_string + '' + repo.name + ''
try:
repo_string = repo_string + ' - ' + repo.homepage + ''
except AttributeError:
pass
repo_string = repo_string + '
'
repo_string = repo_string + "Forks: " + str( repo.forks ) + " - Watchers: " + str( repo.watchers ) + ' | '
if repo.has_issues:
repo_string = repo_string + ' Issues |'
if repo.has_wiki:
repo_string = repo_string + ' Wiki |'
if repo.has_downloads:
repo_string = repo_string + ' Downloads |'
repo_string = repo_string + '
Last Push: ' + datetime.fromtimestamp( repo_date_to_epoch( repo.pushed_at ) ).ctime()
try:
repo_string = repo_string + '' + repo.description + '< /pre>'
except AttributeError:
repo_string = repo_string + '
'
pass
repo_string = repo_string + "
\n"
template = template.replace( '<% repos %>', repo_string )
ga = """
"""
if False != settings['google_analytics']:
template = template.replace( '<% google_analytics %>', ga )
template = template.replace( '<% ga_code %>', settings['google_analytics'] )
else:
template = template.replace( '<% google_analytics %>', '' )
print "Writing file..."
f = open( 'index.html', 'w' )
f.write( template )
f.close()
print "Done!"
if __name__ == "__main__":
main()
Wow. You actually scrolled through all of that. Amazing.