diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..05b1cf3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +**/coverage/* +**/build/* diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..8dc6807 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,21 @@ +{ + "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 + }, + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + }, + "extends": "eslint:recommended" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..345130c --- /dev/null +++ b/.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/README.md b/README.md index 8cc8c11..892fc8e 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,5 @@ -![CF](https://camo.githubusercontent.com/70edab54bba80edb7493cad3135e9606781cbb6b/687474703a2f2f692e696d6775722e636f6d2f377635415363382e706e67) 04: Parallel File Processing -=== +# Callbacks and File System I/O -## Submission Instructions - * fork this repository & create a new branch for your work - * write all of your code in a directory named `lab-` + `` **e.g.** `lab-susan` - * push to your repository - * submit a pull request to this repository - * submit a link to your PR in canvas - * write a question and observation on canvas +This app demonstrates using Node Module, File System, to read text files through callback functions. The way this is implemented is by logging the buffer to console in a specific order. Tests are utilized by checking for conditions when the callback has returned data. this was done using Mocha's done() function. -## Learning Objectives - * students will be able to create asynchronous programs using the node.js callback pattern - * students will be able to read, write, and encode binary data using the Buffer class - * students will be able to utilize the built-in `fs` module for basic file system I/O operations - * students will be able to use `done` (provided by mocha.js) for creating asynchronous tests - -## Resources - * [fs module docs](https://nodejs.org/api/fs.html) - -## Requirements - -#### Configuration - -* include the following: - * **README.md** - contains documentation about your lab - * **.gitignore** - contains a robust `.gitignore` file - * **.eslintrc** - contains the provided `.eslintrc` file - * **.eslintignore** - contains the provided `.eslintignore` file - * **lib/** - contains your modules - * **test/** - contains your unit tests - * **assets/** - contains the text files used by the program - * **index.js** - contains main program file - -#### Feature Tasks - * for this assignment you will need to read three files and `console.log` the first 8 bytes ***(in hex)*** of each file - * regardless of file size, all three files should be read and logged in the order `'one.txt'`, `'two.txt'`, `'three.txt'` - -#### Testing - * create a test that guarantees that the files are logged in the proper order - * create a test that checks for improper file paths - -#### Documentation - * create a simple description of your project - * create a simple layer of documentation that describes how to use `done` in mocha callbacks +done() is Mocha's callback function which is invoked when your callback function has completed. By using done(), it tells Mocha that the test has completed. \ No newline at end of file diff --git a/assets/one.txt b/assets/one.txt new file mode 100644 index 0000000..0bd32f0 --- /dev/null +++ b/assets/one.txt @@ -0,0 +1 @@ +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec ultricies volutpat lobortis. Cras a facilisis lectus, vel gravida arcu. Integer iaculis at massa blandit tincidunt. Maecenas porta augue purus, at hendrerit dolor congue in. Donec volutpat magna massa, eget scelerisque urna ultricies id. Mauris egestas, massa at cursus sagittis, lectus felis scelerisque lacus, eget blandit velit tellus vitae nisl. Morbi molestie tortor eu sem dignissim sagittis. Integer quis egestas leo, a auctor felis. Pellentesque dignissim ut orci ac blandit. Aenean sed nulla enim. Morbi sit amet interdum odio. \ No newline at end of file diff --git a/assets/three.txt b/assets/three.txt new file mode 100644 index 0000000..43c0d65 --- /dev/null +++ b/assets/three.txt @@ -0,0 +1 @@ +Spiderman was here \ No newline at end of file diff --git a/assets/two.txt b/assets/two.txt new file mode 100644 index 0000000..e906d6f --- /dev/null +++ b/assets/two.txt @@ -0,0 +1,6 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum non rutrum augue, sed dictum arcu. Aenean placerat dolor malesuada sapien tincidunt venenatis. Ut lobortis erat quis felis consectetur porttitor. Quisque rutrum, velit vel congue dictum, lacus ipsum laoreet nunc, ac ultricies nunc mi ac quam. Curabitur dapibus ornare orci a congue. Sed vulputate est a lacinia vulputate. Quisque iaculis, turpis dignissim elementum scelerisque, dui leo venenatis justo, at vehicula augue augue non velit. Donec laoreet velit nunc, et lobortis ante ultrices ut. Sed vulputate ac enim congue tempor. Fusce sollicitudin ut mauris at aliquam. In in est arcu. Nullam magna libero, interdum id erat congue, consequat feugiat risus. Phasellus quis turpis nec quam feugiat auctor. Aenean non diam quis diam maximus laoreet et at justo. Nunc felis risus, imperdiet vitae sapien dignissim, efficitur bibendum lectus. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec ultricies volutpat lobortis. Cras a facilisis lectus, vel gravida arcu. Integer iaculis at massa blandit tincidunt. Maecenas porta augue purus, at hendrerit dolor congue in. Donec volutpat magna massa, eget scelerisque urna ultricies id. Mauris egestas, massa at cursus sagittis, lectus felis scelerisque lacus, eget blandit velit tellus vitae nisl. Morbi molestie tortor eu sem dignissim sagittis. Integer quis egestas leo, a auctor felis. Pellentesque dignissim ut orci ac blandit. Aenean sed nulla enim. Morbi sit amet interdum odio. +Duis eget erat eu ipsum cursus ultrices id quis massa. Nulla dignissim non urna et lobortis. Integer mollis justo nisi, at eleifend ex porta ut. Sed aliquam pellentesque mi eu consequat. Etiam volutpat rutrum aliquet. Phasellus et porttitor est, vel elementum risus. Pellentesque vitae leo et nunc venenatis tincidunt. Duis vitae iaculis mauris, sed fringilla risus. Cras imperdiet, velit nec maximus pretium, velit sem facilisis mi, sit amet dignissim tellus lacus et magna. Ut faucibus, erat vitae condimentum auctor, augue augue sodales nisi, ut tincidunt tellus mi nec libero. Pellentesque magna nulla, dignissim non condimentum id, vehicula et urna. Integer varius, erat vitae pellentesque fringilla, est justo eleifend tortor, vel sollicitudin orci dolor in ligula. + +Proin lobortis accumsan odio id ultrices. Ut nisl lacus, vestibulum sit amet libero eget, placerat auctor tortor. Morbi ut sollicitudin nulla. Duis aliquet arcu quis nulla posuere dignissim. Integer sagittis, magna at venenatis consectetur, urna enim gravida ligula, a dapibus diam dolor et ante. Nam ac bibendum eros, ornare faucibus felis. Maecenas gravida id turpis id volutpat. Mauris lobortis erat non lacus tincidunt venenatis. In ac bibendum nunc. Ut lorem mauris, elementum sed convallis ac, sollicitudin et nunc. Vestibulum lacus tellus, porta quis justo non, accumsan convallis augue. Proin a leo eu justo lacinia molestie quis a urna. Fusce nisl lorem, accumsan eu porttitor nec, lacinia id nulla. Quisque eleifend, mauris auctor malesuada porttitor, nulla orci efficitur nisi, sed aliquet purus lacus a erat. Vestibulum nec auctor velit. +Sed imperdiet sodales rutrum. Ut non velit sed turpis dictum gravida vel cursus augue. Proin elementum diam laoreet, molestie mauris non, hendrerit lectus. Phasellus lacinia lacus urna, eu hendrerit odio bibendum ac. Phasellus euismod felis sed metus molestie, ac gravida ante faucibus. Maecenas pulvinar ultricies lorem, vel semper urna fermentum ac. Vivamus vitae vehicula nisi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed purus mi, viverra non iaculis quis, aliquet at nulla. Aenean id mi et eros convallis vulputate eget ut nulla. Proin vel ex vehicula, interdum orci at, efficitur erat. Integer tristique magna et ultricies porttitor. Mauris bibendum, velit nec elementum interdum, ligula nulla aliquet purus, vel maximus nibh leo ut nisl. Proin enim quam, egestas eu consequat in, rutrum eget lectus. Nunc bibendum tellus mi, id tempor lacus sollicitudin eget. Praesent a vulputate mauris. \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..10bf8a9 --- /dev/null +++ b/index.js @@ -0,0 +1,18 @@ +'use strict'; + +const fileReader = require('./lib/file-reader.js'); + +fileReader(`${__dirname}/assets/one.txt`, (err, data) => { + if (err) throw err; + console.log('content of one.txt:', data); + + fileReader(`${__dirname}/assets/two.txt`, (err, data) => { + if (err) throw err; + console.log('content of two.txt:', data); + + fileReader(`${__dirname}/assets/three.txt`, (err, data) => { + if (err) throw err; + console.log('content of three.txt:', data); + }); + }); +}); diff --git a/lib/file-reader.js b/lib/file-reader.js new file mode 100644 index 0000000..5f005d6 --- /dev/null +++ b/lib/file-reader.js @@ -0,0 +1,11 @@ +'use strict'; + +const fs = require('fs'); + +const fileReader = module.exports = (file, callback) => { + fs.readFile(file, (err, data) => { + if (err) return callback(err); + + return callback(null, data.toString('hex', 0, 8)); + }); +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..618a154 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "03-parallel_file_system", + "version": "1.0.0", + "description": "![CF](https://camo.githubusercontent.com/70edab54bba80edb7493cad3135e9606781cbb6b/687474703a2f2f692e696d6775722e636f6d2f377635415363382e706e67) 04: Parallel File Processing ===", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ohjonah/03-parallel_file_system.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/ohjonah/03-parallel_file_system/issues" + }, + "homepage": "https://github.com/ohjonah/03-parallel_file_system#readme", + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.4.2" + } +} diff --git a/test/file-reader-test.js b/test/file-reader-test.js new file mode 100644 index 0000000..cf9531b --- /dev/null +++ b/test/file-reader-test.js @@ -0,0 +1,38 @@ +'use strict'; + +const expect = require('chai').expect; +const fileReader = require('../lib/file-reader.js'); + +describe('File Reader Module', () => { + describe('with improper file path', () => { + it('should return an error', done => { + fileReader(`${__dirname}/not-a-file.txt`, err => { + expect(err).to.be.an('error'); + done(); + }); + }); + }); + + describe('with a proper file path', () => { + it('should return content from txt files', done => { + fileReader(`${__dirname}/../assets/one.txt`, (err, data) => { + expect(err).to.equal(null); + expect(data.length).to.equal(16); + expect(data).to.be.a('string'); + + fileReader(`${__dirname}/../assets/two.txt`, (err, data) => { + expect(err).to.equal(null); + expect(data.length).to.equal(16); + expect(data).to.be.a('string'); + + fileReader(`${__dirname}/../assets/two.txt`, (err, data) => { + expect(err).to.equal(null); + expect(data.length).to.equal(16); + expect(data).to.be.a('string'); + done(); + }); + }); + }); + }); + }); +}); \ No newline at end of file