quetzall-cloud_cache 1.1.6 → 1.2.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/lib/cloud_cache.rb +38 -12
- data/test/cache_tests.rb +166 -140
- metadata +2 -2
data/lib/cloud_cache.rb
CHANGED
@@ -54,6 +54,7 @@ module ActiveSupport
|
|
54
54
|
if (http_method == :put)
|
55
55
|
req = Net::HTTP::Put.new(uri.path)
|
56
56
|
req.body = body unless body.nil?
|
57
|
+
#puts 'BODY SIZE=' + req.body.length.to_s
|
57
58
|
elsif (http_method == :post)
|
58
59
|
req = Net::HTTP::Post.new(uri.path)
|
59
60
|
if !parameters.nil?
|
@@ -66,6 +67,9 @@ module ActiveSupport
|
|
66
67
|
end
|
67
68
|
else
|
68
69
|
req = Net::HTTP::Get.new(uri.path)
|
70
|
+
if !parameters.nil?
|
71
|
+
req.set_form_data(parameters)
|
72
|
+
end
|
69
73
|
end
|
70
74
|
headers.each_pair do |k, v|
|
71
75
|
req[k] = v
|
@@ -93,7 +97,9 @@ module ActiveSupport
|
|
93
97
|
run_http(:get, command_name, command_path)
|
94
98
|
end
|
95
99
|
|
96
|
-
def put(key, val,
|
100
|
+
def put(key, val, options={})
|
101
|
+
seconds_to_store = options[:expires_in] || options[:ttl]
|
102
|
+
raw = options[:raw]
|
97
103
|
#puts 'putting ' + val.to_s + ' to key=' + key
|
98
104
|
seconds_to_store = 0 if seconds_to_store.nil?
|
99
105
|
if raw
|
@@ -106,9 +112,9 @@ module ActiveSupport
|
|
106
112
|
run_http(:put, "PUT", key, data, nil, extra_headers)
|
107
113
|
end
|
108
114
|
|
109
|
-
|
110
|
-
def get_multi(keys, raw=false)
|
115
|
+
def get_multi(keys, options={})
|
111
116
|
return {} if keys.size == 0
|
117
|
+
raw = options[:raw]
|
112
118
|
kj = keys.to_json
|
113
119
|
#puts "keys.to_json = " + kj
|
114
120
|
extra_headers = {"keys" => kj }
|
@@ -155,7 +161,8 @@ module ActiveSupport
|
|
155
161
|
values
|
156
162
|
end
|
157
163
|
|
158
|
-
def get(key,
|
164
|
+
def get(key, options={})
|
165
|
+
raw = options[:raw]
|
159
166
|
begin
|
160
167
|
data = run_http(:get, "GET", key)
|
161
168
|
rescue Net::HTTPServerException
|
@@ -173,7 +180,7 @@ module ActiveSupport
|
|
173
180
|
|
174
181
|
# returns the value as an int.
|
175
182
|
def get_i(key)
|
176
|
-
val = get(key, true)
|
183
|
+
val = get(key, :raw=>true)
|
177
184
|
return nil if val.nil?
|
178
185
|
return val.to_i
|
179
186
|
end
|
@@ -213,12 +220,23 @@ module ActiveSupport
|
|
213
220
|
|
214
221
|
def write(name, value, options={})
|
215
222
|
super
|
216
|
-
put(name, value, options
|
223
|
+
put(name, value, options)
|
217
224
|
end
|
218
225
|
|
219
226
|
def delete(name, options = nil)
|
220
227
|
super
|
221
|
-
|
228
|
+
begin
|
229
|
+
run_http(:delete, "DELETE", name)
|
230
|
+
rescue Net::HTTPServerException => ex
|
231
|
+
puts 'CAUGHT ' + ex.response.inspect
|
232
|
+
case ex.response
|
233
|
+
when Net::HTTPNotFound
|
234
|
+
return false
|
235
|
+
else
|
236
|
+
raise ex
|
237
|
+
end
|
238
|
+
end
|
239
|
+
true
|
222
240
|
end
|
223
241
|
|
224
242
|
def remove(name, options=nil)
|
@@ -235,7 +253,7 @@ module ActiveSupport
|
|
235
253
|
end
|
236
254
|
|
237
255
|
def exists?(key, options = nil)
|
238
|
-
x = get(key, true)
|
256
|
+
x = get(key, :raw=>true)
|
239
257
|
return !x.nil?
|
240
258
|
end
|
241
259
|
|
@@ -247,13 +265,21 @@ module ActiveSupport
|
|
247
265
|
v
|
248
266
|
end
|
249
267
|
|
250
|
-
def increment(key, val=1)
|
251
|
-
|
268
|
+
def increment(key, val=1, options={})
|
269
|
+
headers = {"val"=>val}
|
270
|
+
if options[:set_if_not_found]
|
271
|
+
headers["x-cc-set-if-not-found"] = options[:set_if_not_found]
|
272
|
+
end
|
273
|
+
ret = run_http(:post, "POST", key + "/incr", nil, headers)
|
252
274
|
ret.to_i
|
253
275
|
end
|
254
276
|
|
255
|
-
def decrement(key, val=1)
|
256
|
-
|
277
|
+
def decrement(key, val=1, options={})
|
278
|
+
headers = {"val"=>val}
|
279
|
+
if options[:set_if_not_found]
|
280
|
+
headers["x-cc-set-if-not-found"] = options[:set_if_not_found]
|
281
|
+
end
|
282
|
+
ret = run_http(:post, "POST", key + "/decr", nil, headers)
|
257
283
|
ret.to_i
|
258
284
|
end
|
259
285
|
|
data/test/cache_tests.rb
CHANGED
@@ -20,196 +20,222 @@ class CacheTests < Test::Unit::TestCase
|
|
20
20
|
@cache = ActiveSupport::Cache::CloudCache.new(props['access_key'], props['secret_key'])
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
23
|
def teardown
|
25
24
|
@cache.shutdown unless @cache.nil?
|
26
25
|
end
|
27
26
|
|
28
27
|
def test_auth
|
29
|
-
|
30
|
-
|
28
|
+
@cache.auth()
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_bad_auth
|
32
|
+
|
33
|
+
temp = @cache.secret_key
|
34
|
+
@cache.secret_key = "badkey"
|
35
|
+
|
36
|
+
assert_raise Net::HTTPServerException do
|
37
|
+
test_basic_ops
|
38
|
+
end
|
39
|
+
|
40
|
+
@cache.secret_key = temp
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_basic_ops
|
44
|
+
to_put = "I am a testing string. Take me apart and put me back together again."
|
45
|
+
@cache.put("s1", to_put)
|
46
|
+
|
47
|
+
sleep(1)
|
48
|
+
|
49
|
+
response = @cache.get("s1")
|
50
|
+
assert_equal(to_put, response)
|
31
51
|
|
32
|
-
|
52
|
+
end
|
33
53
|
|
34
|
-
|
35
|
-
|
54
|
+
def test_not_exists
|
55
|
+
assert_nil @cache.get("does_not_exist")
|
56
|
+
end
|
36
57
|
|
37
|
-
|
38
|
-
|
39
|
-
|
58
|
+
def test_delete
|
59
|
+
to_put = "I am a testing string. Take me apart and put me back together again."
|
60
|
+
@cache.put("s1", to_put)
|
40
61
|
|
41
|
-
|
42
|
-
end
|
62
|
+
sleep(1)
|
43
63
|
|
44
|
-
|
45
|
-
|
46
|
-
@cache.put("s1", to_put, 0);
|
64
|
+
response = @cache.get("s1")
|
65
|
+
assert_equal(to_put, response)
|
47
66
|
|
48
|
-
|
67
|
+
@cache.delete("s1")
|
49
68
|
|
50
|
-
|
51
|
-
|
69
|
+
response = @cache.get("s1")
|
70
|
+
assert_nil(response)
|
71
|
+
end
|
52
72
|
|
53
|
-
|
73
|
+
def test_expiry
|
74
|
+
to_put = "I am a testing string. Take me apart and put me back together again."
|
75
|
+
@cache.put("s1", to_put, :ttl=>2);
|
76
|
+
sleep(4)
|
77
|
+
response = @cache.get("s1")
|
78
|
+
assert_nil(response)
|
54
79
|
|
55
|
-
|
56
|
-
|
57
|
-
|
80
|
+
@cache.write("s1", to_put, :expires_in=>2);
|
81
|
+
sleep(4)
|
82
|
+
response = @cache.get("s1")
|
83
|
+
assert_nil(response)
|
84
|
+
end
|
58
85
|
|
59
|
-
|
60
|
-
|
61
|
-
|
86
|
+
def test_list_keys
|
87
|
+
@cache.put("k1", "v2", :expires_in=>15)
|
88
|
+
sleep 1
|
89
|
+
keys = @cache.list_keys
|
90
|
+
puts("PRINTING KEYS:")
|
91
|
+
for key in keys
|
92
|
+
puts key
|
93
|
+
end
|
94
|
+
haskey = keys.index("k1")
|
95
|
+
assert_not_nil(haskey)
|
96
|
+
end
|
62
97
|
|
63
|
-
|
98
|
+
def test_counters
|
99
|
+
val = 0
|
100
|
+
key = "counter1" # should add a test for a key with a slash
|
101
|
+
@cache.put(key, val, :ttl=>50000, :raw=>true)
|
102
|
+
10.times do
|
103
|
+
val = @cache.increment(key)
|
104
|
+
puts 'val=' + val.to_s
|
105
|
+
end
|
106
|
+
assert_equal(10, val)
|
64
107
|
|
65
|
-
|
66
|
-
|
108
|
+
# get as normal int now
|
109
|
+
get_val = @cache.get_i(key)
|
110
|
+
assert_equal(10, get_val)
|
67
111
|
|
68
|
-
|
112
|
+
10.times do
|
113
|
+
val = @cache.decrement(key)
|
114
|
+
end
|
115
|
+
assert_equal(0, val)
|
69
116
|
|
70
|
-
|
71
|
-
|
72
|
-
|
117
|
+
# One more to make sure it stays at 0
|
118
|
+
val = @cache.decrement(key)
|
119
|
+
assert_equal(0, val)
|
73
120
|
|
74
|
-
|
75
|
-
to_put = "I am a testing string. Take me apart and put me back together again."
|
76
|
-
@cache.put("s1", to_put, 2);
|
121
|
+
end
|
77
122
|
|
78
|
-
|
123
|
+
def test_flush
|
124
|
+
x = @cache.flush
|
125
|
+
assert_equal('[]', x)
|
126
|
+
end
|
79
127
|
|
80
|
-
|
81
|
-
|
82
|
-
|
128
|
+
def test_stats
|
129
|
+
x = @cache.stats
|
130
|
+
puts x
|
131
|
+
end
|
83
132
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
for key in keys
|
90
|
-
puts key
|
91
|
-
end
|
92
|
-
haskey = keys.index("k1")
|
93
|
-
assert_not_nil(haskey)
|
94
|
-
end
|
133
|
+
def test_get_multi_raw
|
134
|
+
@cache.remove("m1") rescue false
|
135
|
+
@cache.remove("m2") rescue false
|
136
|
+
@cache.remove("m3") rescue false
|
137
|
+
@cache.remove("m4") rescue false
|
95
138
|
|
96
|
-
|
97
|
-
|
98
|
-
key = "counter1"
|
99
|
-
@cache.put(key, val, 50000, true)
|
100
|
-
10.times do
|
101
|
-
val = @cache.increment(key)
|
102
|
-
end
|
103
|
-
assert_equal(10, val)
|
139
|
+
@cache.put("m1", "v1", :ttl=>500, :raw=>true)
|
140
|
+
@cache.put("m2", "v2", :ttl=>500, :raw=>true)
|
104
141
|
|
105
|
-
|
106
|
-
|
107
|
-
assert_equal(10, get_val)
|
142
|
+
kz = Array["m1", "m2", "m3"]
|
143
|
+
vz = @cache.get_multi(kz, :raw=>true)
|
108
144
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
assert_equal(0, val)
|
145
|
+
assert_equal("v1", vz["m1"])
|
146
|
+
assert_equal("v2", vz["m2"])
|
147
|
+
assert_nil(vz["m3"])
|
113
148
|
|
114
|
-
# One more to make sure it stays at 0
|
115
|
-
val = @cache.decrement(key)
|
116
|
-
assert_equal(0, val)
|
117
149
|
|
118
|
-
|
150
|
+
end
|
119
151
|
|
120
|
-
|
121
|
-
x = @cache.flush
|
122
|
-
assert_equal('[]', x)
|
123
|
-
end
|
124
|
-
|
125
|
-
def test_stats
|
126
|
-
x = @cache.stats
|
127
|
-
puts x
|
128
|
-
end
|
152
|
+
def test_get_multi
|
129
153
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
@cache.remove("m3") rescue false
|
134
|
-
@cache.remove("m4") rescue false
|
154
|
+
kz = []
|
155
|
+
vz = @cache.get_multi(kz)
|
156
|
+
assert vz.size == 0
|
135
157
|
|
136
|
-
|
137
|
-
|
158
|
+
kz = ["nothere"]
|
159
|
+
vz = @cache.get_multi(kz)
|
160
|
+
assert vz.size == 0
|
138
161
|
|
139
|
-
|
140
|
-
|
162
|
+
@cache.remove("m1") rescue false
|
163
|
+
@cache.remove("m2") rescue false
|
164
|
+
@cache.remove("m3") rescue false
|
165
|
+
@cache.remove("m4") rescue false
|
141
166
|
|
142
|
-
|
143
|
-
|
144
|
-
|
167
|
+
@cache.put("m1", "v1", :ttl=>500, :raw=>false)
|
168
|
+
@cache.put("m2", "v2", :ttl=>500, :raw=>false)
|
169
|
+
@cache.put("m4", MyClass.new("Travis", 10), :ttl=>500, :raw=>false)
|
170
|
+
|
171
|
+
kz = ["m1", "m2", "m3", "m4"]
|
172
|
+
vz = @cache.get_multi(kz)
|
173
|
+
|
174
|
+
assert_equal("v1", vz["m1"]);
|
175
|
+
assert_equal("v2", vz["m2"]);
|
176
|
+
assert_nil(vz["m3"]);
|
177
|
+
assert_equal("Travis", vz["m4"].name)
|
178
|
+
assert_equal(10, vz["m4"].age)
|
145
179
|
|
180
|
+
@cache.put("m3", MyClass.new("Leroy", 3), :ttl=>500, :raw=>false)
|
181
|
+
|
182
|
+
kz = ["m1", "m2", "m3", "m4"]
|
183
|
+
vz = @cache.get_multi(kz)
|
146
184
|
|
147
|
-
|
185
|
+
assert_equal("v1", vz["m1"]);
|
186
|
+
assert_equal("v2", vz["m2"]);
|
187
|
+
assert_equal("Leroy", vz["m3"].name)
|
188
|
+
assert_equal(3, vz["m3"].age)
|
189
|
+
assert_equal("Travis", vz["m4"].name)
|
190
|
+
assert_equal(10, vz["m4"].age)
|
148
191
|
|
149
|
-
def test_get_multi
|
150
192
|
|
151
|
-
|
152
|
-
vz = @cache.get_multi(kz)
|
153
|
-
assert vz.size == 0
|
193
|
+
end
|
154
194
|
|
155
|
-
|
156
|
-
|
157
|
-
|
195
|
+
def test_big
|
196
|
+
s = random_string(100000)
|
197
|
+
@cache.put("s1", s)
|
158
198
|
|
159
|
-
|
160
|
-
@cache.remove("m2") rescue false
|
161
|
-
@cache.remove("m3") rescue false
|
162
|
-
@cache.remove("m4") rescue false
|
199
|
+
s2 = @cache.get("s1")
|
163
200
|
|
164
|
-
|
165
|
-
|
166
|
-
@cache.put("m4", MyClass.new("Travis", 10), 500, false)
|
201
|
+
assert_equal(s, s2)
|
202
|
+
end
|
167
203
|
|
168
|
-
|
169
|
-
|
204
|
+
def random_string(length=10)
|
205
|
+
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'
|
206
|
+
password = ''
|
207
|
+
length.times { password << chars[rand(chars.size)] }
|
208
|
+
password
|
209
|
+
end
|
170
210
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
assert_equal(10, vz["m4"].age)
|
211
|
+
def test_usage
|
212
|
+
usage = @cache.usage
|
213
|
+
assert_kind_of(Numeric, usage)
|
214
|
+
end
|
176
215
|
|
177
|
-
@cache.put("m3", MyClass.new("Leroy", 3), 500, false)
|
178
216
|
|
179
|
-
|
180
|
-
|
217
|
+
def test_set_if_not_found
|
218
|
+
key = "sinf"
|
219
|
+
@cache.delete(key)
|
181
220
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
assert_equal(3, vz["m3"].age)
|
186
|
-
assert_equal("Travis", vz["m4"].name)
|
187
|
-
assert_equal(10, vz["m4"].age)
|
188
|
-
|
189
|
-
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_big
|
193
|
-
s = random_string(1500)
|
194
|
-
@cache.put("s1", s)
|
195
|
-
|
196
|
-
s2 = @cache.get("s1")
|
221
|
+
assert_raise Net::HTTPServerException do
|
222
|
+
@cache.increment(key, 1)
|
223
|
+
end
|
197
224
|
|
198
|
-
|
199
|
-
|
225
|
+
val = 3
|
226
|
+
@cache.increment(key, 1, :set_if_not_found=>val)
|
200
227
|
|
201
|
-
def random_string(length=10)
|
202
|
-
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'
|
203
|
-
password = ''
|
204
|
-
length.times { password << chars[rand(chars.size)] }
|
205
|
-
password
|
206
228
|
end
|
207
229
|
|
208
|
-
def
|
209
|
-
|
210
|
-
|
230
|
+
def test_failing_data
|
231
|
+
fname = "fail_message.txt"
|
232
|
+
return if !File.exists?(fname)
|
233
|
+
file = File.new fname
|
234
|
+
result = file.read # JSON.parse(file.read)
|
235
|
+
file.close
|
236
|
+
puts result.inspect
|
237
|
+
@cache.put("bigolmsg", result)
|
211
238
|
end
|
212
239
|
|
213
240
|
|
214
|
-
|
215
241
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quetzall-cloud_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Travis Reeder
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-09 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|