v0.3.0-beta.1
This commit is contained in:
parent
1d89b62354
commit
1e45d1a503
20
README.md
20
README.md
|
@ -14,10 +14,12 @@ Singleton for reading the configuration file required for your program.
|
||||||
|
|
||||||
## What can do
|
## What can do
|
||||||
|
|
||||||
1. Separation of parameter and value by separators `=` and `=>`
|
- Reading multiple configuration files
|
||||||
2. Commenting on lines using special characters `;`, `#`, `//`, `/*`
|
- Separation of parameters by sections
|
||||||
3. Support for sections for describing parameter blocks (sections are set by the name in `[]`)
|
- Access to parameters and sections using keys and indexes
|
||||||
4. Support for spaces and tabs for visual separation
|
- Commenting on lines
|
||||||
|
|
||||||
|
You will get more detailed information on the [wiki](https://git.zhirov.kz/dlang/readconf/wiki).
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
|
@ -25,7 +27,7 @@ The `settings.conf` file (see the [tests](tests/)):
|
||||||
|
|
||||||
![matches.png](img/matches.png)
|
![matches.png](img/matches.png)
|
||||||
|
|
||||||
Read `settings.conf` file:
|
Read `./tests/settings.conf` file:
|
||||||
|
|
||||||
```d
|
```d
|
||||||
import readconf;
|
import readconf;
|
||||||
|
@ -33,7 +35,7 @@ import std.stdio;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
rc.read("./settings.conf");
|
rc.read("./tests/settings.conf");
|
||||||
|
|
||||||
foreach (key, param; rc.sn.keys())
|
foreach (key, param; rc.sn.keys())
|
||||||
writefln("%s => %s", key, param);
|
writefln("%s => %s", key, param);
|
||||||
|
@ -43,7 +45,7 @@ void main()
|
||||||
foreach (key, param; rc.sn("part2").keys())
|
foreach (key, param; rc.sn("part2").keys())
|
||||||
writefln("%s => %s", key, param);
|
writefln("%s => %s", key, param);
|
||||||
|
|
||||||
writeln(rc.sn("part2").key("value1"));
|
writeln(rc["part2"]["value1"]);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -63,6 +65,6 @@ value3 => good value!
|
||||||
this value will be in the new section
|
this value will be in the new section
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dub
|
## DUB
|
||||||
|
|
||||||
Add a dependency on `"readconf": "~>0.2.0"`
|
Add a dependency on `"readconf": "~>0.3.0"`
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
This line will be a comment, since it does not match the basic template
|
||||||
|
parameter1 => value1 ; This will be a comment
|
||||||
|
parameter2 => value2 # This will be a comment
|
||||||
|
parameter3 => value3 // This will be a comment
|
||||||
|
parameter4 => value4 /* This will be a comment
|
||||||
|
parameter5 => value5;This will not be a comment
|
||||||
|
parameter6 => value6// This will also be a whole value
|
||||||
|
parameter7 => //value7 ;The value will not be read
|
||||||
|
parameter8 => "//value8" # Now the value is correctly
|
||||||
|
parameter9 => ';value9' // The value is correctly too
|
||||||
|
parameter10 => '"value10"' // Quotes inside
|
|
@ -0,0 +1,22 @@
|
||||||
|
parameter1 = value1
|
||||||
|
parameter_2 = value2
|
||||||
|
|
||||||
|
[first-section] ; Creating the first section
|
||||||
|
parameter1 = value3 ; A section may contain similar parameter names
|
||||||
|
parameter_2 = value4
|
||||||
|
|
||||||
|
[second-section] // Another section
|
||||||
|
parameter1 = value5
|
||||||
|
parameter_2 = value6
|
||||||
|
|
||||||
|
[] /* Addition of the main section
|
||||||
|
parameter3 = value7 /* A new parameter will be added
|
||||||
|
parameter1 = value8 /* And parameter1 will be redefined
|
||||||
|
|
||||||
|
[first-section] # Addition of the first section
|
||||||
|
parameter3 = value9
|
||||||
|
parameter4 = value10
|
||||||
|
|
||||||
|
[_section] # Creating the new section
|
||||||
|
parameter1 = value11
|
||||||
|
parameter2 = value12
|
|
@ -0,0 +1,16 @@
|
||||||
|
parameter1=value1
|
||||||
|
parameter2=>value2
|
||||||
|
parameter3=value3
|
||||||
|
parameter4=>value4
|
||||||
|
|
||||||
|
_parameter5 = value5
|
||||||
|
parameter6 => value6
|
||||||
|
parameter7 = value7
|
||||||
|
|
||||||
|
parameter8 => value8
|
||||||
|
parameter9 =value9
|
||||||
|
parameter-10 =>value10
|
||||||
|
parameter11 = value11
|
||||||
|
|
||||||
|
|
||||||
|
parameter12_ => value12
|
|
@ -1,5 +0,0 @@
|
||||||
[postgres]
|
|
||||||
host => "//myhost"
|
|
||||||
port => 5432
|
|
||||||
name => mydatabase
|
|
||||||
password => "/&#BD&@MXLE"
|
|
145
tests/test.d
145
tests/test.d
|
@ -3,48 +3,119 @@ import std.conv;
|
||||||
|
|
||||||
unittest
|
unittest
|
||||||
{
|
{
|
||||||
rc.read("./tests/settings.conf", "old");
|
rc.read("./examples/simple.conf");
|
||||||
rc.read("./tests/database.conf", "pgconf");
|
|
||||||
|
|
||||||
assert(rc.cf("old").sn.key("value1") == "text without quotes");
|
auto configFile = rc.cf;
|
||||||
assert(rc["old"][""]["value2"] == "Yes!");
|
auto mainSection = configFile.sn;
|
||||||
assert(rc.cf("old").sn.key("value3") == "value in apostrophes");
|
|
||||||
assert(rc.cf("old").sn.key("value4") == "1000");
|
|
||||||
assert(rc.cf("old").sn.key("value5") == "0.000");
|
|
||||||
assert(rc.cf("old").sn.key("value7") == "//path");
|
|
||||||
assert(rc.cf("old").sn.key("value8") == "\"Hey!\"");
|
|
||||||
assert(rc.cf("old").sn("part2").key("value1") == "this value will be in the new section");
|
|
||||||
assert(rc.cf("old").sn("part2").key("value3") == "good value!");
|
|
||||||
assert(rc.cf("old").sn("part3").key("value1") == "-2");
|
|
||||||
assert(rc.cf("old").sn("part3").key("value3") == "100");
|
|
||||||
|
|
||||||
auto pgconf = rc.cf("pgconf").sn("postgres");
|
assert(mainSection.key("parameter1") == "value1");
|
||||||
|
assert(mainSection["parameter2"] == "value2");
|
||||||
assert(pgconf.key("host") == "//myhost");
|
assert(mainSection.key("parameter3") == "value3");
|
||||||
assert(pgconf.key("port").to!int == 5432);
|
assert(mainSection["parameter4"] == "value4");
|
||||||
assert(pgconf.key("name") == "mydatabase");
|
assert(mainSection.key("_parameter5") == "value5");
|
||||||
assert(pgconf.key("password") == "/&#BD&@MXLE");
|
assert(mainSection["parameter6"] == "value6");
|
||||||
|
assert(mainSection.key("parameter7") == "value7");
|
||||||
auto pgconf2 = rc.cf("pgconf");
|
assert(mainSection["parameter8"] == "value8");
|
||||||
|
assert(mainSection.key("parameter9") == "value9");
|
||||||
assert(pgconf2[]["host"] == "//myhost");
|
assert(mainSection["parameter-10"] == "value10");
|
||||||
assert(pgconf2.sn.key("port").to!int == 5432);
|
assert(mainSection.key("parameter11") == "value11");
|
||||||
assert(pgconf2.sn.key("name") == "mydatabase");
|
assert(mainSection["parameter12_"] == "value12");
|
||||||
assert(pgconf2.sn.key("password") == "/&#BD&@MXLE");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// void main()
|
unittest
|
||||||
// {
|
{
|
||||||
// import std.stdio;
|
rc.read("./examples/sections.conf");
|
||||||
// rc.read("./tests/settings.conf");
|
auto configFile = rc.cf;
|
||||||
|
|
||||||
// foreach (key, param; rc.sn.keys())
|
auto mainSection = configFile.sn;
|
||||||
// writefln("%s => %s", key, param);
|
auto firstSection = configFile.sn("first-section");
|
||||||
|
auto secondSection = configFile["second-section"];
|
||||||
|
auto section = configFile["_section"];
|
||||||
|
|
||||||
// writeln(rc.sn.key("value1"));
|
assert(mainSection.key("parameter1") == "value8");
|
||||||
|
assert(mainSection["parameter_2"] == "value2");
|
||||||
|
assert(mainSection["parameter3"] == "value7");
|
||||||
|
|
||||||
// foreach (key, param; rc.sn("part2").keys())
|
assert(firstSection["parameter1"] == "value3");
|
||||||
// writefln("%s => %s", key, param);
|
assert(firstSection["parameter_2"] == "value4");
|
||||||
|
assert(firstSection["parameter3"] == "value9");
|
||||||
|
assert(firstSection["parameter4"] == "value10");
|
||||||
|
|
||||||
// writeln(rc.sn("part2").key("value1"));
|
assert(secondSection["parameter1"] == "value5");
|
||||||
// }
|
assert(secondSection["parameter_2"] == "value6");
|
||||||
|
|
||||||
|
assert(section["parameter1"] == "value11");
|
||||||
|
assert(section["parameter2"] == "value12");
|
||||||
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
rc.read("./examples/simple.conf", "simple");
|
||||||
|
rc.read("./examples/sections.conf");
|
||||||
|
rc.read("./examples/comments.conf", "comments");
|
||||||
|
|
||||||
|
auto simpleConfig = rc.cf("simple");
|
||||||
|
auto sectionsConfig = rc["sections.conf"];
|
||||||
|
auto commentsConfig = rc["comments"];
|
||||||
|
|
||||||
|
auto simConMaiSec = simpleConfig.sn;
|
||||||
|
|
||||||
|
assert(simConMaiSec.key("parameter1") == "value1");
|
||||||
|
assert(simConMaiSec["parameter2"] == "value2");
|
||||||
|
assert(simConMaiSec.key("parameter3") == "value3");
|
||||||
|
assert(simConMaiSec["parameter4"] == "value4");
|
||||||
|
assert(simConMaiSec.key("_parameter5") == "value5");
|
||||||
|
assert(simConMaiSec["parameter6"] == "value6");
|
||||||
|
assert(simConMaiSec.key("parameter7") == "value7");
|
||||||
|
assert(simConMaiSec["parameter8"] == "value8");
|
||||||
|
assert(simConMaiSec.key("parameter9") == "value9");
|
||||||
|
assert(simConMaiSec["parameter-10"] == "value10");
|
||||||
|
assert(simConMaiSec.key("parameter11") == "value11");
|
||||||
|
assert(simConMaiSec["parameter12_"] == "value12");
|
||||||
|
|
||||||
|
auto secConMaiSec = sectionsConfig.sn;
|
||||||
|
auto secConFirSec = sectionsConfig.sn("first-section");
|
||||||
|
auto secConSecSec = sectionsConfig["second-section"];
|
||||||
|
auto secConSec = sectionsConfig["_section"];
|
||||||
|
|
||||||
|
assert(secConMaiSec.key("parameter1") == "value8");
|
||||||
|
assert(secConMaiSec["parameter_2"] == "value2");
|
||||||
|
assert(secConMaiSec["parameter3"] == "value7");
|
||||||
|
assert(secConFirSec["parameter1"] == "value3");
|
||||||
|
assert(secConFirSec["parameter_2"] == "value4");
|
||||||
|
assert(secConFirSec["parameter3"] == "value9");
|
||||||
|
assert(secConFirSec["parameter4"] == "value10");
|
||||||
|
assert(secConSecSec["parameter1"] == "value5");
|
||||||
|
assert(secConSecSec["parameter_2"] == "value6");
|
||||||
|
assert(secConSec["parameter1"] == "value11");
|
||||||
|
assert(secConSec["parameter2"] == "value12");
|
||||||
|
|
||||||
|
auto comConMaiSec = commentsConfig.sn;
|
||||||
|
|
||||||
|
assert(comConMaiSec["parameter1"] == "value1");
|
||||||
|
assert(comConMaiSec["parameter2"] == "value2");
|
||||||
|
assert(comConMaiSec["parameter3"] == "value3");
|
||||||
|
assert(comConMaiSec["parameter4"] == "value4");
|
||||||
|
assert(comConMaiSec["parameter5"] == "value5;This will not be a comment");
|
||||||
|
assert(comConMaiSec["parameter6"] == "value6// This will also be a whole value");
|
||||||
|
assert(comConMaiSec["parameter8"] == "//value8");
|
||||||
|
assert(comConMaiSec["parameter9"] == ";value9");
|
||||||
|
assert(comConMaiSec["parameter10"] == "\"value10\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
rc.read("./tests/settings.conf");
|
||||||
|
|
||||||
|
assert(rc.cf.sn.key("value1") == "text without quotes");
|
||||||
|
assert(rc[][]["value2"] == "Yes!");
|
||||||
|
assert(rc.cf.sn.key("value3") == "value in apostrophes");
|
||||||
|
assert(rc[][]["value4"] == "1000");
|
||||||
|
assert(rc.cf.sn["value5"] == "0.000");
|
||||||
|
assert(rc[][].key("value7") == "//path");
|
||||||
|
assert(rc.cf.sn.key("value8") == "\"Hey!\"");
|
||||||
|
assert(rc[]["part2"]["value1"] == "this value will be in the new section");
|
||||||
|
assert(rc.cf.sn("part2").key("value3") == "good value!");
|
||||||
|
assert(rc[].sn("part3").key("value1") == "-2");
|
||||||
|
assert(rc.cf["part3"]["value3"] == "100");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue