class Shamu::Features::EnvStore

Expose a read-only runtime environment for consumption by the {FeaturesService}. By default blends a Rack env request headers (if using Rack) with the host env. The request env overrides the host.

When {#fetch fetching}, EnvStore will look for an `X-Shamu-Features` header sent in the HTTP request. It should be constructed using {.pack} to build a verifiable hash of feature settings.

If a rack value is not set, EnvStore will fall back to looking for the toggle in the host's environment with the name `TOGGLE_{ toggle name upcased and underscored }`. For example `buy_now/one_click` will look for `TOGGLE_BUY_NOW_ONE_CLICK` in the environment.

Constants

RACK_ENV_KEY
RACK_HEADER_FEATURES_KEY
RACK_PARAMS_FEATURES_KEY
RACK_PARAMS_KEY

Public Class Methods

env_key_name( key ) click to toggle source

@return [String] the expected ENV key name for the given toggle name.

# File lib/shamu/features/env_store.rb, line 41
def self.env_key_name( key )
  key = key.upcase
  key.tr! "/", "_"
  key
end

Public Instance Methods

fetch( key, &block ) click to toggle source

Fetch a value from the environment.

# File lib/shamu/features/env_store.rb, line 35
def fetch( key, &block )
  return env_fetch( key, &block ) unless defined? Rack
  rack_params_fetch( key, &block )
end

Private Instance Methods

env_fetch( key ) { || ... } click to toggle source
# File lib/shamu/features/env_store.rb, line 49
def env_fetch( key, &block )
  key = self.class.env_key_name( key )
  if ENV.key?( key )
    ENV[ key ].to_bool
  elsif block_given?
    yield
  end
end
rack_header_fetch( key, &block ) click to toggle source
# File lib/shamu/features/env_store.rb, line 58
def rack_header_fetch( key, &block )
  rack_env = scorpion.fetch( Scorpion::Rack::Env )
  return env_fetch( key, &block ) unless header = rack_env[RACK_ENV_KEY]

  features = rack_env.fetch( RACK_HEADER_FEATURES_KEY ) do
    rack_env[ RACK_HEADER_FEATURES_KEY ] = codec.unpack( header )
  end

  features.fetch( key ) do
    env_fetch( key, &block )
  end
end
rack_params_fetch( key, &block ) click to toggle source
# File lib/shamu/features/env_store.rb, line 71
def rack_params_fetch( key, &block )
  rack_env = scorpion.fetch( Scorpion::Rack::Env )
  request  = ::Rack::Request.new( rack_env )

  return rack_header_fetch( key, &block ) unless param = request.params[ RACK_PARAMS_KEY ]

  features = rack_env.fetch( RACK_PARAMS_FEATURES_KEY ) do
    rack_env[ RACK_PARAMS_FEATURES_KEY ] = codec.unpack( param )
  end

  features.fetch( key ) do
    rack_header_fetch( key, &block )
  end
end