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.
Comments
Nicely done. If you don’t mind, I think I’m going to fork this thing and make a few changes. Specifically:
I don’t like using GitHub’s web hosting. I love their page builder and love their clean look, I just don’t like having a “magical” branch in my repo that GitHub uses for the page.
But the clean look is awesome. I think I’m going to take this code and turn it into a project page builder that reads from GitHub and then publishes to a location on my server.
I’ll see what I can come up with. Nice script though.
Cool, let me know if it blows up or anything.
Also, why don’t you like the Github Pages? It’s free CDN hosting, what’s not to love? Just because it’s a git repo doesn’t mean anything. It’s not much different than Heroku I would think.
FYI I cleaned my template mess up with pystache. Ignore the above source code and go to http://github.com/jmhobbs/jmhobbs.github.com for the good stuff.