diff --git a/lab-nathan/.eslintignore b/lab-nathan/.eslintignore new file mode 100644 index 0000000..c6abca4 --- /dev/null +++ b/lab-nathan/.eslintignore @@ -0,0 +1,6 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +**/coverage/* +**/build/* +**/assets/* diff --git a/lab-nathan/.eslintrc b/lab-nathan/.eslintrc new file mode 100644 index 0000000..c8dfef7 --- /dev/null +++ b/lab-nathan/.eslintrc @@ -0,0 +1,23 @@ +{ + "rules": { + "no-console": "off", + "indent": [ "error", 2 ], + "quotes": [ "error", "single" ], + "semi": ["error", "always"], + "linebreak-style": [ "error", "unix" ] + }, + "env": { + "es6": true, + "node": true, + "mocha": true, + "jasmine": true + }, + "parserOptions": { + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + } + }, + "extends": "eslint:recommended" +} diff --git a/lab-nathan/.gitignore b/lab-nathan/.gitignore new file mode 100644 index 0000000..345130c --- /dev/null +++ b/lab-nathan/.gitignore @@ -0,0 +1,136 @@ +# Created by https://www.gitignore.io/api/osx,vim,node,macos,windows + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +### OSX ### + +# Icon must end with two \r + +# Thumbnails + +# Files that might appear in the root of a volume + +# Directories potentially created on remote AFP share + +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +*~ +# auto-generated tag files +tags + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/osx,vim,node,macos,windows diff --git a/lab-nathan/README.md b/lab-nathan/README.md new file mode 100644 index 0000000..392bdc9 --- /dev/null +++ b/lab-nathan/README.md @@ -0,0 +1,5 @@ +# get-bytes + +get-bytes is a node module which returns the specified number of bytes from the beginning of each input file. + +`done` is a function provided by the mocha testing framework, which is passed as a parameter of the `it` function's callback. It is invoked after asynchronous processing is complete and the result of the test has been computed. \ No newline at end of file diff --git a/lab-nathan/assets/one.txt b/lab-nathan/assets/one.txt new file mode 100644 index 0000000..942945f --- /dev/null +++ b/lab-nathan/assets/one.txt @@ -0,0 +1,9 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque viverra vitae tellus eget tempus. Fusce tincidunt eros orci, id efficitur ante accumsan vel. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis varius pulvinar libero, sit amet ultrices diam maximus at. Suspendisse lobortis rhoncus purus, ac efficitur est laoreet a. Aliquam in orci at ex hendrerit porttitor. Praesent aliquet semper dolor, in fermentum justo posuere sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas urna turpis, porttitor id magna eget, luctus volutpat sapien. Proin ultrices lectus id posuere maximus. Nullam sapien risus, euismod ut sollicitudin ut, commodo non magna. Mauris fermentum mi nec blandit semper. Donec id tincidunt tortor. Pellentesque a leo cursus ipsum tempor aliquam. + +In malesuada, orci at rhoncus consectetur, nibh leo scelerisque libero, non eleifend nulla libero ac justo. Ut placerat, arcu aliquam interdum efficitur, neque odio lacinia lacus, et varius lorem elit non eros. Proin dictum condimentum metus, eget accumsan nulla fermentum vitae. Fusce faucibus diam eu metus condimentum aliquet. Maecenas eros purus, tincidunt eu nisl ullamcorper, congue pharetra enim. Sed lorem leo, vehicula non orci id, convallis gravida magna. Nunc in ligula id velit pellentesque hendrerit. Sed lacinia risus a est volutpat auctor. Praesent venenatis metus sapien, ut iaculis ligula condimentum quis. + +Fusce tincidunt nibh sit amet pharetra finibus. Praesent nec elit sem. Curabitur quis laoreet diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean sodales ornare est quis euismod. Integer vitae tristique augue, eu porta lorem. Nullam varius mauris in accumsan mollis. Nam nec justo tellus. Nulla eleifend augue ac est efficitur, eu laoreet lorem pulvinar. Morbi massa tortor, rutrum vel lacinia in, feugiat ac est. Vestibulum non sem vehicula, pretium risus sit amet, suscipit arcu. Nulla vitae felis ut metus tincidunt molestie. + +Mauris egestas tincidunt nulla. Quisque convallis, quam a convallis consectetur, tortor lectus malesuada dui, scelerisque sodales lectus urna vitae dui. Nulla feugiat posuere tempor. Fusce ut felis libero. Quisque ac arcu lacinia, finibus magna id, faucibus elit. Mauris gravida tellus in erat tempor rhoncus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas tristique ex sit amet augue feugiat aliquet. Aenean eget diam eget leo vehicula convallis eu sed urna. Vestibulum ut urna tincidunt, suscipit magna at, accumsan mauris. + +Pellentesque vel fermentum lacus. Quisque maximus tincidunt convallis. Quisque a nunc id risus volutpat pretium. Quisque vel mauris semper, semper lacus ac, finibus enim. Morbi arcu justo, gravida non dolor et, pretium efficitur sem. In bibendum nec tellus eu sollicitudin. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas malesuada molestie felis, id dictum sem eleifend cursus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi lacus nibh, volutpat ac mauris pellentesque, malesuada accumsan leo. Maecenas ut nunc ut lorem bibendum cursus. \ No newline at end of file diff --git a/lab-nathan/assets/three.txt b/lab-nathan/assets/three.txt new file mode 100644 index 0000000..128b93a --- /dev/null +++ b/lab-nathan/assets/three.txt @@ -0,0 +1 @@ +Quisque viverra vitae tellus eget tempus. Fusce tincidunt eros orci, id efficitur ante accumsan vel. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis varius pulvinar libero, sit amet ultrices diam maximus at. Suspendisse lobortis rhoncus purus, ac efficitur est laoreet a. Aliquam in orci at ex hendrerit porttitor. Praesent aliquet semper dolor, in fermentum justo posuere sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas urna turpis, porttitor id magna eget, luctus volutpat sapien. Proin ultrices lectus id posuere maximus. Nullam sapien risus, euismod ut sollicitudin ut, commodo non magna. Mauris fermentum mi nec blandit semper. Donec id tincidunt tortor. Pellentesque a leo cursus ipsum tempor aliquam. \ No newline at end of file diff --git a/lab-nathan/assets/two.txt b/lab-nathan/assets/two.txt new file mode 100644 index 0000000..a30f3f3 --- /dev/null +++ b/lab-nathan/assets/two.txt @@ -0,0 +1,3 @@ +In malesuada, orci at rhoncus consectetur, nibh leo scelerisque libero, non eleifend nulla libero ac justo. Ut placerat, arcu aliquam interdum efficitur, neque odio lacinia lacus, et varius lorem elit non eros. Proin dictum condimentum metus, eget accumsan nulla fermentum vitae. Fusce faucibus diam eu metus condimentum aliquet. Maecenas eros purus, tincidunt eu nisl ullamcorper, congue pharetra enim. Sed lorem leo, vehicula non orci id, convallis gravida magna. Nunc in ligula id velit pellentesque hendrerit. Sed lacinia risus a est volutpat auctor. Praesent venenatis metus sapien, ut iaculis ligula condimentum quis. + +Fusce tincidunt nibh sit amet pharetra finibus. Praesent nec elit sem. Curabitur quis laoreet diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean sodales ornare est quis euismod. Integer vitae tristique augue, eu porta lorem. Nullam varius mauris in accumsan mollis. Nam nec justo tellus. Nulla eleifend augue ac est efficitur, eu laoreet lorem pulvinar. Morbi massa tortor, rutrum vel lacinia in, feugiat ac est. Vestibulum non sem vehicula, pretium risus sit amet, suscipit arcu. Nulla vitae felis ut metus tincidunt molestie. \ No newline at end of file diff --git a/lab-nathan/index.js b/lab-nathan/index.js new file mode 100644 index 0000000..46bf12d --- /dev/null +++ b/lab-nathan/index.js @@ -0,0 +1,9 @@ +'use strict'; + +const getBytes = require('./lib/get-bytes.js'); + +let files = [`${__dirname}/assets/one.txt`, `${__dirname}/assets/two.txt`, `${__dirname}/assets/three.txt`]; + +getBytes(files, 8, function(err, data) { + data.forEach(d => console.log(d)); +}); \ No newline at end of file diff --git a/lab-nathan/lib/get-bytes.js b/lab-nathan/lib/get-bytes.js new file mode 100644 index 0000000..2e3096c --- /dev/null +++ b/lab-nathan/lib/get-bytes.js @@ -0,0 +1,19 @@ +'use strict'; + +const fs = require('fs'); + +let getBytes = function(filePaths, byteCount, callback, buffer = []) { + if (filePaths.length === 0) return callback(null, buffer); + + let filePath = filePaths.shift(); + + fs.readFile(filePath, function(err, data) { + if (err) callback(err); + + buffer.push(data.toString('hex', 0, byteCount)); + + getBytes(filePaths, byteCount, callback, buffer); + }); +}; + +module.exports = getBytes; \ No newline at end of file diff --git a/lab-nathan/package.json b/lab-nathan/package.json new file mode 100644 index 0000000..d5aa0c2 --- /dev/null +++ b/lab-nathan/package.json @@ -0,0 +1,21 @@ +{ + "name": "lab-nathan", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "start": "node index.js", + "test": "mocha", + "lint": "eslint ." + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.4.2" + } +} diff --git a/lab-nathan/test/get-bytes-test.js b/lab-nathan/test/get-bytes-test.js new file mode 100644 index 0000000..2c8be61 --- /dev/null +++ b/lab-nathan/test/get-bytes-test.js @@ -0,0 +1,22 @@ +'use strict'; + +const getBytes = require('../lib/get-bytes.js'); +const expect = require('chai').expect; + +describe('get-bytes', function() { + it('should have a valid input path', function(done) { + getBytes([`${__dirname}/../assets/fake.txt`], 8, function(err) { + expect(err).to.be.an('error').with.property('code', 'ENOENT'); + done(); + }); + }); + + it('should return the first 8 bytes of each asset in order', function(done) { + let files = [`${__dirname}/../assets/one.txt`, `${__dirname}/../assets/two.txt`, `${__dirname}/../assets/three.txt`]; + getBytes(files, 8, function(err, data) { + expect(data).to.deep.equal(['4c6f72656d206970', '496e206d616c6573', '5175697371756520']); + done(); + }); + }); +}); +