rambling-trie 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -0
  3. data/LICENSE +1 -1
  4. data/README.md +25 -11
  5. data/lib/rambling/trie/comparable.rb +2 -2
  6. data/lib/rambling/trie/compressible.rb +3 -3
  7. data/lib/rambling/trie/configuration/properties.rb +10 -9
  8. data/lib/rambling/trie/configuration/provider_collection.rb +15 -13
  9. data/lib/rambling/trie/container.rb +17 -19
  10. data/lib/rambling/trie/enumerable.rb +3 -0
  11. data/lib/rambling/trie/nodes/compressed.rb +3 -3
  12. data/lib/rambling/trie/nodes/node.rb +14 -14
  13. data/lib/rambling/trie/nodes/raw.rb +2 -2
  14. data/lib/rambling/trie/readers/plain_text.rb +9 -4
  15. data/lib/rambling/trie/readers/reader.rb +21 -0
  16. data/lib/rambling/trie/readers.rb +1 -1
  17. data/lib/rambling/trie/serializers/file.rb +1 -1
  18. data/lib/rambling/trie/serializers/marshal.rb +3 -2
  19. data/lib/rambling/trie/serializers/serializer.rb +27 -0
  20. data/lib/rambling/trie/serializers/yaml.rb +3 -2
  21. data/lib/rambling/trie/serializers/zip.rb +9 -5
  22. data/lib/rambling/trie/serializers.rb +1 -1
  23. data/lib/rambling/trie/stringifyable.rb +1 -1
  24. data/lib/rambling/trie/version.rb +1 -1
  25. data/lib/rambling/trie.rb +11 -9
  26. data/rambling-trie.gemspec +5 -1
  27. data/spec/integration/rambling/trie_spec.rb +13 -16
  28. data/spec/lib/rambling/trie/comparable_spec.rb +29 -39
  29. data/spec/lib/rambling/trie/compressor_spec.rb +17 -14
  30. data/spec/lib/rambling/trie/configuration/properties_spec.rb +25 -7
  31. data/spec/lib/rambling/trie/configuration/provider_collection_spec.rb +42 -14
  32. data/spec/lib/rambling/trie/container_spec.rb +200 -325
  33. data/spec/lib/rambling/trie/enumerable_spec.rb +18 -10
  34. data/spec/lib/rambling/trie/inspectable_spec.rb +9 -3
  35. data/spec/lib/rambling/trie/nodes/node_spec.rb +1 -1
  36. data/spec/lib/rambling/trie/nodes/raw_spec.rb +26 -23
  37. data/spec/lib/rambling/trie/readers/plain_text_spec.rb +11 -1
  38. data/spec/lib/rambling/trie/readers/reader_spec.rb +14 -0
  39. data/spec/lib/rambling/trie/serializers/file_spec.rb +1 -3
  40. data/spec/lib/rambling/trie/serializers/marshal_spec.rb +1 -3
  41. data/spec/lib/rambling/trie/serializers/serializer_spec.rb +21 -0
  42. data/spec/lib/rambling/trie/serializers/yaml_spec.rb +1 -3
  43. data/spec/lib/rambling/trie/serializers/zip_spec.rb +24 -16
  44. data/spec/lib/rambling/trie/stringifyable_spec.rb +17 -13
  45. data/spec/lib/rambling/trie_spec.rb +106 -44
  46. data/spec/spec_helper.rb +15 -8
  47. data/spec/support/shared_examples/a_compressible_trie.rb +9 -3
  48. data/spec/support/shared_examples/a_container_partial_word.rb +17 -0
  49. data/spec/support/shared_examples/a_container_scan.rb +14 -0
  50. data/spec/support/shared_examples/a_container_word.rb +43 -0
  51. data/spec/support/shared_examples/a_container_words_within.rb +44 -0
  52. data/spec/support/shared_examples/a_serializable_trie.rb +4 -8
  53. data/spec/support/shared_examples/a_serializer.rb +36 -13
  54. data/spec/support/shared_examples/a_trie_data_structure.rb +24 -10
  55. data/spec/support/shared_examples/a_trie_node.rb +19 -12
  56. data/spec/support/shared_examples/a_trie_node_implementation.rb +40 -43
  57. metadata +19 -3
@@ -3,20 +3,22 @@
3
3
  module Rambling
4
4
  module Trie
5
5
  module Serializers
6
- # Zip file serializer. Dumps/loads contents from zip files. Automatically
7
- # detects if zip file contains `.marshal` or `.yml` file
8
- class Zip
6
+ # Zip file serializer. Dumps/loads contents from +.zip+ files.
7
+ # Automatically detects if zip file contains a +.marshal+ or +.yml+ file,
8
+ # or any other registered +:format => serializer+ combo.
9
+ class Zip < Serializer
9
10
  # Creates a new Zip serializer.
10
11
  # @param [Configuration::Properties] properties the configuration
11
12
  # properties set up so far.
12
13
  def initialize properties
13
14
  @properties = properties
15
+ super()
14
16
  end
15
17
 
16
18
  # Unzip contents from specified filepath and load in contents from
17
19
  # unzipped files.
18
20
  # @param [String] filepath the filepath to load contents from.
19
- # @return [String] all contents of the unzipped loaded file.
21
+ # @return [TContents] all contents of the unzipped loaded file.
20
22
  # @see https://github.com/rubyzip/rubyzip#reading-a-zip-file Zip
21
23
  # reading a file
22
24
  def load filepath
@@ -35,7 +37,7 @@ module Rambling
35
37
  # Dumps contents and zips into a specified filepath.
36
38
  # @param [String] contents the contents to dump.
37
39
  # @param [String] filepath the filepath to dump the contents to.
38
- # @return [Numeric] number of bytes written to disk.
40
+ # @return [TContents] number of bytes written to disk.
39
41
  # @see https://github.com/rubyzip/rubyzip#basic-zip-archive-creation
40
42
  # Zip archive creation
41
43
  def dump contents, filepath
@@ -50,6 +52,8 @@ module Rambling
50
52
 
51
53
  zip.add filename, entry_path
52
54
  end
55
+
56
+ ::File.size filepath
53
57
  end
54
58
 
55
59
  private
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- %w(file marshal yaml zip).each do |file|
3
+ %w(serializer file marshal yaml zip).each do |file|
4
4
  require File.join('rambling', 'trie', 'serializers', file)
5
5
  end
6
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Rambling
4
4
  module Trie
5
- # Provides the String representation behavior for the trie data structure.
5
+ # Provides the +String+ representation behavior for the trie data structure.
6
6
  module Stringifyable
7
7
  # String representation of the current node, if it is a terminal node.
8
8
  # @return [String] the string representation of the current node.
@@ -3,6 +3,6 @@
3
3
  module Rambling
4
4
  module Trie
5
5
  # Current version of the rambling-trie.
6
- VERSION = '2.3.0'
6
+ VERSION = '2.3.1'
7
7
  end
8
8
  end
data/lib/rambling/trie.rb CHANGED
@@ -10,12 +10,12 @@ end
10
10
 
11
11
  # General namespace for all Rambling gems.
12
12
  module Rambling
13
- # Entry point for rambling-trie API.
13
+ # Entry point for +rambling-trie+ API.
14
14
  module Trie
15
15
  class << self
16
- # Creates a new Rambling::Trie. Entry point for the Rambling::Trie API.
16
+ # Creates a new +Rambling::Trie+. Entry point for the +rambling-trie+ API.
17
17
  # @param [String, nil] filepath the file to load the words from.
18
- # @param [Reader, nil] reader the file parser to get each word.
18
+ # @param [Readers::Reader, nil] reader the file parser to get each word.
19
19
  # @return [Container] the trie just created.
20
20
  # @yield [Container] the trie just created.
21
21
  # @see Rambling::Trie::Readers Readers.
@@ -36,7 +36,7 @@ module Rambling
36
36
 
37
37
  # Loads an existing trie from disk into memory. By default, it will
38
38
  # deduce the correct way to deserialize based on the file extension.
39
- # Available formats are `yml`, `marshal`, and `zip` versions of all the
39
+ # Available formats are +yml+, +marshal+, and +zip+ versions of all the
40
40
  # previous formats. You can also define your own.
41
41
  # @param [String] filepath the file to load the words from.
42
42
  # @param [Serializer, nil] serializer the object responsible of loading
@@ -46,7 +46,7 @@ module Rambling
46
46
  # @see Rambling::Trie::Serializers Serializers.
47
47
  # @note Use of
48
48
  # {https://ruby-doc.org/core-2.7.0/Marshal.html#method-c-load
49
- # Marshal.load} is generally discouraged. Only use the `.marshal`
49
+ # Marshal.load} is generally discouraged. Only use the +.marshal+
50
50
  # format with trusted input.
51
51
  def load filepath, serializer = nil
52
52
  serializer ||= serializers.resolve filepath
@@ -58,19 +58,21 @@ module Rambling
58
58
 
59
59
  # Dumps an existing trie from memory into disk. By default, it will
60
60
  # deduce the correct way to serialize based on the file extension.
61
- # Available formats are `yml`, `marshal`, and `zip` versions of all the
61
+ # Available formats are +yml+, +marshal+, and +zip+ versions of all the
62
62
  # previous formats. You can also define your own.
63
63
  # @param [Container] trie the trie to dump into disk.
64
64
  # @param [String] filepath the file to dump to serialized trie into.
65
- # @param [Serializer, nil] serializer the object responsible of
65
+ # @param [Serializers::Serializer, nil] serializer the object responsible
66
+ # for trie serialization.
67
+ # @return [void]
66
68
  # serializing and dumping the trie into disk.
67
- # @see Rambling::Trie::Serializers Serializers.
69
+ # @see Serializers Serializers.
68
70
  def dump trie, filepath, serializer = nil
69
71
  serializer ||= serializers.resolve filepath
70
72
  serializer.dump trie.root, filepath
71
73
  end
72
74
 
73
- # Provides configuration properties for the Rambling::Trie gem.
75
+ # Provides configuration properties for the +Rambling::Trie+ gem.
74
76
  # @return [Configuration::Properties] the configured properties of the
75
77
  # gem.
76
78
  # @yield [Configuration::Properties] the configured properties of the
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
4
  require 'rambling/trie/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
@@ -15,6 +15,10 @@ Gem::Specification.new do |gem|
15
15
  gem.summary = 'A Ruby implementation of the trie data structure.'
16
16
  gem.homepage = 'http://github.com/gonzedge/rambling-trie'
17
17
  gem.date = Time.now.strftime '%Y-%m-%d'
18
+ gem.metadata = {
19
+ 'changelog_uri' => 'https://github.com/gonzedge/rambling-trie/blob/master/CHANGELOG.md',
20
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/rambling-trie',
21
+ }
18
22
 
19
23
  executables = `git ls-files -- bin/*`.split "\n"
20
24
  files = `git ls-files -- {lib,*file,*.gemspec,LICENSE*,README*}`.split "\n"
@@ -8,30 +8,26 @@ describe Rambling::Trie do
8
8
 
9
9
  context 'when providing words directly' do
10
10
  it_behaves_like 'a compressible trie' do
11
- let(:trie) { Rambling::Trie.create }
11
+ let(:trie) { described_class.create }
12
12
  let(:words) { %w(a couple of words for our full trie integration test) }
13
13
 
14
- before do
15
- trie.concat words
16
- end
14
+ before { trie.concat words }
17
15
  end
18
16
  end
19
17
 
20
18
  context 'when provided with words with unicode characters' do
21
19
  it_behaves_like 'a compressible trie' do
22
- let(:trie) { Rambling::Trie.create }
20
+ let(:trie) { described_class.create }
23
21
  let(:words) do
24
22
  %w(poquísimas palabras para nuestra prueba de integración completa 🙃)
25
23
  end
26
24
 
27
- before do
28
- trie.concat words
29
- end
25
+ before { trie.concat words }
30
26
  end
31
27
  end
32
28
 
33
29
  context 'when provided with a filepath' do
34
- let(:trie) { Rambling::Trie.create filepath }
30
+ let(:trie) { described_class.create filepath }
35
31
  let(:words) { File.readlines(filepath).map(&:chomp) }
36
32
 
37
33
  context 'with english words' do
@@ -53,33 +49,34 @@ describe Rambling::Trie do
53
49
 
54
50
  context 'when serialized with Ruby marshal format (default)' do
55
51
  it_behaves_like 'a serializable trie' do
56
- let(:trie_to_serialize) { Rambling::Trie.create words_filepath }
52
+ let(:trie_to_serialize) { described_class.create words_filepath }
57
53
  let(:format) { :marshal }
58
54
  end
59
55
  end
60
56
 
61
57
  context 'when serialized with YAML' do
62
58
  it_behaves_like 'a serializable trie' do
63
- let(:trie_to_serialize) { Rambling::Trie.create words_filepath }
59
+ let(:trie_to_serialize) { described_class.create words_filepath }
64
60
  let(:format) { :yml }
65
61
  end
66
62
  end
67
63
 
68
64
  context 'when serialized with zipped Ruby marshal format' do
65
+ let!(:original_on_exists_proc) { ::Zip.on_exists_proc }
66
+ let!(:original_continue_on_exists_proc) { ::Zip.continue_on_exists_proc }
67
+
69
68
  before do
70
- @original_on_exists_proc = ::Zip.on_exists_proc
71
- @original_continue_on_exists_proc = ::Zip.continue_on_exists_proc
72
69
  ::Zip.on_exists_proc = true
73
70
  ::Zip.continue_on_exists_proc = true
74
71
  end
75
72
 
76
73
  after do
77
- ::Zip.on_exists_proc = @original_on_exists_proc
78
- ::Zip.continue_on_exists_proc = @original_continue_on_exists_proc
74
+ ::Zip.on_exists_proc = original_on_exists_proc
75
+ ::Zip.continue_on_exists_proc = original_continue_on_exists_proc
79
76
  end
80
77
 
81
78
  it_behaves_like 'a serializable trie' do
82
- let(:trie_to_serialize) { Rambling::Trie.create words_filepath }
79
+ let(:trie_to_serialize) { described_class.create words_filepath }
83
80
  let(:format) { 'marshal.zip' }
84
81
  end
85
82
  end
@@ -4,93 +4,83 @@ require 'spec_helper'
4
4
 
5
5
  describe Rambling::Trie::Comparable do
6
6
  describe '#==' do
7
- let(:node_1) { Rambling::Trie::Nodes::Raw.new }
8
- let(:node_2) { Rambling::Trie::Nodes::Raw.new }
7
+ let(:node_one) { Rambling::Trie::Nodes::Raw.new }
8
+ let(:node_two) { Rambling::Trie::Nodes::Raw.new }
9
9
 
10
10
  context 'when the nodes do not have the same letter' do
11
11
  before do
12
- node_1.letter = :a
13
- node_2.letter = :b
12
+ node_one.letter = :a
13
+ node_two.letter = :b
14
14
  end
15
15
 
16
16
  it 'returns false' do
17
- expect(node_1).not_to eq node_2
17
+ expect(node_one).not_to eq node_two
18
18
  end
19
19
  end
20
20
 
21
- context 'when the nodes have the same letter and no children' do
21
+ context 'when nodes have same letter, not terminal and no children' do
22
22
  before do
23
- node_1.letter = :a
24
- node_2.letter = :a
23
+ node_one.letter = :a
24
+ node_two.letter = :a
25
25
  end
26
26
 
27
27
  it 'returns true' do
28
- expect(node_1).to eq node_2
28
+ expect(node_one).to eq node_two
29
29
  end
30
30
  end
31
31
 
32
32
  context 'when the nodes have the same letter and are terminal' do
33
33
  before do
34
- node_1.letter = :a
35
- node_1.terminal!
34
+ node_one.letter = :a
35
+ node_one.terminal!
36
36
 
37
- node_2.letter = :a
38
- node_2.terminal!
37
+ node_two.letter = :a
38
+ node_two.terminal!
39
39
  end
40
40
 
41
41
  it 'returns true' do
42
- expect(node_1).to eq node_2
43
- end
44
- end
45
-
46
- context 'when the nodes have the same letter and are not terminal' do
47
- before do
48
- node_1.letter = :a
49
- node_2.letter = :a
50
- end
51
-
52
- it 'returns true' do
53
- expect(node_1).to eq node_2
42
+ expect(node_one).to eq node_two
54
43
  end
55
44
  end
56
45
 
57
46
  context 'when the nodes have the same letter but are not both terminal' do
58
47
  before do
59
- node_1.letter = :a
60
- node_1.terminal!
48
+ node_one.letter = :a
49
+ node_one.terminal!
61
50
 
62
- node_2.letter = :a
51
+ node_two.letter = :a
63
52
  end
53
+
64
54
  it 'returns false' do
65
- expect(node_1).not_to eq node_2
55
+ expect(node_one).not_to eq node_two
66
56
  end
67
57
  end
68
58
 
69
59
  context 'when the nodes have the same letter and the same children' do
70
60
  before do
71
- node_1.letter = :t
72
- add_words node_1, %w(hese hree hings)
61
+ node_one.letter = :t
62
+ add_words node_one, %w(hese hree hings)
73
63
 
74
- node_2.letter = :t
75
- add_words node_2, %w(hese hree hings)
64
+ node_two.letter = :t
65
+ add_words node_two, %w(hese hree hings)
76
66
  end
77
67
 
78
68
  it 'returns true' do
79
- expect(node_1).to eq node_2
69
+ expect(node_one).to eq node_two
80
70
  end
81
71
  end
82
72
 
83
73
  context 'when the nodes have the same letter but different children' do
84
74
  before do
85
- node_1.letter = :t
86
- add_words node_1, %w(hese wo)
75
+ node_one.letter = :t
76
+ add_words node_one, %w(hese wo)
87
77
 
88
- node_2.letter = :t
89
- add_words node_2, %w(hese hree hings)
78
+ node_two.letter = :t
79
+ add_words node_two, %w(hese hree hings)
90
80
  end
91
81
 
92
82
  it 'returns false' do
93
- expect(node_1).not_to eq node_2
83
+ expect(node_one).not_to eq node_two
94
84
  end
95
85
  end
96
86
  end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Rambling::Trie::Compressor do
6
- let(:compressor) { Rambling::Trie::Compressor.new }
6
+ let(:compressor) { described_class.new }
7
7
 
8
8
  describe '#compress' do
9
9
  let(:node) { Rambling::Trie::Nodes::Raw.new }
@@ -16,9 +16,7 @@ describe Rambling::Trie::Compressor do
16
16
  end
17
17
 
18
18
  context 'with at least one word' do
19
- before do
20
- add_words node, %w(all the words)
21
- end
19
+ before { add_words node, %w(all the words) }
22
20
 
23
21
  it 'keeps the node letter nil' do
24
22
  compressed = compressor.compress node
@@ -28,25 +26,25 @@ describe Rambling::Trie::Compressor do
28
26
  end
29
27
 
30
28
  context 'with a single word' do
31
- before do
32
- add_word node, 'all'
33
- end
29
+ before { add_word node, 'all' }
34
30
 
31
+ # rubocop:disable RSpec/ExampleLength, RSpec/MultipleExpectations
35
32
  it 'compresses into a single node without children' do
36
33
  compressed = compressor.compress node
34
+ compressed_node_a = compressed[:a]
37
35
 
38
- expect(compressed[:a].letter).to eq :all
39
- expect(compressed[:a].children.size).to eq 0
40
- expect(compressed[:a]).to be_terminal
41
- expect(compressed[:a]).to be_compressed
36
+ expect(compressed_node_a.letter).to eq :all
37
+ expect(compressed_node_a.children.size).to eq 0
38
+ expect(compressed_node_a).to be_terminal
39
+ expect(compressed_node_a).to be_compressed
42
40
  end
41
+ # rubocop:enable RSpec/ExampleLength, RSpec/MultipleExpectations
43
42
  end
44
43
 
45
44
  context 'with two words' do
46
- before do
47
- add_words node, %w(all ask)
48
- end
45
+ before { add_words node, %w(all ask) }
49
46
 
47
+ # rubocop:disable RSpec/ExampleLength, RSpec/MultipleExpectations
50
48
  it 'compresses into corresponding three nodes' do
51
49
  compressed = compressor.compress node
52
50
 
@@ -65,8 +63,10 @@ describe Rambling::Trie::Compressor do
65
63
  expect(compressed[:a][:l]).to be_compressed
66
64
  expect(compressed[:a][:s]).to be_compressed
67
65
  end
66
+ # rubocop:enable RSpec/ExampleLength, RSpec/MultipleExpectations
68
67
  end
69
68
 
69
+ # rubocop:disable RSpec/ExampleLength, RSpec/MultipleExpectations
70
70
  it 'reassigns the parent nodes correctly' do
71
71
  add_words node, %w(repay rest repaint)
72
72
  compressed = compressor.compress node
@@ -91,7 +91,9 @@ describe Rambling::Trie::Compressor do
91
91
  expect(compressed[:r][:p][:i].parent).to eq compressed[:r][:p]
92
92
  expect(compressed[:r][:p][:i].children.size).to eq 0
93
93
  end
94
+ # rubocop:enable RSpec/ExampleLength, RSpec/MultipleExpectations
94
95
 
96
+ # rubocop:disable RSpec/ExampleLength, RSpec/MultipleExpectations
95
97
  it 'does not compress terminal nodes' do
96
98
  add_words node, %w(you your yours)
97
99
  compressed = compressor.compress node
@@ -104,5 +106,6 @@ describe Rambling::Trie::Compressor do
104
106
  expect(compressed[:y][:r][:s].letter).to eq :s
105
107
  expect(compressed[:y][:r][:s]).to be_compressed
106
108
  end
109
+ # rubocop:enable RSpec/ExampleLength, RSpec/MultipleExpectations
107
110
  end
108
111
  end
@@ -3,13 +3,17 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Rambling::Trie::Configuration::Properties do
6
- let(:properties) { Rambling::Trie::Configuration::Properties.new }
6
+ let(:properties) { described_class.new }
7
7
 
8
8
  describe '.new' do
9
- it 'configures the serializers' do
9
+ it 'configures the serializer formats' do
10
10
  serializers = properties.serializers
11
-
12
11
  expect(serializers.formats).to match_array %i(marshal yaml yml zip)
12
+ end
13
+
14
+ # rubocop:disable RSpec/ExampleLength
15
+ it 'configures the serializer providers' do
16
+ serializers = properties.serializers
13
17
  expect(serializers.providers.to_a).to match_array [
14
18
  [:marshal, Rambling::Trie::Serializers::Marshal],
15
19
  [:yaml, Rambling::Trie::Serializers::Yaml],
@@ -17,11 +21,15 @@ describe Rambling::Trie::Configuration::Properties do
17
21
  [:zip, Rambling::Trie::Serializers::Zip],
18
22
  ]
19
23
  end
24
+ # rubocop:enable RSpec/ExampleLength
20
25
 
21
- it 'configures the readers' do
26
+ it 'configures the reader formats' do
22
27
  readers = properties.readers
23
-
24
28
  expect(readers.formats).to match_array %i(txt)
29
+ end
30
+
31
+ it 'configures the reader providers' do
32
+ readers = properties.readers
25
33
  expect(readers.providers.to_a).to match_array [
26
34
  [:txt, Rambling::Trie::Readers::PlainText],
27
35
  ]
@@ -44,14 +52,24 @@ describe Rambling::Trie::Configuration::Properties do
44
52
  properties.readers.add :test, 'test'
45
53
  end
46
54
 
47
- it 'resets the serializers and readers to initial values' do
55
+ # rubocop:disable RSpec/MultipleExpectations
56
+ it 'resets the serializers to initial values' do
48
57
  expect(properties.serializers.formats).to include :test
49
- expect(properties.readers.formats).to include :test
50
58
 
51
59
  properties.reset
52
60
 
53
61
  expect(properties.serializers.formats).not_to include :test
62
+ end
63
+ # rubocop:enable RSpec/MultipleExpectations
64
+
65
+ # rubocop:disable RSpec/MultipleExpectations
66
+ it 'resets the readers to initial values' do
67
+ expect(properties.readers.formats).to include :test
68
+
69
+ properties.reset
70
+
54
71
  expect(properties.readers.formats).not_to include :test
55
72
  end
73
+ # rubocop:enable RSpec/MultipleExpectations
56
74
  end
57
75
  end
@@ -8,11 +8,15 @@ describe Rambling::Trie::Configuration::ProviderCollection do
8
8
  { one: first_provider, two: second_provider }
9
9
  end
10
10
 
11
- let(:first_provider) { double :first_provider }
12
- let(:second_provider) { double :second_provider }
11
+ let(:first_provider) do
12
+ instance_double 'Rambling::Trie::Serializers::Marshal', :first_provider
13
+ end
14
+ let(:second_provider) do
15
+ instance_double 'Rambling::Trie::Serializers::Marshal', :second_provider
16
+ end
13
17
 
14
18
  let(:provider_collection) do
15
- Rambling::Trie::Configuration::ProviderCollection.new(
19
+ described_class.new(
16
20
  :provider,
17
21
  configured_providers,
18
22
  configured_default,
@@ -46,25 +50,31 @@ describe Rambling::Trie::Configuration::ProviderCollection do
46
50
  let(:providers) { provider_collection.providers }
47
51
 
48
52
  before do
49
- allow(providers) .to receive_messages(
53
+ allow(providers).to receive_messages(
50
54
  :[] => 'value',
51
55
  keys: %i(a b),
52
56
  )
53
57
  end
54
58
 
59
+ # rubocop:disable RSpec/MultipleExpectations
55
60
  it 'delegates `#[]` to providers' do
56
61
  expect(provider_collection[:key]).to eq 'value'
57
62
  expect(providers).to have_received(:[]).with :key
58
63
  end
64
+ # rubocop:enable RSpec/MultipleExpectations
59
65
 
66
+ # rubocop:disable RSpec/MultipleExpectations
60
67
  it 'aliases `#formats` to `providers#keys`' do
61
68
  expect(provider_collection.formats).to eq %i(a b)
62
69
  expect(providers).to have_received :keys
63
70
  end
71
+ # rubocop:enable RSpec/MultipleExpectations
64
72
  end
65
73
 
66
74
  describe '#add' do
67
- let(:provider) { double :provider }
75
+ let(:provider) do
76
+ instance_double 'Rambling::Trie::Serializers::Marshal', :provider
77
+ end
68
78
 
69
79
  before do
70
80
  provider_collection.add :three, provider
@@ -76,7 +86,9 @@ describe Rambling::Trie::Configuration::ProviderCollection do
76
86
  end
77
87
 
78
88
  describe '#default=' do
79
- let(:other_provider) { double :other_provider }
89
+ let(:other_provider) do
90
+ instance_double 'Rambling::Trie::Serializers::Marshal', :other_provider
91
+ end
80
92
 
81
93
  context 'when the given value is in the providers list' do
82
94
  it 'changes the default provider' do
@@ -106,43 +118,59 @@ describe Rambling::Trie::Configuration::ProviderCollection do
106
118
  expect(provider_collection.default).to be_nil
107
119
  end
108
120
 
121
+ # rubocop:disable RSpec/MultipleExpectations
109
122
  it 'raises an ArgumentError for any other provider' do
110
123
  expect do
111
124
  provider_collection.default = other_provider
112
125
  end.to raise_error ArgumentError
113
126
  expect(provider_collection.default).to be_nil
114
127
  end
128
+ # rubocop:enable RSpec/MultipleExpectations
115
129
  end
116
130
  end
117
131
 
118
132
  describe '#resolve' do
119
133
  context 'when the file extension is one of the providers' do
120
- it 'returns the corresponding provider' do
121
- expect(provider_collection.resolve 'hola.one').to eq first_provider
122
- expect(provider_collection.resolve 'hola.two').to eq second_provider
134
+ [
135
+ ['hola.one', :first_provider],
136
+ ['hola.two', :second_provider],
137
+ ].each do |test_params|
138
+ filepath, provider = test_params
139
+
140
+ it 'returns the corresponding provider' do
141
+ provider_instance = public_send provider
142
+ expect(provider_collection.resolve filepath).to eq provider_instance
143
+ end
123
144
  end
124
145
  end
125
146
 
126
147
  context 'when the file extension is not one of the providers' do
127
- it 'returns the default provider' do
128
- expect(provider_collection.resolve 'hola.unknown').to eq first_provider
129
- expect(provider_collection.resolve 'hola').to eq first_provider
148
+ %w(hola.unknown hola).each do |filepath|
149
+ it 'returns the default provider' do
150
+ expect(provider_collection.resolve filepath).to eq first_provider
151
+ end
130
152
  end
131
153
  end
132
154
  end
133
155
 
134
156
  describe '#reset' do
135
157
  let(:configured_default) { second_provider }
136
- let(:provider) { double :provider }
158
+ let(:provider) do
159
+ instance_double 'Rambling::Trie::Serializers::Marshal', :provider
160
+ end
137
161
 
138
162
  before do
139
163
  provider_collection.add :three, provider
140
164
  provider_collection.default = provider
141
165
  end
142
166
 
143
- it 'resets to back to the initially configured values' do
167
+ it 'resets to back to the initially configured values (:three => nil)' do
144
168
  provider_collection.reset
145
169
  expect(provider_collection[:three]).to be_nil
170
+ end
171
+
172
+ it 'resets to back to the initially configured default' do
173
+ provider_collection.reset
146
174
  expect(provider_collection.default).to eq second_provider
147
175
  end
148
176
  end