GitHub PullRequestReviewCommentEvent at 2014-12-06 01:37:21
Repository: grasshopper
Actor: nicolaasmatthijs
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/comments/21412473","id":21412473,"diff_hunk":"@@ -0,0 +1,393 @@\n+/**\n+ * Copyright (c) 2014 \"Fronteer LTD\"\n+ * Grasshopper OrgUnit Engine\n+ *\n+ * This program is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU Affero General Public License as\n+ * published by the Free Software Foundation, either version 3 of the\n+ * License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU Affero General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Affero General Public License\n+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n+ */\n+\n+var _ = require('lodash');\n+var assert = require('assert');\n+\n+/**\n+ * Assert that an organisational unit has all expected properties\n+ *\n+ * @param  {OrgUnit}              orgUnit               The organisational unit to assert the properties for\n+ * @param  {OrgUnit}              expectedOrgUnit       The organisational unit to which the provided organisational unit should be compared\n+ * @throws {AssertionError}                             Error thrown when an assertion failed\n+ */\n+var assertOrgUnit = module.exports.assertOrgUnit = function(orgUnit, expectedOrgUnit) {\n+    assert.ok(orgUnit);\n+    assert.ok(orgUnit.id);\n+    assert.ok(orgUnit.AppId);\n+    assert.ok(orgUnit.displayName);\n+    assert.ok(orgUnit.type);\n+    assert.ok(orgUnit.createdAt);\n+    assert.ok(orgUnit.updatedAt);\n+    assert.strictEqual(orgUnit.id, expectedOrgUnit.id);\n+    assert.strictEqual(orgUnit.AppId, expectedOrgUnit.AppId);\n+    assert.strictEqual(orgUnit.displayName, expectedOrgUnit.displayName);\n+    assert.strictEqual(orgUnit.type, expectedOrgUnit.type);\n+    assert.strictEqual(orgUnit.group, expectedOrgUnit.group);\n+};\n+\n+/**\n+ * Assert that a new organisational unit can be created\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {String}             displayName                     The name of the organisational unit\n+ * @param  {Number}             type                            The organisational unit type (e.g. `tripos`, `part`)\n+ * @param  {Object}             [opts]                          A set of optional parameters\n+ * @param  {Number}             [opts.app]                      The id of the application that this organisational unit will belong to\n+ * @param  {String}             [opts.description]              The description of the organisational unit\n+ * @param  {Number}             [opts.group]                    The id of the group that can manage the organisational unit. Defaults to creating a new group with the current user as a member\n+ * @param  {Number}             [opts.parent]                   The id of the parent organisational unit\n+ * @param  {Function}           callback                        Standard callback function\n+ * @param  {OrgUnit}            callback.orgUnit                The created organisational unit\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertCreateOrgUnit = module.exports.assertCreateOrgUnit = function(client, displayName, type, opts, callback) {\n+    opts = opts || {};\n+\n+    client.orgUnit.createOrgUnit(displayName, type, opts, function(err, createdOrgUnit, response) {\n+        assert.ok(!err);\n+        assert.ok(createdOrgUnit);\n+        assert.ok(createdOrgUnit.id);\n+        assert.ok(createdOrgUnit.createdAt);\n+        assert.ok(createdOrgUnit.updatedAt);\n+        assert.strictEqual(createdOrgUnit.displayName, displayName);\n+        assert.strictEqual(createdOrgUnit.type, type);\n+\n+        if (opts.description) {\n+            assert.strictEqual(createdOrgUnit.description, opts.description);\n+        }\n+        if (opts.group) {\n+            assert.strictEqual(createdOrgUnit.GroupId, opts.group);\n+        }\n+        if (opts.parent) {\n+            assert.strictEqual(createdOrgUnit.parentId, opts.parent);\n+        }\n+        return callback(createdOrgUnit);\n+    });\n+};\n+\n+/**\n+ * Assert that a new organisational unit can not be created\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {String}             displayName                     The name of the organisational unit\n+ * @param  {Number}             type                            The organisational unit type (e.g. `tripos`, `part`)\n+ * @param  {Object}             [opts]                          A set of optional parameters\n+ * @param  {Number}             [opts.app]                      The id of the application that this organisational unit will belong to\n+ * @param  {String}             [opts.description]              The description of the organisational unit\n+ * @param  {Number}             [opts.group]                    The id of the group that can manage the organisational unit. Defaults to creating a new group with the current user as a member\n+ * @param  {Number}             [opts.parent]                   The id of the parent organisational unit\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertCreateOrgUnitFails = module.exports.assertCreateOrgUnitFails = function(client, displayName, type, opts, code, callback) {\n+    client.orgUnit.createOrgUnit(displayName, type, opts, function(err, orgUnit, response) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        assert.ok(!orgUnit);\n+        return callback();\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can be updated\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to update\n+ * @param  {Object}             opts                            The values to update the app with\n+ * @param  {String}             [opts.displayName]              The name of the organisational unit\n+ * @param  {String}             [opts.description]              The description of the organisational unit\n+ * @param  {Number}             [opts.type]                     The organisational unit type (e.g. `tripos`, `part`)\n+ * @param  {Number}             [opts.group]                    The id of the group that can manage the organisational unit\n+ * @param  {Number}             [opts.parent]                   The id of the parent organisational unit\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertUpdateOrgUnit = module.exports.assertUpdateOrgUnit = function(client, id, opts, callback) {\n+    client.orgUnit.updateOrgUnit(id, opts, function(err, orgUnit, response) {\n+        assert.ok(!err);\n+        if (opts.displayName) {\n+            assert.strictEqual(orgUnit.displayName, opts.displayName);\n+        }\n+        if (opts.description) {\n+            assert.strictEqual(orgUnit.description, opts.description);\n+        }\n+        if (opts.type) {\n+            assert.strictEqual(orgUnit.type, opts.type);\n+        }\n+        if (opts.group) {\n+            assert.strictEqual(orgUnit.GroupId, opts.group);\n+        }\n+        if (opts.parent) {\n+            assert.strictEqual(orgUnit.ParentId, opts.parent);\n+        }\n+        return callback(orgUnit);\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can not be updated\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to update\n+ * @param  {Object}             opts                            The values to update the app with\n+ * @param  {String}             [opts.displayName]              The name of the organisational unit\n+ * @param  {String}             [opts.description]              The description of the organisational unit\n+ * @param  {Number}             [opts.type]                     The organisational unit type (e.g. `tripos`, `part`)\n+ * @param  {Number}             [opts.group]                    The id of the group that can manage the organisational unit\n+ * @param  {Number}             [opts.parent]                   The id of the parent organisational unit\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertUpdateOrgUnitFails = module.exports.assertUpdateOrgUnitFails = function(client, id, opts, code, callback) {\n+    client.orgUnit.updateOrgUnit(id, opts, function(err, orgUnit, response) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        assert.ok(!orgUnit);\n+        return callback();\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can be deleted\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to delete\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertDeleteOrgUnit = module.exports.assertDeleteOrgUnit = function(client, id, callback) {\n+    client.orgUnit.deleteOrgUnit(id, function(err, orgUnit, response) {\n+        assert.ok(!err);\n+        return callback(orgUnit);\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can not be deleted\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to delete\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertDeleteOrgUnitFails = module.exports.assertDeleteOrgUnitFails = function(client, id, code, callback) {\n+    client.orgUnit.deleteOrgUnit(id, function(err, orgUnit, response) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        assert.ok(!orgUnit);\n+        return callback();\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to retrieve\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnit = module.exports.assertGetOrgUnit = function(client, id, callback) {\n+    client.orgUnit.getOrgUnit(id, function(err, orgUnit, response) {\n+        assert.ok(!err);\n+        return callback(orgUnit);\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can not be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to retrieve\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnitFails = module.exports.assertGetOrgUnitFails = function(client, id, code, callback) {\n+    client.orgUnit.getOrgUnit(id, function(err, orgUnit, response) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        assert.ok(!orgUnit);\n+        return callback();\n+    });\n+};\n+\n+/**\n+ * Assert that the organisational units for an app can be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {number}             [app]                           The id of the app to get the organisational units for. Defaults to the current app\n+ * @param  {boolean}            [includeSeries]                 Whether to include the event series associated to the organisational units. Defaults to `false`\n+ * @param  {number}             [parent]                        The id of the parent to retrieve the organisational units for\n+ * @param  {string[]}           [type]                          The organisational unit type[s] to filter the organisational unit by\n+ * @param  {Function}           callback                        Standard callback function\n+ * @param  {OrgUnit}            callback.orgUnit                The retrieved organisational unit\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnits = module.exports.assertGetOrgUnits = function(client, app, includeSeries, parent, type, callback) {\n+    client.orgUnit.getOrgUnits(app, includeSeries, parent, type, function(err, orgUnits) {\n+        assert.ok(!err);\n+        assert.ok(orgUnits);\n+        return callback(orgUnits);\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit can not be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {number}             [app]                           The id of the app to get the organisational units for. Defaults to the current app\n+ * @param  {boolean}            [includeSeries]                 Whether to include the event series associated to the organisational units. Defaults to `false`\n+ * @param  {number}             [parent]                        The id of the parent to retrieve the organisational units for\n+ * @param  {string[]}           [type]                          The organisational unit type[s] to filter the organisational unit by\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnitsFails = module.exports.assertGetOrgUnitsFails = function(client, app, includeSeries, parent, type, code, callback) {\n+    client.orgUnit.getOrgUnits(app, includeSeries, parent, type, function(err, orgUnits) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        assert.ok(!orgUnits);\n+        return callback();\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit's series can be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit for which to retrieve the series\n+ * @param  {Number}             [limit]                         The maximum number of results to retrieve\n+ * @param  {Number}             [offset]                        The paging number of the results to retrieve\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnitSeries = module.exports.assertGetOrgUnitSeries = function(client, id, limit, offset, callback) {\n+    client.orgUnit.getOrgUnitSeries(id, limit, offset, function(err, series) {\n+        assert.ok(!err);\n+        return callback(series);\n+    });\n+};\n+\n+/**\n+ * Assert that an organisational unit's series can be retrieved\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit for which to retrieve the series\n+ * @param  {Number}             [limit]                         The maximum number of results to retrieve\n+ * @param  {Number}             [offset]                        The paging number of the results to retrieve\n+ * @param  {Number}             code                            The expected HTTP error code\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertGetOrgUnitSeriesFails = module.exports.assertGetOrgUnitSeriesFails = function(client, id, limit, offset, code, callback) {\n+    client.orgUnit.getOrgUnitSeries(id, limit, offset, function(err, series) {\n+        assert.ok(err);\n+        assert.strictEqual(err.code, code);\n+        return callback(series);\n+    });\n+};\n+\n+/**\n+ * Assert that one or more series can be added to an organisational unit\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to add the serie(s) to\n+ * @param  {Number[]}           serieIds                        The id of the serie(s) to add to the organisational unit\n+ * @param  {Function}           callback                        Standard callback function\n+ * @throws {AssertionError}                                     Error thrown when an assertion failed\n+ */\n+var assertAddOrgUnitSeries = module.exports.assertAddOrgUnitSeries = function(client, id, serieIds, callback) {\n+    client.orgUnit.addOrgUnitSeries(id, serieIds, function(err, body, response) {\n+        assert.ok(!err);\n+\n+        // Verify all series were added to the organisational unit\n+        assertGetOrgUnitSeries(client, id, 1000, null, function(allSeries) {\n+            _.each(serieIds, function(serieId) {\n+                assert.ok(_.find(allSeries, {'id': serieId}));\n+            });\n+\n+            return callback();\n+        });\n+    });\n+};\n+\n+/**\n+ * Assert that one or more series can not be added to an organisational unit\n+ *\n+ * @param  {RestClient}         client                          The REST client to make the request with\n+ * @param  {Number}             id                              The id of the organisational unit to add the serie(s) to\n+ * @param  {Number[]}           serieIds                        The id of the serie(s) to add to the organisational unit\n+ * @param  {Function}           callback                        Standard callback function\n+ * @param  {Number}             code                            The expected HTTP error code","path":"node_modules/gh-orgunit/tests/util.js","position":342,"original_position":342,"commit_id":"47cd969c993e2c89db32c6edaffeeea8f1112982","original_commit_id":"47cd969c993e2c89db32c6edaffeeea8f1112982","user":{"login":"nicolaasmatthijs","id":109850,"avatar_url":"https://avatars.githubusercontent.com/u/109850?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolaasmatthijs","html_url":"https://github.com/nicolaasmatthijs","followers_url":"https://api.github.com/users/nicolaasmatthijs/followers","following_url":"https://api.github.com/users/nicolaasmatthijs/following{/other_user}","gists_url":"https://api.github.com/users/nicolaasmatthijs/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolaasmatthijs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolaasmatthijs/subscriptions","organizations_url":"https://api.github.com/users/nicolaasmatthijs/orgs","repos_url":"https://api.github.com/users/nicolaasmatthijs/repos","events_url":"https://api.github.com/users/nicolaasmatthijs/events{/privacy}","received_events_url":"https://api.github.com/users/nicolaasmatthijs/received_events","type":"User","site_admin":false},"body":"`code` is before `callback`","created_at":"2014-12-06T01:37:21Z","updated_at":"2014-12-06T01:37:21Z","html_url":"https://github.com/fronteerio/grasshopper/pull/15#discussion_r21412473","pull_request_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15","_links":{"self":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/comments/21412473"},"html":{"href":"https://github.com/fronteerio/grasshopper/pull/15#discussion_r21412473"},"pull_request":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15"}}},"pull_request":{"url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15","id":25359678,"html_url":"https://github.com/fronteerio/grasshopper/pull/15","diff_url":"https://github.com/fronteerio/grasshopper/pull/15.diff","patch_url":"https://github.com/fronteerio/grasshopper/pull/15.patch","issue_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/15","number":15,"state":"open","locked":false,"title":"Organisational units, series, events and groups","user":{"login":"simong","id":92180,"avatar_url":"https://avatars.githubusercontent.com/u/92180?v=3","gravatar_id":"","url":"https://api.github.com/users/simong","html_url":"https://github.com/simong","followers_url":"https://api.github.com/users/simong/followers","following_url":"https://api.github.com/users/simong/following{/other_user}","gists_url":"https://api.github.com/users/simong/gists{/gist_id}","starred_url":"https://api.github.com/users/simong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/simong/subscriptions","organizations_url":"https://api.github.com/users/simong/orgs","repos_url":"https://api.github.com/users/simong/repos","events_url":"https://api.github.com/users/simong/events{/privacy}","received_events_url":"https://api.github.com/users/simong/received_events","type":"User","site_admin":false},"body":"Pretty massive PR including:\r\n\r\nOrganisational units:\r\n * CRUD\r\n * Getting / Adding / Deleting series from an organisational unit\r\n * Getting the organisational unit tree\r\n\r\nSeries:\r\n * CRUD\r\n * Adding / Deleting events to/from series\r\n\r\nEvents:\r\n * CRUD\r\n\r\n\r\nIt's pretty rought, but I'll go do some self-review (which hopefully gets in before @nicolaasmatthijs gets on the plane)","created_at":"2014-12-02T17:39:05Z","updated_at":"2014-12-06T01:37:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"927636a46da38dc1df37152a15d7db332e668959","assignee":{"login":"nicolaasmatthijs","id":109850,"avatar_url":"https://avatars.githubusercontent.com/u/109850?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolaasmatthijs","html_url":"https://github.com/nicolaasmatthijs","followers_url":"https://api.github.com/users/nicolaasmatthijs/followers","following_url":"https://api.github.com/users/nicolaasmatthijs/following{/other_user}","gists_url":"https://api.github.com/users/nicolaasmatthijs/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolaasmatthijs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolaasmatthijs/subscriptions","organizations_url":"https://api.github.com/users/nicolaasmatthijs/orgs","repos_url":"https://api.github.com/users/nicolaasmatthijs/repos","events_url":"https://api.github.com/users/nicolaasmatthijs/events{/privacy}","received_events_url":"https://api.github.com/users/nicolaasmatthijs/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15/commits","review_comments_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15/comments","review_comment_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls/comments/{number}","comments_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/15/comments","statuses_url":"https://api.github.com/repos/fronteerio/grasshopper/statuses/47cd969c993e2c89db32c6edaffeeea8f1112982","head":{"label":"fronteerio:groups-events-series","ref":"groups-events-series","sha":"47cd969c993e2c89db32c6edaffeeea8f1112982","user":{"login":"fronteerio","id":9116505,"avatar_url":"https://avatars.githubusercontent.com/u/9116505?v=3","gravatar_id":"","url":"https://api.github.com/users/fronteerio","html_url":"https://github.com/fronteerio","followers_url":"https://api.github.com/users/fronteerio/followers","following_url":"https://api.github.com/users/fronteerio/following{/other_user}","gists_url":"https://api.github.com/users/fronteerio/gists{/gist_id}","starred_url":"https://api.github.com/users/fronteerio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fronteerio/subscriptions","organizations_url":"https://api.github.com/users/fronteerio/orgs","repos_url":"https://api.github.com/users/fronteerio/repos","events_url":"https://api.github.com/users/fronteerio/events{/privacy}","received_events_url":"https://api.github.com/users/fronteerio/received_events","type":"Organization","site_admin":false},"repo":{"id":24999124,"name":"grasshopper","full_name":"fronteerio/grasshopper","owner":{"login":"fronteerio","id":9116505,"avatar_url":"https://avatars.githubusercontent.com/u/9116505?v=3","gravatar_id":"","url":"https://api.github.com/users/fronteerio","html_url":"https://github.com/fronteerio","followers_url":"https://api.github.com/users/fronteerio/followers","following_url":"https://api.github.com/users/fronteerio/following{/other_user}","gists_url":"https://api.github.com/users/fronteerio/gists{/gist_id}","starred_url":"https://api.github.com/users/fronteerio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fronteerio/subscriptions","organizations_url":"https://api.github.com/users/fronteerio/orgs","repos_url":"https://api.github.com/users/fronteerio/repos","events_url":"https://api.github.com/users/fronteerio/events{/privacy}","received_events_url":"https://api.github.com/users/fronteerio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/fronteerio/grasshopper","description":"Grasshopper Event Engine","fork":false,"url":"https://api.github.com/repos/fronteerio/grasshopper","forks_url":"https://api.github.com/repos/fronteerio/grasshopper/forks","keys_url":"https://api.github.com/repos/fronteerio/grasshopper/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fronteerio/grasshopper/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fronteerio/grasshopper/teams","hooks_url":"https://api.github.com/repos/fronteerio/grasshopper/hooks","issue_events_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/events{/number}","events_url":"https://api.github.com/repos/fronteerio/grasshopper/events","assignees_url":"https://api.github.com/repos/fronteerio/grasshopper/assignees{/user}","branches_url":"https://api.github.com/repos/fronteerio/grasshopper/branches{/branch}","tags_url":"https://api.github.com/repos/fronteerio/grasshopper/tags","blobs_url":"https://api.github.com/repos/fronteerio/grasshopper/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fronteerio/grasshopper/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fronteerio/grasshopper/git/refs{/sha}","trees_url":"https://api.github.com/repos/fronteerio/grasshopper/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fronteerio/grasshopper/statuses/{sha}","languages_url":"https://api.github.com/repos/fronteerio/grasshopper/languages","stargazers_url":"https://api.github.com/repos/fronteerio/grasshopper/stargazers","contributors_url":"https://api.github.com/repos/fronteerio/grasshopper/contributors","subscribers_url":"https://api.github.com/repos/fronteerio/grasshopper/subscribers","subscription_url":"https://api.github.com/repos/fronteerio/grasshopper/subscription","commits_url":"https://api.github.com/repos/fronteerio/grasshopper/commits{/sha}","git_commits_url":"https://api.github.com/repos/fronteerio/grasshopper/git/commits{/sha}","comments_url":"https://api.github.com/repos/fronteerio/grasshopper/comments{/number}","issue_comment_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/comments/{number}","contents_url":"https://api.github.com/repos/fronteerio/grasshopper/contents/{+path}","compare_url":"https://api.github.com/repos/fronteerio/grasshopper/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fronteerio/grasshopper/merges","archive_url":"https://api.github.com/repos/fronteerio/grasshopper/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fronteerio/grasshopper/downloads","issues_url":"https://api.github.com/repos/fronteerio/grasshopper/issues{/number}","pulls_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls{/number}","milestones_url":"https://api.github.com/repos/fronteerio/grasshopper/milestones{/number}","notifications_url":"https://api.github.com/repos/fronteerio/grasshopper/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fronteerio/grasshopper/labels{/name}","releases_url":"https://api.github.com/repos/fronteerio/grasshopper/releases{/id}","created_at":"2014-10-09T16:51:39Z","updated_at":"2014-12-05T11:00:25Z","pushed_at":"2014-12-05T13:20:07Z","git_url":"git://github.com/fronteerio/grasshopper.git","ssh_url":"git@github.com:fronteerio/grasshopper.git","clone_url":"https://github.com/fronteerio/grasshopper.git","svn_url":"https://github.com/fronteerio/grasshopper","homepage":null,"size":1656,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":4,"forks":3,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"fronteerio:master","ref":"master","sha":"249eef64e0e285a174f9a1168ec96ac9f083dc92","user":{"login":"fronteerio","id":9116505,"avatar_url":"https://avatars.githubusercontent.com/u/9116505?v=3","gravatar_id":"","url":"https://api.github.com/users/fronteerio","html_url":"https://github.com/fronteerio","followers_url":"https://api.github.com/users/fronteerio/followers","following_url":"https://api.github.com/users/fronteerio/following{/other_user}","gists_url":"https://api.github.com/users/fronteerio/gists{/gist_id}","starred_url":"https://api.github.com/users/fronteerio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fronteerio/subscriptions","organizations_url":"https://api.github.com/users/fronteerio/orgs","repos_url":"https://api.github.com/users/fronteerio/repos","events_url":"https://api.github.com/users/fronteerio/events{/privacy}","received_events_url":"https://api.github.com/users/fronteerio/received_events","type":"Organization","site_admin":false},"repo":{"id":24999124,"name":"grasshopper","full_name":"fronteerio/grasshopper","owner":{"login":"fronteerio","id":9116505,"avatar_url":"https://avatars.githubusercontent.com/u/9116505?v=3","gravatar_id":"","url":"https://api.github.com/users/fronteerio","html_url":"https://github.com/fronteerio","followers_url":"https://api.github.com/users/fronteerio/followers","following_url":"https://api.github.com/users/fronteerio/following{/other_user}","gists_url":"https://api.github.com/users/fronteerio/gists{/gist_id}","starred_url":"https://api.github.com/users/fronteerio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fronteerio/subscriptions","organizations_url":"https://api.github.com/users/fronteerio/orgs","repos_url":"https://api.github.com/users/fronteerio/repos","events_url":"https://api.github.com/users/fronteerio/events{/privacy}","received_events_url":"https://api.github.com/users/fronteerio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/fronteerio/grasshopper","description":"Grasshopper Event Engine","fork":false,"url":"https://api.github.com/repos/fronteerio/grasshopper","forks_url":"https://api.github.com/repos/fronteerio/grasshopper/forks","keys_url":"https://api.github.com/repos/fronteerio/grasshopper/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fronteerio/grasshopper/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fronteerio/grasshopper/teams","hooks_url":"https://api.github.com/repos/fronteerio/grasshopper/hooks","issue_events_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/events{/number}","events_url":"https://api.github.com/repos/fronteerio/grasshopper/events","assignees_url":"https://api.github.com/repos/fronteerio/grasshopper/assignees{/user}","branches_url":"https://api.github.com/repos/fronteerio/grasshopper/branches{/branch}","tags_url":"https://api.github.com/repos/fronteerio/grasshopper/tags","blobs_url":"https://api.github.com/repos/fronteerio/grasshopper/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fronteerio/grasshopper/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fronteerio/grasshopper/git/refs{/sha}","trees_url":"https://api.github.com/repos/fronteerio/grasshopper/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fronteerio/grasshopper/statuses/{sha}","languages_url":"https://api.github.com/repos/fronteerio/grasshopper/languages","stargazers_url":"https://api.github.com/repos/fronteerio/grasshopper/stargazers","contributors_url":"https://api.github.com/repos/fronteerio/grasshopper/contributors","subscribers_url":"https://api.github.com/repos/fronteerio/grasshopper/subscribers","subscription_url":"https://api.github.com/repos/fronteerio/grasshopper/subscription","commits_url":"https://api.github.com/repos/fronteerio/grasshopper/commits{/sha}","git_commits_url":"https://api.github.com/repos/fronteerio/grasshopper/git/commits{/sha}","comments_url":"https://api.github.com/repos/fronteerio/grasshopper/comments{/number}","issue_comment_url":"https://api.github.com/repos/fronteerio/grasshopper/issues/comments/{number}","contents_url":"https://api.github.com/repos/fronteerio/grasshopper/contents/{+path}","compare_url":"https://api.github.com/repos/fronteerio/grasshopper/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fronteerio/grasshopper/merges","archive_url":"https://api.github.com/repos/fronteerio/grasshopper/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fronteerio/grasshopper/downloads","issues_url":"https://api.github.com/repos/fronteerio/grasshopper/issues{/number}","pulls_url":"https://api.github.com/repos/fronteerio/grasshopper/pulls{/number}","milestones_url":"https://api.github.com/repos/fronteerio/grasshopper/milestones{/number}","notifications_url":"https://api.github.com/repos/fronteerio/grasshopper/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fronteerio/grasshopper/labels{/name}","releases_url":"https://api.github.com/repos/fronteerio/grasshopper/releases{/id}","created_at":"2014-10-09T16:51:39Z","updated_at":"2014-12-05T11:00:25Z","pushed_at":"2014-12-05T13:20:07Z","git_url":"git://github.com/fronteerio/grasshopper.git","ssh_url":"git@github.com:fronteerio/grasshopper.git","clone_url":"https://github.com/fronteerio/grasshopper.git","svn_url":"https://github.com/fronteerio/grasshopper","homepage":null,"size":1656,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":4,"forks":3,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15"},"html":{"href":"https://github.com/fronteerio/grasshopper/pull/15"},"issue":{"href":"https://api.github.com/repos/fronteerio/grasshopper/issues/15"},"comments":{"href":"https://api.github.com/repos/fronteerio/grasshopper/issues/15/comments"},"review_comments":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15/comments"},"review_comment":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/fronteerio/grasshopper/pulls/15/commits"},"statuses":{"href":"https://api.github.com/repos/fronteerio/grasshopper/statuses/47cd969c993e2c89db32c6edaffeeea8f1112982"}}}}