class Vanity::Configuration

This class holds the “how” Vanity operates. For the “what”, please see Vanity::Playground.

Constants

DEFAULTS
LEGACY_CONNECTION_KEY
LEGACY_REDIS_CONFIG_FILE

Attributes

add_participant_route[W]

URL to the add_participant action.

collecting[W]

True if saving results to the datastore (participants and conversions).

config_file[W]

By default the vanity.yml file in the config_path variable. Variables scoped under the key for the current environment are extracted for the connection parameters. If there is no config/vanity.yml file, tries the configuration from config/redis.yml.

config_path[W]

Uses ./config by default.

environment[W]

In order of precedence, RACK_ENV, RAILS_ENV or `development`.

experiments_path[W]

Path to load experiment files from.

experiments_start_enabled[W]

By default experiments start enabled. If you want experiments to be explicitly enabled after a production release, then set to false.

failover_on_datastore_error[W]

Turns on passing of errors to the Proc returned by on_datastore_error. Set `config.failover_on_datastore_error` to `true` to turn this on.

@since 2.0.0

locales_path[W]

Path to Vanity locales. Set this to override those in the gem.

logger[W]

Logger. The default logs to STDOUT.

on_datastore_error[W]

Must return a Proc that accepts as parameters: the thrown error, the calling Class, the calling method, and an array of arguments passed to the calling method. The return value is ignored.

@example

Proc.new do |error, klass, method, arguments|
  ...
end

The default implementation logs this information to Playground#logger.

Set a custom action by calling config.on_datastore_error = Proc.new { … }.

@since 2.0.0

request_filter[W]

Must return a Proc that accepts as a parameter the request object, if made available by the implement framework. The return value should be a boolean whether to ignore the request. This is called only for the JS callback action.

@example

Proc.new do |request|
  ...
end

The default implementation does a simple test of whether the request's HTTP_USER_AGENT header contains a URI, or the words 'bot', 'crawler', or 'spider' since well behaved bots typically include a reference URI in their user agent strings. (Original idea: stackoverflow.com/a/9285889.)

Alternatively, one could filter an explicit list of IPs, add additional user agent strings to filter, or any custom test. Set a custom filter by calling config.request_filter = Proc.new { … }.

@since 2.0.0

templates_path[W]

Path to Vanity templates. Set this to override those in the gem.

use_js[W]

Call to indicate that participants should be added via js. This helps keep robots from participating in the A/B test and skewing results.

If you want to use this:

  • Add <%= vanity_js %> to any page that needs uses an ab_test. vanity_js needs to be included after your call to ab_test so that it knows which version of the experiment the participant is a member of. The helper will render nothing if the there are no ab_tests running on the current page, so adding vanity_js to the bottom of your layouts is a good option. Keep in mind that if you set config.use_js = true and don't include vanity_js in your view no participants will be recorded.

Note that a custom JS callback path can be set using:

  • Set config.add_participant_route = '/path/to/vanity/action', this should point to the add_participant path that is added with Vanity::Rails::Dashboard, make sure that this action is available to all users.

Public Instance Methods

[](arg) click to toggle source
# File lib/vanity/configuration.rb, line 193
def [](arg)
  if instance_variable_defined?("@#{arg}")
    instance_variable_get("@#{arg}")
  else
    DEFAULTS[arg]
  end
end
connection_params(file_name=nil) click to toggle source

@return nil or a hash of symbolized keys for connection settings

# File lib/vanity/configuration.rb, line 207
def connection_params(file_name=nil)
  file_name ||= config_file
  file_path = File.join(config_path, file_name)

  if File.exist?(file_path)
    config = YAML.load(ERB.new(File.read(file_path)).result)
    config ||= {}
    params_for_environment = config[environment.to_s]

    unless params_for_environment
      raise MissingEnvironment.new("No configuration for #{environment}")
    end

    # Symbolize keys if it's a hash.
    if params_for_environment.respond_to?(:inject)
      params_for_environment.inject({}) { |h,kv| h[kv.first.to_sym] = kv.last ; h }
    else
      params_for_environment
    end
  end
end
connection_url() click to toggle source

@deprecated

# File lib/vanity/configuration.rb, line 230
def connection_url
  connection_config = connection_params

  return unless connection_config && connection_config.respond_to?(:has_key?)

  connection_url = connection_config[LEGACY_CONNECTION_KEY]

  if connection_url
    logger.warn(%q{Deprecated: Please specify connection urls using the `url` key with a protocol prefix instead of `connection`. This fallback will be removed in a future version.})

    # Legacy lack of protocol handling
    if connection_url =~ /^\w+:/
      connection_url
    else
      "redis://" + connection_url
    end
  end
end
redis_url_from_file() click to toggle source

@deprecated

# File lib/vanity/configuration.rb, line 250
def redis_url_from_file
  connection_url = connection_params(LEGACY_REDIS_CONFIG_FILE)

  if connection_url
    logger.warn(%q{Deprecated: Please specify the vanity config file, the default fallback to "config/redis.yml" may be removed in a future version.})

    if connection_url =~ /^\w+:/
      connection_url
    else
      "redis://" + connection_url
    end
  end
end
setup_locales() click to toggle source
# File lib/vanity/configuration.rb, line 201
def setup_locales
  locales = Dir[File.join(locales_path, '*.{rb,yml}')]
  I18n.load_path += locales
end