class Rack::MonetaRest
A Rack
application which provides a REST interface to a Moneta
store.
@example config.ru
map '/moneta' do run Rack::MonetaRest.new(:Memory) end
@example config.ru
# Pass it a block like the one passed to Moneta.build run Rack::MonetaRest.new do use :Transformer, value: :zlib adapter :Memory end
@api public
Public Class Methods
new(store = nil, options = {}, &block)
click to toggle source
# File lib/rack/moneta_rest.rb, line 20 def initialize(store = nil, options = {}, &block) if block raise ArgumentError, 'Use either block or options' unless options.empty? @store = ::Moneta.build(&block) else raise ArgumentError, 'Block or argument store is required' unless @store = store @store = ::Moneta.new(@store, options) if Symbol === @store end end
Public Instance Methods
call(env)
click to toggle source
# File lib/rack/moneta_rest.rb, line 30 def call(env) key = env['PATH_INFO'][1..-1].to_s case env['REQUEST_METHOD'] when 'HEAD' if key.empty? respond(400, 'Empty key') elsif @store.key?(key) empty(200) else empty(404) end when 'GET' if key.empty? respond(400, 'Empty key') elsif value = @store[key] respond(200, value) else empty(404) end when 'POST', 'PUT' if key.empty? respond(400, 'Empty key') else respond(200, @store[key] = env['rack.input'].read) end when 'DELETE' if key.empty? @store.clear empty(200) else respond(200, @store.delete(key)) end else respond(400, 'Bad method') end rescue => ex respond(500, "Exception: #{ex.message}") end
Private Instance Methods
empty(status)
click to toggle source
# File lib/rack/moneta_rest.rb, line 71 def empty(status) [status, { 'Content-Type' => 'application/octet-stream', 'Content-Length' => '0' }, []] end
respond(status, value)
click to toggle source
# File lib/rack/moneta_rest.rb, line 75 def respond(status, value) [status, { 'Content-Type' => 'application/octet-stream', 'Content-Length' => value.bytesize.to_s }, [value]] end