simple_cache_rs 0.11.1 → 0.12.1
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/lib/simple_cache/memcached_store.rb +27 -0
- data/lib/simple_cache/null_store.rb +12 -0
- data/lib/simple_cache/pg_store.rb +5 -5
- data/lib/simple_cache/sqlite_store.rb +5 -4
- data/lib/simple_cache.rb +16 -14
- data/test/memcache_store_test.rb +31 -0
- data/test/null_store_test.rb +15 -0
- data/test/pg_store_test.rb +11 -1
- data/test/test_helper.rb +21 -2
- metadata +37 -13
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class SimpleCache::MemcachedStore
|
|
2
|
+
Marshal = ::SimpleCache::Marshal
|
|
3
|
+
|
|
4
|
+
def initialize(url)
|
|
5
|
+
require "dalli"
|
|
6
|
+
|
|
7
|
+
uri = URI.parse(url)
|
|
8
|
+
|
|
9
|
+
@dc = Dalli::Client.new("#{uri.host}:#{uri.port}", :namespace => uri.path || "simple_cache", :compress => true)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def fetch(key, &block)
|
|
13
|
+
value = @dc.get(key)
|
|
14
|
+
return Marshal.unmarshal(value) if value
|
|
15
|
+
return yield(self, key) if block
|
|
16
|
+
nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def store(key, value, ttl = nil)
|
|
20
|
+
@dc.set(key, Marshal.marshal(value), ttl)
|
|
21
|
+
value
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clear
|
|
25
|
+
@dc.flush_all
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -3,7 +3,7 @@ require "micro_sql"
|
|
|
3
3
|
class SimpleCache::PgStore
|
|
4
4
|
Marshal = ::SimpleCache::Marshal
|
|
5
5
|
|
|
6
|
-
TABLE_NAME = "
|
|
6
|
+
TABLE_NAME = "simple_cache2"
|
|
7
7
|
|
|
8
8
|
attr :path
|
|
9
9
|
|
|
@@ -18,18 +18,18 @@ class SimpleCache::PgStore
|
|
|
18
18
|
|
|
19
19
|
def fetch(key, &block)
|
|
20
20
|
value = table[key]
|
|
21
|
-
return value if value
|
|
21
|
+
return Marshal.unmarshal(value) if value
|
|
22
22
|
return yield(self, key) if block
|
|
23
23
|
nil
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def store(key, value, ttl = nil)
|
|
27
|
-
table.update(key, value, ttl)
|
|
27
|
+
table.update(key, Marshal.marshal(value), ttl)
|
|
28
28
|
value
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def clear
|
|
32
|
-
return unless @db.tables.include?(
|
|
33
|
-
@db.ask "DELETE FROM #{
|
|
32
|
+
return unless @db.tables.include?(table.table_name)
|
|
33
|
+
@db.ask "DELETE FROM #{table.table_name}"
|
|
34
34
|
end
|
|
35
35
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# A simplistic Sqlite database interface
|
|
2
2
|
class SimpleCache::SqliteDatabase
|
|
3
|
-
def initialize(
|
|
3
|
+
def initialize(url)
|
|
4
4
|
require "sqlite3"
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
path = URI.parse(url).path
|
|
7
|
+
FileUtils.mkdir_p File.dirname(path)
|
|
7
8
|
|
|
8
9
|
@impl = SQLite3::Database.new(path)
|
|
9
10
|
@prepared_queries = {}
|
|
@@ -27,9 +28,9 @@ class SimpleCache::SqliteStore < SimpleCache::SqliteDatabase
|
|
|
27
28
|
|
|
28
29
|
def self.base_dir
|
|
29
30
|
if RUBY_PLATFORM.downcase.include?("darwin")
|
|
30
|
-
"#{Dir.home}/Library/
|
|
31
|
+
"#{Dir.home}/Library/Caches/org.radiospiel.simple_cache"
|
|
31
32
|
else
|
|
32
|
-
"#{Dir.home}
|
|
33
|
+
"#{Dir.home}/.org.radiospiel.simple_cache"
|
|
33
34
|
end
|
|
34
35
|
end
|
|
35
36
|
|
data/lib/simple_cache.rb
CHANGED
|
@@ -6,30 +6,32 @@ end
|
|
|
6
6
|
|
|
7
7
|
require_relative "simple_cache/marshal"
|
|
8
8
|
|
|
9
|
+
require_relative "simple_cache/memcached_store"
|
|
10
|
+
require_relative "simple_cache/pg_store"
|
|
9
11
|
require_relative "simple_cache/sqlite_store"
|
|
10
12
|
require_relative "simple_cache/redis_store"
|
|
13
|
+
require_relative "simple_cache/null_store"
|
|
11
14
|
|
|
12
15
|
module SimpleCache
|
|
13
16
|
def self.create_store(url)
|
|
14
|
-
expect! url => [ String, Redis, Redis::Namespace ]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
when
|
|
17
|
+
expect! url => [ "null:", nil, String, Redis, Redis::Namespace ]
|
|
18
|
+
|
|
19
|
+
klass = case url
|
|
20
|
+
when Redis, Redis::Namespace then SimpleCache::RedisStore
|
|
21
|
+
when "null:", nil then SimpleCache::NullStore
|
|
22
|
+
else
|
|
19
23
|
uri = URI.parse(url)
|
|
24
|
+
expect! uri.scheme => [ nil, "redis", "sqlite", "pg", "memcached" ]
|
|
20
25
|
|
|
21
26
|
case uri.scheme
|
|
22
|
-
when "redis" then
|
|
23
|
-
|
|
24
|
-
when
|
|
25
|
-
|
|
26
|
-
when "pg"
|
|
27
|
-
require_relative "simple_cache/pg_store"
|
|
28
|
-
return SimpleCache::PgStore.new(url)
|
|
29
|
-
else
|
|
30
|
-
raise uri.scheme.inspect
|
|
27
|
+
when "redis" then SimpleCache::RedisStore
|
|
28
|
+
when nil, "sqlite" then SimpleCache::SqliteStore
|
|
29
|
+
when "pg" then SimpleCache::PgStore
|
|
30
|
+
when "memcached" then SimpleCache::MemcachedStore
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
|
+
|
|
34
|
+
klass.new url
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def self.new(url)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SimpleCache::MemcachedStoreTest < Test::Unit::TestCase
|
|
4
|
+
include SimpleCache::TestCase
|
|
5
|
+
|
|
6
|
+
def simple_cache
|
|
7
|
+
@simple_cache ||= begin
|
|
8
|
+
simple_cache = SimpleCache.new("memcached://localhost:11211/simple_cache_test")
|
|
9
|
+
simple_cache.clear
|
|
10
|
+
simple_cache
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_expiration
|
|
15
|
+
assert_equal("1", simple_cache.store("forever", "1"))
|
|
16
|
+
assert_equal("2", simple_cache.store("young", "2", 3))
|
|
17
|
+
|
|
18
|
+
# Timecop tests don't work here :(
|
|
19
|
+
#
|
|
20
|
+
# Timecop.freeze(Time.now + 10) do
|
|
21
|
+
# assert_equal("1", simple_cache.fetch("forever"))
|
|
22
|
+
# assert_equal(nil, simple_cache.fetch("young"))
|
|
23
|
+
# end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_array
|
|
27
|
+
ary = %w(foo bar)
|
|
28
|
+
assert_equal(ary, simple_cache.store("ary", ary))
|
|
29
|
+
assert_equal(ary, simple_cache.fetch("ary"))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SimpleCache::NullStoreTest < Test::Unit::TestCase
|
|
4
|
+
include SimpleCache::TestCase
|
|
5
|
+
|
|
6
|
+
URL = "null:"
|
|
7
|
+
|
|
8
|
+
def simple_cache
|
|
9
|
+
@simple_cache ||= SimpleCache.new(URL).tap(&:clear)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
@simple_cache.clear if @simple_cache
|
|
14
|
+
end
|
|
15
|
+
end
|
data/test/pg_store_test.rb
CHANGED
|
@@ -4,7 +4,11 @@ class SimpleCache::PgStoreTest < Test::Unit::TestCase
|
|
|
4
4
|
include SimpleCache::TestCase
|
|
5
5
|
|
|
6
6
|
def simple_cache
|
|
7
|
-
@simple_cache ||=
|
|
7
|
+
@simple_cache ||= begin
|
|
8
|
+
simple_cache = SimpleCache.new("pg://simple_cache:simple_cache@localhost:5432/simple_cache_test")
|
|
9
|
+
simple_cache.clear
|
|
10
|
+
simple_cache
|
|
11
|
+
end
|
|
8
12
|
end
|
|
9
13
|
|
|
10
14
|
def test_expiration
|
|
@@ -15,4 +19,10 @@ class SimpleCache::PgStoreTest < Test::Unit::TestCase
|
|
|
15
19
|
assert_equal(nil, simple_cache.fetch("young"))
|
|
16
20
|
end
|
|
17
21
|
end
|
|
22
|
+
|
|
23
|
+
def test_array
|
|
24
|
+
ary = %w(foo bar)
|
|
25
|
+
assert_equal(ary, simple_cache.store("ary", ary))
|
|
26
|
+
assert_equal(ary, simple_cache.fetch("ary"))
|
|
27
|
+
end
|
|
18
28
|
end
|
data/test/test_helper.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'bundler'
|
|
3
3
|
begin
|
|
4
|
-
Bundler.setup(:default, :development)
|
|
4
|
+
Bundler.setup(:default, :development, :test)
|
|
5
5
|
rescue Bundler::BundlerError => e
|
|
6
6
|
$stderr.puts e.message
|
|
7
7
|
$stderr.puts "Run `bundle install` to install missing gems"
|
|
@@ -27,7 +27,12 @@ module SimpleCache::TestCase
|
|
|
27
27
|
assert_equal(nil, simple_cache.fetch("bar"))
|
|
28
28
|
|
|
29
29
|
assert_equal("foo", simple_cache.store("bar", "foo"))
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
if simple_cache.is_a?(SimpleCache::NullStore)
|
|
32
|
+
assert_equal(nil, simple_cache.fetch("bar"))
|
|
33
|
+
else
|
|
34
|
+
assert_equal("foo", simple_cache.fetch("bar"))
|
|
35
|
+
end
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
def test_simple_cache_expiration
|
|
@@ -35,7 +40,21 @@ module SimpleCache::TestCase
|
|
|
35
40
|
assert_equal "baz", simple_cache.cached("key2") { done += 1; "baz" }
|
|
36
41
|
assert_equal 1, done
|
|
37
42
|
assert_equal "baz", simple_cache.cached("key2") { done += 1; "baz" }
|
|
43
|
+
|
|
44
|
+
if simple_cache.is_a?(SimpleCache::NullStore)
|
|
45
|
+
assert_equal 2, done
|
|
46
|
+
else
|
|
47
|
+
assert_equal 1, done
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_simple_cache_clear
|
|
52
|
+
done = 0
|
|
53
|
+
assert_equal "baz", simple_cache.cached("test_simple_cache_expiration") { done += 1; "baz" }
|
|
38
54
|
assert_equal 1, done
|
|
55
|
+
simple_cache.clear
|
|
56
|
+
assert_equal "baz", simple_cache.cached("test_simple_cache_expiration") { done += 1; "baz" }
|
|
57
|
+
assert_equal 2, done
|
|
39
58
|
end
|
|
40
59
|
|
|
41
60
|
def test_simple_cache_store_and_fetch
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simple_cache_rs
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-07-06 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: expectation
|
|
16
|
-
requirement:
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,15 @@ dependencies:
|
|
|
21
21
|
version: '0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements:
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0'
|
|
25
30
|
- !ruby/object:Gem::Dependency
|
|
26
31
|
name: redis
|
|
27
|
-
requirement:
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
28
33
|
none: false
|
|
29
34
|
requirements:
|
|
30
35
|
- - ! '>='
|
|
@@ -32,10 +37,15 @@ dependencies:
|
|
|
32
37
|
version: '0'
|
|
33
38
|
type: :runtime
|
|
34
39
|
prerelease: false
|
|
35
|
-
version_requirements:
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '0'
|
|
36
46
|
- !ruby/object:Gem::Dependency
|
|
37
47
|
name: redis-namespace
|
|
38
|
-
requirement:
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
39
49
|
none: false
|
|
40
50
|
requirements:
|
|
41
51
|
- - ! '>='
|
|
@@ -43,10 +53,15 @@ dependencies:
|
|
|
43
53
|
version: '0'
|
|
44
54
|
type: :runtime
|
|
45
55
|
prerelease: false
|
|
46
|
-
version_requirements:
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
47
62
|
- !ruby/object:Gem::Dependency
|
|
48
63
|
name: micro_sql
|
|
49
|
-
requirement:
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
50
65
|
none: false
|
|
51
66
|
requirements:
|
|
52
67
|
- - ! '>='
|
|
@@ -54,7 +69,12 @@ dependencies:
|
|
|
54
69
|
version: '0'
|
|
55
70
|
type: :runtime
|
|
56
71
|
prerelease: false
|
|
57
|
-
version_requirements:
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
58
78
|
description: A sensibly fast, yet simplistic sqlite- or redis-based cache.
|
|
59
79
|
email: eno@radiospiel.org
|
|
60
80
|
executables: []
|
|
@@ -62,6 +82,8 @@ extensions: []
|
|
|
62
82
|
extra_rdoc_files: []
|
|
63
83
|
files:
|
|
64
84
|
- lib/simple_cache/marshal.rb
|
|
85
|
+
- lib/simple_cache/memcached_store.rb
|
|
86
|
+
- lib/simple_cache/null_store.rb
|
|
65
87
|
- lib/simple_cache/pg_store.rb
|
|
66
88
|
- lib/simple_cache/redis_store.rb
|
|
67
89
|
- lib/simple_cache/sqlite_store.rb
|
|
@@ -117,7 +139,9 @@ files:
|
|
|
117
139
|
- test/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css
|
|
118
140
|
- test/coverage/assets/0.5.3/stylesheet.css
|
|
119
141
|
- test/coverage/index.html
|
|
142
|
+
- test/memcache_store_test.rb
|
|
120
143
|
- test/memoize_test.rb
|
|
144
|
+
- test/null_store_test.rb
|
|
121
145
|
- test/pg_store_test.rb
|
|
122
146
|
- test/redis_store_test.rb
|
|
123
147
|
- test/simple_cache_test.rb
|
|
@@ -137,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
137
161
|
version: '0'
|
|
138
162
|
segments:
|
|
139
163
|
- 0
|
|
140
|
-
hash:
|
|
164
|
+
hash: -4118416796349753026
|
|
141
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
166
|
none: false
|
|
143
167
|
requirements:
|
|
@@ -146,10 +170,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
146
170
|
version: '0'
|
|
147
171
|
segments:
|
|
148
172
|
- 0
|
|
149
|
-
hash:
|
|
173
|
+
hash: -4118416796349753026
|
|
150
174
|
requirements: []
|
|
151
175
|
rubyforge_project:
|
|
152
|
-
rubygems_version: 1.8.
|
|
176
|
+
rubygems_version: 1.8.25
|
|
153
177
|
signing_key:
|
|
154
178
|
specification_version: 3
|
|
155
179
|
summary: A sensibly fast, yet simplistic sqlite- or redis-based cache.
|