aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--Gruntfile.js55
-rwxr-xr-xbin/etatsbasen.js53
m---------etatsbasen-data0
-rw-r--r--fixtures/1.csv7
-rw-r--r--fixtures/2.csv10
-rw-r--r--lib/etatsbasen.js170
-rw-r--r--package.json39
-rw-r--r--test/etatsbasen_test.js80
9 files changed, 417 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..ea1047d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "etatsbasen-data"]
+ path = etatsbasen-data
+ url = https://github.com/mimesbronn/etatsbasen-data.git
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000..1d2b284
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,55 @@
+'use strict';
+
+module.exports = function (grunt) {
+ // Show elapsed time at the end
+ require('time-grunt')(grunt);
+ // Load all grunt tasks
+ require('load-grunt-tasks')(grunt);
+
+ // Project configuration.
+ grunt.initConfig({
+ nodeunit: {
+ files: ['test/**/*_test.js']
+ },
+ jshint: {
+ options: {
+ jshintrc: '.jshintrc',
+ reporter: require('jshint-stylish')
+ },
+ gruntfile: {
+ src: 'Gruntfile.js'
+ },
+ bin: {
+ src: ['bin/*.js']
+ },
+ lib: {
+ src: ['lib/**/*.js']
+ },
+ test: {
+ src: ['test/**/*.js']
+ }
+ },
+ watch: {
+ gruntfile: {
+ files: '<%= jshint.gruntfile.src %>',
+ tasks: ['jshint:gruntfile']
+ },
+ bin: {
+ files: '<%= jshint.bin.src %>',
+ tasks: ['jshint:bin', 'nodeunit']
+ },
+ lib: {
+ files: '<%= jshint.lib.src %>',
+ tasks: ['jshint:lib', 'nodeunit']
+ },
+ test: {
+ files: '<%= jshint.test.src %>',
+ tasks: ['jshint:test', 'nodeunit']
+ }
+ }
+ });
+
+ // Default task.
+ //grunt.registerTask('default', ['jshint', 'nodeunit']);
+ grunt.registerTask('default', ['nodeunit']);
+};
diff --git a/bin/etatsbasen.js b/bin/etatsbasen.js
new file mode 100755
index 0000000..9699a93
--- /dev/null
+++ b/bin/etatsbasen.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+var path = require('path');
+var fs = require('fs');
+var pkg = require(path.join(__dirname, '..', 'package.json'));
+
+var argv = require('minimist')(process.argv.slice(2));
+var etatsbasen = require('etatsbasen');
+
+process.bin = process.title = 'etatsbasen';
+
+if (argv.v) {
+ console.log(pkg.version);
+ process.exit();
+}
+
+var options = {};
+options.filename = argv.f || 'etatsbasen.csv';
+
+if (argv.c && 'string' === typeof argv.c) {
+ options.categories = argv.c.split(',');
+} else {
+ options.categories = [];
+}
+
+function fileNotFound() {
+ return ! fs.existsSync(options.filename);
+}
+
+if (argv.h || fileNotFound()) {
+ if (fileNotFound()) {
+ console.log(process.title + ': ' + options.filename +
+ ': No such file or directory\n');
+ }
+ console.log([
+ 'usage: etatsbasen [options]',
+ '',
+ ' -c [c1,c2,..] Categories to include',
+ ' -f [file] File to read from (defaults: `etatsbasen.csv`)',
+ ' -v Print version.',
+ ' -h Write this help.'
+ ].join('\n'));
+ process.exit();
+}
+
+var ret = etatsbasen.printCSV(function(err) {
+ }, options);
+
+if (ret) {
+
+} else {
+ console.log('Unable to convert');
+ process.exit();
+}
diff --git a/etatsbasen-data b/etatsbasen-data
new file mode 160000
+Subproject 1c422d20169467b2afed860a0abaca32cef4d45
diff --git a/fixtures/1.csv b/fixtures/1.csv
new file mode 100644
index 0000000..87f8f75
--- /dev/null
+++ b/fixtures/1.csv
@@ -0,0 +1,7 @@
+# this test contains invalid emails
+tailid,email,name_nb,name_nn,name_en,url_nb,url_en,orgstructid,orgid,kommunenummer,parentid
+41943,"",DPS Søndre Oslo - Holmlia - distriktspsykiatrisk senter,DPS Søndre Oslo - Holmlia - distriktspsykiatrisk senter,DPS Søndre Oslo District Psychiatric Centre - Holmlia,http://www.oslo-universitetssykehus.no/omoss/avdelinger/dps-sondre-oslo/Sider/enhet.aspx,,39,,,42285
+23842,nav@.kontaktsenter@nav.no,NAV Voss,NAV Voss,NAV Voss,http://www.nav.no/Lokalt/Hordaland,http://nav.no/page?id=1073743655,37,,,26064
+23844,nav. arbeidslivssenter.hordaland@nav.no,NAV Arbeidslivssenter Hordaland,NAV Arbeidslivssenter Hordaland,NAV Employment Support Centre (Hordaland),http://nav.no/805321255.cms,http://nav.no/page?id=1073743655,36,,,26064
+23846,,NAV Arbeidsrådgivning Hordaland,NAV Arbeidsrådgivning Hordaland,NAV Career Advice Office (Hordaland),http://nav.no/805321256.cms,http://nav.no/page?id=1073743655,36,,,26064
+23847,notvalidemail,"NAV Tiltak, Intro og Marked Bergen","NAV Tiltak, Intro og Marked Bergen",NAV Intro Bergen,http://www.nav.no/805321258.cms,,36,,,26064
diff --git a/fixtures/2.csv b/fixtures/2.csv
new file mode 100644
index 0000000..ce8c6b2
--- /dev/null
+++ b/fixtures/2.csv
@@ -0,0 +1,10 @@
+tailid,email,name_nb,name_nn,name_en,url_nb,url_en,orgstructid,orgid,kommunenummer,parentid
+41943,post@oslo-universitetssykehus.no,DPS Søndre Oslo - Holmlia - distriktspsykiatrisk senter,DPS Søndre Oslo - Holmlia - distriktspsykiatrisk senter,DPS Søndre Oslo District Psychiatric Centre - Holmlia,http://www.oslo-universitetssykehus.no/omoss/avdelinger/dps-sondre-oslo/Sider/enhet.aspx,,39,,,42285
+23842,nav.kontaktsenter@nav.no,NAV Voss,NAV Voss,NAV Voss,http://www.nav.no/Lokalt/Hordaland,http://nav.no/page?id=1073743655,37,,,26064
+23844,nav.arbeidslivssenter.hordaland@nav.no,NAV Arbeidslivssenter Hordaland,NAV Arbeidslivssenter Hordaland,NAV Employment Support Centre (Hordaland),http://nav.no/805321255.cms,http://nav.no/page?id=1073743655,36,,,26064
+23846,nav.arbeidsraadgivning.hordaland@nav.no,NAV Arbeidsrådgivning Hordaland,NAV Arbeidsrådgivning Hordaland,NAV Career Advice Office (Hordaland),http://nav.no/805321256.cms,http://nav.no/page?id=1073743655,36,,,26064
+23847,nav.intro.bergen@nav.no,"NAV Tiltak, Intro og Marked Bergen","NAV Tiltak, Intro og Marked Bergen",NAV Intro Bergen,http://www.nav.no/805321258.cms,,36,,,26064
+25994,post@heroy-no.kommune.no,Herøy kommune (Nordland),Herøy kommune (Nordland),Herøy Municipality (Nordland),http://www.heroy-no.kommune.no,,66,,1818,
+25995,postmottak@hitra.kommune.no,Hitra kommune,Hitra kommune,Hitra Municipality,http://www.hitra.kommune.no/,https://www.hitra.kommune.no/turistinformasjon/english/Sider/side.aspx,66,938772924,1617,
+25996,postmottak@hjartdal.kommune.no,Hjartdal kommune,Hjartdal kommune,Hjartdal Municipality,http://www.hjartdal.kommune.no,,66,964963649,0827,
+25997,postmottak@hjelmeland.kommune.no,Hjelmeland kommune,Hjelmeland kommune,Hjelmeland Municipality,http://www.hjelmeland.kommune.no/,,66,864979092,1133,
diff --git a/lib/etatsbasen.js b/lib/etatsbasen.js
new file mode 100644
index 0000000..5be404a
--- /dev/null
+++ b/lib/etatsbasen.js
@@ -0,0 +1,170 @@
+'use strict';
+/*
+ * etatsbasen
+ * user/repo
+ *
+ * Copyright (c) 2014 gorm
+ * Licensed under the MIT license.
+ */
+var csv = require('csv');
+var stringify = require('csv-stringify');
+var fs = require('fs');
+
+function lookForDataFile(filename) {
+ if (fs.existsSync(filename)) {
+ return filename;
+ } else {
+ return false;
+ }
+}
+
+function emailIsInvalid(email) {
+ var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+ return !re.test(email);
+}
+
+function filter(csvdata, includeOrgstructIds) {
+ var headernameToIndex = {};
+
+ if (includeOrgstructIds && !Array.isArray(includeOrgstructIds)) {
+ throw new TypeError('`includedOrgstructIds` should be an array');
+ }
+
+ csvdata = csvdata.filter(function(item, i) {
+ // make mapping between headerName to index
+ if (0 === i) {
+ item.forEach(function(item, i) {
+ headernameToIndex[item] = i;
+ });
+ // always include header
+ return true;
+ } else {
+ var email = item[headernameToIndex.email];
+ if (emailIsInvalid(email)) {
+ return false;
+ }
+
+ return (function() {
+ var i;
+
+ if (includeOrgstructIds.length) {
+ for (i = 0; i < includeOrgstructIds.length; i++) {
+ //console.log(i + " " + includeOrgstructIds[i] + " " + item[headernameToIndex.orgstructid]);
+ if (parseInt(includeOrgstructIds[i]) ===
+ parseInt(item[headernameToIndex.orgstructid])) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return true;
+ }
+ }());
+ }
+ });
+
+ return csvdata;
+}
+
+function renameHeader(data) {
+ if (! data) {
+ throw new TypeError('Missing `data` argument');
+ }
+
+ data[0][0] = 'id';
+ data[0][1] = 'request_email';
+ data[0][2] = 'name';
+ data[0][3] = 'name.nn_NO';
+ data[0][4] = 'name.en';
+
+ return data;
+}
+
+function removeColumns(data) {
+ var columns = ['url_nb', 'url_en', 'kommunenummer',
+ 'orgid', 'orgstructid', 'parentid'];
+
+ columns.forEach(function(name) {
+ var toRemove = -1;
+ data.forEach(function(item, i) {
+ if (0 === i) {
+ toRemove = item.indexOf(name);
+ }
+
+ if (toRemove >= 0) {
+ item.splice(toRemove, 1);
+ }
+ });
+ });
+
+ return data;
+}
+
+function addTags(data) {
+ var orgstructidIndex;
+ data.forEach(function(item, i) {
+ if (0 === i) {
+ item.push('tag_string');
+ orgstructidIndex = item.indexOf('orgstructid');
+ } else {
+ item.push(item[orgstructidIndex]);
+ }
+ });
+ return data;
+}
+
+function addURL(data) {
+ // create new column
+ var urlenIndex=0;
+ var urlnoIndex=0;
+
+ data.forEach(function(item, i) {
+ if (0 === i) {
+ item.push('home_page');
+ urlenIndex = item.indexOf('url_en');
+ urlnoIndex = item.indexOf('url_nb');
+ } else {
+ item.push(item[urlnoIndex] || item[urlenIndex]);
+ }
+ });
+
+ return data;
+}
+
+function print(data) {
+ stringify(data, function(err, output) {
+ if (err) {
+ console.error(err);
+ return false;
+ }
+ // comment first line
+ console.log('#'+output);
+ });
+}
+
+/** Will output a CSV with all organizations to stdout */
+exports.printCSV = function(cb, options) {
+ var filename = lookForDataFile(options.filename);
+
+ if (false === filename) {
+ cb('Can\'t find file `' + options.filename + '`');
+ return false;
+ }
+
+ csv().from.path(filename, { comment: '#'}).to.array( function(data) {
+ print(
+ removeColumns(
+ addURL(
+ addTags(
+ renameHeader(
+ filter(data, options.categories)
+ )
+ )
+ )
+ )
+ );
+ cb();
+ } );
+
+ return true;
+};
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b0bc480
--- /dev/null
+++ b/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "etatsbasen",
+ "version": "0.0.1",
+ "main": "lib/etatsbasen.js",
+ "description": "konverterer etatsbasen",
+ "homepage": "https://github.com/mimesbronn/etatsbasen",
+ "bugs": "https://github.com/mimesbronn/etatsbasen/issues",
+ "author": {
+ "name": "utvk",
+ "email": "utvk@users.noreply.github.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "mimesbronn/etatsbasen"
+ },
+ "licenses": [
+ {
+ "type": "MIT"
+ }
+ ],
+ "keywords": [],
+ "devDependencies": {
+ "grunt-contrib-jshint": "^0.7.0",
+ "grunt-contrib-nodeunit": "^0.2.0",
+ "grunt-contrib-watch": "^0.5.0",
+ "load-grunt-tasks": "^0.2.0",
+ "time-grunt": "^0.2.0",
+ "jshint-stylish": "^0.1.3"
+ },
+ "scripts": {
+ "test": "grunt"
+ },
+ "bin": "./bin/etatsbasen.js",
+ "dependencies": {
+ "minimist": "^0.0.8",
+ "csv": "^0.3.7",
+ "csv-stringify": "0.0.2"
+ }
+}
diff --git a/test/etatsbasen_test.js b/test/etatsbasen_test.js
new file mode 100644
index 0000000..22caf29
--- /dev/null
+++ b/test/etatsbasen_test.js
@@ -0,0 +1,80 @@
+'use strict';
+
+var etatsbasen = require('../lib/etatsbasen.js');
+var events = require('events');
+
+/*
+ ======== A Handy Little Nodeunit Reference ========
+ https://github.com/caolan/nodeunit
+
+ Test methods:
+ test.expect(numAssertions)
+ test.done()
+ Test assertions:
+ test.ok(value, [message])
+ test.equal(actual, expected, [message])
+ test.notEqual(actual, expected, [message])
+ test.deepEqual(actual, expected, [message])
+ test.notDeepEqual(actual, expected, [message])
+ test.strictEqual(actual, expected, [message])
+ test.notStrictEqual(actual, expected, [message])
+ test.throws(block, [error], [message])
+ test.doesNotThrow(block, [error], [message])
+ test.ifError(value)
+*/
+
+exports.etatsbasen = {
+ setUp: function(done) {
+ // setup here
+ done();
+ },
+ 'printCSV': {
+ 'non existing file': function(test) {
+ test.expect(3);
+ etatsbasen.printCSV(function(err) {
+ test.ok(err);
+ test.notEqual(err, '');
+ test.ok(err.match(/^Can\'t find file/));
+ test.done();
+ }, { filename: 'evilmule.csv' });
+ },
+ 'no error with legal file': function(test) {
+ test.expect(1);
+ var oldLogger = console.log;
+ console.log = function() { };
+ etatsbasen.printCSV(function(err) {
+ console.log = oldLogger;
+ test.equal(err, undefined);
+ test.done();
+ }, { filename: 'fixtures/1.csv' });
+ },
+ 'filter empty emails': function(test) {
+ test.expect(4);
+ var oldLogger = console.log;
+ console.log = function(str) {
+ test.ok(str.match(/^\#id/), 'Doesn\'t start with header');
+ test.ok(!str.match(/tailid/, 'Tailid header wasn\'t renamed id'));
+ test.ok(!str.match(/\n/), 'Contains more than the header');
+ };
+ etatsbasen.printCSV(function(err) {
+ console.log = oldLogger;
+ test.ok(!err);
+ test.done();
+ }, { filename: 'fixtures/1.csv' });
+ },
+ 'filter categories': function(test) {
+ test.expect(4);
+ var oldLogger = console.log;
+ console.log = function(str) {
+ test.equal(str.match(/\,36\,/g).length, 3);
+ test.equal(str.match(/\,37\,/g).length, 1);
+ test.ok(!str.match(/\,39\,/));
+ };
+ etatsbasen.printCSV(function(err) {
+ console.log = oldLogger;
+ test.ok(!err);
+ test.done();
+ }, { filename: 'fixtures/2.csv', categories: [36,37] });
+ }
+ }
+ };