A lightweight framework for feature toggling to enable trunk based development.
Switcheroo aims for simplicity, with a clean syntax and a minimal feature set while not compromising on extensibility and testability.
Switcheroo can be installed via Nuget.
> Install-Package Switcheroo
Switcheroo is licensed under the MIT license.
Installation
Nuget packages can be found here.
Add configuration
<configuration>
<configSections>
<section name="features" type="Switcheroo.Configuration.FeatureToggleConfiguration, Switcheroo"/>
</configSections>
<features>
<toggles>
<add name="Log.InColor" enabled="true"/>
</toggles>
</features>
</configuration>
Initializing the library
Features.Initialize(x => x.FromApplicationConfig());
Checking feature status
if (Features.IsEnabled("Log.InColor"))
{
// Implement feature
}
Boolean (true/false)
Feature toggles based on a static binary value - either on or off.
features.Add(new BooleanToggle("Feature1", true));
<features>
<toggles>
<add name="BooleanToggle.Enabled" enabled="true"/>
<add name="BooleanToggle.Disabled" enabled="false"/>
</toggles>
</features>
Date Range (true/false, within date range)
Date Range feature toggles are evaluated on both the binary enabled value and the current date.
features.Add(new DateRangeToggle("Feature2", true, DateTime.Now.AddDays(5), null));
<features>
<toggles>
<add name="Date.Enabled.InRange" enabled="true" from="1 January 2010" until="31 December 2050"/>
<add name="Date.Enabled.Expired" enabled="true" until="31 December 2010"/>
<add name="Date.Enabled.Future" enabled="true" from="1 January 2050"/>
<add name="Date.Disabled" enabled="false"/>
</toggles>
</features>
From and until dates can be any valid date format parseable by DateTime.Parse.
Established features
Marking a feature toggle as established makes the feature toggle throw a FeatureEstablishedException exception to make sure that it is not queried any more.
features.Add(new EstablishedFeatureToggle("establishedFeature"));
<features>
<toggles>
<add name="EstablishedFeature" established="true"/>
</toggles>
</features>
Dependencies
Features can depend on other features. For instance, it is sometimes convenient to have a "main" feature, and then sub-features that depend on it. Dependencies can be specified in configuration as a comma delimited list.
var mainFeature = new BooleanToggle("mainFeature", true);
var subFeature1 = new BooleanToggle("subFeature1", true);
var subFeature2 = new BooleanToggle("subFeature2", true);
var dependency1 = new DependencyToggle(subFeature1, mainFeature);
var dependency2 = new DependencyToggle(subFeature2, mainFeature);
features.Add(dependency1);
features.Add(dependency2);
<features>
<toggles>
<add name="SubFeature1" enabled="true" dependencies="MainFeature"/>
<add name="SubFeature2" enabled="true" dependencies="MainFeature"/>
<add name="MainFeature" enabled="true" />
</toggles>
</features>
Code-friendly initialization
IFeatureConfiguration features = new FeatureConfiguration
{
new BooleanToggle("Feature1", true),
new DateRangeToggle(
"Feature2",
true,
DateTime.Now.AddDays(-2),
DateTime.Now.AddDays(3))
};
IOC friendly through IFeatureConfiguration instances, or the static Feature.Instance backing instance
For<IFeatureConfiguration>().Use(Features.Instance);
Feature toggle diagnostics : IFeatureConfiguration.WhatDoIHave
Console.WriteLine(features.WhatDoIHave());
Name Feature1
IsEnabled True
Name Feature2
IsEnabled True
From 11/16/2012 3:32:23 PM
Until 11/21/2012 3:32:23 PM
Loading from custom configuration resources : build on top of IConfigurationReader
0.3.4753.37554
- Removed MutableToggle
- Added the ability to "freeze" a toggle configuration.
- Validation of toggle state (including cycles in dependencies) now occur on addition to the feature configuration container.
0.3.4749.36197
- Mechanism for detecting dependency cycles. This feature is only active when configuring dependencies via application configuration.
- Fixed bug where a DependencyToggle depending on another DependencyToggle might cause duplicate toggles to be added to the feature set.
v0.3.4748.37146
- Configuration mechanism for DependencyToggle
v0.2.4730.37739
- Added DependencyToggle.
- Changed from a Dictionary to a ConcurrentDictionary.
v0.2.4705.37094
- Added Established features.
v0.1.4705.28808
- Added DateRange toggle.
- Quite a bit of internal refactoring.
v0.1.4704.41742
- Initial version : simple toggles.