rufus-tokyo 1.0.3 → 1.0.4

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.
Files changed (55) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG.txt +6 -0
  3. data/Rakefile +91 -0
  4. data/doc/decision_table.numbers +0 -0
  5. data/lib/rufus/edo/README.txt +101 -0
  6. data/lib/rufus/edo/tabcore.rb +1 -3
  7. data/lib/rufus/tokyo.rb +1 -2
  8. data/lib/rufus/tokyo/cabinet/lib.rb +4 -7
  9. data/lib/rufus/tokyo/cabinet/table.rb +10 -13
  10. data/lib/rufus/tokyo/cabinet/util.rb +4 -1
  11. data/lib/rufus/tokyo/hmethods.rb +4 -4
  12. data/lib/rufus/tokyo/outlen.rb +5 -1
  13. data/lib/rufus/tokyo/tyrant/abstract.rb +8 -0
  14. data/lib/rufus/tokyo/tyrant/lib.rb +6 -6
  15. data/lib/rufus/tokyo/tyrant/table.rb +9 -1
  16. data/lib/rufus/tokyo/version.rb +32 -0
  17. data/rufus-tokyo.gemspec +135 -0
  18. data/spec/cabinet_btree_spec.rb +92 -0
  19. data/spec/cabinet_fixed_spec.rb +33 -0
  20. data/spec/cabinet_spec.rb +291 -0
  21. data/spec/cabinetconfig_spec.rb +82 -0
  22. data/spec/dystopia_core_spec.rb +124 -0
  23. data/spec/edo_cabinet_btree_spec.rb +123 -0
  24. data/spec/edo_cabinet_fixed_spec.rb +42 -0
  25. data/spec/edo_cabinet_spec.rb +286 -0
  26. data/spec/edo_ntyrant_spec.rb +224 -0
  27. data/spec/edo_ntyrant_table_spec.rb +296 -0
  28. data/spec/edo_table_spec.rb +292 -0
  29. data/spec/hmethods_spec.rb +73 -0
  30. data/spec/incr.lua +23 -0
  31. data/spec/openable_spec.rb +51 -0
  32. data/spec/shared_abstract_spec.rb +426 -0
  33. data/spec/shared_table_spec.rb +675 -0
  34. data/spec/shared_tyrant_spec.rb +42 -0
  35. data/spec/spec_base.rb +23 -0
  36. data/spec/start_tyrants.sh +28 -0
  37. data/spec/stop_tyrants.sh +9 -0
  38. data/spec/table_spec.rb +267 -0
  39. data/spec/tyrant_spec.rb +218 -0
  40. data/spec/tyrant_table_spec.rb +298 -0
  41. data/spec/util_list_spec.rb +197 -0
  42. data/spec/util_map_spec.rb +130 -0
  43. data/tasks/dev.rb +70 -0
  44. data/test/bm0.rb +353 -0
  45. data/test/bm1_compression.rb +54 -0
  46. data/test/con0.rb +30 -0
  47. data/test/mem.rb +49 -0
  48. data/test/mem1.rb +44 -0
  49. data/test/readme0.rb +17 -0
  50. data/test/readme1.rb +21 -0
  51. data/test/readme2.rb +15 -0
  52. data/test/readme3.rb +24 -0
  53. data/test/readmes_test.sh +17 -0
  54. metadata +81 -21
  55. data/MIGRATED.txt +0 -1
@@ -0,0 +1,82 @@
1
+
2
+ #
3
+ # Specifying rufus-tokyo
4
+ #
5
+ # Sun Feb 8 16:01:51 JST 2009
6
+ #
7
+
8
+ require File.dirname(__FILE__) + '/spec_base'
9
+
10
+ require 'rufus/tokyo'
11
+
12
+
13
+ describe 'Rufus::Tokyo::CabinetConfig' do
14
+
15
+ before do
16
+ @c = Object.new
17
+ @c.extend(Rufus::Tokyo::CabinetConfig)
18
+ class << @c
19
+ public :determine_open_mode, :determine_conf
20
+ end
21
+ end
22
+
23
+ it 'should open with mode=cw by default' do
24
+
25
+ @c.determine_open_mode({ :mode => ''}).should.equal(6)
26
+ @c.determine_open_mode({ 'mode' => '' }).should.equal(6)
27
+ end
28
+
29
+ it 'should determine mode flags correctly' do
30
+
31
+ @c.determine_open_mode( :mode => 'e').should.equal(16)
32
+ @c.determine_open_mode( :mode => 're').should.equal(17)
33
+ @c.determine_open_mode( :mode => 'ce').should.equal(20)
34
+ end
35
+
36
+ it 'should separate path from params' do
37
+
38
+ @c.determine_conf(
39
+ 'nada.tdb#mode=r', {}, '.tdb')[:path].should.equal('nada.tdb')
40
+ end
41
+
42
+ it 'should not accept suffixes else than .tdb' do
43
+
44
+ lambda {
45
+ @c.determine_conf('nada.tcx', {}, '.tdb').should.be.nil
46
+ }.should.raise(RuntimeError)
47
+
48
+ lambda {
49
+ @c.determine_conf('nada.tcx#mode=r', {}, '.tdb').should.be.nil
50
+ }.should.raise(RuntimeError)
51
+ end
52
+
53
+ it 'should grant write/create by default' do
54
+
55
+ @c.determine_conf('nada.tdb', {}, '.tdb')[:mode].should.equal(6)
56
+ end
57
+
58
+ it 'should respect :mutex' do
59
+
60
+ @c.determine_conf(
61
+ 'nada.tdb#mutex=true', {}, '.tdb')[:mutex].should.equal(true)
62
+ @c.determine_conf(
63
+ 'nada.tdb', { :mutex => true}, '.tdb')[:mutex].should.equal(true)
64
+ end
65
+
66
+ it 'should compute opts correctly' do
67
+
68
+ @c.determine_conf('nada.tdb', {}, '.tdb')[:opts].should.equal(0)
69
+ @c.determine_conf('nada.tdb#opts=ld', {}, '.tdb')[:opts].should.equal(3)
70
+ @c.determine_conf('nada.tdb', { :opts => 'ld' }, '.tdb')[:opts].should.equal(3)
71
+ @c.determine_conf('nada.tdb#opts=lb', {}, '.tdb')[:opts].should.equal(5)
72
+ end
73
+
74
+ it 'should accept :dfunit (TC 1.4.21)' do
75
+
76
+ @c.determine_conf('nada.tdb', {}, '.tdb')[:dfunit].should.equal(0)
77
+ @c.determine_conf('nada.tch#dfunit=8', {}, '.tch')[:dfunit].should.equal(8)
78
+ @c.determine_conf('nada.tct#dfunit=8', {}, '.tdb')[:dfunit].should.equal(8)
79
+ end
80
+
81
+ end
82
+
@@ -0,0 +1,124 @@
1
+
2
+ #
3
+ # Specifying rufus-tokyo
4
+ #
5
+ require File.dirname(__FILE__) + '/spec_base'
6
+
7
+ require 'rufus/tokyo/dystopia'
8
+
9
+ FileUtils.mkdir('tmp') rescue nil
10
+
11
+ describe Rufus::Tokyo::Dystopia::Core do
12
+ after do
13
+ FileUtils.rm_rf( 'tmp/dystopia' )
14
+ end
15
+
16
+ it 'should use open with a block will auto close the db correctly' do
17
+ res = Rufus::Tokyo::Dystopia::Core.open('tmp/dystopia') do |index|
18
+ index.store( 1, "John Adams" )
19
+ index.store( 3, "George Washington" )
20
+ index.count.should.equal( 2 )
21
+ :result
22
+ end
23
+
24
+ res.should.equal(:result)
25
+
26
+ index = Rufus::Tokyo::Dystopia::Core.new('tmp/dystopia')
27
+ r = index.search( "John" )
28
+ r.size.should.equal( 1 )
29
+ r.should.equal( [ 1 ] )
30
+ index.close
31
+ end
32
+
33
+ it 'should use open without a block just like calling new correctly' do
34
+ index = Rufus::Tokyo::Dystopia::Core.open('tmp/dystopia')
35
+ index.store( 1, "John Adams" )
36
+ index.store( 3, "George Washington" )
37
+ index.count.should.equal( 2 )
38
+ index.close
39
+
40
+ index = Rufus::Tokyo::Dystopia::Core.new('tmp/dystopia')
41
+ r = index.search( "John" )
42
+ r.size.should.equal( 1 )
43
+ r.should.equal( [ 1 ] )
44
+ index.close
45
+ end
46
+ end
47
+
48
+ describe 'Rufus::Tokyo::Dystopia::Core' do
49
+ before do
50
+ @db = Rufus::Tokyo::Dystopia::Core.new( 'tmp/dystopia' )
51
+ @db.clear
52
+ end
53
+
54
+ after do
55
+ @db.close
56
+ FileUtils.rm_rf( 'tmp/dystopia' )
57
+ end
58
+
59
+ it 'creates a new directory when started' do
60
+ File.directory?( 'tmp/dystopia' ).should.equal( true )
61
+ end
62
+
63
+ it 'knows its own full path' do
64
+ p = @db.path
65
+ File.directory?( p ).should.equal( true )
66
+ p.should.equal( File.expand_path( "tmp/dystopia" ) )
67
+ end
68
+
69
+ it "knows its record count" do
70
+ @db.count.should.equal( 0 )
71
+ @db.store( 1, "John Adams" )
72
+ @db.count.should.equal( 1 )
73
+ end
74
+
75
+ it "knows how much drive space it takes up in bytes" do
76
+ b = @db.fsize
77
+ @db.store( 1, "John Adams" )
78
+ @db.store( 3, "George Washington" )
79
+ @db.fsize.should > b
80
+ end
81
+
82
+ it "can add records" do
83
+ @db.count.should.equal(0)
84
+ @db.store( 1, "John Adams" )
85
+ @db.store( 3, "George Washington" )
86
+ @db.count.should.equal( 2 )
87
+ end
88
+
89
+ it "can remove records" do
90
+ @db.count.should.equal(0)
91
+ @db.store( 1, "John Adams" )
92
+ @db.store( 3, "George Washington" )
93
+ @db.count.should.equal( 2 )
94
+ @db.delete( 3 )
95
+ @db.count.should.equal( 1 )
96
+ end
97
+
98
+ it "retrieves the whole record of items it has stored" do
99
+ @db.store( 1, "John Adams" )
100
+ @db.store( 3, "George Washington" )
101
+
102
+ @db.fetch( 3 ).should.equal( "George Washington" )
103
+ @db.fetch( 1 ).should.equal( "John Adams" )
104
+ end
105
+
106
+ it "returns nil when the fetched document does not exist" do
107
+ @db.store( 1, "John Adams" )
108
+ @db.count.should.equal( 1 )
109
+ @db.fetch( 3 ).should.be.nil
110
+ end
111
+
112
+ it "searches for text in the database" do
113
+ [ 'John Adams', 'George Washington', 'Thomas Jefferson' ].each_with_index do |e, idx|
114
+ @db.store( idx + 1, e )
115
+ end
116
+ r = @db.search( "on" )
117
+ r.size.should.equal( 2 )
118
+ r.sort.should.equal( [ 2, 3 ] )
119
+
120
+ r = @db.search( "John" )
121
+ r.size.should.equal( 1 )
122
+ r.should.equal( [ 1 ] )
123
+ end
124
+ end
@@ -0,0 +1,123 @@
1
+
2
+ #
3
+ # Specifying rufus-tokyo
4
+ #
5
+ # Fri Aug 28 08:58:37 JST 2009
6
+ #
7
+
8
+ require File.dirname(__FILE__) + '/spec_base'
9
+
10
+ begin
11
+ require 'rufus/edo'
12
+ rescue LoadError
13
+ puts "'TokyoCabinet' ruby bindings not available on this ruby platform"
14
+ end
15
+
16
+ DB_FILE = "tmp/edo_cabinet_btree_spec.tcb"
17
+
18
+ if defined?(TokyoCabinet)
19
+
20
+ FileUtils.mkdir('tmp') rescue nil
21
+
22
+
23
+ describe 'Rufus::Edo::Cabinet .tcb' do
24
+
25
+ before do
26
+ FileUtils.rm(DB_FILE) if File.exist? DB_FILE
27
+ @db = Rufus::Edo::Cabinet.new(DB_FILE)
28
+ end
29
+ after do
30
+ @db.close
31
+ end
32
+
33
+ it 'should accept duplicate values' do
34
+
35
+ @db.putdup('a', 'a0')
36
+ @db.putdup('a', 'a1')
37
+
38
+ @db.getdup('a').should.equal([ 'a0', 'a1' ])
39
+ end
40
+
41
+ it 'should be able to fetch keys for duplicate values' do
42
+ [ %w[John Hornbeck],
43
+ %w[Tim Gourley],
44
+ %w[Grant Schofield],
45
+ %w[James Gray],
46
+ %w[Dana Gray] ].each do |first, last|
47
+ @db.putdup(last, first)
48
+ end
49
+ @db.keys.should.equal(%w[Gourley Gray Hornbeck Schofield])
50
+ @db.keys(:prefix => "G").should.equal(%w[Gourley Gray])
51
+ end
52
+ end
53
+
54
+ describe 'Rufus::Edo::Cabinet .tcb methods' do
55
+
56
+ it 'should fail on other structures' do
57
+
58
+ @db = Rufus::Edo::Cabinet.new(DB_FILE.sub(/\.tcb\z/, ".tch"))
59
+
60
+ lambda { @db.putdup('a', 'a0') }.should.raise(NoMethodError)
61
+
62
+ @db.close
63
+ end
64
+ end
65
+
66
+ describe 'Rufus::Edo::Cabinet .tcb order' do
67
+
68
+ before do
69
+ FileUtils.rm(DB_FILE) if File.exist? DB_FILE
70
+ end
71
+
72
+ it 'should default to a lexical order' do
73
+
74
+ db = Rufus::Edo::Cabinet.new(DB_FILE)
75
+ fields = [1, 2, 10, 11, 20, 21]
76
+ fields.each do |n|
77
+ db[n] = n
78
+ end
79
+ db.keys.should.equal(fields.map { |n| n.to_s }.sort)
80
+ db.close
81
+ end
82
+
83
+ it 'should allow an explicit :cmpfunc => :lexical' do
84
+
85
+ db = Rufus::Edo::Cabinet.new(DB_FILE, :cmpfunc => :lexical)
86
+ fields = [1, 2, 10, 11, 20, 21]
87
+ fields.each do |n|
88
+ db[n] = n
89
+ end
90
+ db.keys.should.equal(fields.map { |n| n.to_s }.sort)
91
+ db.close
92
+ end
93
+
94
+ it 'should allow a :cmpfunc => :decimal' do
95
+
96
+ db = Rufus::Edo::Cabinet.new(DB_FILE, :cmpfunc => :decimal)
97
+ fields = [1, 2, 10, 11, 20, 21]
98
+ fields.each do |n|
99
+ db[n] = n
100
+ end
101
+ db.keys.should.equal(fields.sort.map { |n| n.to_s })
102
+ db.close
103
+ end
104
+
105
+ it 'should allow a custom :cmpfunc as a Proc' do
106
+
107
+ db = Rufus::Edo::Cabinet.new(
108
+ DB_FILE,
109
+ :cmpfunc => lambda { |a, b| [a.size, a] <=> [b.size, b] }
110
+ )
111
+ db["one"] = 1
112
+ db["two"] = 2
113
+ db["three"] = 3
114
+ db["four"] = 4
115
+ db["five"] = 5
116
+ db.to_a.should.equal( [ %w[one 1], %w[two 2],
117
+ %w[five 5], %w[four 4],
118
+ %w[three 3] ] )
119
+ db.close
120
+ end
121
+ end
122
+ end
123
+
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_base'
2
+
3
+ begin
4
+ require 'rufus/edo'
5
+ rescue LoadError
6
+ puts "'TokyoCabinet' ruby bindings not available on this ruby platform"
7
+ end
8
+
9
+ if defined?(TokyoCabinet)
10
+
11
+ FileUtils.mkdir('tmp') rescue nil
12
+
13
+
14
+ describe 'Rufus::Edo::Cabinet .tcf' do
15
+
16
+ before do
17
+ @db = Rufus::Edo::Cabinet.new( 'tmp/edo_cabinet_fixed_spec.tcf',
18
+ :width => 4 )
19
+ @db.clear
20
+ end
21
+ after do
22
+ @db.close
23
+ end
24
+
25
+ it 'should support keys' do
26
+ @db[1] = "one"
27
+ @db[2] = "two"
28
+ @db[3] = "three"
29
+ @db[7] = "seven"
30
+ @db.keys.should.equal(%w[1 2 3 7])
31
+ end
32
+
33
+ it 'should accept a width at creation' do
34
+
35
+ @db[1] = "one"
36
+ @db[2] = "two"
37
+ @db[3] = "three"
38
+ @db.to_a.should.equal([%w[1 one], %w[2 two], %w[3 thre]])
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,286 @@
1
+
2
+ #
3
+ # Specifying rufus-tokyo
4
+ #
5
+ # Sat Feb 21 22:16:23 JST 2009
6
+ #
7
+
8
+ require File.dirname(__FILE__) + '/spec_base'
9
+ require File.dirname(__FILE__) + '/shared_abstract_spec'
10
+
11
+ begin
12
+ require 'rufus/edo'
13
+ rescue LoadError
14
+ puts "'TokyoCabinet' ruby bindings not available on this ruby platform"
15
+ end
16
+
17
+ if defined?(TokyoCabinet)
18
+
19
+ FileUtils.mkdir('tmp') rescue nil
20
+
21
+ describe 'a missing Rufus::Edo::Cabinet' do
22
+
23
+ it 'should raise an error' do
24
+
25
+ lambda {
26
+ Rufus::Edo::Cabinet.new('tmp/naidesuyo.tch', :mode => 'r')
27
+ }.should.raise(Rufus::Edo::EdoError).message.should.equal(
28
+ '(err 3) file not found')
29
+ end
30
+ end
31
+
32
+ describe Rufus::Edo::Cabinet do
33
+
34
+ before do
35
+ @db = Rufus::Edo::Cabinet.new('tmp/edo_cabinet_spec.tch')
36
+ @db.clear
37
+ end
38
+ after do
39
+ @db.close
40
+ end
41
+
42
+ behaves_like "an abstract structure"
43
+
44
+ it 'should return its path' do
45
+
46
+ @db.path.should.equal('tmp/edo_cabinet_spec.tch')
47
+ end
48
+
49
+ it 'should create its underlying file' do
50
+
51
+ File.exist?('tmp/cabinet_spec.tch').should.equal(true)
52
+ end
53
+ end
54
+
55
+ describe 'Rufus::Edo::Cabinet #keys' do
56
+
57
+ before do
58
+ @n = 50
59
+ @db = Rufus::Edo::Cabinet.new('tmp/cabinet_spec.tch')
60
+ @db.clear
61
+ @n.times { |i| @db["person#{i}"] = 'whoever' }
62
+ @n.times { |i| @db["animal#{i}"] = 'whichever' }
63
+ @db["toto#{0.chr}5"] = 'toto'
64
+ end
65
+ after do
66
+ @db.close
67
+ end
68
+
69
+ behaves_like 'abstract structure #keys'
70
+ end
71
+
72
+ describe Rufus::Edo::Cabinet do
73
+
74
+ before do
75
+ @db = Rufus::Edo::Cabinet.new('tmp/edo_cabinet_tran_spec.tch')
76
+ @db.clear
77
+ end
78
+ after do
79
+ @db.close
80
+ end
81
+
82
+ behaves_like 'abstract structure with transactions'
83
+ end
84
+
85
+ describe Rufus::Edo::Cabinet do
86
+
87
+ it 'should accept a default value' do
88
+
89
+ cab = Rufus::Edo::Cabinet.new(
90
+ 'tmp/cabinet_spec_default.tch', :default => '@?!')
91
+ cab['a'] = 'A'
92
+ cab.size.should.equal(1)
93
+ cab['b'].should.equal('@?!')
94
+ cab.close
95
+ end
96
+
97
+ it 'should accept a default value (later)' do
98
+
99
+ cab = Rufus::Edo::Cabinet.new('tmp/cabinet_spec_default.tch')
100
+ cab.default = '@?!'
101
+ cab['a'] = 'A'
102
+ cab.size.should.equal(1)
103
+ cab['b'].should.equal('@?!')
104
+ cab.close
105
+ end
106
+ end
107
+
108
+ describe Rufus::Edo::Cabinet do
109
+
110
+ before do
111
+ @db = Rufus::Edo::Cabinet.new('tmp/edo_cabinet_spec.tch')
112
+ #@db = Rufus::Edo::Cabinet.new('tmp/edo_cabinet_spec.tch', :type => :abstract)
113
+ @db.clear
114
+ 3.times { |i| @db[i.to_s] = "val#{i}" }
115
+ end
116
+ after do
117
+ @db.close
118
+ end
119
+
120
+ behaves_like 'abstract structure #lget/lput/ldelete'
121
+ end
122
+
123
+ describe Rufus::Edo::Cabinet do
124
+
125
+ before do
126
+ @db = Rufus::Edo::Cabinet.new('tmp/cabinet_spec.tch')
127
+ @db.clear
128
+ end
129
+ after do
130
+ @db.close
131
+ end
132
+
133
+ behaves_like 'abstract structure #add{int|double}'
134
+ end
135
+
136
+ describe Rufus::Edo::Cabinet do
137
+
138
+ before do
139
+ @db = Rufus::Edo::Cabinet.new('tmp/cabinet_spec.tch')
140
+ @db.clear
141
+ end
142
+ after do
143
+ @db.close
144
+ end
145
+
146
+ behaves_like 'abstract structure #putkeep'
147
+ behaves_like 'abstract structure #putcat'
148
+ end
149
+
150
+ describe Rufus::Edo::Cabinet do
151
+
152
+ it 'should copy correctly' do
153
+
154
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_source.tch')
155
+ 5000.times { |i| cab["key #{i}"] = "val #{i}" }
156
+ cab.size.should.equal(5000)
157
+ cab.copy('tmp/spec_target.tch')
158
+ cab.close
159
+
160
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_target.tch')
161
+ cab.size.should.equal(5000)
162
+ cab['key 4999'].should.equal('val 4999')
163
+ cab.close
164
+
165
+ FileUtils.rm('tmp/spec_source.tch')
166
+ FileUtils.rm('tmp/spec_target.tch')
167
+ end
168
+
169
+ it 'should copy compactly' do
170
+
171
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_source.tch')
172
+ 100.times { |i| cab["key #{i}"] = "val #{i}" }
173
+ 50.times { |i| cab.delete("key #{i}") }
174
+ cab.size.should.equal(50)
175
+ cab.compact_copy('tmp/spec_target.tch')
176
+ cab.close
177
+
178
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_target.tch')
179
+ cab.size.should.equal(50)
180
+ cab['key 99'].should.equal('val 99')
181
+ cab.close
182
+
183
+ fs0 = File.size('tmp/spec_source.tch')
184
+ fs1 = File.size('tmp/spec_target.tch')
185
+ (fs0 > fs1).should.equal(true)
186
+
187
+ FileUtils.rm('tmp/spec_source.tch')
188
+ FileUtils.rm('tmp/spec_target.tch')
189
+ end
190
+
191
+
192
+ it 'should use open with a block will auto close the db correctly' do
193
+
194
+ res = Rufus::Edo::Cabinet.open('tmp/spec_source.tch') do |cab|
195
+ 10.times { |i| cab["key #{i}"] = "val #{i}" }
196
+ cab.size.should.equal(10)
197
+ :result
198
+ end
199
+
200
+ res.should.equal(:result)
201
+
202
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_source.tch')
203
+ 10.times do |i|
204
+ cab["key #{i}"].should.equal("val #{i}")
205
+ end
206
+ cab.close
207
+
208
+ FileUtils.rm('tmp/spec_source.tch')
209
+ end
210
+
211
+
212
+ it 'should use open without a block just like calling new correctly' do
213
+
214
+ cab = Rufus::Edo::Cabinet.open('tmp/spec_source.tch')
215
+ 10.times { |i| cab["key #{i}"] = "val #{i}" }
216
+ cab.size.should.equal(10)
217
+ cab.close
218
+
219
+ cab = Rufus::Edo::Cabinet.new('tmp/spec_source.tch')
220
+ 10.times do |i|
221
+ cab["key #{i}"].should.equal("val #{i}")
222
+ end
223
+ cab.close
224
+
225
+ FileUtils.rm('tmp/spec_source.tch')
226
+ end
227
+
228
+ it 'should honour the :type parameter' do
229
+
230
+ cab = Rufus::Edo::Cabinet.open('tmp/toto.tch')
231
+ cab.clear
232
+ cab['hello'] = 'world'
233
+ cab.close
234
+
235
+ cab = Rufus::Edo::Cabinet.open('tmp/toto', :type => :hash)
236
+ cab['hello'].should.equal('world')
237
+ cab.close
238
+
239
+ FileUtils.rm('tmp/toto.tch')
240
+ end
241
+ end
242
+
243
+ describe Rufus::Edo::Cabinet do
244
+
245
+ before do
246
+ @db = Rufus::Edo::Cabinet.new('tmp/edo_cabinet_spec.tch')
247
+ @db.clear
248
+ end
249
+ after do
250
+ @db.close
251
+ end
252
+
253
+ behaves_like 'an abstract structure flattening keys and values'
254
+ end
255
+
256
+ describe 'Rufus::Edo::Cabinet with a default value' do
257
+
258
+ before do
259
+ @db = Rufus::Edo::Cabinet.new('tmp/cabinet_spec.tch', :default => 'Nemo')
260
+ @db.clear
261
+ @db['known'] = 'Ulysse'
262
+ end
263
+ after do
264
+ @db.close
265
+ end
266
+
267
+ behaves_like 'an abstract structure with a default value'
268
+ end
269
+
270
+ describe 'Rufus::Edo::Cabinet with a default_proc' do
271
+
272
+ before do
273
+ @db = Rufus::Edo::Cabinet.new(
274
+ 'tmp/cabinet_spec.tch',
275
+ :default_proc => lambda { |db, k| "default:#{k}" })
276
+ @db.clear
277
+ @db['known'] = 'Ulysse'
278
+ end
279
+ after do
280
+ @db.close
281
+ end
282
+
283
+ behaves_like 'an abstract structure with a default_proc'
284
+ end
285
+ end
286
+