sinatra-dalli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +72 -0
- data/Rakefile +10 -0
- data/lib/sinatra/dalli.rb +101 -0
- data/spec/fixture.rb +51 -0
- data/spec/sinatra-dalli_spec.rb +77 -0
- metadata +73 -0
data/README.rdoc
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
= Sinatra-Dalli
|
2
|
+
|
3
|
+
== Install
|
4
|
+
|
5
|
+
gem install sinatra-dalli
|
6
|
+
|
7
|
+
== Dependencies
|
8
|
+
|
9
|
+
dalli
|
10
|
+
zlib
|
11
|
+
|
12
|
+
== Usage:
|
13
|
+
|
14
|
+
require 'rubygems'
|
15
|
+
require 'sinatra'
|
16
|
+
require 'sinatra/dalli'
|
17
|
+
|
18
|
+
# cache
|
19
|
+
get '/cache1' do
|
20
|
+
cache 'cache1' do
|
21
|
+
sleep(5)
|
22
|
+
'Hello Cache1'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# args
|
27
|
+
get '/cache2' do
|
28
|
+
cache 'cache2', :expiry => 10, :compress => true do
|
29
|
+
sleep(3)
|
30
|
+
'Hello Cache2'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# cache object
|
35
|
+
get '/obj' do
|
36
|
+
hash = cache 'obj' do
|
37
|
+
sleep(2)
|
38
|
+
{ :a => 'Hello Object' }
|
39
|
+
end
|
40
|
+
hash[:a]
|
41
|
+
end
|
42
|
+
|
43
|
+
# expire
|
44
|
+
get '/expire' do
|
45
|
+
expire 'cache1'
|
46
|
+
expire /^cache/
|
47
|
+
expire //
|
48
|
+
'Hello Expire'
|
49
|
+
end
|
50
|
+
|
51
|
+
# default options
|
52
|
+
set :cache_server, "localhost:11211"
|
53
|
+
set :cache_namespace, "sinatra-dalli"
|
54
|
+
set :cache_enable, true
|
55
|
+
set :cache_logging, true
|
56
|
+
set :cache_default_expiry, 3600
|
57
|
+
set :cache_default_compress, false
|
58
|
+
|
59
|
+
== Authors & Contributors
|
60
|
+
|
61
|
+
Kazuki Uchida, gioext@gmail.com
|
62
|
+
|
63
|
+
Casey Manion, casey@manion.com
|
64
|
+
|
65
|
+
== License
|
66
|
+
|
67
|
+
Copyright (c) 2009 Kazuki UCHIDA
|
68
|
+
|
69
|
+
Licensed under the MIT License:
|
70
|
+
|
71
|
+
http://www.opensource.org/licenses/mit-license.php
|
72
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
task :default => :spec
|
5
|
+
|
6
|
+
desc "Run all specs in spec directory"
|
7
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
8
|
+
t.spec_opts = ['--color', '--format specdoc']
|
9
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
10
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# Based on https://github.com/JGailor/sinatra-memcache/blob/master/lib/sinatra/memcache.rb
|
2
|
+
# Modified to use dalli instead of memcache-client
|
3
|
+
|
4
|
+
require 'dalli'
|
5
|
+
require 'zlib'
|
6
|
+
|
7
|
+
module Sinatra
|
8
|
+
module Dalli
|
9
|
+
module Helpers
|
10
|
+
|
11
|
+
#
|
12
|
+
#
|
13
|
+
#
|
14
|
+
def cache(key, params = {}, &block)
|
15
|
+
return block.call unless settings.cache_enable
|
16
|
+
|
17
|
+
opts = {
|
18
|
+
:expiry => settings.cache_default_expiry,
|
19
|
+
:compress => settings.cache_default_compress
|
20
|
+
}.merge(params)
|
21
|
+
|
22
|
+
value = get(key, opts)
|
23
|
+
return value unless block_given?
|
24
|
+
|
25
|
+
if value
|
26
|
+
log "Get: #{key}"
|
27
|
+
value
|
28
|
+
else
|
29
|
+
log "Set: #{key}"
|
30
|
+
set(key, block.call, opts)
|
31
|
+
end
|
32
|
+
rescue => e
|
33
|
+
throw e if settings.development? || settings.show_exceptions
|
34
|
+
block.call
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
#
|
39
|
+
#
|
40
|
+
def expire(p)
|
41
|
+
return unless settings.cache_enable
|
42
|
+
|
43
|
+
case p
|
44
|
+
when String
|
45
|
+
expire_key(p)
|
46
|
+
when Regexp
|
47
|
+
expire_regexp(p)
|
48
|
+
end
|
49
|
+
true
|
50
|
+
rescue => e
|
51
|
+
throw e if settings.development? or settings.show_exceptions
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def client
|
58
|
+
settings.cache_client ||= ::Dalli::Client.new settings.cache_server,
|
59
|
+
:namespace => settings.cache_namespace
|
60
|
+
end
|
61
|
+
|
62
|
+
def log(msg)
|
63
|
+
puts "[sinatra-dalli] #{msg}" if settings.cache_logging
|
64
|
+
end
|
65
|
+
|
66
|
+
def get(key, opts)
|
67
|
+
v = client.get(key, :raw => true)
|
68
|
+
return v unless v
|
69
|
+
|
70
|
+
v = Zlib::Inflate.inflate(v) if opts[:compress]
|
71
|
+
Marshal.load(v)
|
72
|
+
end
|
73
|
+
|
74
|
+
def set(key, value, opts)
|
75
|
+
v = Marshal.dump(value)
|
76
|
+
v = Zlib::Deflate.deflate(v) if opts[:compress]
|
77
|
+
client.set(key, v, opts[:expiry], :raw => true)
|
78
|
+
value
|
79
|
+
end
|
80
|
+
|
81
|
+
def expire_key(key)
|
82
|
+
client.delete(key)
|
83
|
+
log "Expire: #{key}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.registered(app)
|
88
|
+
app.helpers Dalli::Helpers
|
89
|
+
|
90
|
+
app.set :cache_client, nil
|
91
|
+
app.set :cache_server, 'localhost:11211'
|
92
|
+
app.set :cache_namespace, 'sinatra-dalli'
|
93
|
+
app.set :cache_enable, true
|
94
|
+
app.set :cache_logging, true
|
95
|
+
app.set :cache_default_expiry, 3600
|
96
|
+
app.set :cache_default_compress, false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
register Dalli
|
101
|
+
end
|
data/spec/fixture.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
get '/' do
|
3
|
+
"Hello World"
|
4
|
+
end
|
5
|
+
|
6
|
+
get '/cache' do
|
7
|
+
cache "cache" do
|
8
|
+
"Hello World"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/cache2' do
|
13
|
+
cache "cache2", :expiry => 1 do
|
14
|
+
"Hello World"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
get '/read' do
|
19
|
+
cache 'cache'
|
20
|
+
end
|
21
|
+
|
22
|
+
get '/compress' do
|
23
|
+
cache "compress", :compress => true do
|
24
|
+
"Hello Compress"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/object' do
|
29
|
+
hash = cache "object" do
|
30
|
+
{ :a => 'hello a', :b => 'hello b' }
|
31
|
+
end
|
32
|
+
hash[:a] + ' ' + hash[:b]
|
33
|
+
end
|
34
|
+
|
35
|
+
get '/expire' do
|
36
|
+
expire "cache"
|
37
|
+
end
|
38
|
+
|
39
|
+
get '/drop' do
|
40
|
+
end
|
41
|
+
|
42
|
+
get '/expire_all' do
|
43
|
+
expire "cache"
|
44
|
+
expire "cache2"
|
45
|
+
expire "compress"
|
46
|
+
end
|
47
|
+
|
48
|
+
configure do
|
49
|
+
set :cache_namespace, "test"
|
50
|
+
set :cache_logging, false
|
51
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'rack/test'
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/../lib/sinatra/dalli'
|
6
|
+
require File.dirname(__FILE__) + '/fixture'
|
7
|
+
|
8
|
+
include Rack::Test::Methods
|
9
|
+
def app
|
10
|
+
Sinatra::Application
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'Sinatra-Dalli' do
|
14
|
+
before do
|
15
|
+
@client = Dalli::Client.new 'localhost:11211', :namespace => "test"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "/index" do
|
19
|
+
get '/'
|
20
|
+
last_response.ok?.should be_true
|
21
|
+
last_response.body.should == "Hello World"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "/cache" do
|
25
|
+
get '/cache'
|
26
|
+
last_response.ok?.should be_true
|
27
|
+
last_response.body.should == "Hello World"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "/cache - marshal" do
|
31
|
+
get '/cache'
|
32
|
+
Marshal.load(@client.get('cache', true)).should == "Hello World"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "/cache, /read" do
|
36
|
+
get '/cache'
|
37
|
+
get '/read'
|
38
|
+
last_response.ok?.should be_true
|
39
|
+
last_response.body.should == "Hello World"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "/cache, /expire - nil" do
|
43
|
+
get '/cache'
|
44
|
+
get '/expire'
|
45
|
+
@client.get('cache').should be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "/cache2 - nil" do
|
49
|
+
get '/cache2'
|
50
|
+
sleep(1)
|
51
|
+
@client.get('cache2').should be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "/compress" do
|
55
|
+
get '/compress'
|
56
|
+
last_response.ok?.should be_true
|
57
|
+
last_response.body.should == "Hello Compress"
|
58
|
+
@client.get('compress', true).should == Zlib::Deflate.deflate(Marshal.dump('Hello Compress'))
|
59
|
+
end
|
60
|
+
|
61
|
+
it "/object" do
|
62
|
+
get '/object'
|
63
|
+
last_response.ok?.should be_true
|
64
|
+
last_response.body.should == "hello a hello b"
|
65
|
+
Marshal.load(@client.get('object', true)).should == { :a => 'hello a', :b => 'hello b' }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "/cache, /cache2, /compress, /expire_all - nil " do
|
69
|
+
get '/cache'
|
70
|
+
get '/cache2'
|
71
|
+
get '/compress'
|
72
|
+
get '/expire_all'
|
73
|
+
@client.get('cache').should be_nil
|
74
|
+
@client.get('cache2').should be_nil
|
75
|
+
@client.get('compress').should be_nil
|
76
|
+
end
|
77
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinatra-dalli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Casey Manion
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-04-30 00:00:00.000000000 +00:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sinatra
|
17
|
+
requirement: &11569220 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *11569220
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: dalli
|
28
|
+
requirement: &11568780 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *11568780
|
37
|
+
description: Cache extension on Sinatra
|
38
|
+
email: casey@manion.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- Rakefile
|
44
|
+
- README.rdoc
|
45
|
+
- lib/sinatra/dalli.rb
|
46
|
+
- spec/sinatra-dalli_spec.rb
|
47
|
+
- spec/fixture.rb
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: https://github.com/caseman72/sinatra-dalli
|
50
|
+
licenses: []
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.6.2
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: Cache extension on Sinatra
|
73
|
+
test_files: []
|