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