rambling-trie 2.4.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +28 -0
  3. data/Gemfile +20 -8
  4. data/Guardfile +16 -5
  5. data/README.md +38 -32
  6. data/Rakefile +6 -0
  7. data/Steepfile +35 -0
  8. data/lib/rambling/trie/comparable.rb +2 -2
  9. data/lib/rambling/trie/compressible.rb +1 -1
  10. data/lib/rambling/trie/compressor.rb +22 -19
  11. data/lib/rambling/trie/configuration/properties.rb +10 -6
  12. data/lib/rambling/trie/configuration/provider_collection.rb +14 -9
  13. data/lib/rambling/trie/configuration.rb +2 -3
  14. data/lib/rambling/trie/container.rb +32 -24
  15. data/lib/rambling/trie/enumerable.rb +5 -6
  16. data/lib/rambling/trie/nodes/compressed.rb +26 -16
  17. data/lib/rambling/trie/nodes/node.rb +35 -12
  18. data/lib/rambling/trie/nodes/raw.rb +18 -20
  19. data/lib/rambling/trie/nodes.rb +2 -3
  20. data/lib/rambling/trie/readers/plain_text.rb +3 -3
  21. data/lib/rambling/trie/readers.rb +2 -3
  22. data/lib/rambling/trie/serializers/file.rb +1 -3
  23. data/lib/rambling/trie/serializers/marshal.rb +4 -4
  24. data/lib/rambling/trie/serializers/yaml.rb +3 -3
  25. data/lib/rambling/trie/serializers/zip.rb +13 -5
  26. data/lib/rambling/trie/serializers.rb +2 -3
  27. data/lib/rambling/trie/stringifyable.rb +1 -1
  28. data/lib/rambling/trie/version.rb +1 -1
  29. data/lib/rambling/trie.rb +12 -15
  30. data/rambling-trie.gemspec +4 -10
  31. data/sig/lib/rambling/trie/comparable.rbs +17 -0
  32. data/sig/lib/rambling/trie/compressible.rbs +17 -0
  33. data/sig/lib/rambling/trie/compressor.rbs +17 -0
  34. data/sig/lib/rambling/trie/configuration/properties.rbs +28 -0
  35. data/sig/lib/rambling/trie/configuration/provider_collection.rbs +47 -0
  36. data/sig/lib/rambling/trie/container.rbs +69 -0
  37. data/sig/lib/rambling/trie/enumerable.rbs +23 -0
  38. data/sig/lib/rambling/trie/inspectable.rbs +27 -0
  39. data/sig/lib/rambling/trie/invalid_operation.rbs +7 -0
  40. data/sig/lib/rambling/trie/nodes/compressed.rbs +25 -0
  41. data/sig/lib/rambling/trie/nodes/missing.rbs +9 -0
  42. data/sig/lib/rambling/trie/nodes/node.rbs +69 -0
  43. data/sig/lib/rambling/trie/nodes/raw.rbs +27 -0
  44. data/sig/lib/rambling/trie/readers/plain_text.rbs +9 -0
  45. data/sig/lib/rambling/trie/readers/reader.rbs +9 -0
  46. data/sig/lib/rambling/trie/serializers/file.rbs +8 -0
  47. data/sig/lib/rambling/trie/serializers/marshal.rbs +13 -0
  48. data/sig/lib/rambling/trie/serializers/serializer.rbs +10 -0
  49. data/sig/lib/rambling/trie/serializers/yaml.rbs +13 -0
  50. data/sig/lib/rambling/trie/serializers/zip.rbs +21 -0
  51. data/sig/lib/rambling/trie/stringifyable.rbs +21 -0
  52. data/sig/lib/rambling/trie.rbs +27 -0
  53. data/sig/lib/zip/entry.rbs +11 -0
  54. data/sig/lib/zip/file.rbs +11 -0
  55. metadata +34 -123
  56. data/spec/assets/test_words.en_US.txt +0 -23
  57. data/spec/assets/test_words.es_DO.txt +0 -24
  58. data/spec/integration/rambling/trie_spec.rb +0 -116
  59. data/spec/lib/rambling/trie/comparable_spec.rb +0 -87
  60. data/spec/lib/rambling/trie/compressor_spec.rb +0 -111
  61. data/spec/lib/rambling/trie/configuration/properties_spec.rb +0 -75
  62. data/spec/lib/rambling/trie/configuration/provider_collection_spec.rb +0 -177
  63. data/spec/lib/rambling/trie/container_spec.rb +0 -466
  64. data/spec/lib/rambling/trie/enumerable_spec.rb +0 -50
  65. data/spec/lib/rambling/trie/inspectable_spec.rb +0 -62
  66. data/spec/lib/rambling/trie/nodes/compressed_spec.rb +0 -43
  67. data/spec/lib/rambling/trie/nodes/node_spec.rb +0 -9
  68. data/spec/lib/rambling/trie/nodes/raw_spec.rb +0 -184
  69. data/spec/lib/rambling/trie/readers/plain_text_spec.rb +0 -26
  70. data/spec/lib/rambling/trie/readers/reader_spec.rb +0 -14
  71. data/spec/lib/rambling/trie/serializers/file_spec.rb +0 -11
  72. data/spec/lib/rambling/trie/serializers/marshal_spec.rb +0 -10
  73. data/spec/lib/rambling/trie/serializers/serializer_spec.rb +0 -21
  74. data/spec/lib/rambling/trie/serializers/yaml_spec.rb +0 -10
  75. data/spec/lib/rambling/trie/serializers/zip_spec.rb +0 -36
  76. data/spec/lib/rambling/trie/stringifyable_spec.rb +0 -89
  77. data/spec/lib/rambling/trie_spec.rb +0 -244
  78. data/spec/spec_helper.rb +0 -42
  79. data/spec/support/config.rb +0 -15
  80. data/spec/support/helpers/add_word.rb +0 -20
  81. data/spec/support/helpers/one_line_heredoc.rb +0 -11
  82. data/spec/support/shared_examples/a_compressible_trie.rb +0 -46
  83. data/spec/support/shared_examples/a_container_partial_word.rb +0 -17
  84. data/spec/support/shared_examples/a_container_scan.rb +0 -14
  85. data/spec/support/shared_examples/a_container_word.rb +0 -43
  86. data/spec/support/shared_examples/a_container_words_within.rb +0 -44
  87. data/spec/support/shared_examples/a_serializable_trie.rb +0 -26
  88. data/spec/support/shared_examples/a_serializer.rb +0 -60
  89. data/spec/support/shared_examples/a_trie_data_structure.rb +0 -45
  90. data/spec/support/shared_examples/a_trie_node.rb +0 -135
  91. data/spec/support/shared_examples/a_trie_node_implementation.rb +0 -149
  92. data/spec/tmp/.gitkeep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25c794ace94646da9b2892ea80c8df575cb3c95fc870790df2b50edde7fbb91e
4
- data.tar.gz: e2be8d009e65109b52a1f36f524701b2d9452855aeceb8870e02fe7db52b150f
3
+ metadata.gz: 4c38f152f6ffdb5b7c3f5abde873ae3024651a52a7697fa4e706d01e28fe504e
4
+ data.tar.gz: 8cdec337b99995019a24d702b48dce2ee3e9a9e6acde298cd5cfef8086e93bc9
5
5
  SHA512:
6
- metadata.gz: cc61981cb9a93450b0f6159adb497f30de7fa7a7ddf98c69a3baa64ed9cd8757aa035d3f818b080822714b2b5505ed5cefbff7217ce952856630bacab2dc3afd
7
- data.tar.gz: 1afc2883a31ee9bbf63172c20d806ed952d40bc65527f582308fbe61b8c83dddc3aa3b3ab1b300ded46bf7dbd2f6e73340d22019de4ca82e0587a81bb789725c
6
+ metadata.gz: 6bbadda2f93e7efdae19f0db8749e304be56b288d62095a269904c4d6e3b6e2f7723acba618fd4e8e8de416108ca9e6249c7a6c9ce5a70e70036e6ad287cb7e2
7
+ data.tar.gz: b60a49628ba61bca14d5a92573df83203feb0346d306adbc628ab7dfad54da82574902ee1f4985a365582a6c5a285b788a108ee7e7d2c22b0ce3f06dc5eccf78
data/Dockerfile ADDED
@@ -0,0 +1,28 @@
1
+ FROM ruby:3.3.6
2
+
3
+ RUN bundle config --global frozen 1
4
+
5
+ WORKDIR /usr/rambling-trie
6
+ RUN git init
7
+
8
+ # Copy strictly what is necessary to install dependencies
9
+ COPY Gemfile Gemfile.lock rambling-trie.gemspec ./
10
+ COPY lib ./lib
11
+
12
+ # Install dependencies
13
+ RUN bundle install
14
+
15
+ # Copy rest of Ruby and Markdown files
16
+ COPY Rakefile ./
17
+ COPY *.md ./
18
+ COPY assets ./assets
19
+ COPY sig ./sig
20
+ COPY spec ./spec
21
+ COPY tasks ./tasks
22
+ COPY scripts ./scripts
23
+
24
+ # Copy rest of configuration files
25
+ COPY *file ./
26
+ COPY *.yml ./
27
+ COPY .mdl* ./
28
+ COPY .yardopts ./
data/Gemfile CHANGED
@@ -7,26 +7,38 @@ gemspec
7
7
  gem 'rubyzip'
8
8
 
9
9
  group :development do
10
- gem 'benchmark-ips'
11
- gem 'flamegraph'
12
- gem 'memory_profiler'
13
- gem 'pry'
14
- gem 'ruby-prof'
15
- gem 'stackprof'
10
+ gem 'rake'
11
+ gem 'rspec'
16
12
  end
17
13
 
18
14
  group :test do
19
- gem 'coveralls_reborn', '~> 0.27.0', require: false
15
+ gem 'coveralls_reborn', require: false
20
16
  gem 'rspec_junit_formatter'
21
17
  gem 'simplecov', require: false
22
18
  end
23
19
 
24
20
  group :local do
21
+ gem 'benchmark-ips', require: false
22
+ gem 'flamegraph', require: false
25
23
  gem 'flog', require: false
26
- gem 'guard-rspec'
24
+ gem 'guard', require: false
25
+ gem 'guard-reek', require: false
26
+ gem 'guard-rspec', require: false
27
+ gem 'guard-rubocop', require: false
28
+ gem 'guard-yard', require: false
27
29
  gem 'mdl', require: false
30
+ gem 'memory_profiler', require: false
31
+ gem 'pry', require: false
32
+ gem 'racc', require: false
33
+ gem 'rbs', require: false
34
+ gem 'redcarpet', require: false
35
+ gem 'reek', require: false
28
36
  gem 'rubocop', require: false
29
37
  gem 'rubocop-performance', require: false
30
38
  gem 'rubocop-rake', require: false
31
39
  gem 'rubocop-rspec', require: false
40
+ gem 'ruby-prof', require: false
41
+ gem 'stackprof', require: false
42
+ gem 'steep', require: false
43
+ gem 'yard', require: false
32
44
  end
data/Guardfile CHANGED
@@ -1,10 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # A sample Guardfile
4
- # More info at https://github.com/guard/guard#readme
3
+ LIB_REGEX = %r{^lib/(.+)\.rb$}
5
4
 
6
- guard 'rspec', cmd: 'rspec', all_on_start: true, all_after_pass: false do
5
+ guard :reek, all_on_start: true, run_all: true do
6
+ watch(LIB_REGEX)
7
+ end
8
+
9
+ guard :rspec, cmd: 'rspec', all_on_start: true, all_after_pass: false do
7
10
  watch(%r{^spec/.+_spec\.rb$})
8
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
- watch('spec/spec_helper.rb') { 'spec' }
11
+ watch(LIB_REGEX) { |m| "spec/lib/#{m[1]}_spec.rb" }
12
+ watch('spec/spec_helper.rb') { 'spec' }
13
+ end
14
+
15
+ guard :rubocop, all_on_start: true do
16
+ watch(LIB_REGEX)
17
+ end
18
+
19
+ guard :yard, server: false do
20
+ watch(LIB_REGEX)
10
21
  end
data/README.md CHANGED
@@ -21,7 +21,7 @@ and is designed to be very fast to traverse.
21
21
 
22
22
  You will need:
23
23
 
24
- * Ruby 2.7.0 or up
24
+ * Ruby 3.1.0 or up
25
25
  * RubyGems
26
26
 
27
27
  See [RVM][rvm], [rbenv][rbenv] or [chruby][chruby] for more information on how to manage Ruby versions.
@@ -30,13 +30,13 @@ See [RVM][rvm], [rbenv][rbenv] or [chruby][chruby] for more information on how t
30
30
 
31
31
  You can either install it manually with:
32
32
 
33
- ``` bash
33
+ ```shell
34
34
  gem install rambling-trie
35
35
  ```
36
36
 
37
37
  Or, include it in your `Gemfile` and bundle it:
38
38
 
39
- ``` ruby
39
+ ```ruby
40
40
  gem 'rambling-trie'
41
41
  ```
42
42
 
@@ -46,13 +46,13 @@ gem 'rambling-trie'
46
46
 
47
47
  To create a new trie, initialize it like this:
48
48
 
49
- ``` ruby
49
+ ```ruby
50
50
  trie = Rambling::Trie.create
51
51
  ```
52
52
 
53
53
  You can also provide a block and the created trie instance will be yielded for you to perform any operation on it:
54
54
 
55
- ``` ruby
55
+ ```ruby
56
56
  Rambling::Trie.create do |trie|
57
57
  trie << 'word'
58
58
  end
@@ -61,13 +61,13 @@ end
61
61
  Additionally, you can provide the path to a file that contains all the words to be added to the trie, and it will read
62
62
  the file and create the complete structure for you, like this:
63
63
 
64
- ``` ruby
64
+ ```ruby
65
65
  trie = Rambling::Trie.create '/path/to/file'
66
66
  ```
67
67
 
68
68
  By default, a plain text file with the following format will be expected:
69
69
 
70
- ``` text
70
+ ```text
71
71
  some
72
72
  words
73
73
  to
@@ -85,20 +85,26 @@ readers.
85
85
 
86
86
  To add new words to the trie, use `#add` or its alias `#<<`:
87
87
 
88
- ``` ruby
88
+ ```ruby
89
89
  trie.add 'word'
90
90
  trie << 'word'
91
91
  ```
92
92
 
93
- Or if you have multiple words to add, you can use `#concat`:
93
+ Or if you have multiple words to add, you can use `#concat` or `#push`:
94
94
 
95
- ``` ruby
95
+ ```ruby
96
96
  trie.concat %w(a collection of words)
97
+ trie.push 'a', 'collection', 'of', 'words'
98
+
99
+ # or
100
+ words = %w(a collection of words)
101
+ trie.concat words
102
+ trie.push *words
97
103
  ```
98
104
 
99
105
  And to find out if a word already exists in the trie, use `#word?` or its alias `#include?`:
100
106
 
101
- ``` ruby
107
+ ```ruby
102
108
  trie.word? 'word'
103
109
  trie.include? 'word'
104
110
  ```
@@ -106,21 +112,21 @@ trie.include? 'word'
106
112
  If you wish to find if part of a word exists in the trie instance, you should call `#partial_word?` or its
107
113
  alias `#match?`:
108
114
 
109
- ``` ruby
115
+ ```ruby
110
116
  trie.partial_word? 'partial_word'
111
117
  trie.match? 'partial_word'
112
118
  ```
113
119
 
114
120
  To get all the words that start with a particular string, you can use `#scan` or its alias `#words`:
115
121
 
116
- ``` ruby
122
+ ```ruby
117
123
  trie.scan 'hi' # => ['hi', 'high', 'highlight', ...]
118
124
  trie.words 'hi' # => ['hi', 'high', 'highlight', ...]
119
125
  ```
120
126
 
121
127
  To get all the words within a given string, you can use `#words_within`:
122
128
 
123
- ``` ruby
129
+ ```ruby
124
130
  trie.words_within 'ifdxawesome45someword3' # => ['if', 'aw', 'awe', ...]
125
131
  trie.words_within 'tktktktk' # => []
126
132
  ```
@@ -128,7 +134,7 @@ trie.words_within 'tktktktk' # => []
128
134
  Or, if you're just interested in knowing whether a given string contains any valid words or not, you can
129
135
  use `#words_within?`:
130
136
 
131
- ``` ruby
137
+ ```ruby
132
138
  trie.words_within? 'ifdxawesome45someword3' # => true
133
139
  trie.words_within? 'tktktktk' # => false
134
140
  ```
@@ -138,7 +144,7 @@ trie.words_within? 'tktktktk' # => false
138
144
  By default, the Rambling Trie works as a standard trie. Starting from version 0.1.0, you can obtain a compressed trie
139
145
  from the standard one, by using the compression feature. Just call the `#compress!` method on the trie instance:
140
146
 
141
- ``` ruby
147
+ ```ruby
142
148
  trie.compress!
143
149
  ```
144
150
 
@@ -151,13 +157,13 @@ non-terminal nodes).
151
157
 
152
158
  If you want, you can also create a new compressed trie and leave the existing one intact. Just use `#compress` instead:
153
159
 
154
- ``` ruby
160
+ ```ruby
155
161
  compressed_trie = trie.compress
156
162
  ```
157
163
 
158
164
  You can find out if a trie instance is compressed by calling the `#compressed?` method. From the `#compress` example:
159
165
 
160
- ``` ruby
166
+ ```ruby
161
167
  trie.compressed? # => false
162
168
  compressed_trie.compressed? # => true
163
169
  ```
@@ -167,7 +173,7 @@ compressed_trie.compressed? # => true
167
173
  Starting from version 0.4.2, you can use any `Enumerable` method over a trie instance, and it will iterate over each
168
174
  word contained in the trie. You can now do things like:
169
175
 
170
- ``` ruby
176
+ ```ruby
171
177
  trie.each { |word| puts word }
172
178
  trie.any? { |word| word.include? 'x' }
173
179
  trie.all? { |word| word.include? 'x' }
@@ -183,14 +189,14 @@ change with little frequency.
183
189
 
184
190
  To store a trie on disk, you can use `.dump` like this:
185
191
 
186
- ``` ruby
192
+ ```ruby
187
193
  Rambling::Trie.dump trie, '/path/to/file'
188
194
  ```
189
195
 
190
196
  Then, when you need to use a trie next time, you don't have to create a new one with all the necessary words. Rather,
191
197
  you can retrieve a previously stored one with `.load` like this:
192
198
 
193
- ``` ruby
199
+ ```ruby
194
200
  trie = Rambling::Trie.load '/path/to/file'
195
201
  ```
196
202
 
@@ -208,19 +214,19 @@ Currently, these formats are supported to store tries on disk:
208
214
  Optionally, you can use a `.zip` version of the supported formats. In order to do so, you'll have to install
209
215
  the [`rubyzip`][rubyzip] gem:
210
216
 
211
- ``` bash
217
+ ```shell
212
218
  gem install rubyzip
213
219
  ```
214
220
 
215
221
  Or, include it in your `Gemfile` and bundle it:
216
222
 
217
- ``` ruby
223
+ ```ruby
218
224
  gem 'rubyzip'
219
225
  ```
220
226
 
221
227
  Then, you can load contents form a `.zip` file like this:
222
228
 
223
- ``` ruby
229
+ ```ruby
224
230
  require 'zip'
225
231
  trie = Rambling::Trie.load '/path/to/file.zip'
226
232
  ```
@@ -271,11 +277,11 @@ The Rambling Trie has been tested with the following Ruby versions:
271
277
  * 3.3.x
272
278
  * 3.2.x
273
279
  * 3.1.x
274
- * 3.0.x
275
- * 2.7.x
276
280
 
277
281
  **No longer supported**:
278
282
 
283
+ * 3.0.x (EOL'ed)
284
+ * 2.7.x (EOL'ed)
279
285
  * 2.6.x (EOL'ed)
280
286
  * 2.5.x (EOL'ed)
281
287
  * 2.4.x (EOL'ed)
@@ -310,7 +316,7 @@ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEM
310
316
  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
311
317
  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
312
318
 
313
- [badge_fury_badge]: https://badge.fury.io/rb/rambling-trie.svg?version=2.4.0
319
+ [badge_fury_badge]: https://badge.fury.io/rb/rambling-trie.svg?version=2.5.1
314
320
  [badge_fury_link]: https://badge.fury.io/rb/rambling-trie
315
321
  [chruby]: https://github.com/postmodern/chruby
316
322
  [code_climate_grade_badge]: https://codeclimate.com/github/gonzedge/rambling-trie/badges/gpa.svg
@@ -327,17 +333,17 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
327
333
  [github_action_codeql_badge]: https://github.com/gonzedge/rambling-trie/actions/workflows/codeql.yml/badge.svg
328
334
  [github_action_codeql_link]: https://github.com/gonzedge/rambling-trie/actions/workflows/codeql.yml
329
335
  [github_user_gonzedge]: https://github.com/gonzedge
330
- [inch_ci_badge]: https://inch-ci.org/github/gonzedge/rambling-trie.svg?branch=master
336
+ [inch_ci_badge]: https://inch-ci.org/github/gonzedge/rambling-trie.svg?branch=main
331
337
  [license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
332
338
  [license_link]: https://opensource.org/licenses/mit-license.php
333
- [marshal]: https://ruby-doc.org/core-2.7.0/Marshal.html
339
+ [marshal]: https://ruby-doc.org/3.3.0/Marshal.html
334
340
  [rambling_trie_configuration]: https://github.com/gonzedge/rambling-trie#configuration
335
- [rambling_trie_contributing_guide]: https://github.com/gonzedge/rambling-trie/blob/master/CONTRIBUTING.md
336
- [rambling_trie_plain_text_reader]: https://github.com/gonzedge/rambling-trie/blob/master/lib/rambling/trie/readers/plain_text.rb
341
+ [rambling_trie_contributing_guide]: https://github.com/gonzedge/rambling-trie/blob/main/CONTRIBUTING.md
342
+ [rambling_trie_plain_text_reader]: https://github.com/gonzedge/rambling-trie/blob/main/lib/rambling/trie/readers/plain_text.rb
337
343
  [rbenv]: https://github.com/sstephenson/rbenv
338
344
  [rubydoc]: http://rubydoc.info/gems/rambling-trie
339
345
  [rubydoc_github]: http://rubydoc.info/github/gonzedge/rambling-trie
340
346
  [rubyzip]: https://github.com/rubyzip/rubyzip
341
347
  [rvm]: https://rvm.io
342
348
  [trie_wiki]: https://en.wikipedia.org/wiki/Trie
343
- [yaml]: https://ruby-doc.org/stdlib-2.7.0/libdoc/yaml/rdoc/YAML.html
349
+ [yaml]: https://ruby-doc.org/3.3.0/stdlibs/yaml/YAML.html
data/Rakefile CHANGED
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
+ require 'reek/rake/task'
4
5
  require 'rspec/core/rake_task'
5
6
  require 'rubocop/rake_task'
7
+ require 'steep/rake_task'
8
+ require 'yard'
6
9
 
7
10
  require 'rambling-trie'
8
11
  require_relative 'tasks/performance'
@@ -10,6 +13,9 @@ require_relative 'tasks/serialization'
10
13
  require_relative 'tasks/ips'
11
14
 
12
15
  RSpec::Core::RakeTask.new :spec
16
+ Reek::Rake::Task.new :reek
13
17
  RuboCop::RakeTask.new :rubocop
18
+ Steep::RakeTask.new :steep
19
+ YARD::Rake::YardocTask.new :yard
14
20
 
15
21
  task default: :spec
data/Steepfile ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # D = Steep::Diagnostic
4
+ #
5
+ target :lib do
6
+ signature 'sig'
7
+
8
+ check 'lib'
9
+ # check 'tasks'
10
+
11
+ # check 'Gemfile'
12
+ # check 'Guardfile'
13
+ # check 'Rakefile'
14
+ # check 'Steepfile'
15
+
16
+ # library 'rubyzip'
17
+ library 'yaml'
18
+ library 'securerandom'
19
+
20
+ # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default)
21
+ # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
22
+ # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
23
+ # configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting
24
+ # configure_code_diagnostics do |hash| # You can setup everything yourself
25
+ # hash[D::Ruby::NoMethod] = :information
26
+ # end
27
+ end
28
+
29
+ # target :test do
30
+ # signature 'sig', 'sig-private'
31
+ #
32
+ # check 'test'
33
+ #
34
+ # # library 'pathname' # Standard libraries
35
+ # end
@@ -6,8 +6,8 @@ module Rambling
6
6
  module Comparable
7
7
  # Compares two nodes.
8
8
  # @param [Nodes::Node] other the node to compare against.
9
- # @return [Boolean] +true+ if the nodes' {Nodes::Node#letter #letter} and
10
- # {Nodes::Node#children_tree #children_tree} are equal, +false+ otherwise.
9
+ # @return [Boolean] `true` if the nodes' {Nodes::Node#letter #letter} and
10
+ # {Nodes::Node#children_tree #children_tree} are equal, `false` otherwise.
11
11
  def == other
12
12
  letter == other.letter &&
13
13
  terminal? == other.terminal? &&
@@ -5,7 +5,7 @@ module Rambling
5
5
  # Provides the compressible behavior for the trie data structure.
6
6
  module Compressible
7
7
  # Indicates if the current {Rambling::Trie::Nodes::Node Node} can be compressed or not.
8
- # @return [Boolean] +true+ for non-{Nodes::Node#terminal? terminal} nodes with one child, +false+ otherwise.
8
+ # @return [Boolean] `true` for non-{Nodes::Node#terminal? terminal} nodes with one child, `false` otherwise.
9
9
  def compressible?
10
10
  !(root? || terminal?) && 1 == children_tree.size
11
11
  end
@@ -5,11 +5,13 @@ module Rambling
5
5
  # Responsible for the compression process of a trie data structure.
6
6
  class Compressor
7
7
  # Compresses a {Nodes::Node Node} from a trie data structure.
8
- # @param [Nodes::Raw] node the node to compress.
9
- # @return [Nodes::Compressed] node the compressed version of the node.
8
+ # @param [Nodes::Node, nil] node the node to compress.
9
+ # @return [Nodes::Compressed, nil] node the compressed version of the node.
10
10
  def compress node
11
+ return unless node
12
+
11
13
  if node.compressible?
12
- compress_child_and_merge node
14
+ compress_only_child_and_merge node
13
15
  else
14
16
  compress_children_and_copy node
15
17
  end
@@ -17,38 +19,39 @@ module Rambling
17
19
 
18
20
  private
19
21
 
20
- def compress_child_and_merge node
21
- merge node, compress(node.first_child)
22
+ # Compresses a {Nodes::Node Node} with an only child from a trie data structure.
23
+ # By this point we already know the node is not nil and that it has an only child,
24
+ # so we use the type annotation because compressed_child will always have a value.
25
+ # @see Rambling::Trie::Compressible#compressible? Compressible#compressible?
26
+ # @param [Nodes::Node] node the node to compress.
27
+ # @return [Nodes::Compressed] node the compressed version of the node.
28
+ def compress_only_child_and_merge node
29
+ compressed_child = compress(node.first_child) # : Nodes::Compressed
30
+ merge node, compressed_child
22
31
  end
23
32
 
24
33
  def merge node, other
25
34
  letter = node.letter.to_s << other.letter.to_s
26
35
 
27
- new_compressed_node letter.to_sym, node.parent, other.children_tree, other.terminal?
36
+ compressed = Rambling::Trie::Nodes::Compressed.new letter.to_sym, node.parent, other.children_tree
37
+ compressed.terminal! if other.terminal?
38
+ compressed
28
39
  end
29
40
 
30
41
  def compress_children_and_copy node
31
- new_compressed_node node.letter, node.parent, compress_children(node.children_tree), node.terminal?
42
+ children_tree = compress_children(node.children_tree)
43
+ compressed = Rambling::Trie::Nodes::Compressed.new node.letter, node.parent, children_tree
44
+ compressed.terminal! if node.terminal?
45
+ compressed
32
46
  end
33
47
 
34
48
  def compress_children tree
35
49
  new_tree = {}
36
50
 
37
- tree.each do |letter, child|
38
- compressed_child = compress child
39
- new_tree[letter] = compressed_child
40
- end
51
+ tree.each { |letter, child| new_tree[letter] = compress child }
41
52
 
42
53
  new_tree
43
54
  end
44
-
45
- def new_compressed_node letter, parent, tree, terminal
46
- node = Rambling::Trie::Nodes::Compressed.new letter, parent, tree
47
- node.terminal! if terminal
48
-
49
- tree.each_value { |child| child.parent = node }
50
- node
51
- end
52
55
  end
53
56
  end
54
57
  end
@@ -4,6 +4,7 @@ module Rambling
4
4
  module Trie
5
5
  module Configuration
6
6
  # Provides configurable properties for Rambling::Trie.
7
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
7
8
  class Properties
8
9
  # The configured {Readers Readers}.
9
10
  # @return [ProviderCollection<Readers::Reader>] the mapping of configured {Readers Readers}.
@@ -17,12 +18,12 @@ module Rambling
17
18
  # @return [Compressor] the configured compressor.
18
19
  attr_accessor :compressor
19
20
 
20
- # The configured +root_builder+, which returns a {Nodes::Node Node} when called.
21
- # @return [Proc<Nodes::Node>] the configured +root_builder+.
21
+ # The configured `root_builder`, which returns a {Nodes::Node Node} when called.
22
+ # @return [Proc<Nodes::Node>] the configured `root_builder`.
22
23
  attr_accessor :root_builder
23
24
 
24
- # The configured +tmp_path+, which will be used for throwaway files.
25
- # @return [String] the configured +tmp_path+.
25
+ # The configured `tmp_path`, which will be used for throwaway files.
26
+ # @return [String] the configured `tmp_path`.
26
27
  attr_accessor :tmp_path
27
28
 
28
29
  # Returns a new properties instance.
@@ -46,8 +47,11 @@ module Rambling
46
47
  attr_writer :readers, :serializers
47
48
 
48
49
  def reset_readers
49
- plain_text_reader = Rambling::Trie::Readers::PlainText.new
50
- @readers = Rambling::Trie::Configuration::ProviderCollection.new :reader, txt: plain_text_reader
50
+ @readers = Rambling::Trie::Configuration::ProviderCollection.new :reader, default_reader_providers
51
+ end
52
+
53
+ def default_reader_providers
54
+ { txt: Rambling::Trie::Readers::PlainText.new }
51
55
  end
52
56
 
53
57
  def reset_serializers
@@ -17,7 +17,7 @@ module Rambling
17
17
  # providers.
18
18
  # @param [TProvider] provider the provider to use as default.
19
19
  # @raise [ArgumentError] when the given provider is not in the provider collection.
20
- # @note If no providers have been configured, +nil+ will be assigned.
20
+ # @note If no providers have been configured, `nil` will be assigned.
21
21
  # @return [TProvider, nil] the default provider to use when a provider cannot be resolved in
22
22
  # {ProviderCollection#resolve #resolve}.
23
23
  attr_reader :default
@@ -58,20 +58,25 @@ module Rambling
58
58
  # @param [String] filepath the filepath to resolve into a provider.
59
59
  # @return [TProvider, nil] the provider for the given file's extension. {#default} if not found.
60
60
  def resolve filepath
61
- providers[file_format filepath] || default
61
+ extension = file_format filepath
62
+ if providers.key? extension
63
+ providers[extension]
64
+ else
65
+ default
66
+ end
62
67
  end
63
68
 
64
69
  # Resets the provider collection to the initial values.
65
70
  # @return [void]
66
71
  def reset
67
72
  providers.clear
68
- configured_providers.each { |k, v| self[k] = v }
73
+ configured_providers.each { |extension, provider| self[extension] = provider }
69
74
  self.default = configured_default
70
75
  end
71
76
 
72
77
  # Get provider corresponding to a given format.
73
78
  # @return [Array<Symbol>] the provider corresponding to that format.
74
- # @see https://ruby-doc.org/core-2.7.0/Hash.html#method-i-5B-5D
79
+ # @see https://ruby-doc.org/3.3.0/Hash.html#method-i-5B-5D
75
80
  # Hash#keys
76
81
  def formats
77
82
  providers.keys
@@ -80,7 +85,7 @@ module Rambling
80
85
  # Get provider corresponding to a given format.
81
86
  # @param [Symbol] format the format to search for in the collection.
82
87
  # @return [TProvider] the provider corresponding to that format.
83
- # @see https://ruby-doc.org/core-2.7.0/Hash.html#method-i-5B-5D Hash#[]
88
+ # @see https://ruby-doc.org/3.3.0/Hash.html#method-i-5B-5D Hash#[]
84
89
  def [] format
85
90
  providers[format]
86
91
  end
@@ -98,13 +103,13 @@ module Rambling
98
103
  end
99
104
 
100
105
  def file_format filepath
101
- format = File.extname filepath
102
- format.slice! 0
103
- format.to_sym
106
+ File.extname(filepath).sub(%r{^\.}, '').to_sym
104
107
  end
105
108
 
106
109
  def contains? provider
107
- provider.nil? || (providers.any? && provider_instances.include?(provider))
110
+ return true if provider.nil?
111
+
112
+ providers.any? && provider_instances.include?(provider || raise)
108
113
  end
109
114
 
110
115
  alias_method :provider_instances, :values
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- %w(properties provider_collection).each do |file|
4
- require File.join('rambling', 'trie', 'configuration', file)
5
- end
3
+ path = File.join 'rambling', 'trie', 'configuration'
4
+ %w(properties provider_collection).each { |file| require File.join(path, file) }
6
5
 
7
6
  module Rambling
8
7
  module Trie