metry 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +14 -69
  3. data/TODO +2 -3
  4. data/cucumber.yml +1 -0
  5. data/example/example.rb +1 -1
  6. data/features/psycho/dashboard.feature +17 -0
  7. data/features/psycho/goals.feature +24 -0
  8. data/features/psycho/visitor_tracking.feature +32 -0
  9. data/features/step_definitions/goals.rb +3 -0
  10. data/features/step_definitions/tracking.rb +1 -1
  11. data/features/step_definitions/web.rb +14 -2
  12. data/features/support/env.rb +4 -0
  13. data/lib/metry.rb +4 -6
  14. data/lib/metry/experiment.rb +6 -8
  15. data/lib/metry/psycho.rb +112 -0
  16. data/lib/metry/psycho/dashboard.erb +14 -0
  17. data/lib/metry/psycho/layout.erb +8 -0
  18. data/lib/metry/psycho/new_goal.erb +9 -0
  19. data/lib/metry/psycho/visitor.erb +7 -0
  20. data/lib/metry/rack/tracking.rb +17 -13
  21. data/lib/metry/storage.rb +116 -0
  22. data/radiant/example/features/metry.feature +8 -8
  23. data/radiant/example/features/psycho.feature +13 -0
  24. data/radiant/example/features/step_definitions/experiments.rb +2 -2
  25. data/radiant/example/features/step_definitions/tracking.rb +1 -1
  26. data/radiant/example/features/support/env.rb +3 -0
  27. data/radiant/extension/lib/metry_authenticator.rb +30 -0
  28. data/radiant/extension/lib/metry_tags.rb +2 -1
  29. data/radiant/extension/metry_extension.rb +1 -1
  30. data/test/{test_tokyo.rb → test_storage.rb} +3 -3
  31. metadata +17 -72
  32. data/lib/metry/memory.rb +0 -27
  33. data/lib/metry/tokyo.rb +0 -181
  34. data/vendor/rufus-tokyo/CHANGELOG.txt +0 -112
  35. data/vendor/rufus-tokyo/CREDITS.txt +0 -27
  36. data/vendor/rufus-tokyo/LICENSE.txt +0 -21
  37. data/vendor/rufus-tokyo/README.txt +0 -310
  38. data/vendor/rufus-tokyo/Rakefile +0 -118
  39. data/vendor/rufus-tokyo/TODO.txt +0 -25
  40. data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
  41. data/vendor/rufus-tokyo/doc/rdoc-style.css +0 -320
  42. data/vendor/rufus-tokyo/lib/rufus-edo.rb +0 -3
  43. data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +0 -3
  44. data/vendor/rufus-tokyo/lib/rufus/edo.rb +0 -39
  45. data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +0 -106
  46. data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +0 -333
  47. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +0 -219
  48. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +0 -159
  49. data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +0 -36
  50. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +0 -4
  51. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +0 -137
  52. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +0 -141
  53. data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +0 -567
  54. data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +0 -58
  55. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +0 -568
  56. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +0 -230
  57. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +0 -753
  58. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +0 -425
  59. data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +0 -161
  60. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +0 -43
  61. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +0 -65
  62. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +0 -71
  63. data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +0 -111
  64. data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +0 -102
  65. data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +0 -74
  66. data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +0 -59
  67. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +0 -35
  68. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +0 -146
  69. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +0 -153
  70. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +0 -162
  71. data/vendor/rufus-tokyo/rufus-tokyo.gemspec +0 -25
  72. data/vendor/rufus-tokyo/spec/cabinet_spec.rb +0 -472
  73. data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +0 -82
  74. data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +0 -447
  75. data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +0 -299
  76. data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +0 -462
  77. data/vendor/rufus-tokyo/spec/edo_table_spec.rb +0 -560
  78. data/vendor/rufus-tokyo/spec/hmethods_spec.rb +0 -44
  79. data/vendor/rufus-tokyo/spec/incr.lua +0 -20
  80. data/vendor/rufus-tokyo/spec/spec.rb +0 -9
  81. data/vendor/rufus-tokyo/spec/spec_base.rb +0 -23
  82. data/vendor/rufus-tokyo/spec/start_tyrants.sh +0 -26
  83. data/vendor/rufus-tokyo/spec/stop_tyrants.sh +0 -9
  84. data/vendor/rufus-tokyo/spec/table_spec.rb +0 -567
  85. data/vendor/rufus-tokyo/spec/tyrant_spec.rb +0 -309
  86. data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +0 -479
  87. data/vendor/rufus-tokyo/spec/util_list_spec.rb +0 -200
  88. data/vendor/rufus-tokyo/spec/util_map_spec.rb +0 -132
  89. data/vendor/rufus-tokyo/tasks/dev.rb +0 -70
  90. data/vendor/rufus-tokyo/test/bm0.rb +0 -353
  91. data/vendor/rufus-tokyo/test/bm1_compression.rb +0 -54
  92. data/vendor/rufus-tokyo/test/con0.rb +0 -30
  93. data/vendor/rufus-tokyo/test/mem.rb +0 -49
  94. data/vendor/rufus-tokyo/test/mem1.rb +0 -44
  95. data/vendor/rufus-tokyo/test/readme0.rb +0 -17
  96. data/vendor/rufus-tokyo/test/readme1.rb +0 -21
  97. data/vendor/rufus-tokyo/test/readme2.rb +0 -15
  98. data/vendor/rufus-tokyo/test/readme3.rb +0 -24
  99. 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
-