Permalink
Browse files

code+tests

  • Loading branch information...
0 parents commit a84e05623116b83cb41a86a50fa26477172ddcf8 @DTrejo committed Mar 27, 2011
Showing with 149 additions and 0 deletions.
  1. +58 −0 streamify.js
  2. +40 −0 test/no-file-test.js
  3. +51 −0 test/test.js
@@ -0,0 +1,58 @@
+//
+// Pretty much all written by James Halliday (substack.net)
+// Small bits by David Trejo (dtrejo.com)
+//
+var Traverse = require('traverse')
+ , fs = require('fs')
+ ;
+
+// emit is a function
+// also, this is a sync function
+exports.streamify = function streamify(obj, emit) {
+
+ Traverse(obj).forEach(function to_s (node) {
+ if (Array.isArray(node)) {
+ this.before(function () { emit('['); });
+ this.post(function (child) {
+ if (!child.isLast) emit(',');
+ });
+ this.after(function () { emit(']'); });
+ }
+ else if (typeof node == 'object') {
+ this.before(function () { emit('{'); });
+ this.pre(function (x, key) {
+ to_s(key);
+ emit(':');
+ });
+ this.post(function (child) {
+ if (!child.isLast) emit(',');
+ });
+ this.after(function () { emit('}'); });
+ }
+ else if (typeof node == 'string') {
+ emit('"' + node.toString().replace(/"/g, '\\"') + '"');
+ }
+ else if (typeof node == 'function') {
+ emit('null');
+ }
+ else {
+ emit(node.toString());
+ }
+ });
+};
+
+exports.streamingWrite = function streamingWrite(path, object, cb) {
+
+ var stream = fs.createWriteStream(path, { flags: 'w+', encoding: 'utf8' });
+
+ stream.on('close', cb);
+ stream.on('error', cb);
+
+ exports.streamify(object, function(chunk) {
+ stream.write(chunk);
+ });
+
+ // all writes have been sent, b/c streamify is a sync function.
+ stream.end();
+
+};
@@ -0,0 +1,40 @@
+var fs = require('fs')
+ , path = './DELETEME.txt'
+ , stream = fs.createWriteStream(path, { flags: 'w+', encoding: 'utf8' })
+ , data = { "I":0.18181818181818182,"bought":0.18181818181818182 }
+ ;
+
+function cb(err) {
+ if (err) console.log(err);
+ console.log('cool, all done.');
+}
+
+stream.on('close', cb);
+stream.on('error', cb);
+
+var arr = [ JSON.stringify(data)
+ , '\n'
+ , JSON.stringify(data)
+ , '\n'
+ ];
+
+// doesn't work:
+// (function(arr, fn){
+// for (var i = 0; i < arr.length; i++) {
+// fn(arr[i]);
+// }
+// })(arr, stream.write);
+
+// however, this works:
+
+stream.write(JSON.stringify(data));
+stream.write('\n');
+stream.write(JSON.stringify(data));
+stream.write('\n');
+stream.write(JSON.stringify(data));
+
+// Wierd eh?
+
+
+// all writes have been sent
+stream.end();
@@ -0,0 +1,51 @@
+var assert = require('assert')
+ , streamify = require('../streamify').streamify
+ , streamingWrite = require('../streamify').streamingWrite
+ , testCase = require('nodeunit').testCase
+ , fs = require('fs')
+ , small = { a: 1, b: 2, c: 3}
+ , medium = {"J":{"I":0.18181818181818182,"bought":0.18181818181818182,"some":0.18181818181818182,"bread":0.09090909090909091,"butter":0.09090909090909091},"'ai":{"I":0.18181818181818182,"bought":0.18181818181818182,"some":0.18181818181818182,"bread":0.09090909090909091,"butter":0.09090909090909091},"acheter":{"I":0.18181818181818182,"bought":0.18181818181818182,"some":0.18181818181818182,"bread":0.09090909090909091,"butter":0.09090909090909091},"du":{"I":0.18181818181818182,"bought":0.18181818181818182,"some":0.18181818181818182,"bread":0.09090909090909091,"butter":0.09090909090909091},"pain":{"I":0.09999999999999999,"bought":0.09999999999999999,"some":0.09999999999999999,"bread":0.18333333333333332,"We":0.08333333333333333,"must":0.08333333333333333,"eat":0.08333333333333333,"the":0.08333333333333333,"white":0.08333333333333333},"beurre":{"I":0.25,"bought":0.25,"some":0.25,"butter":0.25},"Nous":{"We":0.16666666666666669,"must":0.16666666666666669,"eat":0.16666666666666669,"the":0.16666666666666669,"white":0.16666666666666669,"bread":0.16666666666666669},"devon":{"We":0.16666666666666669,"must":0.16666666666666669,"eat":0.16666666666666669,"the":0.16666666666666669,"white":0.16666666666666669,"bread":0.16666666666666669},"manger":{"We":0.16666666666666669,"must":0.16666666666666669,"eat":0.16666666666666669,"the":0.16666666666666669,"white":0.16666666666666669,"bread":0.16666666666666669},"le":{"We":0.16666666666666669,"must":0.16666666666666669,"eat":0.16666666666666669,"the":0.16666666666666669,"white":0.16666666666666669,"bread":0.16666666666666669},"blanc":{"We":0.16666666666666669,"must":0.16666666666666669,"eat":0.16666666666666669,"the":0.16666666666666669,"white":0.16666666666666669,"bread":0.16666666666666669}}
+ , size = 100
+ , big = []
+ ;
+
+while(size--) {
+ big.push(medium);
+}
+
+module.exports = testCase({
+ test_small_object: function(assert) {
+ var str = '';
+ streamify(small, function(data) { str += data; });
+
+ assert.equals(JSON.stringify(small), str
+ , 'JSON.stringify and streamify return the same string for a small object');
+ assert.done();
+ }
+ , test_big_object: function(assert) {
+ var str = '';
+ streamify(big, function(data) { str += data; });
+
+ assert.equals(JSON.stringify(big), str
+ , 'JSON.stringify and streamify return the same string for a big object');
+ assert.done();
+ }
+ , test_small_streaming_write: function(assert) {
+ path = './DELETEME.txt';
+ streamingWrite(path, small, function() {
+ assert.equals(JSON.stringify(small), fs.readFileSync(path).toString('utf8')
+ , 'Streaming write to file with small object returns same as JSON.stringify');
+ });
+ fs.unlinkSync(path);
+ assert.done();
+ }
+ , test_big_streaming_write: function(assert) {
+ path = './DELETEME.txt';
+ streamingWrite(path, big, function() {
+ assert.equals(JSON.stringify(big), fs.readFileSync(path).toString('utf8')
+ , 'Streaming write to file with big object returns same as JSON.stringify');
+ });
+ fs.unlinkSync(path);
+ assert.done();
+ }
+});

0 comments on commit a84e056

Please sign in to comment.