Usage Guide
Once Shapt is one of his dependencies. You gonna need to create a feature toggle module:
defmodule TestModule do
use Shapt,
adapter: [
prod: {Shapt.Adapters.Env, []}
],
toggles: [
feature_x?: %{
force: true,
key: "MYAPP_FEATURE_X",
deadline: ~D[2019-12-31]
},
feature_y?: %{
deadline: ~D[2009-12-31]
}
]
end
This module is a worker that you need to add to your supervision tree. Shapt
will create the proper child_spec/1 and start_link/1 functions.
Options
adapter: receives a keyword list of adapters by environment.toggles: receives a keyword list of toggles to be configured.
Default configurations
If no adapter is provided Shapt gonna set by default, Shapt.Adapters.Env as the
production adapter and Shapt.Adapters.DotEnv as develompment and test adapter.
toggles option has no default values.
Provided functions
Just by using Shapt you gonna have some extra functions on your feature toggle
module:
key_name/0
For each key in the toggles option keyword list you gonna have a fucntion that
represents that feature toggle. From the example above you would have in
TestModule the functions feature_x?/0 and feature_y?/0, those functions
always return only true or false.
toggle/2
Besides the key named functions you gonna have toggle/2. It can be used to
evaluate the feature toggle and what to do when it's on or off. Some usage
examples:
# just returning values
TestModule.toggle(:feature_x?, on: FeatureX, off: OldFeature)
# applying functions that receive the same parameters
TestModule.toggle(:feature_x?, env: [params, options], on: &Feature.x/2, off: &Feature.old/2)
# applying functions with different parameters:
TestModule.toggle(:feature_x?, on: {ModuleX, :function, [paramsx]}, off: {Module, :fuction, [params]})
In those two last examples we use the apply function, be aware of that when
using this feature. So make sure that the env or the third element tuple is
always a list which the size is the same as the provided function arity.
expired?/1
It receives the name of a toggle and says if it's expired or not.
enabled?/1
It receives the name of a toggle and says if it's enabled or not.
expired_toggles/0
List all expired toggles
output_template/0
Return the binary representing the template file generated by the Adapter.
instance_name/0
By default instance_name/0 will always return nil. This function is
overridable so when needed you can specified the behavior to determine which
instance we are running. For the default Adapters provided here this function
has no utility, but it gonna be useful for future Adapters.
Env Adapter
Shapt.Adapters.Env will work directly with environment variables using the System.get_env/1.
This is why the adapter doesn't receive any configuration.
DotEnv Adapter
Shapt.Adapters.DotEnv works with a .env file. If no option is provided it
gonna try to read a .env file from the root of the mix project you're running.
To provide a file you can set {Shapt.Adapters.DotEnv, [file: "path/to/file.env"]} on
your adapter configuration.
Testing
Shapt is built having in mind that you probably gonna use
Mox to write tests. By using Mox you only
need mock enabled?/2 callback. You can have more info on Shapt.Adapter
behaviour docs.