rambling-trie 0.9.1 → 0.9.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b23cfe0d2b236a7970f4666f0df6a7cc4226d22
4
- data.tar.gz: 5147da530a25b386fdafd9cc59ccb1c35b2a2efc
3
+ metadata.gz: 9db4c20b2cd932bc23376649e312e566eb43e227
4
+ data.tar.gz: 40e5584acca19930a92cd894e43a51dccca4d1f1
5
5
  SHA512:
6
- metadata.gz: 71405a6dd24e710629d9e8cb8d307b2faa5664f029bcdedd749063d106e6706bce5fb07fb6ecbf776098668d0b5ab3826e3f3d6d9f75e96e516c2cbce07de2ab
7
- data.tar.gz: 6d5a292f676c979dbf2e3b7cc25d8a932cf087c14325df539b2ccafd872083d9ca1140224eb4edbc93c4fb0e920bd7f75374ba0bbd260d911fdf057fdb5cdd0d
6
+ metadata.gz: f0e1a3166c876d3d3730dd439563567fbeb2108b33b908152c1a388daf2edf75cfbc250f67a7c0d00ec3dd923be3e71f770b3d3ff28bbd0ecaeadb3fe3fe162c
7
+ data.tar.gz: 9f0decef0f2d1dd386677a8631888b4744315ede61b5f5957fd51ebf98b845a4564ea3ada4df60590ffcc8a82a27f5904d7261bd3dc21cf7f422c184932b8781
@@ -29,8 +29,7 @@ module Rambling
29
29
  # @param [Array] chars the characters to look for in the trie.
30
30
  # @return [Array] all the words contained in the trie that start with the specified characters.
31
31
  def scan chars
32
- node = chars.empty? ? self : closest_node(chars)
33
- node.to_a
32
+ chars.empty? ? self : closest_node(chars)
34
33
  end
35
34
 
36
35
  # Always return `true` for a raw (compressed) node.
@@ -73,7 +72,7 @@ module Rambling
73
72
  begin
74
73
  current_length += 1
75
74
 
76
- if (current_key && current_key.length == current_length) || chars.empty?
75
+ if current_key && (current_key.length == current_length || chars.empty?)
77
76
  return children_tree[current_key.to_sym].send method, chars
78
77
  end
79
78
  end while current_key && current_key[current_length] == chars.slice!(0)
@@ -7,11 +7,18 @@ module Rambling
7
7
  include ::Enumerable
8
8
 
9
9
  delegate [
10
- :each,
11
- :compressed?,
12
10
  :[],
11
+ :as_word,
12
+ :children,
13
+ :children_tree,
14
+ :compressed?,
15
+ :each,
16
+ :has_key?,
17
+ :inspect,
13
18
  :letter,
14
- :inspect
19
+ :parent,
20
+ :size,
21
+ :to_s
15
22
  ] => :root
16
23
 
17
24
  # Creates a new Trie.
@@ -45,7 +45,7 @@ module Rambling
45
45
  # @param [Array] chars the characters to look for in the trie.
46
46
  # @return [Array] all the words contained in the trie that start with the specified characters.
47
47
  def scan chars
48
- closest_node chars
48
+ chars.empty? ? self : closest_node(chars)
49
49
  end
50
50
 
51
51
  # Always return `false` for a raw (uncompressed) node.
@@ -57,18 +57,10 @@ module Rambling
57
57
  protected
58
58
 
59
59
  def closest_node chars
60
- if chars.empty?
61
- self
62
- else
63
- letter = chars.slice!(0).to_sym
64
- child = children_tree[letter]
60
+ letter = chars.slice!(0).to_sym
61
+ child = children_tree[letter]
65
62
 
66
- if child
67
- child.closest_node chars
68
- else
69
- Rambling::Trie::MissingNode.new
70
- end
71
- end
63
+ child ? child.scan(chars) : Rambling::Trie::MissingNode.new
72
64
  end
73
65
 
74
66
  private
@@ -1,6 +1,6 @@
1
1
  module Rambling
2
2
  module Trie
3
3
  # Current version of the rambling-trie.
4
- VERSION = '0.9.1'
4
+ VERSION = '0.9.2'
5
5
  end
6
6
  end
@@ -1,3 +1,4 @@
1
+ # Ruby 2.3.3
1
2
 
2
3
  Benchmark for rambling-trie version 0.8.1
3
4
  ==> Creation
@@ -0,0 +1,58 @@
1
+
2
+ Benchmark for rambling-trie version 0.9.2
3
+ ==> Creation
4
+ `Rambling::Trie.create`
5
+ 8.970000 0.200000 9.170000 ( 9.283692)
6
+
7
+ Benchmark for rambling-trie version 0.9.2
8
+ ==> Compression
9
+ `compress!`
10
+ 1.720000 0.030000 1.750000 ( 1.753067)
11
+ 1.660000 0.000000 1.660000 ( 1.671923)
12
+ 1.430000 0.010000 1.440000 ( 1.446879)
13
+ 1.240000 0.060000 1.300000 ( 1.313478)
14
+ 1.230000 0.060000 1.290000 ( 1.299892)
15
+
16
+ Benchmark for rambling-trie version 0.9.2
17
+ ==> Uncompressed
18
+ `word?`
19
+ hi true 0.230000 0.000000 0.230000 ( 0.233806)
20
+ help true 0.390000 0.000000 0.390000 ( 0.388282)
21
+ beautiful true 0.810000 0.000000 0.810000 ( 0.818193)
22
+ impressionism true 1.050000 0.010000 1.060000 ( 1.047699)
23
+ anthropological true 1.150000 0.000000 1.150000 ( 1.158661)
24
+ `partial_word?`
25
+ hi true 0.210000 0.000000 0.210000 ( 0.212588)
26
+ help true 0.410000 0.000000 0.410000 ( 0.409012)
27
+ beautiful true 0.770000 0.000000 0.770000 ( 0.778091)
28
+ impressionism true 0.990000 0.010000 1.000000 ( 0.997804)
29
+ anthropological true 1.140000 0.000000 1.140000 ( 1.142530)
30
+ ==> Compressed
31
+ `word?`
32
+ hi true 0.240000 0.000000 0.240000 ( 0.235445)
33
+ help true 0.390000 0.000000 0.390000 ( 0.397614)
34
+ beautiful true 0.760000 0.000000 0.760000 ( 0.757404)
35
+ impressionism true 1.030000 0.000000 1.030000 ( 1.036627)
36
+ anthropological true 1.290000 0.000000 1.290000 ( 1.291476)
37
+ `partial_word?`
38
+ hi true 1.070000 0.010000 1.080000 ( 1.084173)
39
+ help true 2.170000 0.010000 2.180000 ( 2.183891)
40
+ beautiful true 2.920000 0.000000 2.920000 ( 2.941010)
41
+ impressionism true 4.520000 0.010000 4.530000 ( 4.542043)
42
+ anthropological true 4.350000 0.010000 4.360000 ( 4.362716)
43
+
44
+ Benchmark for rambling-trie version 0.9.2
45
+ ==> Uncompressed
46
+ `scan`
47
+ hi 495 2.010000 0.010000 2.020000 ( 2.020800)
48
+ help 20 6.800000 0.050000 6.850000 ( 6.870425)
49
+ beautiful 6 2.600000 0.010000 2.610000 ( 2.618016)
50
+ impressionism 2 2.410000 0.000000 2.410000 ( 2.423997)
51
+ anthropological 2 2.820000 0.010000 2.830000 ( 2.825191)
52
+ ==> Compressed
53
+ `scan`
54
+ hi 495 1.180000 0.000000 1.180000 ( 1.191953)
55
+ help 20 5.350000 0.010000 5.360000 ( 5.360441)
56
+ beautiful 6 3.190000 0.010000 3.200000 ( 3.224402)
57
+ impressionism 2 5.790000 0.040000 5.830000 ( 5.892171)
58
+ anthropological 2 5.580000 0.020000 5.600000 ( 5.629519)
@@ -32,4 +32,124 @@ describe Rambling::Trie::CompressedNode do
32
32
  expect { node.add 'restaurant' }.to raise_error Rambling::Trie::InvalidOperation
33
33
  end
34
34
  end
35
+
36
+ describe '#partial_word?' do
37
+ let(:raw_node) { Rambling::Trie::RawNode.new }
38
+ let(:compressor) { Rambling::Trie::Compressor.new }
39
+ let(:node) { compressor.compress raw_node }
40
+
41
+ context 'when the chars array is empty' do
42
+ it 'returns true' do
43
+ expect(node.partial_word? []).to be true
44
+ end
45
+ end
46
+
47
+ context 'when the chars array is not empty' do
48
+ context 'when the node has a tree that matches the characters' do
49
+ before do
50
+ raw_node.add 'abc'
51
+ end
52
+
53
+ it 'returns true' do
54
+ expect(node.partial_word? %w(a)).to be true
55
+ expect(node.partial_word? %w(a b)).to be true
56
+ expect(node.partial_word? %w(a b c)).to be true
57
+ end
58
+ end
59
+
60
+ context 'when the node has a tree that does not match the characters' do
61
+ before do
62
+ raw_node.add 'cba'
63
+ end
64
+
65
+ it 'returns false' do
66
+ expect(node.partial_word? %w(a)).to be false
67
+ expect(node.partial_word? %w(a b)).to be false
68
+ expect(node.partial_word? %w(a b c)).to be false
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#word?' do
75
+ let(:raw_node) { Rambling::Trie::RawNode.new }
76
+ let(:compressor) { Rambling::Trie::Compressor.new }
77
+ let(:node) { compressor.compress raw_node }
78
+
79
+ context 'when the chars array is empty' do
80
+ context 'when the node is terminal' do
81
+ before do
82
+ node.terminal!
83
+ end
84
+
85
+ it 'returns true' do
86
+ expect(node.word? []).to be true
87
+ end
88
+ end
89
+
90
+ context 'when the node is not terminal' do
91
+ it 'returns false' do
92
+ expect(node.word? []).to be false
93
+ end
94
+ end
95
+ end
96
+
97
+ context 'when the chars array is not empty' do
98
+ context 'when the node has a tree that matches all the characters' do
99
+ before do
100
+ raw_node.add 'abc'
101
+ end
102
+
103
+ it 'returns true' do
104
+ expect(node.word? %w(a b c)).to be true
105
+ end
106
+ end
107
+
108
+ context 'when the node has a tree that does not match all the characters' do
109
+ before do
110
+ raw_node.add 'abc'
111
+ end
112
+
113
+ it 'returns false' do
114
+ expect(node.word? %w(a)).to be false
115
+ expect(node.word? %w(a b)).to be false
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#scan' do
122
+ let(:raw_node) { Rambling::Trie::RawNode.new }
123
+ let(:compressor) { Rambling::Trie::Compressor.new }
124
+ let(:node) { compressor.compress raw_node }
125
+
126
+ context 'when the chars array is empty' do
127
+ it 'returns itself' do
128
+ expect(node.scan []).to eq node
129
+ end
130
+ end
131
+
132
+ context 'when the chars array is not empty' do
133
+ before do
134
+ raw_node.add 'cba'
135
+ end
136
+
137
+ context 'when the chars are found' do
138
+ it 'returns the found child' do
139
+ expect(node.scan %w(c)).to eq node[:cba]
140
+ expect(node.scan %w(c b)).to eq node[:cba]
141
+ expect(node.scan %w(c b a)).to eq node[:cba]
142
+ end
143
+ end
144
+
145
+ context 'when the chars are not found' do
146
+ it 'returns a MissingNode' do
147
+ expect(node.scan %w(a)).to be_a Rambling::Trie::MissingNode
148
+ expect(node.scan %w(a b)).to be_a Rambling::Trie::MissingNode
149
+ expect(node.scan %w(a b c)).to be_a Rambling::Trie::MissingNode
150
+ expect(node.scan %w(c b a d)).to be_a Rambling::Trie::MissingNode
151
+ end
152
+ end
153
+ end
154
+ end
35
155
  end
@@ -152,12 +152,22 @@ describe Rambling::Trie::Container do
152
152
  describe 'delegates and aliases' do
153
153
  before do
154
154
  allow(root).to receive_messages(
155
- word?: nil,
156
- partial_word?: nil,
157
- scan: nil,
155
+ :[] => nil,
158
156
  add: nil,
157
+ as_word: nil,
158
+ children: nil,
159
+ children_tree: nil,
160
+ compressed?: nil,
159
161
  each: nil,
160
- compressed?: nil
162
+ has_key?: nil,
163
+ inspect: nil,
164
+ letter: nil,
165
+ parent: nil,
166
+ partial_word?: nil,
167
+ scan: nil,
168
+ size: nil,
169
+ to_s: nil,
170
+ word?: nil,
161
171
  )
162
172
  end
163
173
 
@@ -181,15 +191,65 @@ describe Rambling::Trie::Container do
181
191
  expect(root).to have_received(:add).with 'words'
182
192
  end
183
193
 
184
- it 'delegates `#each` to the root node' do
185
- container.each
186
- expect(root).to have_received :each
194
+ it 'delegates `#[]` to the root node' do
195
+ container.[]
196
+ expect(root).to have_received :[]
197
+ end
198
+
199
+ it 'delegates `#as_word` to the root node' do
200
+ container.as_word
201
+ expect(root).to have_received :as_word
202
+ end
203
+
204
+ it 'delegates `#children` to the root node' do
205
+ container.children
206
+ expect(root).to have_received :children
207
+ end
208
+
209
+ it 'delegates `#children_tree` to the root node' do
210
+ container.children_tree
211
+ expect(root).to have_received :children_tree
187
212
  end
188
213
 
189
214
  it 'delegates `#compressed?` to the root node' do
190
215
  container.compressed?
191
216
  expect(root).to have_received :compressed?
192
217
  end
218
+
219
+ it 'delegates `#each` to the root node' do
220
+ container.each
221
+ expect(root).to have_received :each
222
+ end
223
+
224
+ it 'delegates `#has_key?` to the root node' do
225
+ container.has_key?
226
+ expect(root).to have_received :has_key?
227
+ end
228
+
229
+ it 'delegates `#inspect` to the root node' do
230
+ container.inspect
231
+ expect(root).to have_received :inspect
232
+ end
233
+
234
+ it 'delegates `#letter` to the root node' do
235
+ container.letter
236
+ expect(root).to have_received :letter
237
+ end
238
+
239
+ it 'delegates `#parent` to the root node' do
240
+ container.parent
241
+ expect(root).to have_received :parent
242
+ end
243
+
244
+ it 'delegates `#size` to the root node' do
245
+ container.size
246
+ expect(root).to have_received :size
247
+ end
248
+
249
+ it 'delegates `#to_s` to the root node' do
250
+ container.to_s
251
+ expect(root).to have_received :to_s
252
+ end
193
253
  end
194
254
 
195
255
  describe '#compress!' do
@@ -316,6 +316,37 @@ describe Rambling::Trie::RawNode do
316
316
  end
317
317
  end
318
318
 
319
+ describe '#scan' do
320
+ context 'when the chars array is empty' do
321
+ it 'returns itself' do
322
+ expect(node.scan []).to eq node
323
+ end
324
+ end
325
+
326
+ context 'when the chars array is not empty' do
327
+ before do
328
+ node.add 'cba'
329
+ end
330
+
331
+ context 'when the chars are found' do
332
+ it 'returns the found child' do
333
+ expect(node.scan %w(c)).to eq node[:c]
334
+ expect(node.scan %w(c b)).to eq node[:c][:b]
335
+ expect(node.scan %w(c b a)).to eq node[:c][:b][:a]
336
+ end
337
+ end
338
+
339
+ context 'when the chars are not found' do
340
+ it 'returns a MissingNode' do
341
+ expect(node.scan %w(a)).to be_a Rambling::Trie::MissingNode
342
+ expect(node.scan %w(a b)).to be_a Rambling::Trie::MissingNode
343
+ expect(node.scan %w(a b c)).to be_a Rambling::Trie::MissingNode
344
+ expect(node.scan %w(c b a d)).to be_a Rambling::Trie::MissingNode
345
+ end
346
+ end
347
+ end
348
+ end
349
+
319
350
  describe '#as_word' do
320
351
  let(:node) { Rambling::Trie::RawNode.new }
321
352
 
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: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edgar Gonzalez
@@ -173,6 +173,7 @@ files:
173
173
  - reports/0.8.1/benchmark
174
174
  - reports/0.9.0/benchmark
175
175
  - reports/0.9.1/benchmark
176
+ - reports/0.9.2/benchmark
176
177
  - spec/assets/test_words.txt
177
178
  - spec/integration/rambling/trie_spec.rb
178
179
  - spec/lib/rambling/trie/compressed_node_spec.rb
@@ -205,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
206
  version: '0'
206
207
  requirements: []
207
208
  rubyforge_project:
208
- rubygems_version: 2.5.2
209
+ rubygems_version: 2.6.8
209
210
  signing_key:
210
211
  specification_version: 4
211
212
  summary: A custom implementation of the trie data structure.