jmhobbs

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.