v0.3.0-dev.1
This commit is contained in:
parent
d549bca9a8
commit
de3690c94e
18
CHANGELOG.md
18
CHANGELOG.md
|
@ -1,11 +1,23 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [0.2.0]()
|
## [v0.2.0](https://git.zhirov.kz/dlang/readconf/compare/v0.1.1...v0.2.0) (2023.03.26)
|
||||||
|
|
||||||
26.03.2023
|
|
||||||
|
|
||||||
### New
|
### New
|
||||||
|
|
||||||
- Adding sections support
|
- Adding sections support
|
||||||
- Taking into account spaces and tabs to separate the parameter, value and comment
|
- Taking into account spaces and tabs to separate the parameter, value and comment
|
||||||
- Added aliases to convenient parameter access to the value
|
- Added aliases to convenient parameter access to the value
|
||||||
|
|
||||||
|
## [v0.1.1](https://git.zhirov.kz/dlang/readconf/compare/v0.1.0...v0.1.1) (2023.03.24)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- Checking empty keys
|
||||||
|
- Reading an expression in quotation marks
|
||||||
|
|
||||||
|
## [v0.1.0](https://git.zhirov.kz/dlang/readconf/commits/6409917cbe6a287db73fe3eea4bccaadf00379e7) (2023.03.23)
|
||||||
|
|
||||||
|
### The first stable working release
|
||||||
|
|
||||||
|
- The parameters are separated by `=` or `=>`
|
||||||
|
- The ability to comment lines through delimiters `;`, `#`, `//`
|
||||||
|
|
|
@ -27,7 +27,7 @@ private:
|
||||||
static Config config;
|
static Config config;
|
||||||
string path;
|
string path;
|
||||||
bool readed = false;
|
bool readed = false;
|
||||||
ConfigSection[string] sections;
|
ConfigFile[string] configs;
|
||||||
|
|
||||||
const string pattern = "^( |\\t)*(((\\w(\\w|-)+)(( |\\t)*(=>|=){1}"
|
const string pattern = "^( |\\t)*(((\\w(\\w|-)+)(( |\\t)*(=>|=){1}"
|
||||||
~ "( |\\t)*)(?!\\/(\\/|\\*))(([^ >\"'=\\n\\t#;].*?)|(\"(.+)\")"
|
~ "( |\\t)*)(?!\\/(\\/|\\*))(([^ >\"'=\\n\\t#;].*?)|(\"(.+)\")"
|
||||||
|
@ -37,7 +37,7 @@ private:
|
||||||
/**
|
/**
|
||||||
* Reading the configuration file
|
* Reading the configuration file
|
||||||
*/
|
*/
|
||||||
bool readConfig()
|
bool readConfig(const string configName)
|
||||||
{
|
{
|
||||||
File configuration;
|
File configuration;
|
||||||
|
|
||||||
|
@ -49,6 +49,9 @@ private:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configName !in this.configs)
|
||||||
|
this.configs[configName] = ConfigFile(configName);
|
||||||
|
|
||||||
auto regular = regex(this.pattern, "m");
|
auto regular = regex(this.pattern, "m");
|
||||||
|
|
||||||
// reading from the main section
|
// reading from the main section
|
||||||
|
@ -79,10 +82,12 @@ private:
|
||||||
else if (match[group][0] == '\'')
|
else if (match[group][0] == '\'')
|
||||||
group = GROUP_VALUE_3;
|
group = GROUP_VALUE_3;
|
||||||
|
|
||||||
if (sectionName !in this.sections)
|
this.configs[configName].add(sectionName, ConfigParameter(match[GROUP_PROPERTY], match[group]));
|
||||||
this.sections[sectionName] = ConfigSection(sectionName);
|
|
||||||
|
// if (sectionName !in this.sections)
|
||||||
|
// this.sections[sectionName] = ConfigSection(sectionName);
|
||||||
|
|
||||||
this.sections[sectionName].add(ConfigParameter(match[GROUP_PROPERTY], match[group]));
|
// this.sections[sectionName].add(ConfigParameter(match[GROUP_PROPERTY], match[group]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +97,7 @@ private:
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.msg.warning("Unable to close the configuration file " ~ this.path);
|
Log.msg.warning("Unable to close the configuration file " ~ this.path);
|
||||||
Log.msg.error(e);
|
Log.msg.error(e);
|
||||||
|
this.configs.remove(configName);
|
||||||
this.readed = false;
|
this.readed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,14 +124,51 @@ public:
|
||||||
* Params:
|
* Params:
|
||||||
* path = the path to the configuration file
|
* path = the path to the configuration file
|
||||||
*/
|
*/
|
||||||
bool read(string path)
|
bool read(string path, string configName = "")
|
||||||
{
|
{
|
||||||
this.path = path;
|
this.path = path;
|
||||||
if (!path.exists)
|
if (!path.exists)
|
||||||
throw new Exception("The configuration file does not exist: " ~ path);
|
throw new Exception("The configuration file does not exist: " ~ path);
|
||||||
return readConfig();
|
if (configName.length == 0)
|
||||||
|
configName = path.baseName();
|
||||||
|
if (configName in configs)
|
||||||
|
throw new Exception("The configuration file with this name has already been read");
|
||||||
|
return readConfig(configName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the section
|
||||||
|
* Params:
|
||||||
|
* section = section name (default main "[]")
|
||||||
|
*/
|
||||||
|
@property ConfigFile configFile(string configName = "")
|
||||||
|
{
|
||||||
|
if (configName.length == 0)
|
||||||
|
{
|
||||||
|
if (configs.length == 1)
|
||||||
|
return configs[configs.byKey.front];
|
||||||
|
else
|
||||||
|
throw new Exception("You must explicitly specify the name of the configuration file");
|
||||||
|
}
|
||||||
|
|
||||||
|
return configName in configs ? configs[configName] : ConfigFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config file
|
||||||
|
*
|
||||||
|
* Get the config file
|
||||||
|
* Params:
|
||||||
|
* configName = config name (by default the name of the configuration file)
|
||||||
|
*/
|
||||||
|
alias cf = configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ConfigFile
|
||||||
|
{
|
||||||
|
private string name = "[]";
|
||||||
|
private ConfigSection[string] sections;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the section
|
* Get the section
|
||||||
* Params:
|
* Params:
|
||||||
|
@ -144,6 +187,14 @@ public:
|
||||||
* section = section name (default main "[]")
|
* section = section name (default main "[]")
|
||||||
*/
|
*/
|
||||||
alias sn = sectionName;
|
alias sn = sectionName;
|
||||||
|
|
||||||
|
private void add(string sectionName, ConfigParameter parameter)
|
||||||
|
{
|
||||||
|
if (sectionName !in this.sections)
|
||||||
|
this.sections[sectionName] = ConfigSection(sectionName);
|
||||||
|
|
||||||
|
this.sections[sectionName].add(parameter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ConfigSection
|
struct ConfigSection
|
||||||
|
|
25
tests/test.d
25
tests/test.d
|
@ -3,18 +3,21 @@ import readconf;
|
||||||
unittest
|
unittest
|
||||||
{
|
{
|
||||||
rc.read("./tests/settings.conf");
|
rc.read("./tests/settings.conf");
|
||||||
|
rc.read("./tests/settings.conf", "new");
|
||||||
|
|
||||||
assert(rc.sn.key("value1") == "text without quotes");
|
assert(rc.cf("settings.conf").sn.key("value1") == "text without quotes");
|
||||||
assert(rc.sn.key("value2") == "Yes!");
|
assert(rc.cf("settings.conf").sn.key("value2") == "Yes!");
|
||||||
assert(rc.sn.key("value3") == "value in apostrophes");
|
assert(rc.cf("settings.conf").sn.key("value3") == "value in apostrophes");
|
||||||
assert(rc.sn.key("value4") == "1000");
|
assert(rc.cf("settings.conf").sn.key("value4") == "1000");
|
||||||
assert(rc.sn.key("value5") == "0.000");
|
assert(rc.cf("settings.conf").sn.key("value5") == "0.000");
|
||||||
assert(rc.sn.key("value7") == "//path");
|
assert(rc.cf("settings.conf").sn.key("value7") == "//path");
|
||||||
assert(rc.sn.key("value8") == "\"Hey!\"");
|
assert(rc.cf("settings.conf").sn.key("value8") == "\"Hey!\"");
|
||||||
assert(rc.sn("part2").key("value1") == "this value will be in the new section");
|
assert(rc.cf("settings.conf").sn("part2").key("value1") == "this value will be in the new section");
|
||||||
assert(rc.sn("part2").key("value3") == "good value!");
|
assert(rc.cf("settings.conf").sn("part2").key("value3") == "good value!");
|
||||||
assert(rc.sn("part3").key("value1") == "-2");
|
assert(rc.cf("settings.conf").sn("part3").key("value1") == "-2");
|
||||||
assert(rc.sn("part3").key("value3") == "100");
|
assert(rc.cf("settings.conf").sn("part3").key("value3") == "100");
|
||||||
|
|
||||||
|
assert(rc.cf("new").sn("part3").key("value3") == "100");
|
||||||
}
|
}
|
||||||
|
|
||||||
// void main()
|
// void main()
|
||||||
|
|
Loading…
Reference in New Issue