public
Description: GitHub.js
Homepage:
Clone URL: git://github.com/judofyr/github-js.git
judofyr (author)
Thu May 28 09:21:49 -0700 2009
commit  5c19708aa3de308cd70fbf2933efaea2c9ac1f82
tree    f9f0848ceb2d477719c6d1bb3d1c7ba06e204d38
name age message
file COPYING Thu May 28 09:21:49 -0700 2009 First version [judofyr]
file README.markdown Thu May 28 09:21:49 -0700 2009 First version [judofyr]
file Rakefile Thu May 28 09:21:49 -0700 2009 First version [judofyr]
directory examples/ Thu May 28 09:21:49 -0700 2009 First version [judofyr]
directory spec/ Thu May 28 09:21:49 -0700 2009 First version [judofyr]
directory src/ Thu May 28 09:21:49 -0700 2009 First version [judofyr]
directory vendor/ Thu May 28 09:21:49 -0700 2009 First version [judofyr]
README.markdown

GitHub.js

GitHub.js is a simple library for interacting with GitHub's v2 API.

Quickstart

/*
 * LOADERS
 */

var user = new GitHub.User('judofyr');

// Let's load some data:
user.load('basic')

// That command is async, so let's add a callback too:
// (since basic already has been loaded,
//  this would not make any calls to GitHub)
user.load('basic', function(obj) {
  user == obj;    // The object itself is passed to the callback,
                  // so you can easily pass in a normal function.

  user.name;      // Now our object has many properties (see API below)
});

// You can give it multiple loaders too:
user.load('basic', 'followers');
user.load('basic', 'following', callback);

// The loader defaults to 'basic':
user.load()         // equals to user.load('basic')
user.load(callback) // equals to user.load('basic', callback)

// More stuff
user.isLoaded('basic') == true
user.reload('basic')    // Load basic again

/*
 * FETCHERS
 */

var repo = user.repo('something');

// Let's load the issues:
repo.issues('open', function(issues) {
  repo != issues;   // Now issues is a completely different object.
});

// If we fetch them again, it will cause a new call to GitHub:
repo.issues('open', callback);

Use

Run rake build and you'll get two versions:

  • github.only.js, which depends on JS.Class being loaded already
  • github.js, which already includes JS.Class

Read the quickstart at the top, the API at the bottom and take a look at examples/

Use the fork, Luke

I've used the excellent JS.Class which fakes Ruby's object model in JavaScript. It allowed me to quickly build this and get something working pretty well. The goal is however to not have any other dependencies and make it so idomatic JavaScript as possible.

I would be very grateful if someone could take a look at the code and point out all my silly mistakes. This applies to everything, both the frontend API which you'll be using and the backend code which handles API calls. Fork away, don't be afraid of refactoring and deleting my code, and I'll merge your changes right away!

Magnus Holm judofyr@gmail.com


API

GitHub.User

var user = new GitHub.User(login);

user.load(function() {
  user.company;
  user.name;
  user.following_count;
  user.blog;
  user.public_repo_count;
  user.public_gist_count;
  user.id;
  user.login;
  user.followers_count;
  user.created_at;
  user.email;
  user.location;
});

user.load('followers', 'following', function() {
  user.followers;
  user.following;
});

user.load('repos', function() {
  user.repos;   // => [GitHub.Repo]
});

user.repo(project) // => GitHub.Repo
                   // Preloaded if you've already loaded repos

GitHub.Repo

var repo = new GitHub.Repo(owner, name);

repo.load(function() {
  repo.name;
  repo.watchers;
  repo.private;
  repo.url;
  repo.fork;
  repo.forks;
  repo.description;
  repo.homepage;
  repo.owner;
});

repo.load('tags', 'branches', function() {
  repo.tags;        // { name: sha }
  repo.branches     // { name: sha }
});

repo.tree(sha)      // GitHub.Tree

repo.issues('open' OR 'closed', function(issues) {
  issues;           // [GitHub.Issue]
});

repo.issue(number)  // GitHub.Issue

repo.commits(branch, function(commits) {
  commits;          // [GitHub.Commit]
});

repo.commits(branch, filename, function(commits) {
  commits;          // [GitHub.Commit]
});

repo.commit(number) // GitHub.Commit

GitHub.Issue

var issue = new GitHub.Issue(repo, number); // Please use repo.issue(number)

issue.load(function() {
  issue.user;
  issue.updated_at;
  issue.votes;
  issue.number;
  issue.title;
  issue.body;
  issue.position;
  issue.state;
  issue.created_at;
});

GitHub.Commit

var commit = new GitHub.Commit(repo, sha); // Please use repo.commit(sha)

commit.load(function() {
  commit.message;
  commit.parents;
  commit.author;
  commit.url;
  commit.id;
  commit.committed_date;
  commit.authored_date;
  commit.tree;
  commit.committer;
});

commit.load('detailed', function() {
  commit.added;
  commit.removed;
  commit.modified;
});

GitHub.Tree

var tree = new GitHub.Tree(repo, sha); // Please use repo.tree(sha)

tree.load(function() {
  tree.children;  // [GitHub.Tree OR GitHub.Blob]

  var child = tree.children[0];

  child.name;
  child.sha;
  child.mode;
  child.type;
});

GitHub.Blob

var blob = new GitHub.Blob(tree, filename);

blob.load(function() {
  blob.name;
  blob.sha;
  blob.size;
  blob.mode;
  blob.mime_type;
  blob.data;
})