{"action":"created","comment":{"url":"https://api.github.com/repos/adsabs/bumblebee/pulls/comments/27839272","id":27839272,"diff_hunk":"@@ -0,0 +1,283 @@\n+/*\n+ * A generic class that lazy-loads User info\n+ */\n+define([\n+  'backbone',\n+  'js/components/api_request',\n+  'js/components/api_targets',\n+  'js/mixins/hardened',\n+  'js/components/generic_module',\n+  'js/mixins/dependon',\n+  'js/components/api_query',\n+  'js/components/user',\n+  'js/components/api_feedback',\n+  'js/mixins/discovery_bootstrap'\n+\n+], function\n+  (Backbone,\n+   ApiRequest,\n+   ApiTargets,\n+   Hardened,\n+   GenericModule,\n+   Dependon,\n+   ApiQuery,\n+   User,\n+   ApiFeedback,\n+   DiscoveryBootstrap\n+    ) {\n+\n+\n+  var SessionModel = Backbone.Model.extend({\n+\n+    defaults : function(){\n+      return {\n+        resetPasswordToken: undefined\n+      }\n+    }\n+\n+  });\n+\n+\n+  var Session = GenericModule.extend({\n+\n+    initialize: function (options) {\n+      var options = options || {};\n+      //right now, this will only be used if someone forgot their password\n+      this.model = new SessionModel();\n+\n+      this.test = options.test ? true : undefined;\n+\n+      _.bindAll(this, [\n+        \"loginSuccess\",\n+        \"loginFail\",\n+        \"registerSuccess\",\n+        \"registerFail\",\n+        \"resetPassword1Success\",\n+        \"resetPassword1Fail\",\n+        \"resetPassword2Success\",\n+        \"resetPassword2Fail\"\n+      ]);\n+    },\n+\n+    activate: function (beehive) {\n+      this.setBeeHive(beehive);\n+      this.setPubSub(beehive);\n+    },\n+\n+    /* methods that will be available to widgets */\n+\n+    //not sure if I need this\n+    isLoggedIn: function () {\n+      return this.getBeeHive().getObject(\"User\").isLoggedIn();\n+    },\n+\n+    login: function (data) {\n+      var request = new ApiRequest({\n+        target : ApiTargets.USER,\n+        query: new ApiQuery({}),\n+        options : {\n+          type : \"POST\",\n+          data: JSON.stringify(data),\n+          contentType : \"application/json\",\n+          done : this.loginSuccess,\n+          fail : this.loginFail,\n+          beforeSend: function(jqXHR, settings) {\n+            jqXHR.session = this;\n+          }\n+        }\n+      });\n+\n+     this.getBeeHive().getService(\"Api\").request(request);\n+    },\n+\n+    logout: function () {\n+      var request = new ApiRequest({\n+        target : ApiTargets.LOGOUT,\n+        query : new ApiQuery({}),\n+        options : {\n+          context : this,\n+          type : \"GET\",\n+          contentType : \"application/json\",\n+          done : this.logoutSuccess\n+        }\n+      });\n+      this.getBeeHive().getService(\"Api\").request(request);\n+    },\n+\n+    register: function (data) {\n+      var base_url;\n+      //add base_url to data so email redirects to right url\n+      if (!this.test){\n+        base_url = location.origin\n+        _.extend(data, {verify_url : location.origin + \"/#user/account/verify/\" + ApiTargets.REGISTER.match(/\\/(.*)$/)[1] });\n+      }\n+      else {\n+        base_url = \"location.origin\"\n+      }\n+      _.extend(data, {verify_url : base_url + \"/#user/account/verify/\" + ApiTargets.REGISTER.match(/\\/(.*)$/)[1] });\n+\n+      var request = new ApiRequest({\n+        target : ApiTargets.REGISTER,\n+        query : new ApiQuery({}),\n+        options : {\n+          type : \"POST\",\n+          data : JSON.stringify(data),\n+          contentType : \"application/json\",\n+          done : this.registerSuccess,\n+          fail : this.registerFail\n+        }\n+      });\n+      this.getBeeHive().getService(\"Api\").request(request);\n+    },\n+\n+    resetPassword1: function(data){\n+      var current_loc\n+      //add base_url to data so email redirects to right url\n+      if (!this.test){\n+        current_loc = location.origin;\n+      }\n+      else {\n+        current_loc = \"location.origin\";\n+      }\n+      _.extend(data, {reset_url : current_loc + \"/#user/account/verify/\" + ApiTargets.RESET_PASSWORD.match(/\\/(.*)$/)[1] });\n+\n+     var email = data.email;\n+     var data = _.omit(data, \"email\");\n+\n+      var request = new ApiRequest({\n+        target : ApiTargets.RESET_PASSWORD + \"/\" + email,\n+        query : new ApiQuery({}),\n+        options : {\n+          type : \"POST\",\n+          data : JSON.stringify(data),\n+          contentType : \"application/json\",\n+          done : this.resetPassword1Success,\n+          fail : this.resetPassword1Fail\n+        }\n+    });\n+      this.getBeeHive().getService(\"Api\").request(request);\n+    },\n+\n+    resetPassword2: function(data){\n+      var request = new ApiRequest({\n+        target : ApiTargets.RESET_PASSWORD + \"/\" + this.model.get(\"resetPasswordToken\"),\n+        query : new ApiQuery({}),\n+        options : {\n+          type : \"PUT\",\n+          data : JSON.stringify(data),\n+          contentType : \"application/json\",\n+          done : this.resetPassword2Success,\n+          fail : this.resetPassword2Fail\n+        }\n+      });\n+      this.getBeeHive().getService(\"Api\").request(request);\n+    },\n+\n+    setChangeToken : function(token){\n+      this.model.set(\"resetPasswordToken\", token);\n+    },\n+\n+    /* private methods */\n+\n+    loginSuccess: function (response, status, jqXHR) {\n+      var promise, pubsub;\n+      //reset auth token by contacting Bootstrap\n+      //this will log the user in\n+      promise = this.getApiAccess({reconnect: true});\n+      //notify interested widgets\n+      pubsub = this.getPubSub();\n+      promise.done(function(){\n+        pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"login_success\");\n+      });\n+    },\n+\n+    loginFail : function(xhr, status, errorThrown){\n+      var pubsub = this.getPubSub();\n+      var error =  xhr.responseJSON && xhr.responseJSON.error ?  xhr.responseJSON.error : \"error unknown\";\n+\n+      var message = 'Log in was unsuccessful (' + error + ')';\n+      pubsub.publish(pubsub.ALERT, new ApiFeedback({code: 0, msg: message, type : \"danger\", fade : true}));\n+      pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"login_fail\");\n+    },\n+\n+    logoutSuccess : function (response, status, jqXHR) {\n+      //set session state to logged out\n+      var user = this.getBeeHive().getObject(\"User\");\n+      user.completeLogOut();\n+\n+      var pubsub = this.getPubSub();\n+      pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"logout_success\");\n+    },\n+\n+    registerSuccess : function (response, status, jqXHR) {\n+      var pubsub = this.getPubSub();\n+      //authentication widget will show a \"success\" view in response to this user announcement\n+      pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"register_success\");\n+    },\n+\n+    registerFail : function(xhr, status, errorThrown){\n+      var pubsub = this.getPubSub();\n+      var error = (xhr.responseJSON && xhr.responseJSON.error)  ? xhr.responseJSON.error : \"error unknown\";\n+      var message = 'Registration was unsuccessful (' + error + ')';\n+      pubsub.publish(pubsub.ALERT, new ApiFeedback({code: 0, msg: message, type : \"danger\", fade: true}));\n+      pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"register_fail\");\n+    },\n+\n+    resetPassword1Success :function(response, status, jqXHR){\n+      var pubsub = this.getPubSub();\n+      pubsub.publish(this.pubsub.USER_ANNOUNCEMENT, \"reset_password_1_success\");\n+    },\n+\n+    resetPassword1Fail: function(xhr, status, errorThrown){\n+      var pubsub = this.getPubSub();\n+      var error = (xhr.responseJSON && xhr.responseJSON.error)  ? xhr.responseJSON.error : \"error unknown\";\n+      var message = 'password reset step 1 was unsucessful (' + error + ')';\n+      pubsub.publish(pubsub.ALERT, new ApiFeedback({code: 0, msg: message, type : \"danger\", fade: true}));\n+      pubsub.publish(this.pubsub.USER_ANNOUNCEMENT, \"reset_password_1_fail\");\n+    },\n+\n+    resetPassword2Success :function(response, status, jqXHR){\n+\n+      var promise, pubsub;\n+      //reset auth token by contacting Bootstrap\n+      //this will log the user in\n+      promise = this.getApiAccess({reconnect : true});\n+      //notify interested widgets\n+      pubsub = this.getPubSub();\n+      promise.done(function(){\n+        pubsub.publish(pubsub.USER_ANNOUNCEMENT, \"reset_password_2_success\");\n+      });\n+\n+      var message = \"Your password has been successfully reset\";\n+      pubsub.publish(pubsub.ALERT, new ApiFeedback({code: 0, msg: message, type : \"success\", modal: true}));\n+\n+    },\n+\n+    resetPassword2Fail: function(xhr, status, errorThrown){\n+      var pubsub = this.getPubSub();\n+      var error = (xhr.responseJSON && xhr.responseJSON.error)  ? xhr.responseJSON.error : \"error unknown\";\n+      var message = 'password reset step 2 was unsucessful (' + error + ')';\n+      pubsub.publish(pubsub.ALERT, new ApiFeedback({code: 0, msg: message, type : \"danger\", fade: true}));\n+      pubsub.publish(this.pubsub.USER_ANNOUNCEMENT, \"reset_password_2_fail\");\n+    },\n+\n+\n+    hardenedInterface: {\n+      isLoggedIn: \"is the user authenticated\",\n+      login: \"log the user in\",\n+      logout: \"log the user out\",\n+      register: \"registers a new user\",\n+      resetPassword1 : \"sends an email to account\",\n+      resetPassword2 : \"updates the password\",\n+      setChangeToken : \"the router stores the token to reset password here\"\n+    }\n+\n+  });\n+\n+  _.extend(Session.prototype, Dependon.BeeHive, Dependon.PubSub);\n+  _.extend(Session.prototype, Hardened);\n+  _.extend(Session.prototype, DiscoveryBootstrap);","path":"src/js/components/session.js","position":279,"original_position":279,"commit_id":"dbaa3b4548cd4ab71903c5858bb8c2f2be4c1363","original_commit_id":"dbaa3b4548cd4ab71903c5858bb8c2f2be4c1363","user":{"login":"romanchyla","id":411794,"avatar_url":"https://avatars.githubusercontent.com/u/411794?v=3","gravatar_id":"","url":"https://api.github.com/users/romanchyla","html_url":"https://github.com/romanchyla","followers_url":"https://api.github.com/users/romanchyla/followers","following_url":"https://api.github.com/users/romanchyla/following{/other_user}","gists_url":"https://api.github.com/users/romanchyla/gists{/gist_id}","starred_url":"https://api.github.com/users/romanchyla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/romanchyla/subscriptions","organizations_url":"https://api.github.com/users/romanchyla/orgs","repos_url":"https://api.github.com/users/romanchyla/repos","events_url":"https://api.github.com/users/romanchyla/events{/privacy}","received_events_url":"https://api.github.com/users/romanchyla/received_events","type":"User","site_admin":false},"body":"you should extract the parts of DiscoveryBootstrap into a separate module (or existing mixin)","created_at":"2015-04-06T23:07:21Z","updated_at":"2015-04-06T23:07:21Z","html_url":"https://github.com/adsabs/bumblebee/pull/303#discussion_r27839272","pull_request_url":"https://api.github.com/repos/adsabs/bumblebee/pulls/303","_links":{"self":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/comments/27839272"},"html":{"href":"https://github.com/adsabs/bumblebee/pull/303#discussion_r27839272"},"pull_request":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/303"}}},"pull_request":{"url":"https://api.github.com/repos/adsabs/bumblebee/pulls/303","id":31552069,"html_url":"https://github.com/adsabs/bumblebee/pull/303","diff_url":"https://github.com/adsabs/bumblebee/pull/303.diff","patch_url":"https://github.com/adsabs/bumblebee/pull/303.patch","issue_url":"https://api.github.com/repos/adsabs/bumblebee/issues/303","number":303,"state":"open","locked":false,"title":"User-","user":{"login":"aholachek","id":3680488,"avatar_url":"https://avatars.githubusercontent.com/u/3680488?v=3","gravatar_id":"","url":"https://api.github.com/users/aholachek","html_url":"https://github.com/aholachek","followers_url":"https://api.github.com/users/aholachek/followers","following_url":"https://api.github.com/users/aholachek/following{/other_user}","gists_url":"https://api.github.com/users/aholachek/gists{/gist_id}","starred_url":"https://api.github.com/users/aholachek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aholachek/subscriptions","organizations_url":"https://api.github.com/users/aholachek/orgs","repos_url":"https://api.github.com/users/aholachek/repos","events_url":"https://api.github.com/users/aholachek/events{/privacy}","received_events_url":"https://api.github.com/users/aholachek/received_events","type":"User","site_admin":false},"body":"Hi Roman,\r\n\r\nUnfortunately this is still not ready to be merged, but can you take a look at the basic structure and give me some feedback? It is working, but the tests aren't as comprehensive as they should be (although the ones I do have pass), and I still haven't finished dealing with the email confirmation views.","created_at":"2015-03-19T18:30:19Z","updated_at":"2015-04-06T23:07:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fa7a22f8a8084446d1b7106243f374353f998af1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/adsabs/bumblebee/pulls/303/commits","review_comments_url":"https://api.github.com/repos/adsabs/bumblebee/pulls/303/comments","review_comment_url":"https://api.github.com/repos/adsabs/bumblebee/pulls/comments{/number}","comments_url":"https://api.github.com/repos/adsabs/bumblebee/issues/303/comments","statuses_url":"https://api.github.com/repos/adsabs/bumblebee/statuses/dbaa3b4548cd4ab71903c5858bb8c2f2be4c1363","head":{"label":"aholachek:user","ref":"user","sha":"dbaa3b4548cd4ab71903c5858bb8c2f2be4c1363","user":{"login":"aholachek","id":3680488,"avatar_url":"https://avatars.githubusercontent.com/u/3680488?v=3","gravatar_id":"","url":"https://api.github.com/users/aholachek","html_url":"https://github.com/aholachek","followers_url":"https://api.github.com/users/aholachek/followers","following_url":"https://api.github.com/users/aholachek/following{/other_user}","gists_url":"https://api.github.com/users/aholachek/gists{/gist_id}","starred_url":"https://api.github.com/users/aholachek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aholachek/subscriptions","organizations_url":"https://api.github.com/users/aholachek/orgs","repos_url":"https://api.github.com/users/aholachek/repos","events_url":"https://api.github.com/users/aholachek/events{/privacy}","received_events_url":"https://api.github.com/users/aholachek/received_events","type":"User","site_admin":false},"repo":{"id":17230633,"name":"bumblebee","full_name":"aholachek/bumblebee","owner":{"login":"aholachek","id":3680488,"avatar_url":"https://avatars.githubusercontent.com/u/3680488?v=3","gravatar_id":"","url":"https://api.github.com/users/aholachek","html_url":"https://github.com/aholachek","followers_url":"https://api.github.com/users/aholachek/followers","following_url":"https://api.github.com/users/aholachek/following{/other_user}","gists_url":"https://api.github.com/users/aholachek/gists{/gist_id}","starred_url":"https://api.github.com/users/aholachek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aholachek/subscriptions","organizations_url":"https://api.github.com/users/aholachek/orgs","repos_url":"https://api.github.com/users/aholachek/repos","events_url":"https://api.github.com/users/aholachek/events{/privacy}","received_events_url":"https://api.github.com/users/aholachek/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/aholachek/bumblebee","description":"Clever face for BEER","fork":true,"url":"https://api.github.com/repos/aholachek/bumblebee","forks_url":"https://api.github.com/repos/aholachek/bumblebee/forks","keys_url":"https://api.github.com/repos/aholachek/bumblebee/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aholachek/bumblebee/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aholachek/bumblebee/teams","hooks_url":"https://api.github.com/repos/aholachek/bumblebee/hooks","issue_events_url":"https://api.github.com/repos/aholachek/bumblebee/issues/events{/number}","events_url":"https://api.github.com/repos/aholachek/bumblebee/events","assignees_url":"https://api.github.com/repos/aholachek/bumblebee/assignees{/user}","branches_url":"https://api.github.com/repos/aholachek/bumblebee/branches{/branch}","tags_url":"https://api.github.com/repos/aholachek/bumblebee/tags","blobs_url":"https://api.github.com/repos/aholachek/bumblebee/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aholachek/bumblebee/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aholachek/bumblebee/git/refs{/sha}","trees_url":"https://api.github.com/repos/aholachek/bumblebee/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aholachek/bumblebee/statuses/{sha}","languages_url":"https://api.github.com/repos/aholachek/bumblebee/languages","stargazers_url":"https://api.github.com/repos/aholachek/bumblebee/stargazers","contributors_url":"https://api.github.com/repos/aholachek/bumblebee/contributors","subscribers_url":"https://api.github.com/repos/aholachek/bumblebee/subscribers","subscription_url":"https://api.github.com/repos/aholachek/bumblebee/subscription","commits_url":"https://api.github.com/repos/aholachek/bumblebee/commits{/sha}","git_commits_url":"https://api.github.com/repos/aholachek/bumblebee/git/commits{/sha}","comments_url":"https://api.github.com/repos/aholachek/bumblebee/comments{/number}","issue_comment_url":"https://api.github.com/repos/aholachek/bumblebee/issues/comments{/number}","contents_url":"https://api.github.com/repos/aholachek/bumblebee/contents/{+path}","compare_url":"https://api.github.com/repos/aholachek/bumblebee/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aholachek/bumblebee/merges","archive_url":"https://api.github.com/repos/aholachek/bumblebee/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aholachek/bumblebee/downloads","issues_url":"https://api.github.com/repos/aholachek/bumblebee/issues{/number}","pulls_url":"https://api.github.com/repos/aholachek/bumblebee/pulls{/number}","milestones_url":"https://api.github.com/repos/aholachek/bumblebee/milestones{/number}","notifications_url":"https://api.github.com/repos/aholachek/bumblebee/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aholachek/bumblebee/labels{/name}","releases_url":"https://api.github.com/repos/aholachek/bumblebee/releases{/id}","created_at":"2014-02-27T00:13:20Z","updated_at":"2015-03-05T13:36:43Z","pushed_at":"2015-04-06T20:36:33Z","git_url":"git://github.com/aholachek/bumblebee.git","ssh_url":"git@github.com:aholachek/bumblebee.git","clone_url":"https://github.com/aholachek/bumblebee.git","svn_url":"https://github.com/aholachek/bumblebee","homepage":null,"size":8535,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"adsabs:master","ref":"master","sha":"63381b8b9d3fc98ca59dc894e1795f3980db4a12","user":{"login":"adsabs","id":1004839,"avatar_url":"https://avatars.githubusercontent.com/u/1004839?v=3","gravatar_id":"","url":"https://api.github.com/users/adsabs","html_url":"https://github.com/adsabs","followers_url":"https://api.github.com/users/adsabs/followers","following_url":"https://api.github.com/users/adsabs/following{/other_user}","gists_url":"https://api.github.com/users/adsabs/gists{/gist_id}","starred_url":"https://api.github.com/users/adsabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adsabs/subscriptions","organizations_url":"https://api.github.com/users/adsabs/orgs","repos_url":"https://api.github.com/users/adsabs/repos","events_url":"https://api.github.com/users/adsabs/events{/privacy}","received_events_url":"https://api.github.com/users/adsabs/received_events","type":"Organization","site_admin":false},"repo":{"id":17075030,"name":"bumblebee","full_name":"adsabs/bumblebee","owner":{"login":"adsabs","id":1004839,"avatar_url":"https://avatars.githubusercontent.com/u/1004839?v=3","gravatar_id":"","url":"https://api.github.com/users/adsabs","html_url":"https://github.com/adsabs","followers_url":"https://api.github.com/users/adsabs/followers","following_url":"https://api.github.com/users/adsabs/following{/other_user}","gists_url":"https://api.github.com/users/adsabs/gists{/gist_id}","starred_url":"https://api.github.com/users/adsabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adsabs/subscriptions","organizations_url":"https://api.github.com/users/adsabs/orgs","repos_url":"https://api.github.com/users/adsabs/repos","events_url":"https://api.github.com/users/adsabs/events{/privacy}","received_events_url":"https://api.github.com/users/adsabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/adsabs/bumblebee","description":"Clever face for ADS","fork":false,"url":"https://api.github.com/repos/adsabs/bumblebee","forks_url":"https://api.github.com/repos/adsabs/bumblebee/forks","keys_url":"https://api.github.com/repos/adsabs/bumblebee/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adsabs/bumblebee/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adsabs/bumblebee/teams","hooks_url":"https://api.github.com/repos/adsabs/bumblebee/hooks","issue_events_url":"https://api.github.com/repos/adsabs/bumblebee/issues/events{/number}","events_url":"https://api.github.com/repos/adsabs/bumblebee/events","assignees_url":"https://api.github.com/repos/adsabs/bumblebee/assignees{/user}","branches_url":"https://api.github.com/repos/adsabs/bumblebee/branches{/branch}","tags_url":"https://api.github.com/repos/adsabs/bumblebee/tags","blobs_url":"https://api.github.com/repos/adsabs/bumblebee/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adsabs/bumblebee/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adsabs/bumblebee/git/refs{/sha}","trees_url":"https://api.github.com/repos/adsabs/bumblebee/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adsabs/bumblebee/statuses/{sha}","languages_url":"https://api.github.com/repos/adsabs/bumblebee/languages","stargazers_url":"https://api.github.com/repos/adsabs/bumblebee/stargazers","contributors_url":"https://api.github.com/repos/adsabs/bumblebee/contributors","subscribers_url":"https://api.github.com/repos/adsabs/bumblebee/subscribers","subscription_url":"https://api.github.com/repos/adsabs/bumblebee/subscription","commits_url":"https://api.github.com/repos/adsabs/bumblebee/commits{/sha}","git_commits_url":"https://api.github.com/repos/adsabs/bumblebee/git/commits{/sha}","comments_url":"https://api.github.com/repos/adsabs/bumblebee/comments{/number}","issue_comment_url":"https://api.github.com/repos/adsabs/bumblebee/issues/comments{/number}","contents_url":"https://api.github.com/repos/adsabs/bumblebee/contents/{+path}","compare_url":"https://api.github.com/repos/adsabs/bumblebee/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adsabs/bumblebee/merges","archive_url":"https://api.github.com/repos/adsabs/bumblebee/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adsabs/bumblebee/downloads","issues_url":"https://api.github.com/repos/adsabs/bumblebee/issues{/number}","pulls_url":"https://api.github.com/repos/adsabs/bumblebee/pulls{/number}","milestones_url":"https://api.github.com/repos/adsabs/bumblebee/milestones{/number}","notifications_url":"https://api.github.com/repos/adsabs/bumblebee/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adsabs/bumblebee/labels{/name}","releases_url":"https://api.github.com/repos/adsabs/bumblebee/releases{/id}","created_at":"2014-02-22T00:59:37Z","updated_at":"2015-04-06T20:42:23Z","pushed_at":"2015-04-06T20:42:23Z","git_url":"git://github.com/adsabs/bumblebee.git","ssh_url":"git@github.com:adsabs/bumblebee.git","clone_url":"https://github.com/adsabs/bumblebee.git","svn_url":"https://github.com/adsabs/bumblebee","homepage":"","size":10447,"stargazers_count":7,"watchers_count":7,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":8,"mirror_url":null,"open_issues_count":29,"forks":8,"open_issues":29,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/303"},"html":{"href":"https://github.com/adsabs/bumblebee/pull/303"},"issue":{"href":"https://api.github.com/repos/adsabs/bumblebee/issues/303"},"comments":{"href":"https://api.github.com/repos/adsabs/bumblebee/issues/303/comments"},"review_comments":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/303/comments"},"review_comment":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/adsabs/bumblebee/pulls/303/commits"},"statuses":{"href":"https://api.github.com/repos/adsabs/bumblebee/statuses/dbaa3b4548cd4ab71903c5858bb8c2f2be4c1363"}}}}