rambling-trie 0.9.3 → 1.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/README.md +133 -26
- data/Rakefile +1 -2
- data/lib/rambling/trie.rb +53 -9
- data/lib/rambling/trie/comparable.rb +16 -0
- data/lib/rambling/trie/compressable.rb +14 -0
- data/lib/rambling/trie/compressed_node.rb +38 -14
- data/lib/rambling/trie/compressor.rb +14 -10
- data/lib/rambling/trie/configuration.rb +11 -0
- data/lib/rambling/trie/configuration/properties.rb +66 -0
- data/lib/rambling/trie/configuration/provider_collection.rb +101 -0
- data/lib/rambling/trie/container.rb +57 -17
- data/lib/rambling/trie/enumerable.rb +1 -1
- data/lib/rambling/trie/forwardable.rb +9 -4
- data/lib/rambling/trie/inspectable.rb +37 -0
- data/lib/rambling/trie/invalid_operation.rb +3 -2
- data/lib/rambling/trie/missing_node.rb +2 -1
- data/lib/rambling/trie/node.rb +40 -30
- data/lib/rambling/trie/raw_node.rb +29 -13
- data/lib/rambling/trie/readers.rb +11 -0
- data/lib/rambling/trie/readers/plain_text.rb +26 -0
- data/lib/rambling/trie/serializers.rb +11 -0
- data/lib/rambling/trie/serializers/file.rb +25 -0
- data/lib/rambling/trie/serializers/marshal.rb +38 -0
- data/lib/rambling/trie/serializers/yaml.rb +39 -0
- data/lib/rambling/trie/serializers/zip.rb +67 -0
- data/lib/rambling/trie/stringifyable.rb +20 -0
- data/lib/rambling/trie/version.rb +1 -1
- data/rambling-trie.gemspec +2 -2
- data/spec/integration/rambling/trie_spec.rb +45 -49
- data/spec/lib/rambling/trie/comparable_spec.rb +104 -0
- data/spec/lib/rambling/trie/compressed_node_spec.rb +44 -0
- data/spec/lib/rambling/trie/configuration/properties_spec.rb +49 -0
- data/spec/lib/rambling/trie/configuration/provider_collection_spec.rb +165 -0
- data/spec/lib/rambling/trie/container_spec.rb +127 -38
- data/spec/lib/rambling/trie/{inspector_spec.rb → inspectable_spec.rb} +7 -5
- data/spec/lib/rambling/trie/raw_node_spec.rb +22 -41
- data/spec/lib/rambling/trie/readers/plain_text_spec.rb +14 -0
- data/spec/lib/rambling/trie/serializers/file_spec.rb +11 -0
- data/spec/lib/rambling/trie/serializers/marshal_spec.rb +14 -0
- data/spec/lib/rambling/trie/serializers/yaml_spec.rb +14 -0
- data/spec/lib/rambling/trie/serializers/zip_spec.rb +30 -0
- data/spec/lib/rambling/trie/stringifyable_spec.rb +82 -0
- data/spec/lib/rambling/trie_spec.rb +120 -7
- data/spec/spec_helper.rb +7 -1
- data/spec/support/config.rb +5 -0
- data/spec/support/shared_examples/a_compressable_trie.rb +26 -0
- data/spec/support/shared_examples/a_serializable_trie.rb +26 -0
- data/spec/support/shared_examples/a_serializer.rb +29 -0
- data/spec/support/shared_examples/a_trie_data_structure.rb +29 -0
- data/spec/tmp/.gitkeep +0 -0
- metadata +51 -24
- data/lib/rambling/trie/compression.rb +0 -13
- data/lib/rambling/trie/inspector.rb +0 -11
- data/lib/rambling/trie/plain_text_reader.rb +0 -23
- data/lib/rambling/trie/tasks/gem.rb +0 -17
- data/lib/rambling/trie/tasks/helpers/path.rb +0 -17
- data/lib/rambling/trie/tasks/helpers/performance_report.rb +0 -17
- data/lib/rambling/trie/tasks/helpers/time.rb +0 -7
- data/lib/rambling/trie/tasks/performance.rb +0 -15
- data/lib/rambling/trie/tasks/performance/all.rb +0 -17
- data/lib/rambling/trie/tasks/performance/benchmark.rb +0 -201
- data/lib/rambling/trie/tasks/performance/directory.rb +0 -11
- data/lib/rambling/trie/tasks/performance/flamegraph.rb +0 -119
- data/lib/rambling/trie/tasks/performance/profile/call_tree.rb +0 -147
- data/lib/rambling/trie/tasks/performance/profile/memory.rb +0 -143
- data/spec/lib/rambling/trie/plain_text_reader_spec.rb +0 -18
data/rambling-trie.gemspec
CHANGED
@@ -5,8 +5,8 @@ require 'rambling/trie/version'
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.authors = ['Edgar Gonzalez', 'Lilibeth De La Cruz']
|
7
7
|
gem.email = ['edggonzalezg@gmail.com', 'lilibethdlc@gmail.com']
|
8
|
-
gem.description = 'The Rambling Trie is a
|
9
|
-
gem.summary = 'A
|
8
|
+
gem.description = 'The Rambling Trie is a Ruby implementation of the trie data structure, which includes compression abilities and is designed to be very fast to traverse.'
|
9
|
+
gem.summary = 'A Ruby implementation of the trie data structure.'
|
10
10
|
gem.homepage = 'http://github.com/gonzedge/rambling-trie'
|
11
11
|
gem.date = Time.now.strftime '%Y-%m-%d'
|
12
12
|
|
@@ -1,55 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rambling::Trie do
|
4
|
-
shared_examples_for 'a compressable trie' do
|
5
|
-
context 'and the trie is not compressed' do
|
6
|
-
it_behaves_like 'a trie data structure'
|
7
|
-
|
8
|
-
it 'does not alter the input' do
|
9
|
-
word = 'string'
|
10
|
-
trie.add word
|
11
|
-
|
12
|
-
expect(word).to eq 'string'
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'is marked as not compressed' do
|
16
|
-
expect(trie).not_to be_compressed
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'and the trie is compressed' do
|
21
|
-
before { trie.compress! }
|
22
|
-
|
23
|
-
it_behaves_like 'a trie data structure'
|
24
|
-
|
25
|
-
it 'is marked as compressed' do
|
26
|
-
expect(trie).to be_compressed
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
shared_examples_for 'a trie data structure' do
|
32
|
-
it 'contains all the words from the file' do
|
33
|
-
words.each do |word|
|
34
|
-
expect(trie).to include word
|
35
|
-
expect(trie.word? word).to be true
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'matches the start of all the words from the file' do
|
40
|
-
words.each do |word|
|
41
|
-
expect(trie.match? word).to be true
|
42
|
-
expect(trie.match? word[0..-2]).to be true
|
43
|
-
expect(trie.partial_word? word).to be true
|
44
|
-
expect(trie.partial_word? word[0..-2]).to be true
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'allows iterating over all the words' do
|
49
|
-
expect(trie.to_a.sort).to eq words.sort
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
4
|
describe 'with words provided directly' do
|
54
5
|
it_behaves_like 'a compressable trie' do
|
55
6
|
let(:words) { %w[a couple of words for our full trie integration test] }
|
@@ -79,4 +30,49 @@ describe Rambling::Trie do
|
|
79
30
|
let(:trie) { Rambling::Trie.create filepath }
|
80
31
|
end
|
81
32
|
end
|
33
|
+
|
34
|
+
describe 'saving and loading full trie from a file' do
|
35
|
+
let(:words_filepath) { File.join ::SPEC_ROOT, 'assets', 'test_words.en_US.txt' }
|
36
|
+
let(:words) { File.readlines(words_filepath).map &:chomp! }
|
37
|
+
let(:trie_to_serialize) { Rambling::Trie.create words_filepath }
|
38
|
+
let(:trie_filename) { File.join ::SPEC_ROOT, '..', 'tmp', 'trie-root' }
|
39
|
+
|
40
|
+
context 'when serialized with Ruby marshal format (default)' do
|
41
|
+
it_behaves_like 'a serializable trie' do
|
42
|
+
let(:trie_filepath) { "#{trie_filename}.marshal" }
|
43
|
+
let(:loaded_trie) { Rambling::Trie.load trie_filepath }
|
44
|
+
let(:serializer) { nil }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when serialized with YAML' do
|
49
|
+
it_behaves_like 'a serializable trie' do
|
50
|
+
let(:trie_filepath) { "#{trie_filename}.yml" }
|
51
|
+
let(:loaded_trie) { Rambling::Trie.load trie_filepath }
|
52
|
+
let(:serializer) { nil }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when serialized with zipped Ruby marshal format' do
|
57
|
+
before do
|
58
|
+
require 'zip'
|
59
|
+
@original_on_exists_proc = ::Zip.on_exists_proc
|
60
|
+
@original_continue_on_exists_proc = ::Zip.continue_on_exists_proc
|
61
|
+
::Zip.on_exists_proc = true
|
62
|
+
::Zip.continue_on_exists_proc = true
|
63
|
+
end
|
64
|
+
|
65
|
+
after do
|
66
|
+
require 'zip'
|
67
|
+
::Zip.on_exists_proc = @original_on_exists_proc
|
68
|
+
::Zip.continue_on_exists_proc = @original_continue_on_exists_proc
|
69
|
+
end
|
70
|
+
|
71
|
+
it_behaves_like 'a serializable trie' do
|
72
|
+
let(:trie_filepath) { "#{trie_filename}.marshal.zip" }
|
73
|
+
let(:loaded_trie) { Rambling::Trie.load trie_filepath }
|
74
|
+
let(:serializer) { nil }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
82
78
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rambling::Trie::Comparable do
|
4
|
+
describe '#==' do
|
5
|
+
let(:node_1) { Rambling::Trie::RawNode.new }
|
6
|
+
let(:node_2) { Rambling::Trie::RawNode.new }
|
7
|
+
|
8
|
+
context 'when the nodes do not have the same letter' do
|
9
|
+
before do
|
10
|
+
node_1.letter = :a
|
11
|
+
node_2.letter = :b
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns false' do
|
15
|
+
expect(node_1).not_to eq node_2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when the nodes have the same letter and no children' do
|
20
|
+
before do
|
21
|
+
node_1.letter = :a
|
22
|
+
node_2.letter = :a
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns true' do
|
26
|
+
expect(node_1).to eq node_2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when the nodes have the same letter and are terminal' do
|
31
|
+
before do
|
32
|
+
node_1.letter = :a
|
33
|
+
node_1.terminal!
|
34
|
+
|
35
|
+
node_2.letter = :a
|
36
|
+
node_2.terminal!
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns true' do
|
40
|
+
expect(node_1).to eq node_2
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when the nodes have the same letter and are not terminal' do
|
45
|
+
before do
|
46
|
+
node_1.letter = :a
|
47
|
+
node_2.letter = :a
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns true' do
|
51
|
+
expect(node_1).to eq node_2
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when the nodes have the same letter but are not both terminal' do
|
56
|
+
before do
|
57
|
+
node_1.letter = :a
|
58
|
+
node_1.terminal!
|
59
|
+
|
60
|
+
node_2.letter = :a
|
61
|
+
end
|
62
|
+
it 'returns false' do
|
63
|
+
expect(node_1).not_to eq node_2
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when the nodes have the same letter and the same children' do
|
68
|
+
before do
|
69
|
+
node_1.letter = :t
|
70
|
+
node_1.add 'hese'
|
71
|
+
node_1.add 'hree'
|
72
|
+
node_1.add 'hings'
|
73
|
+
|
74
|
+
node_2.letter = :t
|
75
|
+
node_2.add 'hese'
|
76
|
+
node_2.add 'hree'
|
77
|
+
node_2.add 'hings'
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns true' do
|
81
|
+
expect(node_1).to eq node_2
|
82
|
+
expect(node_1[:h][:e][:s][:e]).to eq node_2[:h][:e][:s][:e]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when the nodes have the same letter but different children' do
|
87
|
+
before do
|
88
|
+
node_1.letter = :t
|
89
|
+
node_1.add 'hese'
|
90
|
+
node_1.add 'wo'
|
91
|
+
|
92
|
+
node_2.letter = :t
|
93
|
+
node_2.add 'hese'
|
94
|
+
node_2.add 'hree'
|
95
|
+
node_2.add 'hings'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'returns false' do
|
99
|
+
expect(node_1).not_to eq node_2
|
100
|
+
expect(node_1[:h][:e][:s][:e]).to eq node_2[:h][:e][:s][:e]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -152,4 +152,48 @@ describe Rambling::Trie::CompressedNode do
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|
155
|
+
|
156
|
+
describe '#match_prefix' do
|
157
|
+
let(:raw_node) { Rambling::Trie::RawNode.new }
|
158
|
+
let(:compressor) { Rambling::Trie::Compressor.new }
|
159
|
+
let(:node) { compressor.compress raw_node }
|
160
|
+
|
161
|
+
before do
|
162
|
+
raw_node.letter = :i
|
163
|
+
raw_node.add 'gnite'
|
164
|
+
raw_node.add 'mport'
|
165
|
+
raw_node.add 'mportant'
|
166
|
+
raw_node.add 'mportantly'
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'when the node is terminal' do
|
170
|
+
before do
|
171
|
+
raw_node.terminal!
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'adds itself to the words' do
|
175
|
+
expect(node.match_prefix %w(g n i t e)).to include 'i'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when the node is not terminal' do
|
180
|
+
it 'does not add itself to the words' do
|
181
|
+
expect(node.match_prefix %w(g n i t e)).not_to include 'i'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'when the first few chars match a terminal node' do
|
186
|
+
it 'adds those terminal nodes to the words' do
|
187
|
+
words = node.match_prefix(%w(m p o r t a n t l y)).to_a
|
188
|
+
expect(words).to include 'import', 'important', 'importantly'
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context 'when the first few chars do not match a terminal node' do
|
193
|
+
it 'does not add any other words found' do
|
194
|
+
words = node.match_prefix(%w(m p m p o r t a n t l y)).to_a
|
195
|
+
expect(words).not_to include 'import', 'important', 'importantly'
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
155
199
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rambling::Trie::Configuration::Properties do
|
4
|
+
let(:properties) { Rambling::Trie::Configuration::Properties.new }
|
5
|
+
|
6
|
+
describe '.new' do
|
7
|
+
it 'configures the serializers' do
|
8
|
+
serializers = properties.serializers
|
9
|
+
expect(serializers.keys).to match_array %i(marshal yaml yml zip)
|
10
|
+
|
11
|
+
expect(serializers[:marshal]).to be_instance_of Rambling::Trie::Serializers::Marshal
|
12
|
+
expect(serializers[:yaml]).to be_instance_of Rambling::Trie::Serializers::Yaml
|
13
|
+
expect(serializers[:yml]).to be_instance_of Rambling::Trie::Serializers::Yaml
|
14
|
+
expect(serializers[:zip]).to be_instance_of Rambling::Trie::Serializers::Zip
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'configures the readers' do
|
18
|
+
readers = properties.readers
|
19
|
+
expect(readers.keys).to match_array %i(txt)
|
20
|
+
|
21
|
+
expect(readers[:txt]).to be_instance_of Rambling::Trie::Readers::PlainText
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'configures the compressor' do
|
25
|
+
expect(properties.compressor).to be_instance_of Rambling::Trie::Compressor
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'configures the root_builder' do
|
29
|
+
expect(properties.root_builder.call).to be_instance_of Rambling::Trie::RawNode
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#reset' do
|
34
|
+
before do
|
35
|
+
properties.serializers.add :test, 'test'
|
36
|
+
properties.readers.add :test, 'test'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'resets the serializers and readers to initial values' do
|
40
|
+
expect(properties.serializers.keys).to include :test
|
41
|
+
expect(properties.readers.keys).to include :test
|
42
|
+
|
43
|
+
properties.reset
|
44
|
+
|
45
|
+
expect(properties.serializers.keys).not_to include :test
|
46
|
+
expect(properties.readers.keys).not_to include :test
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rambling::Trie::Configuration::ProviderCollection do
|
4
|
+
let(:configured_default) { nil }
|
5
|
+
let(:configured_providers) do
|
6
|
+
{ one: first_provider, two: second_provider }
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:first_provider) { double :first_provider }
|
10
|
+
let(:second_provider) { double :second_provider }
|
11
|
+
|
12
|
+
let(:provider_collection) do
|
13
|
+
Rambling::Trie::Configuration::ProviderCollection.new(
|
14
|
+
'provider',
|
15
|
+
configured_providers,
|
16
|
+
configured_default
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.new' do
|
21
|
+
it 'has a name' do
|
22
|
+
expect(provider_collection.name).to eq 'provider'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'has the given providers' do
|
26
|
+
expect(provider_collection.providers)
|
27
|
+
.to eq one: first_provider, two: second_provider
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has a default provider' do
|
31
|
+
expect(provider_collection.default).to eq first_provider
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when a default is provided' do
|
35
|
+
let(:configured_default) { second_provider }
|
36
|
+
|
37
|
+
it 'has that as the default provider' do
|
38
|
+
expect(provider_collection.default).to eq second_provider
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'aliases and delegates' do
|
44
|
+
let(:providers) { provider_collection.providers }
|
45
|
+
|
46
|
+
before do
|
47
|
+
allow(providers) .to receive_messages(
|
48
|
+
:[] => nil,
|
49
|
+
:[]= => nil,
|
50
|
+
keys: nil,
|
51
|
+
values: nil,
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'delegates #[] to providers' do
|
56
|
+
provider_collection[:key]
|
57
|
+
expect(providers).to have_received(:[]).with :key
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'delegates #[]= to providers' do
|
61
|
+
provider_collection[:key] = 'hello'
|
62
|
+
expect(providers).to have_received(:[]=).with :key, 'hello'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'delegates #keys to providers' do
|
66
|
+
provider_collection.keys
|
67
|
+
expect(providers).to have_received :keys
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'delegates #values to providers' do
|
71
|
+
provider_collection.values
|
72
|
+
expect(providers).to have_received :values
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#add' do
|
77
|
+
let(:provider) { double :provider }
|
78
|
+
|
79
|
+
before do
|
80
|
+
provider_collection.add :three, provider
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'adds a new provider' do
|
84
|
+
expect(provider_collection.providers[:three]).to eq provider
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#default=' do
|
89
|
+
let(:other_provider) { double :other_provider }
|
90
|
+
|
91
|
+
context 'when the given value is in the providers list' do
|
92
|
+
it 'changes the default provider' do
|
93
|
+
provider_collection.default = second_provider
|
94
|
+
expect(provider_collection.default).to eq second_provider
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when the given value is not in the providers list' do
|
99
|
+
it 'does not change the default provider' do
|
100
|
+
expect do
|
101
|
+
begin
|
102
|
+
provider_collection.default = other_provider
|
103
|
+
rescue
|
104
|
+
end
|
105
|
+
end.not_to change { provider_collection.default }
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'raises an ArgumentError' do
|
109
|
+
expect do
|
110
|
+
provider_collection.default = other_provider
|
111
|
+
end.to raise_error ArgumentError
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when the providers list is empty' do
|
116
|
+
let(:configured_providers) do
|
117
|
+
{}
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'accepts nil' do
|
121
|
+
provider_collection.default = nil
|
122
|
+
expect(provider_collection.default).to be_nil
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'raises an ArgumentError for any other provider' do
|
126
|
+
expect do
|
127
|
+
provider_collection.default = other_provider
|
128
|
+
end.to raise_error ArgumentError
|
129
|
+
expect(provider_collection.default).to be_nil
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe '#resolve' do
|
135
|
+
context 'when the file extension is one of the providers' do
|
136
|
+
it 'returns the corresponding provider' do
|
137
|
+
expect(provider_collection.resolve 'hola.one').to eq first_provider
|
138
|
+
expect(provider_collection.resolve 'hola.two').to eq second_provider
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'when the file extension is not one of the providers' do
|
143
|
+
it 'returns the default provider' do
|
144
|
+
expect(provider_collection.resolve 'hola.unknown').to eq first_provider
|
145
|
+
expect(provider_collection.resolve 'hola').to eq first_provider
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '#reset' do
|
151
|
+
let(:configured_default) { second_provider }
|
152
|
+
let(:provider) { double :provider }
|
153
|
+
|
154
|
+
before do
|
155
|
+
provider_collection.add :three, provider
|
156
|
+
provider_collection.default = provider
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'resets to back to the initially configured values' do
|
160
|
+
provider_collection.reset
|
161
|
+
expect(provider_collection[:three]).to be_nil
|
162
|
+
expect(provider_collection.default).to eq second_provider
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|