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,425 +0,0 @@
1
- #--
2
- # Copyright (c) 2009, John Mettraux, jmettraux@gmail.com
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining a copy
5
- # of this software and associated documentation files (the "Software"), to deal
6
- # in the Software without restriction, including without limitation the rights
7
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- # copies of the Software, and to permit persons to whom the Software is
9
- # furnished to do so, subject to the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be included in
12
- # all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
- # THE SOFTWARE.
21
- #
22
- # Made in Japan.
23
- #++
24
-
25
-
26
- require 'rufus/tokyo/hmethods'
27
-
28
-
29
- module Rufus::Tokyo
30
-
31
- #
32
- # :nodoc:
33
- #
34
- module ListMapMixin
35
-
36
- # A shortcut
37
- #
38
- def clib
39
-
40
- CabinetLib
41
- end
42
-
43
- # Returns the underlying 'native' (FFI) memory pointer
44
- #
45
- def pointer
46
-
47
- @pointer
48
- end
49
-
50
- def pointer_or_raise
51
-
52
- @pointer || raise("#{self.class} got freed, cannot use anymore")
53
- end
54
-
55
- def outlen_op (method, *args)
56
-
57
- args.unshift(pointer_or_raise)
58
-
59
- outlen = FFI::MemoryPointer.new(:int)
60
- args << outlen
61
-
62
- out = clib.send(method, *args)
63
-
64
- return nil if out.address == 0
65
-
66
- return out.get_bytes(0, outlen.get_int(0))
67
-
68
- ensure
69
-
70
- outlen.free
71
- end
72
- end
73
-
74
- #
75
- # A Tokyo Cabinet in-memory (tcutil.h) map
76
- #
77
- # http://tokyocabinet.sourceforge.net/spex-en.html#tcutilapi
78
- #
79
- class Map
80
-
81
- include HashMethods
82
- include ListMapMixin
83
-
84
- # Creates an empty instance of a Tokyo Cabinet in-memory map
85
- #
86
- # (It's OK to pass the pointer of a C map directly, this is in fact
87
- # used in rufus/tokyo/table when retrieving entries)
88
- #
89
- def initialize (pointer=nil)
90
-
91
- @pointer = pointer || clib.tcmapnew
92
- end
93
-
94
- # Inserts key/value pair
95
- #
96
- def []= (k, v)
97
-
98
- clib.tcmapput(pointer, k, Rufus::Tokyo::blen(k), v, Rufus::Tokyo::blen(v))
99
-
100
- v
101
- end
102
-
103
- # Deletes an entry
104
- #
105
- def delete (k)
106
-
107
- v = self[k]
108
- return nil unless v
109
-
110
- (clib.tcmapout(pointer_or_raise, k, Rufus::Tokyo::blen(k)) == 1) ||
111
- raise("failed to remove key '#{k}'")
112
-
113
- v
114
- end
115
-
116
- # Empties the map
117
- #
118
- def clear
119
-
120
- clib.tcmapclear(pointer_or_raise)
121
- end
122
-
123
- # (the actual #[] method is provided by HashMethods)
124
- #
125
- def get (k)
126
-
127
- outlen_op(:tcmapget, k, Rufus::Tokyo.blen(k))
128
- end
129
- protected :get
130
-
131
- # Returns an array of all the keys in the map
132
- #
133
- def keys
134
-
135
- clib.tcmapiterinit(pointer_or_raise)
136
- a = []
137
-
138
- klen = FFI::MemoryPointer.new(:int)
139
-
140
- loop do
141
- k = clib.tcmapiternext(@pointer, klen)
142
- break if k.address == 0
143
- a << k.get_bytes(0, klen.get_int(0))
144
- end
145
-
146
- return a
147
-
148
- ensure
149
-
150
- klen.free
151
- end
152
-
153
- # Returns the count of entries in the map
154
- #
155
- def size
156
-
157
- clib.tcmaprnum(pointer_or_raise)
158
- end
159
-
160
- alias :length :size
161
-
162
- # Frees the map (nukes it from memory)
163
- #
164
- def free
165
-
166
- clib.tcmapdel(pointer_or_raise)
167
- @pointer = nil
168
- end
169
-
170
- alias :destroy :free
171
- alias :close :free
172
-
173
- # Turns a given Tokyo map structure into a Ruby Hash. By default
174
- # (free = true) will dispose of the map before replying with the Ruby
175
- # Hash.
176
- #
177
- def self.to_h (map_pointer, free=true)
178
-
179
- m = self.new(map_pointer)
180
- h = m.to_h
181
- m.free if free
182
-
183
- h
184
- end
185
-
186
- # Turns a Ruby hash into a Tokyo Cabinet Map and returns it
187
- # (don't forget to free the map when you're done with it !)
188
- #
189
- def self.from_h (h)
190
-
191
- h.inject(Map.new) { |m, (k, v)| m[k] = v; m }
192
- end
193
-
194
- # Behaves much like Hash#[] but outputs a Rufus::Tokyo::Map
195
- # (don't forget to free the map when you're done with it !)
196
- #
197
- def self.[] (*h_or_a)
198
-
199
- if h_or_a.is_a?(Array) && h_or_a.size == 1 && h_or_a.first.is_a?(Array)
200
- h_or_a = h_or_a.first
201
- end
202
-
203
- from_h(::Hash[*h_or_a])
204
- end
205
- end
206
-
207
- #
208
- # A Tokyo Cabinet in-memory (tcutil.h) list
209
- #
210
- # http://tokyocabinet.sourceforge.net/spex-en.html#tcutilapi
211
- #
212
- class List
213
-
214
- include Enumerable
215
- include ListMapMixin
216
-
217
- # Creates a new Tokyo Cabinet list.
218
- #
219
- # (by passing a list pointer, one can wrap an existing list pointer
220
- # into a handy instance of this class)
221
- #
222
- def initialize (list_pointer=nil)
223
-
224
- if list_pointer.is_a?(FFI::Pointer)
225
- @pointer = list_pointer
226
- else
227
- @pointer = clib.tclistnew
228
- list_pointer.each { |e| self << e } if list_pointer
229
- end
230
- end
231
-
232
- # Inserts an element in the list (note that the lib will raise an
233
- # ArgumentError if s is not a String)
234
- #
235
- def << (s)
236
-
237
- clib.tclistpush(@pointer, s, Rufus::Tokyo.blen(s))
238
-
239
- self
240
- end
241
-
242
- # Pushes an argument or a list of arguments to this list
243
- #
244
- def push (*args)
245
-
246
- args.each { |a| self << a }
247
-
248
- self
249
- end
250
-
251
- # Pops the last element in the list
252
- #
253
- def pop
254
-
255
- outlen_op(:tclistpop)
256
- end
257
-
258
- # Removes and returns the first element in a list
259
- #
260
- def shift
261
-
262
- #clib.tclistshift2(@pointer) rescue nil
263
- outlen_op(:tclistshift)
264
- end
265
-
266
- # Inserts a string at the beginning of the list
267
- #
268
- def unshift (s)
269
-
270
- clib.tclistunshift(@pointer, s, Rufus::Tokyo.blen(s))
271
-
272
- self
273
- end
274
-
275
- # The put operation.
276
- #
277
- def []= (a, b, c=nil)
278
-
279
- i, s = c.nil? ? [ a, b ] : [ [a, b], c ]
280
-
281
- range = if i.is_a?(Range)
282
- i
283
- elsif i.is_a?(Array)
284
- start, count = i
285
- (start..start + count - 1)
286
- else
287
- [ i ]
288
- end
289
-
290
- range = norm(range)
291
-
292
- values = s.is_a?(Array) ? s : [ s ]
293
- # not "values = Array(s)"
294
-
295
- range.each_with_index do |offset, index|
296
- val = values[index]
297
- if val
298
- clib.tclistover(@pointer, offset, val, Rufus::Tokyo.blen(val))
299
- else
300
- outlen_op(:tclistremove, values.size)
301
- end
302
- end
303
-
304
- self
305
- end
306
-
307
- # Removes the value at a given index and returns the value
308
- # (returns nil if no value available)
309
- #
310
- def delete_at (i)
311
-
312
- outlen_op(:tclistremove, i)
313
- end
314
-
315
- def delete_if
316
- # TODO
317
- end
318
-
319
- def slice
320
- # TODO
321
- end
322
- def slice!
323
- # TODO
324
- end
325
-
326
- # Returns the size of this Tokyo Cabinet list
327
- #
328
- def size
329
-
330
- clib.tclistnum(@pointer)
331
- end
332
-
333
- alias :length :size
334
-
335
- # The equivalent of Ruby Array#[]
336
- #
337
- def [] (i, count=nil)
338
-
339
- return nil if (count != nil) && count < 1
340
-
341
- len = self.size
342
-
343
- range = if count.nil?
344
- i.is_a?(Range) ? i : [i]
345
- else
346
- (i..i + count - 1)
347
- end
348
-
349
- r = norm(range).collect { |i| outlen_op(:tclistval, i) }
350
-
351
- range.first == range.last ? r.first : r
352
- end
353
-
354
- # Empties the list.
355
- #
356
- def clear
357
-
358
- clib.tclistclear(@pointer)
359
- end
360
-
361
- # The classical each.
362
- #
363
- def each
364
-
365
- (0..self.size - 1).each { |i| yield self[i] }
366
- end
367
-
368
- # Turns this Tokyo Cabinet list into a Ruby array
369
- #
370
- def to_a
371
-
372
- self.collect { |e| e }
373
- end
374
-
375
- # Closes (frees) this list
376
- #
377
- def free
378
-
379
- self.class.free(@pointer)
380
- @pointer = nil
381
- end
382
-
383
- alias :close :free
384
- alias :destroy :free
385
-
386
- # Frees (closes) the given 'native' (FFI) list (memory pointer)
387
- #
388
- def self.free (list_pointer)
389
-
390
- CabinetLib.tclistdel(list_pointer)
391
- end
392
-
393
- # Closes (frees memory from it) this list and returns the ruby version
394
- # of it
395
- #
396
- def release
397
-
398
- a = self.to_a
399
- self.close
400
- a
401
- end
402
-
403
- # Turns a list pointer into a Ruby Array instance (and makes sure to
404
- # release the pointer
405
- #
406
- def self.release (list_pointer)
407
-
408
- Rufus::Tokyo::List.new(list_pointer).release
409
- end
410
-
411
- protected
412
-
413
- # Makes sure this offset/range fits the size of the list
414
- #
415
- def norm (i)
416
- l = self.length
417
- case i
418
- when Range then ((i.first % l)..(i.last % l))
419
- when Array then [ i.first % l ]
420
- else i % l
421
- end
422
- end
423
- end
424
- end
425
-
@@ -1,161 +0,0 @@
1
- #--
2
- # Copyright (c) 2009, John Mettraux, jmettraux@gmail.com
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining a copy
5
- # of this software and associated documentation files (the "Software"), to deal
6
- # in the Software without restriction, including without limitation the rights
7
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- # copies of the Software, and to permit persons to whom the Software is
9
- # furnished to do so, subject to the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be included in
12
- # all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
- # THE SOFTWARE.
21
- #
22
- # Made in Japan.
23
- #++
24
-
25
-
26
- module Rufus
27
- module Tokyo
28
-
29
- #
30
- # Methods for setting up / tuning a Cabinet.
31
- #
32
- module CabinetConfig
33
-
34
- protected
35
-
36
- # Given a path, a hash of parameters and a suffix,
37
- #
38
- # a) makes sure that the path has the given suffix or raises an exception
39
- # b) gathers params found in the path (#) or in params
40
- # c) determines the config as set by the parameters
41
- #
42
- # Suffix is optional, if present, it will be enforced.
43
- #
44
- def determine_conf (path, params, required_type=nil)
45
-
46
- if path.index('#')
47
-
48
- ss = path.split('#')
49
- path = ss.shift
50
-
51
- ss.each { |p| pp = p.split('='); params[pp[0]] = pp[1] }
52
- end
53
-
54
- params = params.inject({}) { |h, (k, v)| h[k.to_sym] = v; h }
55
-
56
- [
57
- {
58
- :params => params,
59
- :mode => determine_open_mode(params),
60
- :mutex => (params[:mutex].to_s == 'true'),
61
- #:indexes => params[:idx] || params[:indexes],
62
- :xmsiz => (params[:xmsiz] || 67108864).to_i,
63
- },
64
- determine_type_and_path(path, params, required_type),
65
- determine_tuning_values(params),
66
- determine_cache_values(params)
67
-
68
- ].inject({}) { |h, hh| h.merge(hh) }
69
- end
70
-
71
- def determine_open_mode (params) #:nodoc#
72
-
73
- mode = params[:mode].to_s
74
- mode = 'wc' if mode.size < 1
75
-
76
- {
77
- 'r' => (1 << 0), # open as a reader
78
- 'w' => (1 << 1), # open as a writer
79
- 'c' => (1 << 2), # writer creating
80
- 't' => (1 << 3), # writer truncating
81
- 'e' => (1 << 4), # open without locking
82
- 'f' => (1 << 5), # lock without blocking
83
- 's' => (1 << 6), # synchronize every transaction (tctdb.h)
84
-
85
- }.inject(0) { |r, (c, v)|
86
-
87
- r = r | v if mode.index(c); r
88
- }
89
- end
90
-
91
- def determine_tuning_values (params) #:nodoc#
92
-
93
- o = params[:opts] || ''
94
- o = {
95
- 'l' => 1 << 0, # large
96
- 'd' => 1 << 1, # deflate
97
- 'b' => 1 << 2, # bzip2
98
- 't' => 1 << 3, # tcbs
99
- 'x' => 1 << 4
100
- }.inject(0) { |i, (k, v)| i = i | v if o.index(k); i }
101
-
102
- {
103
- :bnum => (params[:bnum] || 131071).to_i,
104
- :apow => (params[:apow] || 4).to_i,
105
- :fpow => (params[:fpow] || 10).to_i,
106
- :opts => o,
107
-
108
- :lmemb => (params[:lmemb] || 128).to_i,
109
- # number of members in each leaf page (:btree)
110
- :nmemb => (params[:nmemb] || 256).to_i,
111
- # number of members in each non-leaf page (:btree)
112
-
113
- :width => (params[:width] || 255).to_i,
114
- # width of the value of each record (:fixed)
115
- :limsiz => (params[:limsiz] || 26_8435_456).to_i,
116
- # limit size of the database file (:fixed)
117
-
118
- :dfunit => (params[:dfunit] || 0).to_i
119
- # unit step number. If it is not more than 0,
120
- # the auto defragmentation is disabled.
121
- }
122
- end
123
-
124
- def determine_cache_values (params) #:nodoc#
125
-
126
- {
127
- :rcnum => params[:rcnum].to_i,
128
- :lcnum => (params[:lcnum] || 2048).to_i,
129
- :ncnum => (params[:ncnum] || 512).to_i
130
- }
131
- end
132
-
133
- CABINET_SUFFIXES = {
134
- :hash => '.tch', :btree => '.tcb', :fixed => '.tcf', :table => '.tct'
135
- }
136
-
137
- CABINET_TYPES = CABINET_SUFFIXES.invert
138
-
139
- def determine_type_and_path (path, params, required_type) #:nodoc#
140
-
141
- type = required_type || params[:type]
142
- ext = File.extname(path)
143
-
144
- if ext == ''
145
- suffix = CABINET_SUFFIXES[type]
146
- path = path + suffix
147
- else
148
- suffix = ext
149
- type ||= CABINET_TYPES[ext]
150
- end
151
-
152
- raise "path '#{path}' must be suffixed with #{suffix}" \
153
- if suffix and File.extname(path) != suffix
154
-
155
- { :path => path, :type => type }
156
- end
157
- end
158
-
159
- end
160
- end
161
-