class Moneta::Fallback
Provides a fallback to a second store when an exception is raised
@example Basic usage - catches any {IOError} and falls back to {Moneta::Adapters:Null}
Moneta.build do use :Fallback adapter :Client end
@example Specifying an exception to rescue
Moneta.build do use :Fallback, rescue: Redis::CannotConnectError adapter :Redis end
@example Specifying a different fallback
Moneta.build do use :Fallback do # This is a new builder context adapter :Memory end adapter :File, dir: 'cache' end
@api public
Public Class Methods
new(adapter, options = {}, &block)
click to toggle source
@param [Moneta store] adapter The underlying store @param [Hash] options @option options [Moneta store] :fallback (:Null store) The store to fall
back on
@option options [Class|Array<Class>] :rescue ([IOError]) The list
of exceptions that should be rescued
@yieldreturn [Moneta store] Moneta
store built using the builder API
Calls superclass method
# File lib/moneta/fallback.rb, line 34 def initialize(adapter, options = {}, &block) super @fallback = if block_given? ::Moneta.build(&block) elsif options.key?(:fallback) options.delete(:fallback) else ::Moneta::Adapters::Null.new end @rescue = case options[:rescue] when nil [::IOError] when Array options[:rescue] else [options[:rescue]] end end
Protected Instance Methods
fallback(name, *args, &block)
click to toggle source
# File lib/moneta/fallback.rb, line 66 def fallback(name, *args, &block) result = case name when :values_at, :fetch_values, :slice keys, options = args @fallback.public_send(name, *keys, **options, &block) else @fallback.public_send(name, *args, &block) end # Don't expose the fallback class to the caller if result == @fallback self else result end end
wrap(name, *args) { || ... }
click to toggle source
# File lib/moneta/fallback.rb, line 59 def wrap(name, *args, &block) yield rescue => e raise unless @rescue.any? { |rescuable| rescuable === e } fallback(name, *args, &block) end