# HG changeset patch # User Matthew Wild # Date 1227246447 0 # Node ID 0dc5819660e83ec0662ab20154d9f973d4c62cd1 # Parent 9ade55e059ea1dc69cd6854c08414fe67a7ed4c5 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;) diff -r 9ade55e059ea -r 0dc5819660e8 core/configmanager.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/configmanager.lua Fri Nov 21 05:47:27 2008 +0000 @@ -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 -r 9ade55e059ea -r 0dc5819660e8 tests/test_core_configmanager.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_core_configmanager.lua Fri Nov 21 05:47:27 2008 +0000 @@ -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 +