+
+ Ofangreindar upplsingar fela ekki sr fjrfestingarrgjf ea hvatningu til viskipta. Allar fjrfestingar fela sr httu og gefur sguleg vxtun ekki endilega vsbendingu um framtarvxtun. M5 ber ekki byrg hugsanlegum villum, tfum upplsingum ea kvrunum sem byggar eru upplsingunum.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/endpoints/cyclecounter/documentation.md b/endpoints/cyclecounter/documentation.md
new file mode 100644
index 00000000..89ebe412
--- /dev/null
+++ b/endpoints/cyclecounter/documentation.md
@@ -0,0 +1,9 @@
+# Bicyclecounter in Reykjavik
+
+Source: [Bicycle Counter](http://bicyclecounter.dk/)
+
+- GET [/cyclecounter](https://apis.is/cyclecounter)
+
+Get current status of bicycle counters in Iceland, currently only one located by Suðurlandsbraut in Reykjavík.
+
+---
diff --git a/endpoints/cyclecounter/index.js b/endpoints/cyclecounter/index.js
index 75b8599d..afdeeced 100644
--- a/endpoints/cyclecounter/index.js
+++ b/endpoints/cyclecounter/index.js
@@ -1,26 +1,28 @@
-var request = require('request'),
- parseString = require('xml2js').parseString,
- app = require('../../server');
+/* eslint-disable prefer-destructuring */
+const request = require('request')
+const xml2js = require('xml2js')
+const app = require('../../server')
-app.get('/cyclecounter', function(req, res){
- request.get({
- url: 'http://www.bicyclecounter.dk/BicycleCounter/GetCycleInfo?ran=1379500208853&StationId=235&LaneId=0'
- }, function(err, response, xml) {
- if(err || response.statusCode !== 200)
- return res.json(500,{error: 'www.bicyclecounter.dk refuses to respond or give back data'});
+const parseString = xml2js.parseString
- var cyclecounter = [];
- parseString(xml, { explicitRoot: false }, function(err, result) {
+app.get('/cyclecounter', (req, res) => {
+ request.get({
+ url: 'http://www.bicyclecounter.dk/BicycleCounter/GetCycleInfo?ran=1379500208853&StationId=235&LaneId=0',
+ }, (err, response, xml) => {
+ if (err || response.statusCode !== 200) {
+ return res.status(500).json({ error: 'www.bicyclecounter.dk refuses to respond or give back data' })
+ }
- cyclecounter.push({
- DayCount: result.DayCount[0],
- YearCount: result.YearCount[0],
- Time: result.Time[0],
- Date: result.Date[0],
- });
+ const cyclecounter = []
+ parseString(xml, { explicitRoot: false }, (parseError, result) => {
+ cyclecounter.push({
+ DayCount: result.DayCount[0],
+ YearCount: result.YearCount[0],
+ Time: result.Time[0],
+ Date: result.Date[0],
+ })
- return res.json({results: cyclecounter});
- });
- }
- );
-});
+ return res.cache(5).json({ results: cyclecounter })
+ })
+ })
+})
diff --git a/endpoints/cyclecounter/tests/integration_test.js b/endpoints/cyclecounter/tests/integration_test.js
index 361f6f6f..a3bf1a1e 100644
--- a/endpoints/cyclecounter/tests/integration_test.js
+++ b/endpoints/cyclecounter/tests/integration_test.js
@@ -1,14 +1,14 @@
-var request = require('request');
-var assert = require('assert');
-var helpers = require('../../../lib/test_helpers.js');
+/* eslint-disable import/extensions */
+const request = require('request')
+const helpers = require('../../../lib/test_helpers.js')
-describe('cyclecounter', function() {
- // The only thing that changes is the form attribute, so why not just re-use the object
- var fieldsToCheckFor = ["DayCount", "YearCount", "Time", "Date"];
+describe('cyclecounter', () => {
+ // The only thing that changes is the form attribute, so why not just re-use the object
+ const fieldsToCheckFor = ['DayCount', 'YearCount', 'Time', 'Date']
- it("should return an array of objects containing correct fields", function(done) {
- var params = helpers.testRequestParams("/cyclecounter");
- var resultHandler = helpers.testRequestHandlerForFields(done, fieldsToCheckFor);
- request(params, resultHandler);
- });
-});
+ it('should return an array of objects containing correct fields', (done) => {
+ const params = helpers.testRequestParams('/cyclecounter')
+ const resultHandler = helpers.testRequestHandlerForFields(done, fieldsToCheckFor)
+ request(params, resultHandler)
+ })
+})
diff --git a/endpoints/declension/index.js b/endpoints/declension/index.js
index 545243a3..642a92b3 100644
--- a/endpoints/declension/index.js
+++ b/endpoints/declension/index.js
@@ -1,99 +1,113 @@
-// dependencies
-var app = require('../../server'),
- request = require('request'),
- helper = require('apis-helpers'),
- cheerio = require('cheerio'),
- _ = require('underscore'),
- url = require('url');
-
-var baseUrl = url.parse('http://dev.phpbin.ja.is/ajax_leit.php');
-
-app.get('/declension/:word', function(req, res) {
- var word = req.params.word;
- baseUrl.query = {'q': word};
-
- var params = {
- url: url.format(baseUrl),
- headers: {
- 'User-Agent': helper.browser(),
- },
- };
-
- getDeclensions(function(body) {
- return res.json(parseTable(body));
- }, params);
-});
+/* eslint-disable prefer-destructuring */
+/* eslint-disable no-mixed-operators */
+/* eslint-disable import/first */
+const url = require('url')
+const request = require('request')
+const helper = require('apis-helpers')
+const cheerio = require('cheerio')
+const _ = require('lodash')
+const app = require('../../server')
+
+const baseUrl = url.parse('http://dev.phpbin.ja.is/ajax_leit.php')
// return permutation of a given word
-function getDeclensions(callback, params) {
- request.get(params, function(err, res, body) {
- if (err || res.statusCode != 200) {
- return res.json(500, {error:'A request to dev.phpbin.ja.is resulted in a error'});
- }
-
- body = body.replace(//g, '');
- var $;
-
- try {
- $ = cheerio.load(body);
- } catch(error) {
- return res.json(500, {
- error: 'Parsing the data from dev.phpbin.ja.is resulted in a error',
- moreinfo: error
- });
- }
-
- // Links mean reults!
- var result = $("a");
-
- // more than 1 result from request (ex: 'hús')
- if (result.length > 1) {
- // call recursively again with new url
- var id = result[0].attribs.on_click.match(/\d+/)[0];
- baseUrl.query = {'id': id};
- params.url = url.format(baseUrl);
- return getDeclensions(callback, params);
- };
-
- // else just call func to return data
- return callback($);
- });
-};
+function getDeclensions(callback, providedParams) {
+ const params = Object.assign({}, providedParams)
+ request.get(params, (err, res, body) => {
+ if (err || res.statusCode !== 200) {
+ return res.status(500).json({
+ error: 'A request to dev.phpbin.ja.is resulted in a error',
+ })
+ }
+
+ let $
+ const sanitisedBody = body.replace(//g, '')
+
+ try {
+ $ = cheerio.load(sanitisedBody)
+ } catch (error) {
+ return res.status(500).json({
+ error: 'Parsing the data from dev.phpbin.ja.is resulted in a error',
+ moreinfo: error,
+ })
+ }
+
+ // Links mean results!
+ const result = $('a')
+
+ // more than 1 result from request (ex: 'hús')
+ if (result.length > 1) {
+ // call recursively again with new url
+ const id = result[0].attribs.on_click.match(/\d+/)[0]
+ baseUrl.query = { id }
+ params.url = url.format(baseUrl)
+ return getDeclensions(callback, params)
+ }
+
+ // else just call func to return data
+ return callback($)
+ })
+}
// Creates a sequence of integers, each iteration creates a value and increments that value by 1
// step: specify how often to run the iteration
// increment: how much to increment after each iteration
function generateSequence(start, step, increment) {
- // ex:
- // input: start: 0, step: 4, increment: 3
- // output: [ 0, 1, 4, 5, 8, 9, 12, 13 ]
- var results = [];
+ // ex:
+ // input: start: 0, step: 4, increment: 3
+ // output: [ 0, 1, 4, 5, 8, 9, 12, 13 ]
+ const results = []
- _.each(_.range(start, step), function(i) {
- var value = (i + increment * i);
+ _.each(_.range(start, step), (i) => {
+ const value = (i + increment * i)
- results.push(value, value + 1);
- });
+ results.push(value, value + 1)
+ })
- return results;
-};
+ return results
+}
function parseTable($) {
- var type = $('small').contents().text().trim();
-
- // create a sequence which is the same as the index of 'Eintala' of the td's in the HTML table.
- var singular = generateSequence(0, 4, 3),
- results = [];
-
- $('table tr td span').each(function(i) {
- var parent = this.parent();
-
- results.push({
- predicate: parent.parent().find('td:first-child').text(),
- value: this.text(),
- category: i in singular ? 'Eintala' : 'Fleirtala'
- });
- });
-
- return { results: results, type: type };
-};
+ const type = $('small').contents().text().trim()
+
+ // create a sequence which is the same as the index of 'Eintala' of the td's
+ // in the HTML table.
+ const singular = generateSequence(0, 4, 3)
+ const results = []
+
+ $('table tr td span').each((i, element) => {
+ const predicate = (
+ element
+ .parent
+ .parent
+ .children
+ .filter(node => node.name === 'td')[0]
+ .children[0]
+ .data
+ )
+
+ results.push({
+ predicate,
+ value: element.children[0].data,
+ category: i in singular ? 'Eintala' : 'Fleirtala',
+ })
+ })
+
+ return { results, type }
+}
+
+app.get('/declension/:word', (req, res) => {
+ const word = req.params.word
+ baseUrl.query = { q: word }
+
+ const params = {
+ url: url.format(baseUrl),
+ headers: {
+ 'User-Agent': helper.browser(),
+ },
+ }
+
+ getDeclensions((body) => {
+ return res.cache(86400).json(parseTable(body))
+ }, params)
+})
diff --git a/endpoints/declension/tests/integration_test.js b/endpoints/declension/tests/integration_test.js
index abeefc7f..e6ed13f7 100644
--- a/endpoints/declension/tests/integration_test.js
+++ b/endpoints/declension/tests/integration_test.js
@@ -1,12 +1,12 @@
-var request = require('request'),
- assert = require('assert'),
- helpers = require('../../../lib/test_helpers.js');
+/* eslint-disable import/extensions */
+const request = require('request')
+const helpers = require('../../../lib/test_helpers.js')
-describe('declension', function() {
- it("should return an array of objects containing correct fields", function(done) {
- var fieldsToCheckFor = ["predicate", "value", "category"];
- var params = helpers.testRequestParams("/declension/laugavegur");
- var resultHandler = helpers.testRequestHandlerForFields(done, fieldsToCheckFor);
- request.get(params, resultHandler);
- });
-});
+describe('declension', () => {
+ it('should return an array of objects containing correct fields', (done) => {
+ const fieldsToCheckFor = ['predicate', 'value', 'category']
+ const params = helpers.testRequestParams('/declension/laugavegur')
+ const resultHandler = helpers.testRequestHandlerForFields(done, fieldsToCheckFor)
+ request.get(params, resultHandler)
+ })
+})
diff --git a/endpoints/earthquake/documentation.md b/endpoints/earthquake/documentation.md
new file mode 100644
index 00000000..619ebaf8
--- /dev/null
+++ b/endpoints/earthquake/documentation.md
@@ -0,0 +1,9 @@
+# Earthquakes in Iceland
+
+Source: [Icelandic Meteorological Office](http://vedur.is)
+
+- GET [/earthquake/is](https://apis.is/earthquake/is)
+
+Get earthquake monitoring data for the last 48 hours.
+
+---
diff --git a/endpoints/earthquake/index.js b/endpoints/earthquake/index.js
index 60524ad1..4184d607 100644
--- a/endpoints/earthquake/index.js
+++ b/endpoints/earthquake/index.js
@@ -1,56 +1,35 @@
-var request = require('request'),
- cheerio = require('cheerio'),
- browser = require('apis-helpers').browser,
- app = require('../../server');
+/* eslint-disable no-prototype-builtins */
+/* eslint-disable no-restricted-syntax */
+/* eslint-disable no-useless-escape */
+/* eslint-disable prefer-destructuring */
+const request = require('request')
+const cheerio = require('cheerio')
+const helpers = require('apis-helpers')
+const app = require('../../server')
-/*
- * Hraun table parse
- */
-app.get('/earthquake/is', function (req, res, next) {
- getEarthquakes(function(error,body) {
- if(error) return res.json(500,{error:error.toString()});
-
- return res.json({
- results: parseList(body)
- });
- });
-});
-
-/*
- * Main vedur.is website (JS variable included in the source) (secondary source of information).
- */
-app.get('/earthquake/is/sec', function (req, res, next) {
- getEarthquakes(function(error,body) {
- if(error) return res.json(500,{error:error.toString()});
- return res.json({
- results: parseJavaScriptVariable(body)
- });
- },{
- url: 'http://www.vedur.is/skjalftar-og-eldgos/jardskjalftar',
- headers: { 'User-Agent': browser() },
- encoding: "utf-8" // needed for some reason.. defaulting to ISO-8859-1
- });
-});
+const browser = helpers.browser
/*
- This function only handles the request part and calls callback with
- the body
- */
-function getEarthquakes(callback,params) {
- var req_params = (params == null) ? {
- url: 'http://hraun.vedur.is/ja/skjalftar/skjlisti.html',
- headers: { 'User-Agent': browser() },
- encoding: "binary" // needed for some reason.. defaulting to ISO-8859-1
- } : params;
-
- request(req_params, function (error,res, body) {
- if(error || res.statusCode !== 200){
- return callback(new Error("Could not retrieve the data from the data source"));
- }
+ This function only handles the request part and calls callback with
+ the body
+ */
+function getEarthquakes(callback, params) {
+ // eslint-disable-next-line eqeqeq
+ const reqParams = !params ? {
+ url: 'http://hraun.vedur.is/ja/skjalftar/skjlisti.html',
+ headers: { 'User-Agent': browser() },
+ // needed for some reason.. defaulting to ISO-8859-1
+ encoding: 'binary',
+ } : params
+
+ request(reqParams, (error, res, body) => {
+ if (error || res.statusCode !== 200) {
+ return callback(new Error('Could not retrieve the data from the data source'))
+ }
- return callback(error,body);
- });
-};
+ return callback(error, body)
+ })
+}
/*
* This function traverses the DOM, and looks for a JS variable that is included
@@ -58,100 +37,150 @@ function getEarthquakes(callback,params) {
* Note that it is synchronous.
*/
function parseJavaScriptVariable(body) {
- var jsonString = ""; // Work with empty string if scraping fails.
- // Create a cheerio object from response body.
- var $ = cheerio.load(body);
-
- // Find the variable inside one of the
+
+
+
+
+