class Shapkeep

Constants

InvalidScriptNameError
VERSION

Attributes

lua_root[RW]
sha_file[R]

Public Class Methods

new(sha_file) click to toggle source
# File lib/shapkeep.rb, line 10
def initialize(sha_file)
  @sha_file = sha_file
  @lua_root = script_store.delete(:lua_root) { Dir.pwd }
end

Public Instance Methods

eval(redis, name, keys = [], args = []) click to toggle source
# File lib/shapkeep.rb, line 15
def eval(redis, name, keys = [], args = [])
  begin
    invalid_script_name!(name) unless script_available?(name)
    redis.evalsha(sha_for_script_name(name), keys, args)
  rescue Redis::CommandError => boom
    raise boom unless boom.message.include?('NOSCRIPT')

    load_script(redis, name)
    retry
  end
end
load_scripts!(redis) click to toggle source
# File lib/shapkeep.rb, line 27
def load_scripts!(redis)
  script_store.keys.each { |name| load_script(redis, name) }
end
script_available?(name) click to toggle source
# File lib/shapkeep.rb, line 35
def script_available?(name)
  script_store.has_key?(name)
end
script_store() click to toggle source
# File lib/shapkeep.rb, line 31
def script_store
  @script_store ||= YAML.load_file(sha_file)
end

Private Instance Methods

invalid_script_name!(name) click to toggle source
# File lib/shapkeep.rb, line 66
def invalid_script_name!(name)
  raise InvalidScriptNameError.new("No script with name [ #{name} ].")
end
load_script(redis, name) click to toggle source
# File lib/shapkeep.rb, line 61
def load_script(redis, name)
  sha = redis.script(:load, script_for_name(name))
  script_store[name][:sha] = sha
end
lua_filename?(string) click to toggle source
# File lib/shapkeep.rb, line 57
def lua_filename?(string)
  ['.lua', '.LUA'].include?(string[-4..-1])
end
script_for_name(name) click to toggle source
# File lib/shapkeep.rb, line 49
def script_for_name(name)
  potential_script = script_store[name.to_sym][:script]

  return potential_script unless lua_filename?(potential_script)

  File.read(File.join(lua_root, potential_script))
end
script_sha(script) click to toggle source
# File lib/shapkeep.rb, line 45
def script_sha(script)
  Digest::SHA1.hexdigest(script)
end
sha_for_script_name(name) click to toggle source
# File lib/shapkeep.rb, line 41
def sha_for_script_name(name)
  script_store[name.to_sym][:sha] ||= script_sha(script_for_name(name))
end