From 1439756c4b5204ed88ccf26ae63e4c22ff671c76 Mon Sep 17 00:00:00 2001 From: maasencioh Date: Mon, 24 Oct 2016 13:24:42 +0200 Subject: [PATCH] feat: validates that it's a NetCDF file --- README.md | 1 + package.json | 3 +++ src/index.js | 29 ++++++++++++++++++++++++++--- test/files/madis-sao.nc | Bin 0 -> 266032 bytes test/files/not_nc.txt | 1 + test/files/test_hgroups.nc | Bin 0 -> 90645 bytes test/test.js | 16 +++++++++++++--- yarn.lock | 4 ++++ 8 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 test/files/madis-sao.nc create mode 100644 test/files/not_nc.txt create mode 100644 test/files/test_hgroups.nc diff --git a/README.md b/README.md index dde35ea..e6cdc24 100755 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Read and explore NetCDF files ## Example ```js +const fs = require('fs'); const netcdfjs = require('netcdfjs'); ``` diff --git a/package.json b/package.json index 693c949..c26a613 100755 --- a/package.json +++ b/package.json @@ -34,5 +34,8 @@ "mocha": "^3.1.2", "mocha-better-spec-reporter": "^3.0.2", "should": "^11.1.1" + }, + "dependencies": { + "iobuffer": "^2.1.0" } } diff --git a/src/index.js b/src/index.js index 8076ae0..8998162 100755 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,30 @@ 'use strict'; -module.exports = netcdf; +const IOBuffer = require('iobuffer'); -function netcdf() { - return true; +function netcdf(data) { + const buffer = new IOBuffer(data); + + // Validate that it's a NetCDF file + notNetcdf((buffer.readChars(3) !== 'CDF'), 'should start with CDF'); + + // Check the NetCDF format + const version = buffer.readByte(); + notNetcdf((version === 2), '64-bit offset format not supported yet'); + notNetcdf((version !== 1), 'unknown version'); + + return buffer.length; } + +/** + * Throws a non-valid NetCDF exception if the statement it's true + * @param {boolean} statement - Throws if true + * @param {string} reason - Reason to throw + */ +function notNetcdf(statement, reason) { + if (statement) { + throw new TypeError('Not a valid NetCDF v3.x file: ' + reason); + } +} + +module.exports = netcdf; diff --git a/test/files/madis-sao.nc b/test/files/madis-sao.nc new file mode 100644 index 0000000000000000000000000000000000000000..3360f77ae6824319e721dc2e9ca1f6eef9f564f3 GIT binary patch literal 266032 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

+7+S!v;q~XUf?*)9gkj-x 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 Vq=6z06lvi9g9e08DbM=w{{ahdJk|gJ literal 0 HcmV?d00001 diff --git a/test/test.js b/test/test.js index cc11652..96677f4 100755 --- a/test/test.js +++ b/test/test.js @@ -1,9 +1,19 @@ 'use strict'; const netcdfjs = require('..'); +const fs = require('fs'); +const pathFiles = __dirname + '/files/'; -describe('test', function () { - it('should be tested', function () { - (42).should.equal(42); +describe('Read file', function () { + it('Throws on non NetCDF file', function () { + const data = fs.readFileSync(pathFiles + 'not_nc.txt'); + netcdfjs.bind(null, data).should.throw('Not a valid NetCDF v3.x file: should start with CDF'); + }); + + it('read header information', function () { + // http://www.unidata.ucar.edu/software/netcdf/examples/files.html + const data = fs.readFileSync(pathFiles + 'madis-sao.nc'); + + netcdfjs(data).should.be.equal(266032); }); }); diff --git a/yarn.lock b/yarn.lock index 97ad11b..e7f3d7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3096,6 +3096,10 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +iobuffer: + version "2.1.0" + resolved "https://registry.yarnpkg.com/iobuffer/-/iobuffer-2.1.0.tgz#074882d24020a85db6a5042a0418ef9b6b2e616a" + irregular-plurals@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac"