rambling-trie 2.2.1 → 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 +5 -1
  3. data/LICENSE +1 -1
  4. data/README.md +37 -21
  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 +17 -15
  9. data/lib/rambling/trie/container.rb +18 -20
  10. data/lib/rambling/trie/enumerable.rb +4 -1
  11. data/lib/rambling/trie/nodes/compressed.rb +3 -3
  12. data/lib/rambling/trie/nodes/node.rb +18 -18
  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 +6 -5
  19. data/lib/rambling/trie/serializers/serializer.rb +27 -0
  20. data/lib/rambling/trie/serializers/yaml.rb +7 -7
  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 +12 -10
  26. data/rambling-trie.gemspec +8 -4
  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 +14 -9
  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 +26 -10
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rambling
4
+ module Trie
5
+ module Readers
6
+ # Base class for all readers.
7
+ class Reader
8
+ # Yields each word read from given file.
9
+ # @abstract Subclass and override {#each_word} to fit to a particular
10
+ # file format.
11
+ # @param [String] filepath the full path of the file to load the words
12
+ # from.
13
+ # @yield [String] Each line read from the file.
14
+ # @return [self]
15
+ def each_word filepath
16
+ raise NotImplementedError
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- %w(plain_text).each do |file|
3
+ %w(reader plain_text).each do |file|
4
4
  require File.join('rambling', 'trie', 'readers', file)
5
5
  end
6
6
 
@@ -4,7 +4,7 @@ module Rambling
4
4
  module Trie
5
5
  module Serializers
6
6
  # Basic file serializer. Dumps/loads string contents from files.
7
- class File
7
+ class File < Serializer
8
8
  # Loads contents from a specified filepath.
9
9
  # @param [String] filepath the filepath to load contents from.
10
10
  # @return [String] all contents of the file.
@@ -3,13 +3,14 @@
3
3
  module Rambling
4
4
  module Trie
5
5
  module Serializers
6
- # Serializer for Ruby marshal format (.marshal) files.
7
- class Marshal
6
+ # Serializer for Ruby marshal format (+.marshal+) files.
7
+ class Marshal < Serializer
8
8
  # Creates a new Marshal serializer.
9
9
  # @param [Serializer] serializer the serializer responsible to write to
10
10
  # and read from disk.
11
11
  def initialize serializer = nil
12
12
  @serializer = serializer || Rambling::Trie::Serializers::File.new
13
+ super()
13
14
  end
14
15
 
15
16
  # Loads marshaled object from contents in filepath and deserializes it
@@ -17,10 +18,10 @@ module Rambling
17
18
  # @param [String] filepath the full path of the file to load the
18
19
  # marshaled object from.
19
20
  # @return [Nodes::Node] The deserialized {Nodes::Node Node}.
20
- # @see https://ruby-doc.org/core-2.5.0/Marshal.html#method-c-load
21
+ # @see https://ruby-doc.org/core-2.7.0/Marshal.html#method-c-load
21
22
  # Marshal.load
22
23
  # @note Use of
23
- # {https://ruby-doc.org/core-2.5.0/Marshal.html#method-c-load
24
+ # {https://ruby-doc.org/core-2.7.0/Marshal.html#method-c-load
24
25
  # Marshal.load} is generally discouraged. Only use this with trusted
25
26
  # input.
26
27
  def load filepath
@@ -33,7 +34,7 @@ module Rambling
33
34
  # @param [String] filepath the full path of the file to dump the
34
35
  # marshaled object into.
35
36
  # @return [Numeric] number of bytes written to disk.
36
- # @see https://ruby-doc.org/core-2.5.0/Marshal.html#method-c-dump
37
+ # @see https://ruby-doc.org/core-2.7.0/Marshal.html#method-c-dump
37
38
  # Marshal.dump
38
39
  def dump node, filepath
39
40
  serializer.dump ::Marshal.dump(node), filepath
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rambling
4
+ module Trie
5
+ module Serializers
6
+ # Base class for all serializers.
7
+ class Serializer
8
+ # Loads contents from a specified filepath.
9
+ # @abstract Subclass and override {#load} to parse the desired format.
10
+ # @param [String] filepath the filepath to load contents from.
11
+ # @return [TContents] parsed contents from given file.
12
+ def load filepath
13
+ raise NotImplementedError
14
+ end
15
+
16
+ # Dumps contents into a specified filepath.
17
+ # @abstract Subclass and override {#dump} to output the desired format.
18
+ # @param [TContents] contents the contents to dump into given file.
19
+ # @param [String] filepath the filepath to dump the contents to.
20
+ # @return [Numeric] number of bytes written to disk.
21
+ def dump contents, filepath
22
+ raise NotImplementedError
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -3,13 +3,14 @@
3
3
  module Rambling
4
4
  module Trie
5
5
  module Serializers
6
- # Serializer for Ruby yaml format (.yaml) files.
7
- class Yaml
6
+ # Serializer for Ruby yaml format (+.yaml+, or +.yml+) files.
7
+ class Yaml < Serializer
8
8
  # Creates a new Yaml serializer.
9
9
  # @param [Serializer] serializer the serializer responsible to write to
10
10
  # and read from disk.
11
11
  def initialize serializer = nil
12
12
  @serializer = serializer || Rambling::Trie::Serializers::File.new
13
+ super()
13
14
  end
14
15
 
15
16
  # Loads serialized object from YAML file in filepath and deserializes
@@ -17,19 +18,18 @@ module Rambling
17
18
  # @param [String] filepath the full path of the file to load the
18
19
  # serialized YAML object from.
19
20
  # @return [Nodes::Node] The deserialized {Nodes::Node Node}.
20
- # @see https://ruby-doc.org/stdlib-2.5.0/libdoc/psych/rdoc/Psych.html#method-c-safe_load
21
+ # @see https://ruby-doc.org/stdlib-2.7.0/libdoc/psych/rdoc/Psych.html#method-c-safe_load
21
22
  # Psych.safe_load
22
23
  def load filepath
23
24
  require 'yaml'
24
25
  ::YAML.safe_load(
25
26
  serializer.load(filepath),
26
- [
27
+ permitted_classes: [
27
28
  Symbol,
28
29
  Rambling::Trie::Nodes::Raw,
29
30
  Rambling::Trie::Nodes::Compressed,
30
31
  ],
31
- [],
32
- true,
32
+ aliases: true,
33
33
  )
34
34
  end
35
35
 
@@ -39,7 +39,7 @@ module Rambling
39
39
  # @param [String] filepath the full path of the file to dump the YAML
40
40
  # object into.
41
41
  # @return [Numeric] number of bytes written to disk.
42
- # @see https://ruby-doc.org/stdlib-2.5.0/libdoc/psych/rdoc/Psych.html#method-c-dump
42
+ # @see https://ruby-doc.org/stdlib-2.7.0/libdoc/psych/rdoc/Psych.html#method-c-dump
43
43
  # Psych.dump
44
44
  def dump node, filepath
45
45
  require 'yaml'
@@ -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.2.1'
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
@@ -45,8 +45,8 @@ module Rambling
45
45
  # @yield [Container] the trie just loaded.
46
46
  # @see Rambling::Trie::Serializers Serializers.
47
47
  # @note Use of
48
- # {https://ruby-doc.org/core-2.5.0/Marshal.html#method-c-load
49
- # Marshal.load} is generally discouraged. Only use the `.marshal`
48
+ # {https://ruby-doc.org/core-2.7.0/Marshal.html#method-c-load
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"
@@ -29,9 +33,9 @@ Gem::Specification.new do |gem|
29
33
  gem.license = 'MIT'
30
34
  gem.version = Rambling::Trie::VERSION
31
35
  gem.platform = Gem::Platform::RUBY
32
- gem.required_ruby_version = '>= 2.5', '< 3.1'
36
+ gem.required_ruby_version = '>= 2.7', '< 4'
33
37
 
34
38
  gem.add_development_dependency 'rake', '~> 13.0'
35
- gem.add_development_dependency 'rspec', '~> 3.9'
36
- gem.add_development_dependency 'yard', '~> 0.9.25'
39
+ gem.add_development_dependency 'rspec', '~> 3.12'
40
+ gem.add_development_dependency 'yard', '~> 0.9.28'
37
41
  end
@@ -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