metry 1.2.0 → 2.0.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/History.txt +6 -0
- data/Manifest.txt +14 -69
- data/TODO +2 -3
- data/cucumber.yml +1 -0
- data/example/example.rb +1 -1
- data/features/psycho/dashboard.feature +17 -0
- data/features/psycho/goals.feature +24 -0
- data/features/psycho/visitor_tracking.feature +32 -0
- data/features/step_definitions/goals.rb +3 -0
- data/features/step_definitions/tracking.rb +1 -1
- data/features/step_definitions/web.rb +14 -2
- data/features/support/env.rb +4 -0
- data/lib/metry.rb +4 -6
- data/lib/metry/experiment.rb +6 -8
- data/lib/metry/psycho.rb +112 -0
- data/lib/metry/psycho/dashboard.erb +14 -0
- data/lib/metry/psycho/layout.erb +8 -0
- data/lib/metry/psycho/new_goal.erb +9 -0
- data/lib/metry/psycho/visitor.erb +7 -0
- data/lib/metry/rack/tracking.rb +17 -13
- data/lib/metry/storage.rb +116 -0
- data/radiant/example/features/metry.feature +8 -8
- data/radiant/example/features/psycho.feature +13 -0
- data/radiant/example/features/step_definitions/experiments.rb +2 -2
- data/radiant/example/features/step_definitions/tracking.rb +1 -1
- data/radiant/example/features/support/env.rb +3 -0
- data/radiant/extension/lib/metry_authenticator.rb +30 -0
- data/radiant/extension/lib/metry_tags.rb +2 -1
- data/radiant/extension/metry_extension.rb +1 -1
- data/test/{test_tokyo.rb → test_storage.rb} +3 -3
- metadata +17 -72
- data/lib/metry/memory.rb +0 -27
- data/lib/metry/tokyo.rb +0 -181
- data/vendor/rufus-tokyo/CHANGELOG.txt +0 -112
- data/vendor/rufus-tokyo/CREDITS.txt +0 -27
- data/vendor/rufus-tokyo/LICENSE.txt +0 -21
- data/vendor/rufus-tokyo/README.txt +0 -310
- data/vendor/rufus-tokyo/Rakefile +0 -118
- data/vendor/rufus-tokyo/TODO.txt +0 -25
- data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
- data/vendor/rufus-tokyo/doc/rdoc-style.css +0 -320
- data/vendor/rufus-tokyo/lib/rufus-edo.rb +0 -3
- data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +0 -3
- data/vendor/rufus-tokyo/lib/rufus/edo.rb +0 -39
- data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +0 -106
- data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +0 -333
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +0 -219
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +0 -159
- data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +0 -36
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +0 -4
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +0 -137
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +0 -141
- data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +0 -567
- data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +0 -58
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +0 -568
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +0 -230
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +0 -753
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +0 -425
- data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +0 -161
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +0 -43
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +0 -65
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +0 -71
- data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +0 -111
- data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +0 -102
- data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +0 -74
- data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +0 -59
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +0 -35
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +0 -146
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +0 -153
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +0 -162
- data/vendor/rufus-tokyo/rufus-tokyo.gemspec +0 -25
- data/vendor/rufus-tokyo/spec/cabinet_spec.rb +0 -472
- data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +0 -82
- data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +0 -447
- data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +0 -299
- data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +0 -462
- data/vendor/rufus-tokyo/spec/edo_table_spec.rb +0 -560
- data/vendor/rufus-tokyo/spec/hmethods_spec.rb +0 -44
- data/vendor/rufus-tokyo/spec/incr.lua +0 -20
- data/vendor/rufus-tokyo/spec/spec.rb +0 -9
- data/vendor/rufus-tokyo/spec/spec_base.rb +0 -23
- data/vendor/rufus-tokyo/spec/start_tyrants.sh +0 -26
- data/vendor/rufus-tokyo/spec/stop_tyrants.sh +0 -9
- data/vendor/rufus-tokyo/spec/table_spec.rb +0 -567
- data/vendor/rufus-tokyo/spec/tyrant_spec.rb +0 -309
- data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +0 -479
- data/vendor/rufus-tokyo/spec/util_list_spec.rb +0 -200
- data/vendor/rufus-tokyo/spec/util_map_spec.rb +0 -132
- data/vendor/rufus-tokyo/tasks/dev.rb +0 -70
- data/vendor/rufus-tokyo/test/bm0.rb +0 -353
- data/vendor/rufus-tokyo/test/bm1_compression.rb +0 -54
- data/vendor/rufus-tokyo/test/con0.rb +0 -30
- data/vendor/rufus-tokyo/test/mem.rb +0 -49
- data/vendor/rufus-tokyo/test/mem1.rb +0 -44
- data/vendor/rufus-tokyo/test/readme0.rb +0 -17
- data/vendor/rufus-tokyo/test/readme1.rb +0 -21
- data/vendor/rufus-tokyo/test/readme2.rb +0 -15
- data/vendor/rufus-tokyo/test/readme3.rb +0 -24
- data/vendor/rufus-tokyo/test/readmes_test.sh +0 -17
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Specifying rufus-tokyo
|
|
4
|
-
#
|
|
5
|
-
# Sun Feb 8 13:13:41 JST 2009
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
require File.dirname(__FILE__) + '/spec_base'
|
|
9
|
-
|
|
10
|
-
require 'rufus/tokyo/tyrant'
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
describe 'a missing Tokyo Rufus::Tokyo::Tyrant' do
|
|
14
|
-
|
|
15
|
-
it 'should raise an error' do
|
|
16
|
-
|
|
17
|
-
should.raise(RuntimeError) {
|
|
18
|
-
Rufus::Tokyo::Tyrant.new('tyrant.example.com', 45000)
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe 'a Tokyo Rufus::Tokyo::Tyrant' do
|
|
24
|
-
|
|
25
|
-
it 'should open and close' do
|
|
26
|
-
|
|
27
|
-
should.not.raise {
|
|
28
|
-
t = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
29
|
-
t.close
|
|
30
|
-
}
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it 'should refuse to connect to a TyrantTable' do
|
|
34
|
-
|
|
35
|
-
lambda {
|
|
36
|
-
t = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45001)
|
|
37
|
-
}.should.raise(ArgumentError)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
describe 'a Tokyo Rufus::Tokyo::Tyrant' do
|
|
42
|
-
|
|
43
|
-
before do
|
|
44
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
45
|
-
@db.clear
|
|
46
|
-
end
|
|
47
|
-
after do
|
|
48
|
-
@db.close
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it 'should respond to stat' do
|
|
52
|
-
|
|
53
|
-
stat = @db.stat
|
|
54
|
-
stat['type'].should.equal('hash')
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it 'should get put value' do
|
|
58
|
-
|
|
59
|
-
@db['alpha'] = 'bravo'
|
|
60
|
-
@db['alpha'].should.equal('bravo')
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it 'should count entries' do
|
|
64
|
-
|
|
65
|
-
@db.size.should.equal(0)
|
|
66
|
-
3.times { |i| @db[i.to_s] = i.to_s }
|
|
67
|
-
@db.size.should.equal(3)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it 'should delete entries' do
|
|
71
|
-
|
|
72
|
-
@db['alpha'] = 'bravo'
|
|
73
|
-
@db.delete('alpha').should.equal('bravo')
|
|
74
|
-
@db.size.should.equal(0)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it 'should iterate entries' do
|
|
78
|
-
|
|
79
|
-
3.times { |i| @db[i.to_s] = i.to_s }
|
|
80
|
-
@db.values.should.equal(%w{ 0 1 2 })
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it 'should accept and restitute \0 strings' do
|
|
84
|
-
s = "toto#{0.chr}nada"
|
|
85
|
-
@db[s] = s
|
|
86
|
-
@db[s].should.equal(s)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it 'should reply to #keys when there are keys containing \0' do
|
|
90
|
-
|
|
91
|
-
s = "toto#{0.chr}nada"
|
|
92
|
-
@db[s] = s
|
|
93
|
-
@db.keys.should.equal([ s ])
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it 'should not respond to defrag' do
|
|
97
|
-
|
|
98
|
-
lambda() { @db.defrag }.should.raise(NoMethodError)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
describe 'Rufus::Tokyo::Tyrant #keys' do
|
|
104
|
-
|
|
105
|
-
before do
|
|
106
|
-
@n = 50
|
|
107
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
108
|
-
@db.clear
|
|
109
|
-
@n.times { |i| @db["person#{i}"] = 'whoever' }
|
|
110
|
-
@n.times { |i| @db["animal#{i}"] = 'whichever' }
|
|
111
|
-
@db["toto#{0.chr}5"] = 'toto'
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
after do
|
|
115
|
-
@db.close
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
it 'should return a Ruby Array by default' do
|
|
119
|
-
|
|
120
|
-
@db.keys.class.should.equal(::Array)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it 'should return a Cabinet List when :native => true' do
|
|
124
|
-
|
|
125
|
-
l = @db.keys(:native => true)
|
|
126
|
-
l.class.should.equal(Rufus::Tokyo::List)
|
|
127
|
-
l.size.should.equal(2 * @n + 1)
|
|
128
|
-
l.free
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it 'should retrieve forward matching keys when :prefix => "prefix-"' do
|
|
132
|
-
|
|
133
|
-
@db.keys(:prefix => 'person').size.should.equal(@n)
|
|
134
|
-
|
|
135
|
-
l = @db.keys(:prefix => 'animal', :native => true)
|
|
136
|
-
l.size.should.equal(@n)
|
|
137
|
-
l.free
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
it 'should retrieve keys that contain \0' do
|
|
141
|
-
|
|
142
|
-
@db.keys.include?("toto#{0.chr}5").should.be.true
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
it 'should retrieve forward matching keys when key contains \0' do
|
|
146
|
-
|
|
147
|
-
@db.keys(:prefix => 'toto').should.equal([ "toto#{0.chr}5" ])
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it 'should return a limited number of keys when :limit is set' do
|
|
151
|
-
|
|
152
|
-
@db.keys(:limit => 20).size.should.equal(20)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it 'should delete_keys_with_prefix' do
|
|
156
|
-
|
|
157
|
-
@db.delete_keys_with_prefix('animal')
|
|
158
|
-
@db.size.should.equal(@n + 1)
|
|
159
|
-
@db.keys(:prefix => 'animal').size.should.equal(0)
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
describe 'Rufus::Tokyo::Tyrant lget/lput/ldelete' do
|
|
164
|
-
|
|
165
|
-
before do
|
|
166
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
167
|
-
@db.clear
|
|
168
|
-
3.times { |i| @db[i.to_s] = "val#{i}" }
|
|
169
|
-
end
|
|
170
|
-
after do
|
|
171
|
-
@db.close
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
it 'should get multiple values' do
|
|
175
|
-
|
|
176
|
-
@db.lget(%w{ 0 1 2 }).should.equal({"0"=>"val0", "1"=>"val1", "2"=>"val2"})
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
it 'should put multiple values' do
|
|
180
|
-
|
|
181
|
-
@db.lput('3' => 'val3', '4' => 'val4')
|
|
182
|
-
@db.lget(%w{ 2 3 }).should.equal({"2"=>"val2", "3"=>"val3"})
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it 'should delete multiple values' do
|
|
186
|
-
|
|
187
|
-
@db.ldelete(%w{ 2 3 })
|
|
188
|
-
@db.lget(%w{ 0 1 2 }).should.equal({"0"=>"val0", "1"=>"val1"})
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
describe 'Rufus::Tokyo::Tyrant#add{int|double}' do
|
|
193
|
-
|
|
194
|
-
before do
|
|
195
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
196
|
-
@db.clear
|
|
197
|
-
end
|
|
198
|
-
after do
|
|
199
|
-
@db.close
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
it 'should increment (int)' do
|
|
203
|
-
|
|
204
|
-
@db.addint('counter', 1).should.equal(1)
|
|
205
|
-
@db.incr('counter', 1).should.equal(2)
|
|
206
|
-
@db.addint('counter', 2).should.equal(4)
|
|
207
|
-
@db.incr('counter').should.equal(5)
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
it 'should fail gracefully if counter has already a [string] value (int)' do
|
|
211
|
-
|
|
212
|
-
@db['counter'] = 'a'
|
|
213
|
-
lambda { @db.addint('counter', 1) }.should.raise(Rufus::Tokyo::TokyoError)
|
|
214
|
-
@db['counter'].should.equal('a')
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it 'should increment (double)' do
|
|
218
|
-
|
|
219
|
-
@db.adddouble('counter', 1.0).should.equal(1.0)
|
|
220
|
-
@db.incr('counter', 1.5).should.equal(2.5)
|
|
221
|
-
@db.adddouble('counter', 2.2).should.equal(4.7)
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
it 'should fail gracefully if counter has already a [string] value (double)' do
|
|
225
|
-
|
|
226
|
-
@db['counter'] = 'a'
|
|
227
|
-
lambda {
|
|
228
|
-
@db.adddouble('counter', 1.0)
|
|
229
|
-
}.should.raise(Rufus::Tokyo::TokyoError)
|
|
230
|
-
@db['counter'].should.equal('a')
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
describe 'Rufus::Tokyo::Tyrant (lua extensions)' do
|
|
235
|
-
|
|
236
|
-
before do
|
|
237
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
238
|
-
@db.clear
|
|
239
|
-
end
|
|
240
|
-
after do
|
|
241
|
-
@db.close
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
it 'should call lua extensions' do
|
|
245
|
-
|
|
246
|
-
@db['toto'] = '0'
|
|
247
|
-
3.times { @db.ext(:incr, 'toto', '1') }
|
|
248
|
-
@db.ext('incr', 'toto', 2) # lax
|
|
249
|
-
|
|
250
|
-
@db['toto'].should.equal('5')
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it 'should return nil when function is missing' do
|
|
254
|
-
|
|
255
|
-
@db.ext(:missing, 'nada', 'forever').should.equal(nil)
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
describe 'Rufus::Tokyo::Tyrant#putkeep' do
|
|
260
|
-
|
|
261
|
-
before do
|
|
262
|
-
@db = Rufus::Tokyo::Tyrant.new('127.0.0.1', 45000)
|
|
263
|
-
@db.clear
|
|
264
|
-
end
|
|
265
|
-
after do
|
|
266
|
-
@db.close
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it 'should accept values' do
|
|
270
|
-
|
|
271
|
-
@db.putkeep('pillow', 'Shonagon')
|
|
272
|
-
@db.size.should.equal(1)
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
it 'should restitute values' do
|
|
276
|
-
|
|
277
|
-
@db.putkeep('pillow', 'Shonagon')
|
|
278
|
-
@db['pillow'].should.equal('Shonagon')
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it 'should not overwrite values if already set' do
|
|
282
|
-
|
|
283
|
-
@db['pillow'] = 'Shonagon'
|
|
284
|
-
@db['pillow'].should.equal('Shonagon')
|
|
285
|
-
|
|
286
|
-
@db.putkeep('pillow', 'Ruby')
|
|
287
|
-
@db['pillow'].should.equal('Shonagon')
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
it 'should return true if not yet set' do
|
|
291
|
-
|
|
292
|
-
@db.putkeep('pillow', 'Shonagon').should.equal(true)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
it 'should return false if already set' do
|
|
296
|
-
|
|
297
|
-
@db['pillow'] = 'Shonagon'
|
|
298
|
-
@db.putkeep('pillow', 'Ruby').should.equal(false)
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
it 'should accept binary data \0' do
|
|
302
|
-
|
|
303
|
-
s = "Sei#{0.chr}Shonagon"
|
|
304
|
-
|
|
305
|
-
@db.putkeep(s, s).should.be.true
|
|
306
|
-
@db[s].should.equal(s)
|
|
307
|
-
end
|
|
308
|
-
end
|
|
309
|
-
|
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Specifying rufus-tokyo
|
|
4
|
-
#
|
|
5
|
-
# Sun Feb 8 22:55:11 JST 2009
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
require File.dirname(__FILE__) + '/spec_base'
|
|
9
|
-
|
|
10
|
-
require 'rufus/tokyo/tyrant'
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
describe 'Rufus::Tokyo::TyrantTable' do
|
|
14
|
-
|
|
15
|
-
it 'should refuse to connect to a plain Tyrant' do
|
|
16
|
-
|
|
17
|
-
lambda {
|
|
18
|
-
t = Rufus::Tokyo::TyrantTable.new('127.0.0.1', 45000)
|
|
19
|
-
}.should.raise(ArgumentError)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
describe 'Rufus::Tokyo::TyrantTable' do
|
|
25
|
-
|
|
26
|
-
before do
|
|
27
|
-
@t = Rufus::Tokyo::TyrantTable.new('127.0.0.1', 45001)
|
|
28
|
-
#puts @t.stat.inject('') { |s, (k, v)| s << "#{k} => #{v}\n" }
|
|
29
|
-
@t.clear
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
after do
|
|
33
|
-
@t.close
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it 'should respond to stat' do
|
|
37
|
-
|
|
38
|
-
@t.stat['type'].should.equal('table')
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it 'should generate unique ids' do
|
|
42
|
-
|
|
43
|
-
@t.genuid.should.satisfy { |i| i > 0 }
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it 'should clear db' do
|
|
47
|
-
|
|
48
|
-
@t.clear
|
|
49
|
-
@t.size.should.be.zero
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'should return nil for missing keys' do
|
|
53
|
-
|
|
54
|
-
@t['missing'].should.be.nil
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it 'should accept map input' do
|
|
58
|
-
|
|
59
|
-
@t['pk0'] = value = { 'name' => 'fred', 'age' => '22' }
|
|
60
|
-
@t['pk0'].should.equal(value)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it 'should raise an ArgumentError on non map or hash input' do
|
|
64
|
-
|
|
65
|
-
lambda {
|
|
66
|
-
@t['pk0'] = 'bad thing here'
|
|
67
|
-
}.should.raise(ArgumentError)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
unless defined?(JRUBY_VERSION)
|
|
71
|
-
it 'should raise an ArgumentError on non-string column name' do
|
|
72
|
-
|
|
73
|
-
lambda {
|
|
74
|
-
@t['pk0'] = [ 1, 2 ]
|
|
75
|
-
}.should.raise(ArgumentError)
|
|
76
|
-
lambda {
|
|
77
|
-
@t['pk0'] = { 1 => 2 }
|
|
78
|
-
}.should.raise(ArgumentError)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it 'should raise an ArgumentError on non-string column value' do
|
|
82
|
-
|
|
83
|
-
lambda {
|
|
84
|
-
@t['pk0'] = { 'a' => 2 }
|
|
85
|
-
}.should.raise(ArgumentError)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it 'should return map values' do
|
|
90
|
-
|
|
91
|
-
@t['pk0'] = { 'name' => 'toto', 'age' => '30' }
|
|
92
|
-
@t['pk0'].should.equal({ 'name' => 'toto', 'age' => '30' })
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it 'should delete records' do
|
|
96
|
-
|
|
97
|
-
@t['pk0'] = { 'name' => 'toto', 'age' => '30' }
|
|
98
|
-
@t.delete('pk0')
|
|
99
|
-
@t['pk0'].should.be.nil
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it 'should return deleted value' do
|
|
103
|
-
|
|
104
|
-
@t['pk0'] = old = { 'name' => 'toto', 'age' => '30' }
|
|
105
|
-
@t.delete('pk0').should.equal(old)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it 'should change store size after deleting' do
|
|
109
|
-
|
|
110
|
-
@t['pk0'] = { 'name' => 'toto', 'age' => '30' }
|
|
111
|
-
@t.delete('pk0')
|
|
112
|
-
@t.size.should.be.zero
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it 'should not support transactions' do
|
|
116
|
-
lambda {
|
|
117
|
-
@t.transaction {}
|
|
118
|
-
}.should.raise(NoMethodError)
|
|
119
|
-
lambda {
|
|
120
|
-
@t.abort
|
|
121
|
-
}.should.raise(NoMethodError)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it 'should store binary data \0' do
|
|
125
|
-
s = "toto#{0.chr}nada"
|
|
126
|
-
@t[s] = { s => s }
|
|
127
|
-
@t[s].should.equal({ s => s })
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
describe 'Rufus::Tokyo::Table #keys' do
|
|
134
|
-
|
|
135
|
-
before do
|
|
136
|
-
@n = 50
|
|
137
|
-
@tab = Rufus::Tokyo::TyrantTable.new('127.0.0.1', 45001)
|
|
138
|
-
@tab.clear
|
|
139
|
-
@n.times { |i| @tab["person#{i}"] = { 'name' => 'whoever' } }
|
|
140
|
-
@n.times { |i| @tab["animal#{i}"] = { 'name' => 'whichever' } }
|
|
141
|
-
@tab["toto#{0.chr}5"] = { 'name' => 'toto' }
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
after do
|
|
145
|
-
@tab.close
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
it 'should return a Ruby Array by default' do
|
|
149
|
-
|
|
150
|
-
@tab.keys.class.should.equal(::Array)
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it 'should return a Cabinet List when :native => true' do
|
|
154
|
-
|
|
155
|
-
l = @tab.keys(:native => true)
|
|
156
|
-
l.class.should.equal(Rufus::Tokyo::List)
|
|
157
|
-
l.size.should.equal(2 * @n + 1)
|
|
158
|
-
l.free
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it 'should retrieve forward matching keys when :prefix => "prefix-"' do
|
|
162
|
-
|
|
163
|
-
@tab.keys(:prefix => 'person').size.should.equal(@n)
|
|
164
|
-
|
|
165
|
-
l = @tab.keys(:prefix => 'animal', :native => true)
|
|
166
|
-
l.size.should.equal(@n)
|
|
167
|
-
l.free
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
it 'should retrieve keys that contain \0' do
|
|
171
|
-
|
|
172
|
-
@tab.keys.include?("toto#{0.chr}5").should.be.true
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
it 'should retrieve forward matching keys when key contains \0' do
|
|
176
|
-
|
|
177
|
-
@tab.keys(:prefix => 'toto').should.equal([ "toto#{0.chr}5" ])
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
it 'should return a limited number of keys when :limit is set' do
|
|
181
|
-
|
|
182
|
-
@tab.keys(:limit => 20).size.should.equal(20)
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it 'should delete_keys_with_prefix' do
|
|
186
|
-
|
|
187
|
-
@tab.delete_keys_with_prefix('animal')
|
|
188
|
-
@tab.size.should.equal(@n + 1)
|
|
189
|
-
@tab.keys(:prefix => 'animal').size.should.equal(0)
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
def prepare_table_with_data (port)
|
|
195
|
-
t = Rufus::Tokyo::TyrantTable.new('127.0.0.1', port)
|
|
196
|
-
t.clear
|
|
197
|
-
t['pk0'] = { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' }
|
|
198
|
-
t['pk1'] = { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }
|
|
199
|
-
t['pk2'] = { 'name' => 'jack', 'age' => '44', 'lang' => 'en' }
|
|
200
|
-
t['pk3'] = { 'name' => 'jake', 'age' => '45', 'lang' => 'en,li' }
|
|
201
|
-
t
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
describe 'a Tokyo Tyrant table' do
|
|
205
|
-
|
|
206
|
-
before do
|
|
207
|
-
@t = prepare_table_with_data(45001)
|
|
208
|
-
end
|
|
209
|
-
after do
|
|
210
|
-
@t.close
|
|
211
|
-
# TODO : well there are trailing indexes now... :(
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
it 'should accept lexical indexes' do
|
|
215
|
-
@t.set_index('name', :lexical).should.equal(true)
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
it 'should accept decimal indexes' do
|
|
219
|
-
@t.set_index('age', :decimal).should.equal(true)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
it 'should accept removal of indexes' do
|
|
223
|
-
@t.set_index('age', :decimal)
|
|
224
|
-
@t.set_index('age', :remove).should.equal(true)
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it 'should accept indexes on the primary key (well...)' do
|
|
228
|
-
@t.set_index(:pk, :lexical).should.equal(true)
|
|
229
|
-
@t.set_index('', :lexical).should.equal(true)
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
describe 'Rufus::Tokyo::TyrantTable#lget' do
|
|
235
|
-
|
|
236
|
-
before do
|
|
237
|
-
@t = prepare_table_with_data(45001)
|
|
238
|
-
end
|
|
239
|
-
after do
|
|
240
|
-
@t.close
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
it 'should return an empty hash for missing keys' do
|
|
244
|
-
@t.lget(%w{ pk97 pk98 }).should.equal({})
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
it 'should return multiple records' do
|
|
248
|
-
@t.lget(%w{ pk0 pk1 }).should.equal({
|
|
249
|
-
'pk0' => { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' },
|
|
250
|
-
'pk1' => { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }
|
|
251
|
-
})
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
describe 'a Tokyo Tyrant table, like a Ruby Hash,' do
|
|
257
|
-
|
|
258
|
-
before do
|
|
259
|
-
@t = prepare_table_with_data(45001)
|
|
260
|
-
end
|
|
261
|
-
after do
|
|
262
|
-
@t.close
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
it 'should respond to #keys' do
|
|
266
|
-
|
|
267
|
-
@t.keys.should.equal([ 'pk0', 'pk1', 'pk2', 'pk3' ])
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
it 'should respond to #values' do
|
|
271
|
-
|
|
272
|
-
@t.values.should.equal([
|
|
273
|
-
{ 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' },
|
|
274
|
-
{ 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' },
|
|
275
|
-
{ 'name' => 'jack', 'age' => '44', 'lang' => 'en' },
|
|
276
|
-
{ 'name' => 'jake', 'age' => '45', 'lang' => 'en,li' }])
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
it 'should benefit from Enumerable' do
|
|
280
|
-
|
|
281
|
-
@t.find { |k, v|
|
|
282
|
-
v['name'] == 'jeff'
|
|
283
|
-
}.should.equal([
|
|
284
|
-
'pk1', { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }])
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
describe 'queries on Tokyo Tyrant tables' do
|
|
290
|
-
|
|
291
|
-
before do
|
|
292
|
-
@t = prepare_table_with_data(45001)
|
|
293
|
-
end
|
|
294
|
-
after do
|
|
295
|
-
@t.close
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
it 'can be executed' do
|
|
299
|
-
|
|
300
|
-
@t.query { |q|
|
|
301
|
-
q.add 'lang', :includes, 'en'
|
|
302
|
-
}.size.should.equal(4)
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
it 'can be prepared' do
|
|
306
|
-
|
|
307
|
-
@t.prepare_query { |q|
|
|
308
|
-
q.add 'lang', :includes, 'en'
|
|
309
|
-
}.should.satisfy { |q| q.class == Rufus::Tokyo::TableQuery }
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
it 'can be counted' do
|
|
313
|
-
|
|
314
|
-
#@t.prepare_query { |q|
|
|
315
|
-
# q.add 'lang', :includes, 'en'
|
|
316
|
-
#}.count.should.equal(4)
|
|
317
|
-
|
|
318
|
-
q = @t.prepare_query { |q|
|
|
319
|
-
q.add 'lang', :includes, 'en'
|
|
320
|
-
}
|
|
321
|
-
q.run
|
|
322
|
-
q.count.should.equal(4)
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
it 'can be limited' do
|
|
326
|
-
|
|
327
|
-
@t.query { |q|
|
|
328
|
-
q.add 'lang', :includes, 'en'
|
|
329
|
-
q.limit 2
|
|
330
|
-
}.size.should.equal(2)
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
it 'can leverage regex matches' do
|
|
334
|
-
|
|
335
|
-
@t.query { |q|
|
|
336
|
-
q.add 'name', :matches, '^j.+k'
|
|
337
|
-
}.to_a.should.equal([
|
|
338
|
-
{:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
|
|
339
|
-
{:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
it 'can leverage numerical comparison (gt)' do
|
|
343
|
-
|
|
344
|
-
@t.query { |q|
|
|
345
|
-
q.add 'age', :gt, '40'
|
|
346
|
-
q.pk_only
|
|
347
|
-
}.to_a.should.equal([ 'pk2', 'pk3' ])
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
it 'can have negated conditions' do
|
|
351
|
-
|
|
352
|
-
@t.query { |q|
|
|
353
|
-
q.add 'age', :gt, '40', false
|
|
354
|
-
q.pk_only
|
|
355
|
-
}.to_a.should.equal([ 'pk0', 'pk1' ])
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
if Rufus::Tokyo::TyrantLib.respond_to?(:qry_setlimit)
|
|
360
|
-
|
|
361
|
-
it 'can be limited and have an offset' do
|
|
362
|
-
|
|
363
|
-
@t.query { |q|
|
|
364
|
-
q.add 'lang', :includes, 'en'
|
|
365
|
-
q.order_by 'name', :desc
|
|
366
|
-
q.limit 2, 0
|
|
367
|
-
}.collect { |e| e['name'] }.should.equal(%w{ jim jeff })
|
|
368
|
-
@t.query { |q|
|
|
369
|
-
q.add 'lang', :includes, 'en'
|
|
370
|
-
q.order_by 'name', :desc
|
|
371
|
-
q.limit 2, 2
|
|
372
|
-
}.collect { |e| e['name'] }.should.equal(%w{ jake jack })
|
|
373
|
-
end
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
it 'can be deleted (searchout : query#delete)' do
|
|
377
|
-
|
|
378
|
-
@t.prepare_query { |q|
|
|
379
|
-
q.add 'lang', :includes, 'es'
|
|
380
|
-
}.delete
|
|
381
|
-
|
|
382
|
-
@t.size.should.equal(3)
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
it 'can be deleted immediately (searchout table#query_delete)' do
|
|
386
|
-
|
|
387
|
-
@t.query_delete { |q|
|
|
388
|
-
q.add 'lang', :includes, 'es'
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
@t.size.should.equal(3)
|
|
392
|
-
end
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
describe 'Tokyo Tyrant and TableQuery#process' do
|
|
396
|
-
|
|
397
|
-
before do
|
|
398
|
-
@t = prepare_table_with_data(45001)
|
|
399
|
-
end
|
|
400
|
-
after do
|
|
401
|
-
@t.close
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
it 'should not work' do
|
|
405
|
-
|
|
406
|
-
lambda {
|
|
407
|
-
@t.prepare_query { |q|
|
|
408
|
-
q.add 'lang', :includes, 'en'
|
|
409
|
-
}.process { |k, v|
|
|
410
|
-
}.free
|
|
411
|
-
}.should.raise(NoMethodError)
|
|
412
|
-
end
|
|
413
|
-
end
|
|
414
|
-
|
|
415
|
-
describe 'results from Tokyo Tyrant table queries' do
|
|
416
|
-
|
|
417
|
-
before do
|
|
418
|
-
@t = prepare_table_with_data(45001)
|
|
419
|
-
end
|
|
420
|
-
|
|
421
|
-
after do
|
|
422
|
-
@t.close
|
|
423
|
-
end
|
|
424
|
-
|
|
425
|
-
it 'can come ordered (strdesc)' do
|
|
426
|
-
|
|
427
|
-
@t.query { |q|
|
|
428
|
-
q.add 'lang', :includes, 'en'
|
|
429
|
-
q.order_by 'name', :desc
|
|
430
|
-
q.limit 2
|
|
431
|
-
}.to_a.should.equal([
|
|
432
|
-
{:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"},
|
|
433
|
-
{:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"}])
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
it 'can come ordered (strasc)' do
|
|
437
|
-
|
|
438
|
-
@t.query { |q|
|
|
439
|
-
q.add 'lang', :includes, 'en'
|
|
440
|
-
q.order_by 'name', :asc
|
|
441
|
-
}.to_a.should.equal([
|
|
442
|
-
{:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
|
|
443
|
-
{:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"},
|
|
444
|
-
{:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"},
|
|
445
|
-
{:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"}])
|
|
446
|
-
end
|
|
447
|
-
|
|
448
|
-
it 'can come ordered (numasc)' do
|
|
449
|
-
|
|
450
|
-
@t.query { |q|
|
|
451
|
-
q.add 'lang', :includes, 'en'
|
|
452
|
-
q.order_by 'age', :numasc
|
|
453
|
-
}.to_a.should.equal([
|
|
454
|
-
{:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"},
|
|
455
|
-
{:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"},
|
|
456
|
-
{:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
|
|
457
|
-
{:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
it 'can come without the primary keys (no_pk)' do
|
|
461
|
-
|
|
462
|
-
@t.query { |q|
|
|
463
|
-
q.add 'name', :matches, '^j.+k'
|
|
464
|
-
q.no_pk
|
|
465
|
-
}.to_a.should.equal([
|
|
466
|
-
{"name"=>"jack", "lang"=>"en", "age"=>"44"},
|
|
467
|
-
{"name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
it 'can consist only of the primary keys (pk_only)' do
|
|
471
|
-
|
|
472
|
-
@t.query { |q|
|
|
473
|
-
q.add 'name', :matches, '^j.+k'
|
|
474
|
-
q.pk_only
|
|
475
|
-
}.to_a.should.equal(["pk2", "pk3"])
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
end
|
|
479
|
-
|