diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Gruntfile.js | 55 | ||||
-rwxr-xr-x | bin/etatsbasen.js | 53 | ||||
m--------- | etatsbasen-data | 0 | ||||
-rw-r--r-- | fixtures/1.csv | 7 | ||||
-rw-r--r-- | fixtures/2.csv | 10 | ||||
-rw-r--r-- | lib/etatsbasen.js | 170 | ||||
-rw-r--r-- | package.json | 39 | ||||
-rw-r--r-- | test/etatsbasen_test.js | 80 |
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] }); + } + } + }; |