class Chewy::Strategy

This class represents strategies stack with `:base` Strategy on top of it. This causes raising exceptions on every index update attempt, so other strategy must be choosen.

User.first.save # Raises UndefinedUpdateStrategy exception

Chewy.strategy(:atomic) do
  User.last.save # Save user according to the `:atomic` strategy rules
end

Public Class Methods

new() click to toggle source
# File lib/chewy/strategy.rb, line 35
def initialize
  @stack = [resolve(Chewy.root_strategy).new]
end

Public Instance Methods

current() click to toggle source
# File lib/chewy/strategy.rb, line 39
def current
  @stack.last
end
pop() click to toggle source
# File lib/chewy/strategy.rb, line 49
def pop
  raise "Can't pop root strategy" if @stack.one?

  result = @stack.pop.tap(&:leave)
  debug "[#{@stack.size}] -> #{result.name}, now #{current.name}" if @stack.size > 1
  result
end
push(name) click to toggle source
# File lib/chewy/strategy.rb, line 43
def push(name)
  result = @stack.push resolve(name).new
  debug "[#{@stack.size - 1}] <- #{current.name}" if @stack.size > 2
  result
end
wrap(name) { || ... } click to toggle source
# File lib/chewy/strategy.rb, line 57
def wrap(name)
  stack = push(name)
  yield
ensure
  pop if stack
end

Private Instance Methods

debug(string) click to toggle source
# File lib/chewy/strategy.rb, line 66
def debug(string)
  return unless Chewy.logger&.debug?

  line = caller.detect { |l| l !~ %r{lib/chewy/strategy.rb:|lib/chewy.rb:} }
  Chewy.logger.debug(["Chewy strategies stack: #{string}", line.sub(/:in\s.+$/, '')].join(' @ '))
end
resolve(name) click to toggle source
# File lib/chewy/strategy.rb, line 73
def resolve(name)
  "Chewy::Strategy::#{name.to_s.camelize}".safe_constantize or raise "Can't find update strategy `#{name}`"
end