mirror of
https://github.com/mbierlee/mirage-config.git
synced 2024-11-15 04:44:01 +01:00
Add java properties config factory
This commit is contained in:
parent
05202053da
commit
40a20ca3ff
|
@ -7,7 +7,7 @@ Licensed under the terms of the MIT license - See [LICENSE.txt](LICENSE.txt)
|
||||||
Toolkit for loading and using application configuration from various formats.
|
Toolkit for loading and using application configuration from various formats.
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
- Load from various file formats such as JSON;
|
- Load from various file formats such as JSON and Java properties;
|
||||||
- Environment variable substitution;
|
- Environment variable substitution;
|
||||||
- Internal configuration substitution (Value in config replaced by other path in config);
|
- Internal configuration substitution (Value in config replaced by other path in config);
|
||||||
- Parse configuration from string or JSONValue instead of from disk.
|
- Parse configuration from string or JSONValue instead of from disk.
|
||||||
|
|
125
source/mirage/java.d
Normal file
125
source/mirage/java.d
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
/**
|
||||||
|
* Utilities for loading Java properties files.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Mike Bierlee, m.bierlee@lostmoment.com
|
||||||
|
* Copyright: 2022 Mike Bierlee
|
||||||
|
* License:
|
||||||
|
* This software is licensed under the terms of the MIT license.
|
||||||
|
* The full terms of the license can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module mirage.java;
|
||||||
|
|
||||||
|
import mirage.config : ConfigFactory, ConfigDictionary, ConfigNode, ValueNode, ObjectNode, ConfigCreationException;
|
||||||
|
|
||||||
|
import std.string : lineSplitter, strip, startsWith, split;
|
||||||
|
import std.array : array;
|
||||||
|
import std.exception : enforce;
|
||||||
|
import std.conv : to;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates configuration files from Java properties.
|
||||||
|
*/
|
||||||
|
class JavaPropertiesFactory : ConfigFactory {
|
||||||
|
/**
|
||||||
|
* Parse configuration from the given Java properties string.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* contents = Text contents of the config to be parsed.
|
||||||
|
* Returns: The parsed configuration.
|
||||||
|
*/
|
||||||
|
override ConfigDictionary parseConfig(string contents) {
|
||||||
|
enforce!ConfigCreationException(contents !is null, "Contents cannot be null.");
|
||||||
|
auto lines = contents.lineSplitter().array;
|
||||||
|
auto properties = new ConfigDictionary();
|
||||||
|
foreach (size_t index, string line; lines) {
|
||||||
|
auto trimmedLine = line.strip;
|
||||||
|
if (trimmedLine.length == 0 || trimmedLine.startsWith('#')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto parts = trimmedLine.split('=');
|
||||||
|
enforce!ConfigCreationException(parts.length <= 2, "Line has too many equals signs and cannot be parsed (L" ~ index
|
||||||
|
.to!string ~ "): " ~ trimmedLine);
|
||||||
|
enforce!ConfigCreationException(parts.length == 2, "Missing value assignment (L" ~ index.to!string ~ "): " ~ trimmedLine);
|
||||||
|
properties.set(parts[0], parts[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse Java properties from the given Java properties string.
|
||||||
|
|
||||||
|
* Params:
|
||||||
|
* json = Text contents of the config to be parsed.
|
||||||
|
* Returns: The parsed configuration.
|
||||||
|
*/
|
||||||
|
ConfigDictionary parseJavaProperties(const string properties) {
|
||||||
|
return new JavaPropertiesFactory().parseConfig(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a Java properties file from disk.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* filePath = Path to the Java properties file.
|
||||||
|
* Returns: The loaded configuration.
|
||||||
|
*/
|
||||||
|
ConfigDictionary loadJavaProperties(const string filePath) {
|
||||||
|
return new JavaPropertiesFactory().loadFile(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
version (unittest) {
|
||||||
|
import std.exception : assertThrown;
|
||||||
|
import std.process : environment;
|
||||||
|
|
||||||
|
@("Parse java properties")
|
||||||
|
unittest {
|
||||||
|
auto config = parseJavaProperties("
|
||||||
|
# I have a comment
|
||||||
|
bla=one
|
||||||
|
di.bla=two
|
||||||
|
");
|
||||||
|
|
||||||
|
assert(config.get("bla") == "one");
|
||||||
|
assert(config.get("di.bla") == "two");
|
||||||
|
}
|
||||||
|
|
||||||
|
@("Parse java properties file")
|
||||||
|
unittest {
|
||||||
|
auto config = loadJavaProperties("testfiles/java.properties");
|
||||||
|
assert(config.get("bla") == "one");
|
||||||
|
assert(config.get("di.bla") == "two");
|
||||||
|
}
|
||||||
|
|
||||||
|
@("Fail to parse when there are too many equals signs")
|
||||||
|
unittest {
|
||||||
|
assertThrown!ConfigCreationException(parseJavaProperties("one=two=three"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@("Fail to parse when value assignment is missing")
|
||||||
|
unittest {
|
||||||
|
assertThrown!ConfigCreationException(parseJavaProperties("answertolife"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@("Substitute env vars")
|
||||||
|
unittest {
|
||||||
|
environment["MIRAGE_TEST_ENVY"] = "Much";
|
||||||
|
auto config = parseJavaProperties("envy=$MIRAGE_TEST_ENVY");
|
||||||
|
|
||||||
|
assert(config.get("envy") == "Much");
|
||||||
|
}
|
||||||
|
|
||||||
|
@("Use value from other key")
|
||||||
|
unittest {
|
||||||
|
auto config = parseJavaProperties("
|
||||||
|
one=money
|
||||||
|
two=${one}
|
||||||
|
");
|
||||||
|
|
||||||
|
assert(config.get("two") == "money");
|
||||||
|
}
|
||||||
|
}
|
|
@ -196,7 +196,7 @@ version (unittest) {
|
||||||
assert(config.get("taxNumber") == null);
|
assert(config.get("taxNumber") == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@("Substitute env vars in JSON")
|
@("Substitute env vars")
|
||||||
unittest {
|
unittest {
|
||||||
environment["MIRAGE_TEST_APP_NAME"] = "Unittest";
|
environment["MIRAGE_TEST_APP_NAME"] = "Unittest";
|
||||||
environment["MIRAGE_TEST_HOSTNAME"] = "wonkeyhost";
|
environment["MIRAGE_TEST_HOSTNAME"] = "wonkeyhost";
|
||||||
|
@ -208,4 +208,18 @@ version (unittest) {
|
||||||
assert(config.get("server.port") == "8118");
|
assert(config.get("server.port") == "8118");
|
||||||
assert(config.get("app") == "Unittest server - built with love");
|
assert(config.get("app") == "Unittest server - built with love");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@("Use value from other key")
|
||||||
|
unittest {
|
||||||
|
string json = "
|
||||||
|
{
|
||||||
|
\"one\": \"Groot\",
|
||||||
|
\"two\": \"${one}\",
|
||||||
|
}
|
||||||
|
";
|
||||||
|
|
||||||
|
auto config = parseJsonConfig(json);
|
||||||
|
|
||||||
|
assert(config.get("two") == "Groot");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,3 +11,4 @@ module mirage;
|
||||||
|
|
||||||
public import mirage.config;
|
public import mirage.config;
|
||||||
public import mirage.json;
|
public import mirage.json;
|
||||||
|
public import mirage.java;
|
3
testfiles/java.properties
Normal file
3
testfiles/java.properties
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# I have a comment
|
||||||
|
bla=one
|
||||||
|
di.bla=two
|
Loading…
Reference in a new issue