Skip to content

Commit cdc1b13

Browse files
committed
introduce Feature.Name and Feature.NamingConvention
1 parent d610e9e commit cdc1b13

22 files changed

Lines changed: 163 additions & 109 deletions

Source/FeatureSwitcher.Configuration/AppConfig.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private FeaturesSection FeaturesSection
6363
get { return _features ?? SectionGroup.GetFeaturesSection(_settings.SectionGroupName, _settings.IgnoreConfigurationErrors); }
6464
}
6565

66-
public bool? IsEnabled(string feature)
66+
public bool? IsEnabled(Feature.Name feature)
6767
{
6868
return Features(feature).GetValueOrDefault(Default(feature).GetValueOrDefault());
6969
}

Source/FeatureSwitcher.Configuration/AppConfigDefault.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public AppConfigDefault(DefaultSection defaultSection)
99
_defaultSection = defaultSection;
1010
}
1111

12-
public bool? IsEnabled(string feature)
12+
public bool? IsEnabled(Feature.Name feature)
1313
{
1414
if (_defaultSection == null)
1515
return null;

Source/FeatureSwitcher.Configuration/AppConfigFeatures.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ public AppConfigFeatures(FeaturesSection features)
99
_features = features;
1010
}
1111

12-
public bool? IsEnabled(string feature)
12+
public bool? IsEnabled(Feature.Name feature)
1313
{
1414
if (_features == null)
1515
return null;
1616

17-
var featureElement = _features.Features[feature];
17+
var featureElement = _features.Features[feature.Value];
1818

1919
if (featureElement == null)
2020
return null;

Source/FeatureSwitcher.Contexteer/Configuration/FeatureConfigurationFor.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ namespace FeatureSwitcher.Configuration
77
internal class FeatureConfigurationFor<TContext> : IConfigureFeaturesFor<TContext>, IConfigureBehaviorFor<TContext>, IConfigureNamingFor<TContext>
88
where TContext : IContext
99
{
10-
private Func<TContext, Feature.NameOf[]> _nameOf;
11-
private Func<TContext, Feature.NameOf[]> NameOf
10+
private Func<TContext, Feature.NamingConvention[]> _namingConvention;
11+
private Func<TContext, Feature.NamingConvention[]> NamingConvention
1212
{
13-
get { return _nameOf ?? (ctx => null); }
13+
get { return _namingConvention ?? (ctx => null); }
1414
}
1515
private Func<TContext, Feature.Behavior[]> _behavior;
1616
private Func<TContext, Feature.Behavior[]> Behavior
@@ -38,19 +38,19 @@ IConfigureFeaturesFor<TContext> IConfigureFeaturesFor<TContext>.And
3838
get { return this; }
3939
}
4040

41-
public IConfigureNaming NamedBy
41+
IConfigureNaming IConfigureFeatures.NamedBy
4242
{
4343
get { return this; }
4444
}
4545

46-
public IConfigureBehavior ConfiguredBy
46+
IConfigureBehavior IConfigureFeatures.ConfiguredBy
4747
{
4848
get { return this; }
4949
}
5050

51-
IConfigureFeaturesFor<TContext> IConfigureNamingFor<TContext>.Custom(Func<TContext, Feature.NameOf[]> naming)
51+
IConfigureFeaturesFor<TContext> IConfigureNamingFor<TContext>.Custom(Func<TContext, Feature.NamingConvention[]> namingConventions)
5252
{
53-
_nameOf = naming;
53+
_namingConvention = namingConventions;
5454
return this;
5555
}
5656

@@ -60,9 +60,9 @@ IConfigureFeaturesFor<TContext> IConfigureBehaviorFor<TContext>.Custom(Func<TCon
6060
return this;
6161
}
6262

63-
IConfigureFeatures IConfigureNaming.Custom(params Feature.NameOf[] nameOfs)
63+
IConfigureFeatures IConfigureNaming.Custom(params Feature.NamingConvention[] namingConventions)
6464
{
65-
return (this as IConfigureNamingFor<TContext>).Custom(ctx => nameOfs);
65+
return (this as IConfigureNamingFor<TContext>).Custom(ctx => namingConventions);
6666
}
6767

6868
IConfigureFeatures IConfigureBehavior.Custom(params Feature.Behavior[] behaviors)
@@ -73,7 +73,7 @@ IConfigureFeatures IConfigureBehavior.Custom(params Feature.Behavior[] behaviors
7373
public Feature.Configuration For(TContext context)
7474
{
7575
return new Feature.Configuration(
76-
type => (NameOf(context) ?? new Feature.NameOf[0]).Where(x => x != null).Select(x => x(type)).FirstOrDefault(x => x != null),
76+
type => (NamingConvention(context) ?? new Feature.NamingConvention[0]).Where(x => x != null).Select(x => x(type)).FirstOrDefault(x => x != null),
7777
name => (Behavior(context) ?? new Feature.Behavior[0]).Select(x => x(name)).FirstOrDefault(x => x.HasValue),
7878
typeof(TContext) != typeof(Default) ? FeatureConfiguration.For(Default.Context) : Feature.Configuration.Current);
7979
}

Source/FeatureSwitcher.Contexteer/Configuration/IConfigureNamingFor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ public interface IConfigureNamingFor<out TContext> : IConfigureNaming
1515
/// </summary>
1616
/// <param name="namingConventions">The naming conventions to use.</param>
1717
/// <returns>the extension point for features configuration in contexts of type <typeparamref name="TContext"/>.</returns>
18-
IConfigureFeaturesFor<TContext> Custom(Func<TContext, Feature.NameOf[]> namingConventions);
18+
IConfigureFeaturesFor<TContext> Custom(Func<TContext, Feature.NamingConvention[]> namingConventions);
1919
}
2020
}
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
1-
using System;
2-
using FeatureSwitcher.Configuration;
3-
41
namespace FeatureSwitcher.Specs.Domain
52
{
6-
public class EnableByName<T>
3+
public static class EnableByName<T>
74
where T : IFeature
85
{
9-
public readonly static EnableByName<T> Instance = new EnableByName<T>();
10-
11-
public bool? IsEnabled(string feature)
6+
public static bool? IsEnabled(Feature.Name name)
127
{
13-
return Features.OfType<T>.EnabledByTypeName(feature);
14-
}
15-
16-
public string For(Type featureType)
17-
{
18-
return Features.OfType<T>.NamedByTypeName(featureType);
8+
return typeof(T).Name == name.Value ? true : (bool?)null;
199
}
2010
}
2111
}

Source/FeatureSwitcher.Specs/When_behavior_is_not_configured_in_context_and_configured_general.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,25 @@ public class When_behavior_is_not_configured_in_context_and_configured_general :
1313
{
1414
Features.Are.
1515
ConfiguredBy.Custom(
16-
EnableByName<Basic>.Instance.IsEnabled,
17-
EnableByName<Simple>.Instance.IsEnabled,
18-
EnableByName<Complex>.Instance.IsEnabled).And.
16+
EnableByName<Basic>.IsEnabled,
17+
EnableByName<Simple>.IsEnabled,
18+
EnableByName<Complex>.IsEnabled).And.
1919
NamedBy.TypeName();
2020

2121
In<BusinessBranch>.Contexts.FeaturesAre().
2222
NamedBy.TypeFullName();
2323
};
2424

25-
Behaves_like<Enabled<Basic>> a_disabled_basic_feature;
26-
Behaves_like<EnabledInDefault<Basic>> a_disabled_basic_feature_in_default;
25+
Behaves_like<Enabled<Basic>> an_enabled_basic_feature;
26+
Behaves_like<EnabledInDefault<Basic>> an_enabled_basic_feature_in_default;
2727
Behaves_like<DisabledInHeadquaters<Basic>> a_disabled_basic_feature_in_headquarters;
2828

29-
Behaves_like<Enabled<Simple>> a_disabled_simple_feature;
30-
Behaves_like<EnabledInDefault<Simple>> a_disabled_simple_feature_in_default;
29+
Behaves_like<Enabled<Simple>> an_enabled_simple_feature;
30+
Behaves_like<EnabledInDefault<Simple>> an_enabled_simple_feature_in_default;
3131
Behaves_like<DisabledInHeadquaters<Simple>> an_enabled_feature_in_headquarters;
3232

33-
Behaves_like<Enabled<Complex>> a_disabled_complex_feature;
34-
Behaves_like<EnabledInDefault<Complex>> a_disabled_complex_feature_in_default;
33+
Behaves_like<Enabled<Complex>> an_enabled_complex_feature;
34+
Behaves_like<EnabledInDefault<Complex>> an_enabled_complex_feature_in_default;
3535
Behaves_like<DisabledInHeadquaters<Complex>> a_disabled_complex_feature_in_headquarters;
3636
}
3737
}

Source/FeatureSwitcher.Specs/When_chaining_application_configuration_and_partial_configurations.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ public class When_chaining_application_configuration_and_partial_configurations
1212
Features.Are
1313
.ConfiguredBy.Custom(
1414
new AppConfig(true).Features,
15-
EnableByName<Simple>.Instance.IsEnabled,
15+
EnableByName<Simple>.IsEnabled,
1616
new AppConfig(true).Default).And
1717
.NamedBy.Custom(
18-
EnableByName<Simple>.Instance.For,
19-
Features.OfAnyType.NamedByTypeFullName);
18+
Features.OfType<Simple>.NamedByTypeName,
19+
Features.OfType<Complex>.NamedByTypeFullName);
2020

2121
Behaves_like<Disabled<Basic>> a_disabled_basic_feature;
2222
Behaves_like<DisabledInDefault<Basic>> a_disabled_basic_feature_in_default;

Source/FeatureSwitcher.Specs/When_chaining_multiple_partial_configurations.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace FeatureSwitcher.Specs
99
public class When_chaining_multiple_partial_configurations : WithCleanUp
1010
{
1111
Establish ctx = () => Features.Are.
12-
ConfiguredBy.Custom(EnableByName<Simple>.Instance.IsEnabled, EnableByName<Complex>.Instance.IsEnabled).And.
13-
NamedBy.Custom(EnableByName<Simple>.Instance.For, EnableByName<Complex>.Instance.For);
12+
ConfiguredBy.Custom(EnableByName<Simple>.IsEnabled, EnableByName<Complex>.IsEnabled).And.
13+
NamedBy.Custom(Features.OfType<Simple>.NamedByTypeName, Features.OfType<Complex>.NamedByTypeName);
1414

1515
Behaves_like<Disabled<Basic>> a_disabled_basic_feature;
1616
Behaves_like<DisabledInDefault<Basic>> a_disabled_basic_feature_in_default;

Source/FeatureSwitcher.Specs/When_chaining_multiple_partial_configurations_and_contexts.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ public class When_chaining_multiple_partial_configurations_and_contexts : WithCl
1313
Establish ctx = () =>
1414
{
1515
Features.Are
16-
.ConfiguredBy.Custom(EnableByName<Simple>.Instance.IsEnabled, EnableByName<Complex>.Instance.IsEnabled).And
17-
.NamedBy.Custom(EnableByName<Simple>.Instance.For, EnableByName<Complex>.Instance.For);
16+
.ConfiguredBy.Custom(EnableByName<Simple>.IsEnabled, EnableByName<Complex>.IsEnabled).And
17+
.NamedBy.Custom(Features.OfType<Simple>.NamedByTypeName, Features.OfType<Complex>.NamedByTypeName);
1818

1919
In<Default>.Contexts.FeaturesAre()
20-
.AlwaysDisabled().And
20+
.ConfiguredBy.Custom(Features.OfType<Simple>.Disabled, Features.OfType<Basic>.Disabled, Features.OfAnyType.Enabled).And
2121
.NamedBy.TypeFullName();
2222

2323
In<BusinessBranch>.Contexts.FeaturesAre()
24-
.ConfiguredBy.Custom(EnableByName<Basic>.Instance.IsEnabled).And
25-
.NamedBy.Custom(EnableByName<Basic>.Instance.For);
24+
.ConfiguredBy.Custom(EnableByName<Basic>.IsEnabled).And
25+
.NamedBy.Custom(Features.OfType<Basic>.NamedByTypeName);
2626
};
2727

2828
Behaves_like<Enabled<Simple>> an_enabled_feature_simple;
@@ -34,7 +34,7 @@ public class When_chaining_multiple_partial_configurations_and_contexts : WithCl
3434
Behaves_like<EnabledInHeadquaters<Basic>> an_enabled_feature_basic_in_headquarters;
3535

3636
Behaves_like<Enabled<Complex>> an_enabled_feature_complex;
37-
Behaves_like<DisabledInDefault<Complex>> a_disabled_feature_complex_in_default;
38-
Behaves_like<DisabledInHeadquaters<Complex>> a_disabled_feature_complex_in_headquarters;
37+
Behaves_like<EnabledInDefault<Complex>> an_enabled_feature_complex_in_default;
38+
Behaves_like<EnabledInHeadquaters<Complex>> an_enabled_feature_complex_in_headquarters;
3939
}
4040
}

0 commit comments

Comments
 (0)