Module: Bandit

Defined in:
lib/bandit/storage/base.rb,
lib/bandit.rb,
lib/bandit/config.rb,
lib/bandit/version.rb,
lib/bandit/date_hour.rb,
lib/bandit/exceptions.rb,
lib/bandit/experiment.rb,
lib/bandit/memoizable.rb,
lib/bandit/players/base.rb,
lib/bandit/storage/dalli.rb,
lib/bandit/storage/redis.rb,
lib/bandit/storage/memory.rb,
lib/bandit/storage/memcache.rb,
lib/bandit/players/round_robin.rb,
lib/bandit/players/epsilon_greedy.rb,
lib/bandit/extensions/view_concerns.rb,
lib/generators/bandit/install_generator.rb,
lib/bandit/extensions/controller_concerns.rb,
lib/generators/bandit/dashboard_generator.rb

Overview

every so often store current epsilon state:<experiment>:<player>:epsilon = 0.1

Defined Under Namespace

Modules: ControllerConcerns, Generators, Memoizable, ViewConcerns Classes: BasePlayer, BaseStorage, Config, DalliStorage, DateHour, EpsilonGreedyPlayer, Experiment, MemCacheStorage, MemoryStorage, MissingConfigurationError, RedisStorage, RoundRobinPlayer, UnknownPlayerEngineError, UnknownStorageEngineError

Constant Summary collapse

VERSION =
"0.1.0"
@@storage_failure_at =
nil

Class Method Summary collapse

Class Method Details

.configObject



27
28
29
# File 'lib/bandit.rb', line 27

def self.config
  @config ||= Config.new
end

.experimentsObject



61
62
63
# File 'lib/bandit.rb', line 61

def self.experiments
  Experiment.instances
end

.get_experiment(name) ⇒ Object



56
57
58
59
# File 'lib/bandit.rb', line 56

def self.get_experiment(name)
  exp = Experiment.instances.select { |e| e.name == name }
  exp.length > 0 ? exp.first : nil
end

.playerObject



48
49
50
# File 'lib/bandit.rb', line 48

def self.player
  @player ||= BasePlayer.get_player(Bandit.config.player.intern, Bandit.config.player_config)
end

.setup {|config| ... } ⇒ Object

Yields:



31
32
33
34
35
36
# File 'lib/bandit.rb', line 31

def self.setup(&block)
  yield config
  config.check!
  # intern keys in storage config
  config.storage_config = config.storage_config.inject({}) { |n,o| n[o.first.intern] = o.last; n }
end

.storageObject



38
39
40
41
42
43
44
45
46
# File 'lib/bandit.rb', line 38

def self.storage
  # try using configured storage at least once every 5 minutes until resolved
  if @@storage_failure_at.nil? or (Time.now.to_i - @@storage_failure_at) > 300
    @storage ||= BaseStorage.get_storage(Bandit.config.storage.intern, Bandit.config.storage_config)
  else
    Rails.logger.warn "storage failure detected #{Time.now.to_i - @@storage_failure_at} seconds ago - using memory storage for 5 minutes"
    BaseStorage.get_storage(:memory, Bandit.config.storage_config)
  end
end

.storage_failed!Object



52
53
54
# File 'lib/bandit.rb', line 52

def self.storage_failed!
  @@storage_failure_at = Time.now.to_i
end