octonode-nick v0.0.1
octonode 
octonode is a library for nodejs to access the github v3 api
Installation
npm install octonodeUsage
var github = require('octonode');
// Then we instantiate a client with or without a token (as show in a later section)
var ghme = client.me();
var ghuser = client.user('pksunkara');
var ghrepo = client.repo('pksunkara/hub');
var ghorg = client.org('flatiron');
var ghissue = client.issue('pksunkara/hub', 37);
var ghmilestone = client.milestone('pksunkara/hub', 37);
var ghlabel = client.label('pksunkara/hub', 'todo');
var ghpr = client.pr('pksunkara/hub', 37);
var ghgist = client.gist();
var ghteam = client.team(37);
var ghsearch = client.search();Build a client which accesses any public information
var client = github.client();
client.get('/users/pksunkara', {}, function (err, status, body, headers) {
console.log(body); //json object
});Build a client from an access token
var client = github.client('someaccesstoken');
client.get('/user', {}, function (err, status, body, headers) {
console.log(body); //json object
});Build a client from credentials
var client = github.client({
username: 'pksunkara',
password: 'password'
});
client.get('/user', {}, function (err, status, body, headers) {
console.log(body); //json object
});Build a client from client keys
var client = github.client({
id: 'abcdefghijklmno',
secret: 'abcdefghijk'
});
client.get('/user', {}, function (err, status, body, headers) {
console.log(body); //json object
});Request Options
Request options can be set by setting defaults on the client. (e.g. Proxies)
var client = github.client();
client.requestDefaults['proxy'] = 'https://myproxy.com:1085'These options are passed though to request, see their API here: https://github.com/mikeal/request#requestoptions-callback
Proxies
You can set proxies dynamically by using the example above, but Octonode will respect environment proxies by default. Just set this using:
export HTTP_PROXY='https://myproxy.com:1085' if you are using the command line
Many of the below use cases use parts of the above code
Authentication
Authenticate to github in cli mode (desktop application)
github.auth.config({
username: 'pksunkara',
password: 'password'
}).login(['user', 'repo', 'gist'], function (err, id, token) {
console.log(id, token);
});Revoke authentication to github in cli mode (desktop application)
github.auth.config({
username: 'pksunkara',
password: 'password'
}).revoke(id, function (err) {
if (err) throw err;
});Authenticate to github in web mode (web application)
// Web application which authenticates to github
var http = require('http')
, url = require('url')
, qs = require('querystring')
, github = require('octonode');
// Build the authorization config and url
var auth_url = github.auth.config({
id: 'mygithubclientid',
secret: 'mygithubclientsecret'
}).login(['user', 'repo', 'gist']);
// Store info to verify against CSRF
var state = auth_url.match(/&state=([0-9a-z]{32})/i);
// Web server
http.createServer(function (req, res) {
uri = url.parse(req.url);
// Redirect to github login
if (uri.pathname=='/login') {
res.writeHead(301, {'Content-Type': 'text/plain', 'Location': auth_url})
res.end('Redirecting to ' + auth_url);
}
// Callback url from github login
else if (uri.pathname=='/auth') {
var values = qs.parse(uri.query);
// Check against CSRF attacks
if (!state || state[1] != values.state) {
res.writeHead(403, {'Content-Type': 'text/plain'});
res.end('');
} else {
github.auth.login(values.code, function (err, token) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(token);
});
}
} else {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end('');
}
}).listen(3000);
console.log('Server started on 3000');Rate Limiting
You can also check your rate limit status by calling the following.
client.limit(function (err, left, max) {
console.log(left); // 4999
console.log(max); // 5000
});API Callback Structure
All the callbacks for the following will take first an error argument, then a data argument, like this:
ghme.info(function(err, data, headers) {
console.log("error: " + err);
console.log("data: " + data);
console.log("headers:" + headers);
});Pagination
If a function is said to be supporting pagination, then that function can be used in many ways as shown below. Results from the function are arranged in pages.
The page argument is optional and is used to specify which page of issues to retrieve. The perPage argument is also optional and is used to specify how many issues per page.
// Normal usage of function
ghrepo.issues(callback); //array of first 30 issues
// Using pagination parameters
ghrepo.issues(2, 100, callback); //array of second 100 issues
ghrepo.issues(10, callback); //array of 30 issues from page 10
// Pagination parameters can be set with query object too
ghrepo.issues({
page: 2,
per_page: 100,
state: 'closed'
}, callback); //array of second 100 issues which are closedGithub authenticated user api
Token/Credentials required for the following:
Get information about the user (GET /user)
ghme.info(callback); //jsonUpdate user profile (PATCH /user)
ghme.update({
"name": "monalisa octocat",
"email": "octocat@github.com",
}, callback);Get emails of the user (GET /user/emails)
ghme.emails(callback); //array of emailsSet emails of the user (POST /user/emails)
ghme.emails(['new1@ma.il', 'new2@ma.il'], callback); //array of emails
ghme.emails('new@ma.il', callback); //array of emailsDelete emails of the user (DELETE /user/emails)
ghme.emails(['new1@ma.il', 'new2@ma.il']);
ghme.emails('new@ma.il');Get the followers of the user (GET /user/followers)
ghme.followers(callback); //array of github usersGet users whom the user is following (GET /user/following)
This query supports pagination.
ghme.following(callback); //array of github usersCheck if the user is following a user (GET /user/following/marak)
ghme.following('marak', callback); //booleanFollow a user (PUT /user/following/marak)
ghme.follow('marak');Unfollow a user (DELETE /user/following/marak)
ghme.unfollow('marak');Get public keys of a user (GET /user/keys)
ghme.keys(callback); //array of keysGet a single public key (GET /user/keys/1)
ghme.keys(1, callback); //keyCreate a public key (POST /user/keys)
ghme.keys({"title":"laptop", "key":"ssh-rsa AAA..."}, callback); //keyUpdate a public key (PATCH /user/keys/1)
ghme.keys(1, {"title":"desktop", "key":"ssh-rsa AAA..."}, callback); //keyDelete a public key (DELETE /user/keys/1)
ghme.keys(1);Get the starred repos for the user (GET /user/starred)
This query supports pagination.
ghme.starred(callback); //array of reposCheck if you have starred a repository (GET /user/starred/pksunkara/octonode)
ghme.checkStarred('flatiron/flatiron', callback); //booleanStar a repository (PUT /user/starred/pksunkara/octonode)
ghme.star('flatiron/flatiron');Unstar a repository (DELETE /user/starred/pksunkara/octonode)
ghme.unstar('flatiron/flatiron');Get the subscriptions of the user (GET /user/subscriptions)
This query supports pagination.
ghme.watched(callback); //array of reposList your public and private organizations (GET /user/orgs)
This query supports pagination.
ghme.orgs(callback); //array of orgsList your repositories (GET /user/repos)
This query supports pagination.
ghme.repos(callback); //array of reposCreate a repository (POST /user/repos)
ghme.repo({
"name": "Hello-World",
"description": "This is your first repo",
}, callback); //repoFork a repository (POST /repos/pksunkara/hub/forks)
ghme.fork('pksunkara/hub', callback); //forked repoGithub users api
No token required for the following
Get information about a user (GET /users/pksunkara)
ghuser.info(callback); //jsonGet user followers (GET /users/pksunkara/followers)
This query supports pagination.
ghuser.followers(callback); //array of github usersGet user followings (GET /users/pksunkara/following)
This query supports pagination.
ghuser.following(callback); //array of github usersGet events performed by a user (GET /users/pksunkara/events)
This query supports pagination.
Optionally, supply an array of Event Types to filter by.
ghuser.events(['PushEvent'], callback); //array of PushEvent eventsOr leave it out to get all Event Types.
ghuser.events(callback); //array of eventsGet user public organizations (GET /users/pksunkara/orgs)
This query supports pagination.
ghuser.orgs(callback); //array of organizationsGithub repositories api
Get information about a repository (GET /repos/pksunkara/hub)
ghrepo.info(callback); //jsonGet the collaborators for a repository (GET /repos/pksunkara/hub/collaborators)
ghrepo.collaborators(callback); //array of github usersCheck if a user is collaborator for a repository (GET /repos/pksunkara/hub/collaborators/marak)
ghrepo.collaborators('marak', callback); //booleanGet the commits for a repository (GET /repos/pksunkara/hub/commits)
ghrepo.commits(callback); //array of commitsGet a certain commit for a repository (GET /repos/pksunkara/hub/commits/18293abcd72)
ghrepo.commit('18293abcd72', callback); //commitGet the tags for a repository (GET /repos/pksunkara/hub/tags)
ghrepo.tags(callback); //array of tagsGet the releases for a repository (GET /repos/pksunkara/hub/releases)
ghrepo.releases(callback); //array of releasesGet the languages for a repository (GET /repos/pksunkara/hub/languages)
ghrepo.languages(callback); //array of languagesGet the contributors for a repository (GET /repos/pksunkara/hub/contributors)
ghrepo.contributors(callback); //array of github usersGet the branches for a repository (GET /repos/pksunkara/hub/branches)
This query supports pagination.
ghrepo.branches(callback); //array of branchesGet a branch for a repository (GET /repos/pksunkara/hub/branches/master)
ghrepo.branch('master', callback); //branchGet the issues for a repository (GET /repos/pksunkara/hub/issues)
This query supports pagination.
ghrepo.issues(callback); //array of issuesCreate an issue for a repository (POST /repos/pksunkara/hub/issues)
ghrepo.issue({
"title": "Found a bug",
"body": "I'm having a problem with this.",
"assignee": "octocat",
"milestone": 1,
"labels": ["Label1", "Label2"]
}, callback); //issueGet the milestones for a repository (GET /repos/pksunkara/hub/milestones)
This query supports pagination.
ghrepo.milestones(callback); //array of milestonesCreate a milestone for a repository (POST /repos/pksunkara/hub/milestones)
ghrepo.milestone({
"title": "Sprint 345",
"description": "The sprint where we fix all the things!",
"due_on": new Date(2014, 7, 1)
}, callback); //milestoneGet the labels for a repository (GET /repos/pksunkara/hub/labels)
This query supports pagination.
ghrepo.labels(callback); //array of labelsCreate a label for a repository (POST /repos/pksunkara/hub/labels)
ghrepo.label({
"name": "Priority",
"color": "ff0000",
}, callback); //labelGet the pull requests for a repository (GET /repos/pksunkara/hub/pulls)
This query supports pagination.
ghrepo.prs(callback); //array of pull requestsCreate a pull request (POST /repos/pksunkara/hub/pulls)
ghrepo.pr({
"title": "Amazing new feature",
"body": "Please pull this in!",
"head": "octocat:new-feature",
"base": "master"
}, callback); //pull requestGet the hooks for a repository (GET /repos/pksunkara/hub/hooks)
This query supports pagination.
ghrepo.hooks(callback); //array of hooksCreate a hook (POST /repos/pksunkara/hub/hooks)
ghrepo.hook({
"name": "web",
"active": true,
"events": ["push", "pull_request"],
"config": {
"url": "http://myawesomesite.com/github/events"
}
}, callback); // hookGet the README for a repository (GET /repos/pksunkara/hub/readme)
ghrepo.readme(callback); //file
ghrepo.readme('v0.1.0', callback); //fileGet the root contents on a branch called "myBranch"
ghrepo.contents('', "myBranch", callback);Get the contents of a path in repository
ghrepo.contents('lib/index.js', callback); //path
ghrepo.contents('lib/index.js', 'v0.1.0', callback); //pathCreate a file at a path in repository
ghrepo.createContents('lib/index.js', 'commit message', 'content', callback); //path
ghrepo.createContents('lib/index.js', 'commit message', 'content', 'v0.1.0', callback); //pathUpdate a file at a path in repository
ghrepo.updateContents('lib/index.js', 'commit message', 'content', 'put-sha-here', callback); //path
ghrepo.updateContents('lib/index.js', 'commit message', 'content', 'put-sha-here', 'v0.1.0', callback); //pathDelete a file at a path in repository
ghrepo.deleteContents('lib/index.js', 'commit message', 'put-sha-here', callback); //path
ghrepo.deleteContents('lib/index.js', 'commit message', 'put-sha-here', 'v0.1.0', callback); //pathGet archive link for a repository
ghrepo.archive('tarball', callback); //link to archive
ghrepo.archive('zipball', 'v0.1.0', callback); //link to archiveGet the blob for a repository (GET /repos/pksunkara/hub/git/blobs/SHA)
ghrepo.blob('18293abcd72', callback); //blobGet users who starred a repository (GET /repos/pksunkara/hub/stargazers)
ghrepo.stargazers(1, 100, callback); //array of users
ghrepo.stargazers(10, callback); //array of users
ghrepo.stargazers(callback); //array of usersGet the teams for a repository (GET /repos/pksunkara/hub/teams)
ghrepo.teams(callback); //array of teamsGet a git tree (GET /repos/pksunkara/hub/git/trees/18293abcd72)
ghrepo.tree('18293abcd72', callback); //tree
ghrepo.tree('18293abcd72', true, callback); //recursive treeDelete the repository (DELETE /repos/pksunkara/hub)
ghrepo.destroy();List statuses for a specific ref (GET /repos/pksunkara/hub/statuses/master)
ghrepo.statuses('master', callback); //array of statusesCreate status (POST /repos/pksunkara/hub/statuses/SHA)
ghrepo.status('18e129c213848c7f239b93fe5c67971a64f183ff', {
"state": "success",
"target_url": "http://ci.mycompany.com/job/hub/3",
"description": "Build success."
}, callback); // created statusGithub organizations api
Get information about an organization (GET /orgs/flatiron)
ghorg.info(callback); //jsonUpdate an organization (POST /orgs/flatiron)
ghorg.update({
blog: 'https://blog.com'
}, callback); // orgList organization repositories (GET /orgs/flatiron/repos)
This query supports pagination.
ghorg.repos(callback); //array of reposCreate an organization repository (POST /orgs/flatiron/repos)
ghorg.repo({
name: 'Hello-world',
description: 'My first world program'
}, callback); //repoGet an organization's teams (GET /orgs/flatiron/teams)
ghorg.teams(callback); //array of teamsGet an organization's members (GET /orgs/flatiron/members)
This query supports pagination.
ghorg.members(callback); //array of github usersCheck an organization member (GET /orgs/flatiron/members/pksunkara)
ghorg.member('pksunkara', callback); //booleanCreate an organization team (POST /orgs/flatiron/teams)
ghorg.createTeam({
"name": "new team name",
"permission": "push",
"repo_names": [
"flatiron/utile"
]
}, callback);Github issues api
Get a single issue (GET /repos/pksunkara/hub/issues/37)
ghissue.info(callback); //issueEdit an issue for a repository (PATCH /repos/pksunkara/hub/issues/37)
ghissue.update({
"title": "Found a bug and I am serious",
}, callback); //issueList comments on an issue (GET /repos/pksunkara/hub/issues/37/comments)
This query supports pagination.
ghissue.comments(callback); //array of commentsGithub milestones api
Get a single milestone (GET /repos/pksunkara/hub/milestones/37)
ghmilestone.info(callback); //milestoneEdit a milestone for a repository (PATCH /repos/pksunkara/hub/milestones/37)
ghmilestone.update({
"title": "Updated milestone title",
}, callback); //milestoneDelete a milestone for a repository (DELETE /repos/pksunkara/hub/milestones/37)
ghmilestone.delete(callback); //milestoneGithub labels api
Get a single label (GET /repos/pksunkara/hub/labels/todo)
ghlabel.info(callback); //labelEdit a label for a repository (PATCH /repos/pksunkara/hub/labels/todo)
ghlabel.update({
"color": "000000",
}, callback); //labelDelete a label for a repository (PATCH /repos/pksunkara/hub/labels/todo)
ghlabel.delete(callback); //labelGithub pull requests api
Get a single pull request (GET /repos/pksunkara/hub/pulls/37)
ghpr.info(callback); //pull requestUpdate a pull request (PATCH /repos/pksunkara/hub/pulls/37)
ghpr.update({
'title': 'Wow this pr'
}, callback); //pull requestClose a pull request
ghpr.close(callback); //pull requestGet if a pull request has been merged (GET /repos/pksunkara/hub/pulls/37/merge)
ghpr.merged(callback); //booleanList commits on a pull request (GET /repos/pksunkara/hub/pulls/37/commits)
ghpr.commits(callback); //array of commitsList comments on a pull request (GET /repos/pksunkara/hub/pulls/37/comments)
ghpr.comments(callback); //array of commentsList files in pull request (GET /repos/pksunkara/hub/pulls/37/files)
ghpr.files(callback); //array of filesGithub gists api
List authenticated user's gists (GET /gists)
This query supports pagination.
ghgist.list(callback); //array of gistsList authenticated user's public gists (GET /gists/public)
This query supports pagination.
ghgist.public(callback); //array of gistsList authenticated user's starred gists (GET /gists/starred)
This query supports pagination.
ghgist.starred(callback); //array of gistsList a user's public gists (GET /users/pksunkara/gists)
This query supports pagination.
ghgist.user('pksunkara', callback); //array of gistsGet a single gist (GET /gists/37)
ghgist.get(37, callback); //gistCreate a gist (POST /gists)
ghgist.create({
description: "the description",
files: { ... }
}), callback); //gistEdit a gist (PATCH /gists/37)
ghgist.edit(37, {
description: "hello gist"
}, callback); //gistDelete a gist (DELETE /gists/37)
ghgist.delete(37);Fork a gist (POST /gists/37/forks)
ghgist.fork(37, callback); //gistStar a gist (PUT /gists/37/star)
ghgist.star(37);Unstar a gist (DELETE /gists/37/unstar)
ghgist.unstar(37);Check if a gist is starred (GET /gists/37/star)
ghgist.check(37); //booleanList comments on a gist (GET /gists/37/comments)
ghgist.comments(37, callback); //array of commentsCreate a comment (POST /gists/37/comments)
ghgist.comments(37, {
body: "Just commenting"
}, callback); //commentGet a single comment (GET /gists/comments/1)
ghgist.comment(1, callback); //commentEdit a comment (POST /gists/comments/1)
ghgist.comment(1, {
body: "lol at commenting"
}, callback); //commentDelete a comment (DELETE /gists/comments/1)
ghgist.comment(1);Github teams api
Get a team (GET /team/37)
ghteam.info(callback); //jsonGet the team members (GET /team/37/members)
ghteam.members(callback); //array of github usersCheck if a user is part of the team (GET /team/37/members/pksunkara)
ghteam.member('pksunkara', callback); //booleanAdd a user to a team (PUT /team/37/members/pksunkara)
ghteam.addUser("pksunkara", callback); //booleanRemove a user from a team (DELETE /team/37/members/pksunkara)
ghteam.removeUser("pksunkara", callback); //booleanList all repos of a team (GET /team/37/repos)
ghteam.repos(callback); //array of reposGithub search api
Search issues
ghsearch.issues({
q: 'windows+state:open+repo:pksunkara/hub',
sort: 'created',
order: 'asc'
}, callback); //array of search resultsSearch repositories
ghsearch.repos({
q: 'hub+language:go',
sort: 'created',
order: 'asc'
}, callback); //array of search resultsSearch users
ghsearch.users({
q: 'tom+followers:>100',
sort: 'created',
order: 'asc'
}, callback); //array of search resultsSearch code
ghsearch.code({
q: 'auth+in:file+repo:pksunkara/hub',
sort: 'created',
order: 'asc'
}, callback); //array of search resultsTesting
npm testIf you like this project, please watch this and follow me.
Contributors
Here is a list of Contributors
TODO
The following method names use underscore as an example. The library contains camel cased method names.
// public repos for unauthenticated, private and public for authenticated
me.get_watched_repositories(callback);
me.is_watching('repo', callback);
me.start_watching('repo', callback);
me.stop_watching('repo', callback);
me.get_issues(params, callback);
// organization data
var org = octonode.Organization('bulletjs');
org.update(dict_with_update_properties, callback);
org.get_public_members(callback);
org.is_public_member('user', callback);
org.make_member_public('user', callback);
org.conceal_member('user', callback);
org.get_team('team', callback);
org.create_team({name:'', repo_names:'', permission:''}, callback);
org.edit_team({name:'', permission:''}, callback);
org.delete_team('name', callback);
org.get_team_members('team', callback);
org.get_team_member('team', 'user', callback);
org.remove_member_from_team('user', 'team', callback);
org.get_repositories(callback);
org.create_repository({name: ''}, callback);
org.get_team_repositories('team', callback);
org.get_team_repository('team', 'name', callback);
org.add_team_repository('team', 'name', callback);
org.remove_team_repository('team', 'name', callback);
var repo = octonode.Repository('pksunkara/octonode');
repo.update({name: ''}, callback);
// collaborator information
repo.add_collaborator('name', callback);
repo.remove_collaborator('name', callback);
// commit data
repo.get_commit('sha-id', callback);
repo.get_all_comments(callback);
repo.get_commit_comments('SHA ID', callback);
repo.comment_on_commit({body: '', commit_id: '', line: '', path: '', position: ''}, callback);
repo.get_single_comment('comment id', callback);
repo.edit_single_comment('comment id', callback);
repo.delete_single_comment('comment id', callback);
// downloads
repo.get_downloads(callback);
repo.get_download(callback);
repo.create_download({name: ''}, 'filepath', callback);
repo.delete_download(callback);
// keys
repo.get_deploy_keys(callback);
repo.get_deploy_key('id', callback);
repo.create_deploy_key({title: '', key: ''}, callback);
repo.edit_deploy_key({title: '', key: ''}, callback);
repo.delete_deploy_key('id', callback);
// watcher data
repo.get_watchers(callback);
// pull requests
repo.get_all_pull_request_comments(callback);
repo.get_pull_request_comment('id', callback);
repo.create_pull_request_comment('id', {body:'', commit_id:'', path:'', position:''}, callback);
repo.reply_to_pull_request_comment('id', 'body', callback);
repo.edit_pull_request_comment('id', 'body', callback);
repo.delete_pull_request_comment('id', callback);
repo.get_issues(params, callback);
repo.get_issue('id', callback);
repo.create_issue({title: ''}, callback);
repo.edit_issue({title: ''}, callback);
repo.get_issue_comments('issue', callback);
repo.get_issue_comment('id', callback);
repo.create_issue_comment('id', 'comment', callback);
repo.edit_issue_comment('id', 'comment', callback);
repo.delete_issue_comment('id', callback);
repo.get_issue_events('id', callback);
repo.get_events(callback);
repo.get_event('id', callback);
repo.get_labels(callback);
repo.get_label('id', callback);
repo.create_label('name', 'color', callback);
repo.edit_label('name', 'color', callback);
repo.delete_label('id', callback);
repo.get_issue_labels('issue', callback);
repo.add_labels_to_issue('issue', ['label1', 'label2'], callback);
repo.remove_label_from_issue('issue', 'labelid', callback);
repo.set_labels_for_issue('issue', ['label1', 'label2'], callback);
repo.remove_all_labels_from_issue('issue', callback);
repo.get_labels_for_milestone_issues('milestone', callback);
repo.get_milestones(callback);
repo.get_milestone('id', callback);
repo.create_milestone('title', callback);
repo.edit_milestone('title', callback);
repo.delete_milestone('id', callback);
// raw git access
repo.create_blob('content', 'encoding', callback);
repo.get_commit('sha-id', callback);
repo.create_commit('message', 'tree', [parents], callback);
repo.get_reference('ref', callback);
repo.get_all_references(callback);
repo.create_reference('ref', 'sha', callback);
repo.update_reference('ref', 'sha', force, callback);I accept pull requests and guarantee a reply back within a day
License
MIT/X11
Bug Reports
Report here. Guaranteed reply within a day.
Contact
Pavan Kumar Sunkara (pavan.sss1991@gmail.com)
11 years ago