{"action":"created","comment":{"url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/comments/206661050","pull_request_review_id":142117426,"id":206661050,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNjY2MTA1MA==","diff_hunk":"@@ -9,94 +9,106 @@\n // for download online.\n 'use strict';\n \n-const logger = require('../utils/logger')('air-quality');\n-const API_KEY = process.env.AIR_NOW_KEY;\n-const path = require('path');\n-const fs = require('fs');\n-const geolib = require('geolib');\n-const request = require('request');\n-\n-var baseUrl = 'http://www.airnowapi.org/aq/forecast/zipCode/?format=application/' + \n-        'json&API_KEY=' + API_KEY,\n-    reportingLocations = (function() {  // Parse csv\n-        var locationPath = path.join(__dirname, 'air-reporting-locations.csv'),\n-            text = fs.readFileSync(locationPath, 'utf8'),\n-            rawLocations = text.split('\\n');\n-\n-        rawLocations.pop();  // Remove trailing \\n\n-        rawLocations.shift();  // Remove header\n-        return rawLocations\n-            .map(function(line) {\n-                var data = line.split('|');\n-                return {\n-                    city: data[0],\n-                    state: data[1],\n-                    zipcode: data[2],\n-                    latitude: +data[3],\n-                    longitude: +data[4]\n-                };\n-            });\n-    })();\n-\n-\n-var getClosestReportingLocation = function(lat, lng) {\n-    var nearest = geolib.findNearest({latitude: lat, longitude: lng}, reportingLocations),\n+const ApiConsumer = require('../utils/api-consumer');\n+\n+var debug = require('debug'),\n+    error = debug('netsblox:rpc:air-quality:error'),\n+    trace = debug('netsblox:rpc:air-quality:trace'),\n+    API_KEY = process.env.AIR_NOW_KEY,\n+    path = require('path'),\n+    fs = require('fs'),\n+    geolib = require('geolib');\n+\n+const AirConsumer = new ApiConsumer('air-quality', `http://www.airnowapi.org/aq/observation/zipCode/current/?format=application/json&API_KEY=${API_KEY}`,{cache: {ttl: 30*60}});\n+\n+var reportingLocations = (function() {  // Parse csv\n+    var locationPath = path.join(__dirname, 'air-reporting-locations.csv'),\n+        text = fs.readFileSync(locationPath, 'utf8'),\n+        rawLocations = text.split('\\n');\n+\n+    rawLocations.pop();  // Remove trailing \\n\n+    rawLocations.shift();  // Remove header\n+    return rawLocations\n+        .map(function(line) {\n+            var data = line.split('|');\n+            return {\n+                city: data[0],\n+                state: data[1],\n+                zipcode: data[2],\n+                latitude: +data[3],\n+                longitude: +data[4]\n+            };\n+        });\n+})();\n+\n+/**\n+ * Get ZIP code of closest reporting location for coordinates\n+ * @param {Latitude} latitude latitude of location\n+ * @param {Longitude} longitude Longitude of location\n+ * @returns {Number} ZIP code of closest location\n+ */\n+AirConsumer._getClosestReportingLocation = function(latitude, longitude) {\n+    var nearest = geolib.findNearest({latitude: latitude, longitude: longitude}, reportingLocations),\n         city = reportingLocations[nearest.key].city,\n         state = reportingLocations[nearest.key].state,\n         zipcode = reportingLocations[nearest.key].zipcode;\n-    logger.trace('Nearest reporting location is ' + city + ', ' + state);\n+    trace('Nearest reporting location is ' + city + ', ' + state);\n     return zipcode;\n };\n \n-var qualityIndex = function(latitude, longitude) {\n-    var response = this.response,\n-        nearest,\n-        url;\n+/**\n+ * Get air quality index of closest reporting location for coordinates\n+ * @param {Latitude} latitude latitude of location\n+ * @param {Longitude} longitude Longitude of location\n+ * @returns {Number} AQI of closest station\n+ */\n+AirConsumer.qualityIndex = function(latitude, longitude) {\n+    var nearest = this._getClosestReportingLocation(latitude, longitude);\n \n-    logger.trace(`Requesting air quality at ${latitude}, ${longitude}`);\n-    if (!latitude || !longitude) {\n-        return response.status(400).send('ERROR: missing latitude or longitude');\n-    }\n+    trace(`Requesting air quality at ${latitude}, ${longitude} (nearest station: ${nearest})`);\n \n-    nearest = getClosestReportingLocation(latitude, longitude);\n-    url = baseUrl + '&zipCode=' + nearest;\n-\n-    logger.trace('Requesting air quality at '+ nearest);\n-    \n-    request(url, (err, res, body) => {\n-        var aqi = -1,\n-            code = err ? 500 : res.statusCode;\n-\n-        try {\n-            body = JSON.parse(body).shift();\n-            if (body && body.AQI) {\n-                aqi = +body.AQI;\n-                logger.trace('Air quality at '+ nearest + ' is ' + aqi);\n-            }\n-        } catch (e) {\n-            // Just send -1 if anything bad happens\n-            logger.error('Could not get air quality index: ', e);\n-        }\n+    return this.qualityIndexByZip(nearest);\n+};\n \n-        response.status(code).json(aqi);\n-    });\n+/**\n+ * Get air quality index of closest reporting location for ZIP code\n+ * @param {BoundedNumber<0,99999>} zipCode ZIP code of location\n+ * @returns {Number} AQI of closest station\n+ */\n+AirConsumer.qualityIndexByZip = function(zipCode) {","path":"src/server/rpc/procedures/air-quality/air-quality.js","position":null,"original_position":132,"commit_id":"8c5410fe2f3357f910805528976aebdb31bff5f8","original_commit_id":"c3c3ae6335a8ef0d3c01402fd575ae33bf932af7","user":{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false},"body":"It's intended, name is changed.","created_at":"2018-07-31T19:50:37Z","updated_at":"2018-07-31T19:50:37Z","html_url":"https://github.com/NetsBlox/NetsBlox/pull/2178#discussion_r206661050","pull_request_url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/comments/206661050"},"html":{"href":"https://github.com/NetsBlox/NetsBlox/pull/2178#discussion_r206661050"},"pull_request":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178"}},"in_reply_to_id":206559983},"pull_request":{"url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178","id":204910952,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA0OTEwOTUy","html_url":"https://github.com/NetsBlox/NetsBlox/pull/2178","diff_url":"https://github.com/NetsBlox/NetsBlox/pull/2178.diff","patch_url":"https://github.com/NetsBlox/NetsBlox/pull/2178.patch","issue_url":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/2178","number":2178,"state":"open","locked":false,"title":"RPC Refactor WIP (#2155)","user":{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false},"body":"Small batch to get some of them included sooner.\r\n\r\nAdds annotations to:\r\n- air-quality\r\n- battleship\r\n- british-museum\r\n- earthquake\r\n- water-watch\r\n\r\n\r\nMoved to APIConsumer:\r\n- air-quality (with updated tests)\r\n","created_at":"2018-07-30T19:50:14Z","updated_at":"2018-07-31T19:50:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cbd14bbcb5a64872609ea6cfd42da8620a168e8d","assignee":{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false},"assignees":[{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":264605394,"node_id":"MDU6TGFiZWwyNjQ2MDUzOTQ=","url":"https://api.github.com/repos/NetsBlox/NetsBlox/labels/rpcs","name":"rpcs","color":"d4c5f9","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178/commits","review_comments_url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178/comments","review_comment_url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/2178/comments","statuses_url":"https://api.github.com/repos/NetsBlox/NetsBlox/statuses/8c5410fe2f3357f910805528976aebdb31bff5f8","head":{"label":"gsteinLTU:refactor-part1","ref":"refactor-part1","sha":"8c5410fe2f3357f910805528976aebdb31bff5f8","user":{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false},"repo":{"id":126871168,"node_id":"MDEwOlJlcG9zaXRvcnkxMjY4NzExNjg=","name":"NetsBlox","full_name":"gsteinLTU/NetsBlox","owner":{"login":"gsteinLTU","id":7331488,"node_id":"MDQ6VXNlcjczMzE0ODg=","avatar_url":"https://avatars3.githubusercontent.com/u/7331488?v=4","gravatar_id":"","url":"https://api.github.com/users/gsteinLTU","html_url":"https://github.com/gsteinLTU","followers_url":"https://api.github.com/users/gsteinLTU/followers","following_url":"https://api.github.com/users/gsteinLTU/following{/other_user}","gists_url":"https://api.github.com/users/gsteinLTU/gists{/gist_id}","starred_url":"https://api.github.com/users/gsteinLTU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsteinLTU/subscriptions","organizations_url":"https://api.github.com/users/gsteinLTU/orgs","repos_url":"https://api.github.com/users/gsteinLTU/repos","events_url":"https://api.github.com/users/gsteinLTU/events{/privacy}","received_events_url":"https://api.github.com/users/gsteinLTU/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gsteinLTU/NetsBlox","description":"a networked visual programming language based on Snap!","fork":true,"url":"https://api.github.com/repos/gsteinLTU/NetsBlox","forks_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/forks","keys_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/teams","hooks_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/hooks","issue_events_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/issues/events{/number}","events_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/events","assignees_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/assignees{/user}","branches_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/branches{/branch}","tags_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/tags","blobs_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/git/refs{/sha}","trees_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/statuses/{sha}","languages_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/languages","stargazers_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/stargazers","contributors_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/contributors","subscribers_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/subscribers","subscription_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/subscription","commits_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/commits{/sha}","git_commits_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/git/commits{/sha}","comments_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/comments{/number}","issue_comment_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/issues/comments{/number}","contents_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/contents/{+path}","compare_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/merges","archive_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/downloads","issues_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/issues{/number}","pulls_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/pulls{/number}","milestones_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/milestones{/number}","notifications_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/labels{/name}","releases_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/releases{/id}","deployments_url":"https://api.github.com/repos/gsteinLTU/NetsBlox/deployments","created_at":"2018-03-26T18:18:32Z","updated_at":"2018-07-20T17:22:24Z","pushed_at":"2018-07-31T19:50:09Z","git_url":"git://github.com/gsteinLTU/NetsBlox.git","ssh_url":"git@github.com:gsteinLTU/NetsBlox.git","clone_url":"https://github.com/gsteinLTU/NetsBlox.git","svn_url":"https://github.com/gsteinLTU/NetsBlox","homepage":"https://www.netsblox.org","size":55098,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"NetsBlox:master","ref":"master","sha":"01fe5010f5c081f298a5eb9251b84d333efd20e5","user":{"login":"NetsBlox","id":11653971,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNjUzOTcx","avatar_url":"https://avatars3.githubusercontent.com/u/11653971?v=4","gravatar_id":"","url":"https://api.github.com/users/NetsBlox","html_url":"https://github.com/NetsBlox","followers_url":"https://api.github.com/users/NetsBlox/followers","following_url":"https://api.github.com/users/NetsBlox/following{/other_user}","gists_url":"https://api.github.com/users/NetsBlox/gists{/gist_id}","starred_url":"https://api.github.com/users/NetsBlox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NetsBlox/subscriptions","organizations_url":"https://api.github.com/users/NetsBlox/orgs","repos_url":"https://api.github.com/users/NetsBlox/repos","events_url":"https://api.github.com/users/NetsBlox/events{/privacy}","received_events_url":"https://api.github.com/users/NetsBlox/received_events","type":"Organization","site_admin":false},"repo":{"id":32888294,"node_id":"MDEwOlJlcG9zaXRvcnkzMjg4ODI5NA==","name":"NetsBlox","full_name":"NetsBlox/NetsBlox","owner":{"login":"NetsBlox","id":11653971,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNjUzOTcx","avatar_url":"https://avatars3.githubusercontent.com/u/11653971?v=4","gravatar_id":"","url":"https://api.github.com/users/NetsBlox","html_url":"https://github.com/NetsBlox","followers_url":"https://api.github.com/users/NetsBlox/followers","following_url":"https://api.github.com/users/NetsBlox/following{/other_user}","gists_url":"https://api.github.com/users/NetsBlox/gists{/gist_id}","starred_url":"https://api.github.com/users/NetsBlox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NetsBlox/subscriptions","organizations_url":"https://api.github.com/users/NetsBlox/orgs","repos_url":"https://api.github.com/users/NetsBlox/repos","events_url":"https://api.github.com/users/NetsBlox/events{/privacy}","received_events_url":"https://api.github.com/users/NetsBlox/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NetsBlox/NetsBlox","description":"a networked visual programming language based on Snap!","fork":false,"url":"https://api.github.com/repos/NetsBlox/NetsBlox","forks_url":"https://api.github.com/repos/NetsBlox/NetsBlox/forks","keys_url":"https://api.github.com/repos/NetsBlox/NetsBlox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NetsBlox/NetsBlox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NetsBlox/NetsBlox/teams","hooks_url":"https://api.github.com/repos/NetsBlox/NetsBlox/hooks","issue_events_url":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/events{/number}","events_url":"https://api.github.com/repos/NetsBlox/NetsBlox/events","assignees_url":"https://api.github.com/repos/NetsBlox/NetsBlox/assignees{/user}","branches_url":"https://api.github.com/repos/NetsBlox/NetsBlox/branches{/branch}","tags_url":"https://api.github.com/repos/NetsBlox/NetsBlox/tags","blobs_url":"https://api.github.com/repos/NetsBlox/NetsBlox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NetsBlox/NetsBlox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NetsBlox/NetsBlox/git/refs{/sha}","trees_url":"https://api.github.com/repos/NetsBlox/NetsBlox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NetsBlox/NetsBlox/statuses/{sha}","languages_url":"https://api.github.com/repos/NetsBlox/NetsBlox/languages","stargazers_url":"https://api.github.com/repos/NetsBlox/NetsBlox/stargazers","contributors_url":"https://api.github.com/repos/NetsBlox/NetsBlox/contributors","subscribers_url":"https://api.github.com/repos/NetsBlox/NetsBlox/subscribers","subscription_url":"https://api.github.com/repos/NetsBlox/NetsBlox/subscription","commits_url":"https://api.github.com/repos/NetsBlox/NetsBlox/commits{/sha}","git_commits_url":"https://api.github.com/repos/NetsBlox/NetsBlox/git/commits{/sha}","comments_url":"https://api.github.com/repos/NetsBlox/NetsBlox/comments{/number}","issue_comment_url":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/comments{/number}","contents_url":"https://api.github.com/repos/NetsBlox/NetsBlox/contents/{+path}","compare_url":"https://api.github.com/repos/NetsBlox/NetsBlox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NetsBlox/NetsBlox/merges","archive_url":"https://api.github.com/repos/NetsBlox/NetsBlox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NetsBlox/NetsBlox/downloads","issues_url":"https://api.github.com/repos/NetsBlox/NetsBlox/issues{/number}","pulls_url":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls{/number}","milestones_url":"https://api.github.com/repos/NetsBlox/NetsBlox/milestones{/number}","notifications_url":"https://api.github.com/repos/NetsBlox/NetsBlox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NetsBlox/NetsBlox/labels{/name}","releases_url":"https://api.github.com/repos/NetsBlox/NetsBlox/releases{/id}","deployments_url":"https://api.github.com/repos/NetsBlox/NetsBlox/deployments","created_at":"2015-03-25T20:13:41Z","updated_at":"2018-07-31T19:37:15Z","pushed_at":"2018-07-31T19:50:11Z","git_url":"git://github.com/NetsBlox/NetsBlox.git","ssh_url":"git@github.com:NetsBlox/NetsBlox.git","clone_url":"https://github.com/NetsBlox/NetsBlox.git","svn_url":"https://github.com/NetsBlox/NetsBlox","homepage":"https://www.netsblox.org","size":55173,"stargazers_count":31,"watchers_count":31,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":12,"mirror_url":null,"archived":false,"open_issues_count":94,"license":null,"forks":12,"open_issues":94,"watchers":31,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178"},"html":{"href":"https://github.com/NetsBlox/NetsBlox/pull/2178"},"issue":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/2178"},"comments":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/issues/2178/comments"},"review_comments":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178/comments"},"review_comment":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/pulls/2178/commits"},"statuses":{"href":"https://api.github.com/repos/NetsBlox/NetsBlox/statuses/8c5410fe2f3357f910805528976aebdb31bff5f8"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"gsteinLTU"}}