Import initial configmanager, not sure if it works yet, but it does pass the unit...
authorMatthew Wild <mwild1@gmail.com>
Fri, 21 Nov 2008 05:47:27 +0000 (05:47 +0000)
committerMatthew Wild <mwild1@gmail.com>
Fri, 21 Nov 2008 05:47:27 +0000 (05:47 +0000)
core/configmanager.lua [new file with mode: 0644]
tests/test_core_configmanager.lua [new file with mode: 0644]

diff --git a/core/configmanager.lua b/core/configmanager.lua
new file mode 100644 (file)
index 0000000..cc7ffb7
--- /dev/null
@@ -0,0 +1,105 @@
+
+local _G = _G;
+module "configmanager"
+
+local parsers = {};
+
+local config = { ["*"] = { core = {} } };
+
+local global_config = config["*"];
+
+-- When host not found, use global
+setmetatable(config, { __index = function () return global_config; end});
+local host_mt = { __index = global_config };
+
+-- When key not found in section, check key in global's section
+function section_mt(section_name)
+       return { __index =      function (t, k)
+                                                                       local section = rawget(global_config, section_name);
+                                                                       if not section then return nil; end
+                                                                       return section[k];
+                                                       end };
+end
+
+function get(host, section, key)
+       local sec = config[host][section];
+       if sec then
+               return sec[key];
+       end
+       return nil;
+end
+
+function set(host, section, key, value)
+       if host and section and key then
+               local hostconfig = rawget(config, host);
+               if not hostconfig then
+                       hostconfig = rawset(config, host, setmetatable({}, host_mt))[host];
+               end
+               if not rawget(hostconfig, section) then
+                       hostconfig[section] = setmetatable({}, section_mt(section));
+               end
+               hostconfig[section][key] = value;
+               return true;
+       end
+       return false;
+end
+
+function load(filename, format)
+       if parsers[format] and parsers[format].load then
+               local f = io.open(filename);
+               if f then 
+                       local ok, err = parsers[format](f:read("*a"));
+                       f:close();
+                       return ok, err;
+               end
+       end
+       return false, "no parser";
+end
+
+function save(filename, format)
+end
+
+function addparser(format, parser)
+       if format and parser then
+               parsers[format] = parser;
+       end
+end
+
+do
+       parsers.lua = {};
+       function parsers.lua.load(data)
+               local env = setmetatable({}, { __index = function (t, k)
+                                                                                       if k:match("^mod_") then
+                                                                                               return function (settings_table)
+                                                                                                                       config[__currenthost or "*"][k] = settings_table;
+                                                                                                               end;
+                                                                                       end
+                                                                                       return rawget(_G, k);
+                                                                               end});
+               
+               function env.Host(name)
+                       env.__currenthost = name;
+               end
+               
+               local chunk, err = loadstring(data);
+               
+               if not chunk then
+                       return nil, err;
+               end
+               
+               setfenv(chunk, env);
+               
+               local ok, err = pcall(chunk);
+               
+               if not ok then
+                       return nil, err;
+               end
+               
+               
+               
+               return true;
+       end
+       
+end
+
+return _M;
\ No newline at end of file
diff --git a/tests/test_core_configmanager.lua b/tests/test_core_configmanager.lua
new file mode 100644 (file)
index 0000000..099ff3c
--- /dev/null
@@ -0,0 +1,28 @@
+
+function get(get, config)
+       config.set("example.com", "test", "testkey", 123);
+       assert_equal(get("example.com", "test", "testkey"), 123, "Retrieving a set key");
+
+       config.set("*", "test", "testkey1", 321);
+       assert_equal(get("*", "test", "testkey1"), 321, "Retrieving a set global key");
+       assert_equal(get("example.com", "test", "testkey1"), 321, "Retrieving a set key of undefined host, of which only a globally set one exists");
+       
+       config.set("example.com", "test", ""); -- Creates example.com host in config
+       assert_equal(get("example.com", "test", "testkey1"), 321, "Retrieving a set key, of which only a globally set one exists");
+       
+       assert_equal(get(), nil, "No parameters to get()");
+       assert_equal(get("undefined host"), nil, "Getting for undefined host");
+       assert_equal(get("undefined host", "undefined section"), nil, "Getting for undefined host & section");
+       assert_equal(get("undefined host", "undefined section", "undefined key"), nil, "Getting for undefined host & section & key");
+
+       assert_equal(get("example.com", "undefined section", "testkey"), nil, "Defined host, undefined section");
+end
+
+function set(set, u)
+       assert_equal(set("*"), false, "Set with no section/key");
+       assert_equal(set("*", "set_test"), false, "Set with no key");   
+
+       assert_equal(set("*", "set_test", "testkey"), true, "Setting a nil global value");
+       assert_equal(set("*", "set_test", "testkey", 123), true, "Setting a global value");
+end
+