Skip to content

Commit 3c3581b

Browse files
Allowing to use configuration settings
1 parent eb2fe87 commit 3c3581b

6 files changed

Lines changed: 109 additions & 84 deletions

File tree

src/TemplatedConfiguration.Example/Config.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
Global.ConnectionString.ServerName = TheServer
44

55

6-
ComponentB.ConnectionString.DatabaseName="server=different;database=funkydb;integrated security=sometimes"
6+
ComponentB.ConnectionString="server=different;database=funkydb;integrated security=sometimes"

src/TemplatedConfiguration.Example/Program.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,25 @@ static void Main(string[] args)
2424

2525
.Build();
2626

27-
Console.WriteLine("Component A: Connection String: " +config.GetValue<string>("ComponentA.ConnectionString"));
27+
Console.WriteLine("Component A: Connection String: " +config.GetValue<string>("ComponentA.ConnectionString"));
2828
Console.WriteLine("Component B: Connection String: " +config.GetValue<string>("ComponentB.ConnectionString"));
2929

3030
Console.ReadLine();
3131
}
3232

33+
public class MySEttings
34+
{
35+
public string SettingA { get; set; }
36+
}
37+
3338
public class Global
3439
{
3540
public static readonly Dictionary<string, string> DefaultSettings = new Dictionary<string, string>()
3641
{
42+
{"settinga", "abc" },
3743
// Default global settings.
3844
{"Global.ConnectionString.Security", "Integrated Security=true;" },
39-
{"ComponentA.ConnectionString.Settings", "" },
45+
{"Global.ConnectionString.Settings", "" },
4046
};
4147
}
4248

src/TemplatedConfiguration.Tests/TemplatedConfigurationSourceTests.cs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,35 @@ public TemplatedConfigurationSourceTests()
1717
[InlineData("settingwithouttemplate")] // Proves Case Insensititivity
1818
public void Can_get_value_without_template(string key)
1919
{
20-
var configurationRoot = BuildConfigurationRootWithoutRebuilding();
20+
var configurationRoot = BuildConfigurationRoot();
2121

2222
var result = configurationRoot.GetValue<string>(key);
2323

2424
Assert.Equal("normal value", result);
2525
}
2626

27-
private static IConfigurationRoot BuildConfigurationRootWithoutRebuilding()
27+
private static IConfigurationRoot BuildConfigurationRoot()
2828
{
2929
var configurationRoot = new ConfigurationBuilder()
30-
.WithRecursiveTemplateSupport(
31-
builder => builder
32-
.AddInMemoryCollection(new Dictionary<string, string>
33-
{
34-
{"SettingWithoutTemplate", "normal value"},
35-
{"DefaultSetting", "[default value]"},
36-
})
37-
.AddInMemoryCollection(new Dictionary<string, string>
38-
{
39-
{"TemplatedSetting", "this comes from the default setting: '{DefaultSetting}'"},
40-
{"CaseInsensitiveSetting", "this comes from the default setting: '{defaultsetting}'"},
41-
{"Recursive", "this is {Recursive}"},
42-
})
43-
).Build();
30+
.AddInMemoryCollection(new Dictionary<string, string>
31+
{
32+
{"SettingWithoutTemplate", "normal value"},
33+
{"DefaultSetting", "[default value]"},
34+
35+
// This setting verifies if we can use 'sections'
36+
{"sub:defaultsetting", "[sub default value]"},
37+
})
38+
.AddInMemoryCollection(new Dictionary<string, string>
39+
{
40+
{"TemplatedSetting", "this comes from the default setting: '{DefaultSetting}'"},
41+
{"CaseInsensitiveSetting", "this comes from the default setting: '{defaultsetting}'"},
42+
{"Recursive", "this is {Recursive}"},
43+
44+
// uses a setting from a different section
45+
{"subsub:uses_sub_setting", "{sub:defaultsetting}"},
46+
})
47+
.WithRecursiveTemplateSupport()
48+
.Build();
4449
return configurationRoot;
4550
}
4651

@@ -51,7 +56,7 @@ private static IConfigurationRoot BuildConfigurationRootWithoutRebuilding()
5156
[InlineData("CaseInsensitiveSetting")] // Proves Case Insensititivity on recursive template
5257
public void Can_get_templated_default_value(string key)
5358
{
54-
var configurationRoot = BuildConfigurationRootWithoutRebuilding();
59+
var configurationRoot = BuildConfigurationRoot();
5560
var result = configurationRoot.GetValue<string>(key);
5661

5762
Assert.Equal("this comes from the default setting: '[default value]'", result);
@@ -60,7 +65,7 @@ public void Can_get_templated_default_value(string key)
6065
[Fact]
6166
public void Can_handle_loops_in_recursion()
6267
{
63-
var configurationRoot = BuildConfigurationRootWithoutRebuilding();
68+
var configurationRoot = BuildConfigurationRoot();
6469
var result = configurationRoot.GetValue<string>("Recursive");
6570

6671
Assert.Equal("this is {Recursive}", result);
@@ -70,7 +75,7 @@ public void Can_handle_loops_in_recursion()
7075
[InlineData("TemplatedSetting")] // Correctly cased
7176
[InlineData("templatedsetting")] // Proves Case Insensititivity on root template name
7277
[InlineData("CaseInsensitiveSetting")] // Proves Case Insensititivity on recursive template
73-
public void Can_add_templated_configuration_without_subbuilder(string key)
78+
public void Can_add_templated_configuration_without_subtemplate(string key)
7479
{
7580
var configurationRoot = new ConfigurationBuilder()
7681
.AddInMemoryCollection(new Dictionary<string, string>
@@ -93,6 +98,16 @@ public void Can_add_templated_configuration_without_subbuilder(string key)
9398

9499
}
95100

101+
[Fact]
102+
public void Can_get_sub_settings()
103+
{
104+
var config = BuildConfigurationRoot();
105+
var sub = config.GetSection("subsub");
106+
var using_subsetting = sub["uses_sub_setting"];
107+
Assert.Equal("[sub default value]", using_subsetting);
108+
109+
}
110+
96111
[Fact]
97112
public void Build_is_only_called_once_on_source()
98113
{

src/TemplatedConfiguration/TemplatedConfiguration.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<Version>0.1.0</Version>
5+
<Version>0.2.0</Version>
66
</PropertyGroup>
77

88
<ItemGroup>

src/TemplatedConfiguration/TemplatedConfigurationProvider.cs

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public static string Replace(this string str, string oldValue, string newValue,
3333

3434
public class TemplatedConfigurationProvider : IConfigurationProvider
3535
{
36-
private static readonly Regex _regex = new Regex(@"(\{[\w,\-,\.]*\})", RegexOptions.Compiled);
36+
private static readonly Regex _regex = new Regex(@"(\{[\w,\-,\.:]*\})", RegexOptions.Compiled);
3737
public readonly IConfigurationRoot InnerConfiguration;
3838

3939
/// <summary>Initialize a new instance from the source.</summary>
@@ -110,65 +110,5 @@ public IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string
110110
return key1;
111111
});
112112
}
113-
114-
private class TemplatedSettingKey : IEquatable<TemplatedSettingKey>
115-
{
116-
public bool Equals(TemplatedSettingKey other)
117-
{
118-
if (ReferenceEquals(null, other)) return false;
119-
if (ReferenceEquals(this, other)) return true;
120-
return string.Equals(Name, other.Name, StringComparison.InvariantCultureIgnoreCase);
121-
}
122-
123-
public override bool Equals(object obj)
124-
{
125-
if (ReferenceEquals(null, obj)) return false;
126-
if (ReferenceEquals(this, obj)) return true;
127-
if (obj.GetType() != this.GetType()) return false;
128-
return Equals((TemplatedSettingKey)obj);
129-
}
130-
131-
public override int GetHashCode()
132-
{
133-
return (Name != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(Name) : 0);
134-
}
135-
136-
public static bool operator ==(TemplatedSettingKey left, TemplatedSettingKey right)
137-
{
138-
return Equals(left, right);
139-
}
140-
141-
public static bool operator !=(TemplatedSettingKey left, TemplatedSettingKey right)
142-
{
143-
return !Equals(left, right);
144-
}
145-
146-
public readonly string Name;
147-
148-
public TemplatedSettingKey(string name)
149-
{
150-
if (string.IsNullOrEmpty(name))
151-
{
152-
throw new ArgumentException("message", nameof(name));
153-
}
154-
155-
Name = name.TrimStart('{').TrimEnd('}')?.ToLower();
156-
}
157-
158-
public static implicit operator string(TemplatedSettingKey key)
159-
{
160-
return key.ToString();
161-
}
162-
163-
public static implicit operator TemplatedSettingKey(string name)
164-
{
165-
return new TemplatedSettingKey(name);
166-
}
167-
168-
public override string ToString()
169-
{
170-
return "{" + Name + "}";
171-
}
172-
}
173113
}
174114
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
3+
namespace TemplatedConfiguration
4+
{
5+
public class TemplatedSettingKey : IEquatable<TemplatedSettingKey>
6+
{
7+
public bool Equals(TemplatedSettingKey other)
8+
{
9+
if (ReferenceEquals(null, other)) return false;
10+
if (ReferenceEquals(this, other)) return true;
11+
return String.Equals(Name, other.Name, StringComparison.InvariantCultureIgnoreCase);
12+
}
13+
14+
public override bool Equals(object obj)
15+
{
16+
if (ReferenceEquals(null, obj)) return false;
17+
if (ReferenceEquals(this, obj)) return true;
18+
if (obj.GetType() != this.GetType()) return false;
19+
return Equals((TemplatedSettingKey)obj);
20+
}
21+
22+
public override int GetHashCode()
23+
{
24+
return (Name != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(Name) : 0);
25+
}
26+
27+
public static bool operator ==(TemplatedSettingKey left, TemplatedSettingKey right)
28+
{
29+
return Equals(left, right);
30+
}
31+
32+
public static bool operator !=(TemplatedSettingKey left, TemplatedSettingKey right)
33+
{
34+
return !Equals(left, right);
35+
}
36+
37+
public readonly string Name;
38+
39+
public TemplatedSettingKey(string name)
40+
{
41+
if (String.IsNullOrEmpty(name))
42+
{
43+
throw new ArgumentException("message", nameof(name));
44+
}
45+
46+
Name = name.TrimStart('{').TrimEnd('}')?.ToLower();
47+
}
48+
49+
public static implicit operator string(TemplatedSettingKey key)
50+
{
51+
return key.ToString();
52+
}
53+
54+
public static implicit operator TemplatedSettingKey(string name)
55+
{
56+
return new TemplatedSettingKey(name);
57+
}
58+
59+
public override string ToString()
60+
{
61+
return "{" + Name + "}";
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)