Add ini.stringify functionality, a test, and some TODOs in ini.js
authorisaacs <i@izs.me>
Mon, 22 Mar 2010 22:25:12 +0000 (15:25 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Tue, 6 Apr 2010 00:05:35 +0000 (17:05 -0700)
lib/ini.js
test/simple/test-ini.js

index bc19387..3a59457 100644 (file)
@@ -1,3 +1,13 @@
+// TODO:
+// 1. Handle quoted strings, including line breaks, so that this:
+//    foo = "bar
+//      baz"
+//    parses to {foo:"bar\n  baz"}
+// 2. Escape with \, so that this:
+//    foo = bar\
+//      \"baz
+//    parses to {foo:"bar\n  \"baz"}
+
 exports.parse = function(d) {
   var ini = {'-':{}};
 
@@ -26,4 +36,31 @@ exports.parse = function(d) {
   }
 
   return ini;
+};
+
+function safe (val) {
+  return (val+"").replace(/[\n\r]+/g, " ");
 }
+
+exports.stringify = function (obj) {
+  // if the obj has a "-" section, then do that first.
+  var ini = "";
+  if ("-" in obj) {
+    for (var key in obj["-"]) {
+      ini += safe(key)+" = "+safe(obj["-"][key])+"\n";
+    }
+  }
+  for (var section in obj) if (section !== "-") {
+    ini += "[" + safe(section) + "]\n";
+    for (var key in obj[section]) {
+
+      ini += safe(key) + ((obj[section][key] === true)
+        ? "\n"
+        : " = "+safe(obj[section][key])+"\n");
+    }
+  }
+  return ini;
+};
+
+exports.encode = exports.stringify;
+exports.decode = exports.parse;
index 9b072f2..489950d 100644 (file)
@@ -1,7 +1,8 @@
 require("../common");
-var path = require('path');
-var fs = require("fs");
-parse = require("ini").parse;
+var path = require('path'),
+  fs = require("fs"),
+  ini = require("ini"),
+  parse = require("ini").parse;
 
 debug("load fixtures/fixture.ini");
 
@@ -15,32 +16,44 @@ fs.readFile(p,function(err, data) {
   var iniContents = parse(data);
   assert.equal(typeof iniContents, 'object');
   
-  var expect =
-    { "-" :
-      { "root" : "something"
-      , "url" : "http://example.com/?foo=bar"
-      }
-    , "the section with whitespace" :
-      { "this has whitespace" : "yep"
-      , "just a flag, no value." : true
-      }
-    , "section" :
-      { "one" : "two"
-      , "Foo" : "Bar"
-      , "this" : "Your Mother!"
-      , "blank" : ""
-      }
-    , "Section Two" :
-      { "something else" : "blah"
-      , "remove" : "whitespace"
-      }
-    };
-  
-  assert.deepEqual(iniContents, expect,
-    "actual: \n"+inspect(iniContents) +"\n≠\nexpected:\n"+inspect(expect))
+  var expect = { "-" :
+                 { "root" : "something"
+                 , "url" : "http://example.com/?foo=bar"
+                 }
+               , "the section with whitespace" :
+                 { "this has whitespace" : "yep"
+                 , "just a flag, no value." : true
+                 }
+               , "section" :
+                 { "one" : "two"
+                 , "Foo" : "Bar"
+                 , "this" : "Your Mother!"
+                 , "blank" : ""
+                 }
+               , "Section Two" :
+                 { "something else" : "blah"
+                 , "remove" : "whitespace"
+                 }
+               },
+    expectStr = "root = something\n"+
+                "url = http://example.com/?foo=bar\n"+
+                "[the section with whitespace]\n"+
+                "this has whitespace = yep\n"+
+                "just a flag, no value.\n"+
+                "[section]\n"+
+                "one = two\n"+
+                "Foo = Bar\n"+
+                "this = Your Mother!\n"+
+                "blank = \n"+
+                "[Section Two]\n"+
+                "something else = blah\n"+
+                "remove = whitespace\n";
 
-  assert.equal(iniContents['-']['root'],'something');
-  assert.equal(iniContents['section']['blank'],'');
-  assert.equal(iniContents['Section Two']['remove'],'whitespace');
+  assert.deepEqual(iniContents, expect,
+    "actual: \n"+inspect(iniContents) +"\n≠\nexpected:\n"+inspect(expect));
 
+  assert.equal(ini.stringify(iniContents), expectStr,
+    "actual: \n"+inspect(ini.stringify(iniContents)) +"\n≠\nexpected:\n"+inspect(expectStr));
 });
+
+