rambling-trie 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -0
  3. data/LICENSE +1 -1
  4. data/README.md +68 -29
  5. data/lib/rambling/trie/comparable.rb +2 -3
  6. data/lib/rambling/trie/compressible.rb +3 -5
  7. data/lib/rambling/trie/compressor.rb +2 -12
  8. data/lib/rambling/trie/configuration/properties.rb +8 -14
  9. data/lib/rambling/trie/configuration/provider_collection.rb +19 -27
  10. data/lib/rambling/trie/container.rb +28 -42
  11. data/lib/rambling/trie/enumerable.rb +4 -2
  12. data/lib/rambling/trie/nodes/compressed.rb +4 -5
  13. data/lib/rambling/trie/nodes/missing.rb +1 -2
  14. data/lib/rambling/trie/nodes/node.rb +21 -34
  15. data/lib/rambling/trie/nodes/raw.rb +2 -2
  16. data/lib/rambling/trie/readers/plain_text.rb +10 -6
  17. data/lib/rambling/trie/readers/reader.rb +19 -0
  18. data/lib/rambling/trie/readers.rb +1 -1
  19. data/lib/rambling/trie/serializers/file.rb +1 -1
  20. data/lib/rambling/trie/serializers/marshal.rb +12 -20
  21. data/lib/rambling/trie/serializers/serializer.rb +27 -0
  22. data/lib/rambling/trie/serializers/yaml.rb +10 -16
  23. data/lib/rambling/trie/serializers/zip.rb +9 -5
  24. data/lib/rambling/trie/serializers.rb +1 -1
  25. data/lib/rambling/trie/stringifyable.rb +1 -1
  26. data/lib/rambling/trie/version.rb +1 -1
  27. data/lib/rambling/trie.rb +19 -22
  28. data/rambling-trie.gemspec +9 -5
  29. data/spec/integration/rambling/trie_spec.rb +49 -20
  30. data/spec/lib/rambling/trie/comparable_spec.rb +29 -39
  31. data/spec/lib/rambling/trie/compressor_spec.rb +17 -14
  32. data/spec/lib/rambling/trie/configuration/properties_spec.rb +25 -7
  33. data/spec/lib/rambling/trie/configuration/provider_collection_spec.rb +44 -16
  34. data/spec/lib/rambling/trie/container_spec.rb +202 -327
  35. data/spec/lib/rambling/trie/enumerable_spec.rb +18 -10
  36. data/spec/lib/rambling/trie/inspectable_spec.rb +9 -3
  37. data/spec/lib/rambling/trie/nodes/compressed_spec.rb +6 -0
  38. data/spec/lib/rambling/trie/nodes/node_spec.rb +1 -1
  39. data/spec/lib/rambling/trie/nodes/raw_spec.rb +32 -27
  40. data/spec/lib/rambling/trie/readers/plain_text_spec.rb +11 -1
  41. data/spec/lib/rambling/trie/readers/reader_spec.rb +14 -0
  42. data/spec/lib/rambling/trie/serializers/file_spec.rb +2 -4
  43. data/spec/lib/rambling/trie/serializers/marshal_spec.rb +2 -4
  44. data/spec/lib/rambling/trie/serializers/serializer_spec.rb +21 -0
  45. data/spec/lib/rambling/trie/serializers/yaml_spec.rb +2 -4
  46. data/spec/lib/rambling/trie/serializers/zip_spec.rb +24 -16
  47. data/spec/lib/rambling/trie/stringifyable_spec.rb +17 -13
  48. data/spec/lib/rambling/trie_spec.rb +107 -45
  49. data/spec/spec_helper.rb +16 -9
  50. data/spec/support/shared_examples/a_compressible_trie.rb +9 -3
  51. data/spec/support/shared_examples/a_container_partial_word.rb +17 -0
  52. data/spec/support/shared_examples/a_container_scan.rb +14 -0
  53. data/spec/support/shared_examples/a_container_word.rb +43 -0
  54. data/spec/support/shared_examples/a_container_words_within.rb +44 -0
  55. data/spec/support/shared_examples/a_serializable_trie.rb +5 -9
  56. data/spec/support/shared_examples/a_serializer.rb +37 -14
  57. data/spec/support/shared_examples/a_trie_data_structure.rb +24 -10
  58. data/spec/support/shared_examples/a_trie_node.rb +22 -14
  59. data/spec/support/shared_examples/a_trie_node_implementation.rb +40 -43
  60. metadata +25 -9
@@ -21,7 +21,8 @@ shared_examples_for 'a trie node' do
21
21
  end
22
22
 
23
23
  context 'with a letter and a parent' do
24
- let(:parent) { node.class.new }
24
+ let(:parent) { node_class.new }
25
+ # noinspection RubyArgCount
25
26
  let(:node_with_parent) { node_class.new :a, parent }
26
27
 
27
28
  it 'does not have any letter' do
@@ -40,9 +41,7 @@ shared_examples_for 'a trie node' do
40
41
 
41
42
  describe '#root?' do
42
43
  context 'when the node has a parent' do
43
- before do
44
- node.parent = node
45
- end
44
+ before { node.parent = node }
46
45
 
47
46
  it 'returns false' do
48
47
  expect(node).not_to be_root
@@ -50,9 +49,7 @@ shared_examples_for 'a trie node' do
50
49
  end
51
50
 
52
51
  context 'when the node does not have a parent' do
53
- before do
54
- node.parent = nil
55
- end
52
+ before { node.parent = nil }
56
53
 
57
54
  it 'returns true' do
58
55
  expect(node).to be_root
@@ -61,12 +58,13 @@ shared_examples_for 'a trie node' do
61
58
  end
62
59
 
63
60
  describe '#terminal!' do
61
+ # rubocop:disable RSpec/MultipleExpectations
64
62
  it 'forces the node to be terminal' do
65
63
  expect(node).not_to be_terminal
66
64
  node.terminal!
67
-
68
65
  expect(node).to be_terminal
69
66
  end
67
+ # rubocop:enable RSpec/MultipleExpectations
70
68
 
71
69
  it 'returns the node' do
72
70
  expect(node.terminal!).to eq node
@@ -74,8 +72,9 @@ shared_examples_for 'a trie node' do
74
72
  end
75
73
 
76
74
  describe 'delegates and aliases' do
77
- let(:children_tree) do
78
- double(
75
+ let :children_tree do
76
+ instance_double(
77
+ 'Hash',
79
78
  :children_tree,
80
79
  :[] => 'value',
81
80
  :[]= => nil,
@@ -84,20 +83,21 @@ shared_examples_for 'a trie node' do
84
83
  )
85
84
  end
86
85
 
87
- before do
88
- node.children_tree = children_tree
89
- end
86
+ before { node.children_tree = children_tree }
90
87
 
88
+ # rubocop:disable RSpec/MultipleExpectations
91
89
  it 'delegates `#[]` to its children tree' do
92
90
  expect(node[:key]).to eq 'value'
93
91
  expect(children_tree).to have_received(:[]).with :key
94
92
  end
93
+ # rubocop:enable RSpec/MultipleExpectations
95
94
 
96
95
  it 'delegates `#[]=` to its children tree' do
97
96
  node[:key] = 'value'
98
97
  expect(children_tree).to have_received(:[]=).with(:key, 'value')
99
98
  end
100
99
 
100
+ # rubocop:disable RSpec/MultipleExpectations
101
101
  it 'delegates `#key?` to its children tree' do
102
102
  allow(children_tree).to receive(:key?)
103
103
  .with(:present_key)
@@ -106,18 +106,26 @@ shared_examples_for 'a trie node' do
106
106
  expect(node).to have_key(:present_key)
107
107
  expect(node).not_to have_key(:absent_key)
108
108
  end
109
+ # rubocop:enable RSpec/MultipleExpectations
109
110
 
111
+ # rubocop:disable RSpec/MultipleExpectations
110
112
  it 'delegates `#delete` to its children tree' do
111
113
  expect(node.delete :key).to be true
112
114
  expect(children_tree).to have_received(:delete).with :key
113
115
  end
116
+ # rubocop:enable RSpec/MultipleExpectations
114
117
 
118
+ # rubocop:disable RSpec/ExampleLength
115
119
  it 'delegates `#children` to its children tree values' do
116
- children = [double(:child_1), double(:child_2)]
120
+ children = [
121
+ instance_double('Rambling::Trie::Nodes::Node', :child_one),
122
+ instance_double('Rambling::Trie::Nodes::Node', :child_two),
123
+ ]
117
124
  allow(children_tree).to receive(:values).and_return children
118
125
 
119
126
  expect(node.children).to eq children
120
127
  end
128
+ # rubocop:enable RSpec/ExampleLength
121
129
 
122
130
  it 'aliases `#has_key?` to `#key?`' do
123
131
  node.has_key? :nope
@@ -12,26 +12,22 @@ shared_examples_for 'a trie node implementation' do
12
12
 
13
13
  context 'when the chars array is not empty' do
14
14
  context 'when the node has a tree that matches the characters' do
15
- before do
16
- add_word_to_tree 'abc'
17
- end
15
+ before { add_word_to_tree 'abc' }
18
16
 
19
- it 'returns true' do
20
- expect(node.partial_word? %w(a)).to be true
21
- expect(node.partial_word? %w(a b)).to be true
22
- expect(node.partial_word? %w(a b c)).to be true
17
+ [%w(a), %w(a b), %w(a b c)].each do |letters|
18
+ it "returns true for '#{letters}'" do
19
+ expect(node.partial_word? letters).to be true
20
+ end
23
21
  end
24
22
  end
25
23
 
26
24
  context 'when the node has a tree that does not match the characters' do
27
- before do
28
- add_word_to_tree 'cba'
29
- end
25
+ before { add_word_to_tree 'cba' }
30
26
 
31
- it 'returns false' do
32
- expect(node.partial_word? %w(a)).to be false
33
- expect(node.partial_word? %w(a b)).to be false
34
- expect(node.partial_word? %w(a b c)).to be false
27
+ [%w(a), %w(a b), %w(a b c)].each do |letters|
28
+ it "returns false for '#{letters}'" do
29
+ expect(node.partial_word? letters).to be false
30
+ end
35
31
  end
36
32
  end
37
33
  end
@@ -40,9 +36,7 @@ shared_examples_for 'a trie node implementation' do
40
36
  describe '#word?' do
41
37
  context 'when the chars array is empty' do
42
38
  context 'when the node is terminal' do
43
- before do
44
- node.terminal!
45
- end
39
+ before { node.terminal! }
46
40
 
47
41
  it 'returns true' do
48
42
  expect(node.word? []).to be true
@@ -58,9 +52,7 @@ shared_examples_for 'a trie node implementation' do
58
52
 
59
53
  context 'when the chars array is not empty' do
60
54
  context 'when the node has a tree that matches all the characters' do
61
- before do
62
- add_word_to_tree 'abc'
63
- end
55
+ before { add_word_to_tree 'abc' }
64
56
 
65
57
  it 'returns true' do
66
58
  expect(node.word? %w(a b c).map(&:dup)).to be true
@@ -68,13 +60,12 @@ shared_examples_for 'a trie node implementation' do
68
60
  end
69
61
 
70
62
  context 'when the node subtree does not match all the characters' do
71
- before do
72
- add_word_to_tree 'abc'
73
- end
63
+ before { add_word_to_tree 'abc' }
74
64
 
75
- it 'returns false' do
76
- expect(node.word? %w(a).map(&:dup)).to be false
77
- expect(node.word? %w(a b).map(&:dup)).to be false
65
+ [%w(a), %w(a b)].each do |letters|
66
+ it "returns false for '#{letters}'" do
67
+ expect(node.word? letters.map(&:dup)).to be false
68
+ end
78
69
  end
79
70
  end
80
71
  end
@@ -88,26 +79,34 @@ shared_examples_for 'a trie node implementation' do
88
79
  end
89
80
 
90
81
  context 'when the chars array is not empty' do
91
- before do
92
- add_words_to_tree %w(cba ccab)
93
- end
82
+ before { add_words_to_tree %w(cba ccab) }
94
83
 
95
84
  context 'when the chars are found' do
96
- it 'returns the found child' do
97
- expect(node.scan %w(c)).to match_array %w(cba ccab)
98
- expect(node.scan %w(c b)).to match_array %w(cba)
99
- expect(node.scan %w(c b a)).to match_array %w(cba)
85
+ [
86
+ [%w(c), %w(cba ccab)],
87
+ [%w(c b), %w(cba)],
88
+ [%w(c b a), %w(cba)],
89
+ ].each do |test_params|
90
+ letters, expected = test_params
91
+
92
+ it "returns the corresponding children (#{letters} => #{expected})" do
93
+ expect(node.scan letters).to match_array expected
94
+ end
100
95
  end
101
96
  end
102
97
 
103
98
  context 'when the chars are not found' do
104
- it 'returns a Nodes::Missing' do
105
- expect(node.scan %w(a)).to be_a Rambling::Trie::Nodes::Missing
106
- expect(node.scan %w(a b)).to be_a Rambling::Trie::Nodes::Missing
107
- expect(node.scan %w(a b c)).to be_a Rambling::Trie::Nodes::Missing
108
- expect(node.scan %w(c a)).to be_a Rambling::Trie::Nodes::Missing
109
- expect(node.scan %w(c c b)).to be_a Rambling::Trie::Nodes::Missing
110
- expect(node.scan %w(c b a d)).to be_a Rambling::Trie::Nodes::Missing
99
+ [
100
+ %w(a),
101
+ %w(a b),
102
+ %w(a b c),
103
+ %w(c a),
104
+ %w(c c b),
105
+ %w(c b a d),
106
+ ].each do |letters|
107
+ it "returns a Nodes::Missing for '#{letters}'" do
108
+ expect(node.scan letters).to be_a Rambling::Trie::Nodes::Missing
109
+ end
111
110
  end
112
111
  end
113
112
  end
@@ -120,9 +119,7 @@ shared_examples_for 'a trie node implementation' do
120
119
  end
121
120
 
122
121
  context 'when the node is terminal' do
123
- before do
124
- node.terminal!
125
- end
122
+ before { node.terminal! }
126
123
 
127
124
  it 'adds itself to the words' do
128
125
  expect(node.match_prefix %w(g n i t e)).to include 'i'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rambling-trie
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edgar Gonzalez
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-03-30 00:00:00.000000000 Z
12
+ date: 2024-01-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '13.0'
20
+ version: '13.1'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '13.0'
27
+ version: '13.1'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: 0.9.28
48
+ version: 0.9.34
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: 0.9.28
55
+ version: 0.9.34
56
56
  description: 'The Rambling Trie is a Ruby implementation of the trie data structure,
57
57
  which includes compression abilities and is designed to be very fast to traverse. '
58
58
  email:
@@ -86,9 +86,11 @@ files:
86
86
  - lib/rambling/trie/nodes/raw.rb
87
87
  - lib/rambling/trie/readers.rb
88
88
  - lib/rambling/trie/readers/plain_text.rb
89
+ - lib/rambling/trie/readers/reader.rb
89
90
  - lib/rambling/trie/serializers.rb
90
91
  - lib/rambling/trie/serializers/file.rb
91
92
  - lib/rambling/trie/serializers/marshal.rb
93
+ - lib/rambling/trie/serializers/serializer.rb
92
94
  - lib/rambling/trie/serializers/yaml.rb
93
95
  - lib/rambling/trie/serializers/zip.rb
94
96
  - lib/rambling/trie/stringifyable.rb
@@ -108,8 +110,10 @@ files:
108
110
  - spec/lib/rambling/trie/nodes/node_spec.rb
109
111
  - spec/lib/rambling/trie/nodes/raw_spec.rb
110
112
  - spec/lib/rambling/trie/readers/plain_text_spec.rb
113
+ - spec/lib/rambling/trie/readers/reader_spec.rb
111
114
  - spec/lib/rambling/trie/serializers/file_spec.rb
112
115
  - spec/lib/rambling/trie/serializers/marshal_spec.rb
116
+ - spec/lib/rambling/trie/serializers/serializer_spec.rb
113
117
  - spec/lib/rambling/trie/serializers/yaml_spec.rb
114
118
  - spec/lib/rambling/trie/serializers/zip_spec.rb
115
119
  - spec/lib/rambling/trie/stringifyable_spec.rb
@@ -119,16 +123,22 @@ files:
119
123
  - spec/support/helpers/add_word.rb
120
124
  - spec/support/helpers/one_line_heredoc.rb
121
125
  - spec/support/shared_examples/a_compressible_trie.rb
126
+ - spec/support/shared_examples/a_container_partial_word.rb
127
+ - spec/support/shared_examples/a_container_scan.rb
128
+ - spec/support/shared_examples/a_container_word.rb
129
+ - spec/support/shared_examples/a_container_words_within.rb
122
130
  - spec/support/shared_examples/a_serializable_trie.rb
123
131
  - spec/support/shared_examples/a_serializer.rb
124
132
  - spec/support/shared_examples/a_trie_data_structure.rb
125
133
  - spec/support/shared_examples/a_trie_node.rb
126
134
  - spec/support/shared_examples/a_trie_node_implementation.rb
127
135
  - spec/tmp/.gitkeep
128
- homepage: http://github.com/gonzedge/rambling-trie
136
+ homepage: https://github.com/gonzedge/rambling-trie
129
137
  licenses:
130
138
  - MIT
131
- metadata: {}
139
+ metadata:
140
+ changelog_uri: https://github.com/gonzedge/rambling-trie/blob/master/CHANGELOG.md
141
+ documentation_uri: https://www.rubydoc.info/gems/rambling-trie
132
142
  post_install_message:
133
143
  rdoc_options: []
134
144
  require_paths:
@@ -147,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
157
  - !ruby/object:Gem::Version
148
158
  version: '0'
149
159
  requirements: []
150
- rubygems_version: 3.4.10
160
+ rubygems_version: 3.5.3
151
161
  signing_key:
152
162
  specification_version: 4
153
163
  summary: A Ruby implementation of the trie data structure.
@@ -166,8 +176,10 @@ test_files:
166
176
  - spec/lib/rambling/trie/nodes/node_spec.rb
167
177
  - spec/lib/rambling/trie/nodes/raw_spec.rb
168
178
  - spec/lib/rambling/trie/readers/plain_text_spec.rb
179
+ - spec/lib/rambling/trie/readers/reader_spec.rb
169
180
  - spec/lib/rambling/trie/serializers/file_spec.rb
170
181
  - spec/lib/rambling/trie/serializers/marshal_spec.rb
182
+ - spec/lib/rambling/trie/serializers/serializer_spec.rb
171
183
  - spec/lib/rambling/trie/serializers/yaml_spec.rb
172
184
  - spec/lib/rambling/trie/serializers/zip_spec.rb
173
185
  - spec/lib/rambling/trie/stringifyable_spec.rb
@@ -177,6 +189,10 @@ test_files:
177
189
  - spec/support/helpers/add_word.rb
178
190
  - spec/support/helpers/one_line_heredoc.rb
179
191
  - spec/support/shared_examples/a_compressible_trie.rb
192
+ - spec/support/shared_examples/a_container_partial_word.rb
193
+ - spec/support/shared_examples/a_container_scan.rb
194
+ - spec/support/shared_examples/a_container_word.rb
195
+ - spec/support/shared_examples/a_container_words_within.rb
180
196
  - spec/support/shared_examples/a_serializable_trie.rb
181
197
  - spec/support/shared_examples/a_serializer.rb
182
198
  - spec/support/shared_examples/a_trie_data_structure.rb