Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)

remotes/origin/sasl
Matthew Wild 17 years ago
parent 44545470c0
commit ede1bd83a8
  1. 105
      core/configmanager.lua
  2. 28
      tests/test_core_configmanager.lua

@ -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;

@ -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
Loading…
Cancel
Save