UI for the Flipper gem.
Viewing an individual feature:
Add this line to your application's Gemfile:
gem 'flipper-ui'
And then execute:
$ bundle
Or install it yourself as:
$ gem install flipper-ui
Given that you've already initialized Flipper
as per the flipper readme, you can mount Flipper::UI
to a route of your choice:
# config/routes.rb
YourRailsApp::Application.routes.draw do
mount Flipper::UI.app(Flipper) => '/flipper'
end
If you'd like to lazy load flipper, you can pass a block instead:
# config/routes.rb
YourRailsApp::Application.routes.draw do
flipper_block = lambda {
# some flipper initialization here, for example:
# YourRailsApp.flipper
}
mount Flipper::UI.app(flipper_block) => '/flipper'
end
You almost certainly want to limit access when using Flipper::UI in production.
The Flipper::UI.app
method yields a builder instance prior to any predefined middleware. You can insert the Rack::Auth::Basic
middleware, that'll prompt for a username and password when visiting the defined (i.e., /flipper
) route.
# config/routes.rb
flipper_app = Flipper::UI.app(Flipper.instance) do |builder|
builder.use Rack::Auth::Basic do |username, password|
# Verify credentials
end
end
mount flipper_app, at: '/flipper'
It is possible to use routes constraints to limit access to routes:
# config/routes.rb
flipper_constraint = lambda { |request| request.remote_ip == '127.0.0.1' }
constraints flipper_constraint do
mount Flipper::UI.app(flipper) => '/flipper'
end
Another example is to use the current_user
when using a gem-based authentication system (i.e., warden or devise):
# initializers/admin_access.rb
class CanAccessFlipperUI
def self.matches?(request)
current_user = request.env['warden'].user
current_user.present? && current_user.respond_to?(:admin?) && current_user.admin?
end
end
# config/routes.rb
constraints CanAccessFlipperUI do
mount Flipper::UI.app(flipper) => '/flipper'
end
Minimal example for Rack:
# config.ru
require 'flipper-ui'
require 'flipper/adapters/memory'
adapter = Flipper::Adapters::Memory.new
flipper = Flipper.new(adapter)
run Flipper::UI.app(flipper) { |builder|
builder.use Rack::Session::Cookie, secret: "something long and random"
}
The key is that you need to have sessions setup. Rails does this for you, so this step isn't necessary, but for standalone rack, you'll need it. Without sessions setup, you will receive a Runtime error like:
RuntimeError: you need to set up a session middleware *before* Rack::Protection::RemoteToken.
See examples/ui/basic.ru for a more full example
Flipper UI can be customized via configure
, which yields a configuration instance for setting the text on the five main sections of the UI feature view.
config.actors
config.groups
config.percentage_of_actors
config.percentage_of_time
config.delete
Each of these methods returns a Flipper::UI::Option that responds to title=
, description=
as seen below.
e.g. customzing the percentage_of_actors and delete sections' titles and descriptions
Flipper::UI.configure do |config|
config.percentage_of_actors.title = "My Custom Title"
config.percentage_of_actors.description = "My custom description"
config.delete.title = "BE VERY CAREFUL!"
config.delete.description = "YOU'VE BEEN WARNED!"
end
results in:
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Fire up the app (
script/server
) - Start up guard (
bundle exec guard
for automatic coffeescript/sass compilation and such). - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request