rambling-trie 0.9.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/LICENSE +1 -1
  4. data/README.md +133 -26
  5. data/Rakefile +1 -2
  6. data/lib/rambling/trie.rb +53 -9
  7. data/lib/rambling/trie/comparable.rb +16 -0
  8. data/lib/rambling/trie/compressable.rb +14 -0
  9. data/lib/rambling/trie/compressed_node.rb +38 -14
  10. data/lib/rambling/trie/compressor.rb +14 -10
  11. data/lib/rambling/trie/configuration.rb +11 -0
  12. data/lib/rambling/trie/configuration/properties.rb +66 -0
  13. data/lib/rambling/trie/configuration/provider_collection.rb +101 -0
  14. data/lib/rambling/trie/container.rb +57 -17
  15. data/lib/rambling/trie/enumerable.rb +1 -1
  16. data/lib/rambling/trie/forwardable.rb +9 -4
  17. data/lib/rambling/trie/inspectable.rb +37 -0
  18. data/lib/rambling/trie/invalid_operation.rb +3 -2
  19. data/lib/rambling/trie/missing_node.rb +2 -1
  20. data/lib/rambling/trie/node.rb +40 -30
  21. data/lib/rambling/trie/raw_node.rb +29 -13
  22. data/lib/rambling/trie/readers.rb +11 -0
  23. data/lib/rambling/trie/readers/plain_text.rb +26 -0
  24. data/lib/rambling/trie/serializers.rb +11 -0
  25. data/lib/rambling/trie/serializers/file.rb +25 -0
  26. data/lib/rambling/trie/serializers/marshal.rb +38 -0
  27. data/lib/rambling/trie/serializers/yaml.rb +39 -0
  28. data/lib/rambling/trie/serializers/zip.rb +67 -0
  29. data/lib/rambling/trie/stringifyable.rb +20 -0
  30. data/lib/rambling/trie/version.rb +1 -1
  31. data/rambling-trie.gemspec +2 -2
  32. data/spec/integration/rambling/trie_spec.rb +45 -49
  33. data/spec/lib/rambling/trie/comparable_spec.rb +104 -0
  34. data/spec/lib/rambling/trie/compressed_node_spec.rb +44 -0
  35. data/spec/lib/rambling/trie/configuration/properties_spec.rb +49 -0
  36. data/spec/lib/rambling/trie/configuration/provider_collection_spec.rb +165 -0
  37. data/spec/lib/rambling/trie/container_spec.rb +127 -38
  38. data/spec/lib/rambling/trie/{inspector_spec.rb → inspectable_spec.rb} +7 -5
  39. data/spec/lib/rambling/trie/raw_node_spec.rb +22 -41
  40. data/spec/lib/rambling/trie/readers/plain_text_spec.rb +14 -0
  41. data/spec/lib/rambling/trie/serializers/file_spec.rb +11 -0
  42. data/spec/lib/rambling/trie/serializers/marshal_spec.rb +14 -0
  43. data/spec/lib/rambling/trie/serializers/yaml_spec.rb +14 -0
  44. data/spec/lib/rambling/trie/serializers/zip_spec.rb +30 -0
  45. data/spec/lib/rambling/trie/stringifyable_spec.rb +82 -0
  46. data/spec/lib/rambling/trie_spec.rb +120 -7
  47. data/spec/spec_helper.rb +7 -1
  48. data/spec/support/config.rb +5 -0
  49. data/spec/support/shared_examples/a_compressable_trie.rb +26 -0
  50. data/spec/support/shared_examples/a_serializable_trie.rb +26 -0
  51. data/spec/support/shared_examples/a_serializer.rb +29 -0
  52. data/spec/support/shared_examples/a_trie_data_structure.rb +29 -0
  53. data/spec/tmp/.gitkeep +0 -0
  54. metadata +51 -24
  55. data/lib/rambling/trie/compression.rb +0 -13
  56. data/lib/rambling/trie/inspector.rb +0 -11
  57. data/lib/rambling/trie/plain_text_reader.rb +0 -23
  58. data/lib/rambling/trie/tasks/gem.rb +0 -17
  59. data/lib/rambling/trie/tasks/helpers/path.rb +0 -17
  60. data/lib/rambling/trie/tasks/helpers/performance_report.rb +0 -17
  61. data/lib/rambling/trie/tasks/helpers/time.rb +0 -7
  62. data/lib/rambling/trie/tasks/performance.rb +0 -15
  63. data/lib/rambling/trie/tasks/performance/all.rb +0 -17
  64. data/lib/rambling/trie/tasks/performance/benchmark.rb +0 -201
  65. data/lib/rambling/trie/tasks/performance/directory.rb +0 -11
  66. data/lib/rambling/trie/tasks/performance/flamegraph.rb +0 -119
  67. data/lib/rambling/trie/tasks/performance/profile/call_tree.rb +0 -147
  68. data/lib/rambling/trie/tasks/performance/profile/memory.rb +0 -143
  69. data/spec/lib/rambling/trie/plain_text_reader_spec.rb +0 -18
@@ -2,7 +2,9 @@ require 'spec_helper'
2
2
 
3
3
  describe Rambling::Trie do
4
4
  describe '.create' do
5
- let(:container) { double :container }
5
+ let(:root) { Rambling::Trie::RawNode.new }
6
+ let(:compressor) { Rambling::Trie::Compressor.new }
7
+ let!(:container) { Rambling::Trie::Container.new root, compressor }
6
8
 
7
9
  before do
8
10
  allow(Rambling::Trie::Container).to receive(:new)
@@ -16,9 +18,9 @@ describe Rambling::Trie do
16
18
 
17
19
  context 'with a block' do
18
20
  it 'yields the new container' do
19
- yielded_trie = nil
20
- Rambling::Trie.create { |trie| yielded_trie = trie }
21
- expect(yielded_trie).to eq container
21
+ yielded = nil
22
+ Rambling::Trie.create { |trie| yielded = trie }
23
+ expect(yielded).to eq container
22
24
  end
23
25
  end
24
26
 
@@ -48,15 +50,126 @@ describe Rambling::Trie do
48
50
  let(:reader) { double :reader, each_word: nil }
49
51
 
50
52
  before do
51
- allow(Rambling::Trie::PlainTextReader).to receive(:new)
52
- .and_return reader
53
+ Rambling::Trie.config do |c|
54
+ c.readers.add :default, reader
55
+ c.readers.default = reader
56
+ end
53
57
  end
54
58
 
55
- it 'defaults to the PlainTextReader' do
59
+ it 'defaults to a plain text reader' do
56
60
  Rambling::Trie.create filepath, nil
57
61
 
58
62
  expect(reader).to have_received(:each_word).with filepath
59
63
  end
60
64
  end
61
65
  end
66
+
67
+ describe '.load' do
68
+ let(:root) { Rambling::Trie::RawNode.new }
69
+ let(:compressor) { Rambling::Trie::Compressor.new }
70
+ let(:container) { Rambling::Trie::Container.new root, compressor }
71
+ let(:serializer) { double :serializer, load: root }
72
+ let(:filepath) { 'a path to a file' }
73
+
74
+ it 'returns a new container with the loaded root node' do
75
+ trie = Rambling::Trie.load filepath, serializer
76
+ expect(trie).to eq container
77
+ end
78
+
79
+ it 'uses the serializer to load the root node from the given filepath' do
80
+ trie = Rambling::Trie.load filepath, serializer
81
+ expect(serializer).to have_received(:load).with filepath
82
+ end
83
+
84
+ context 'without a serializer' do
85
+ let(:marshal_serializer) { double :marshal_serializer, load: nil }
86
+ let(:default_serializer) { double :default_serializer, load: nil }
87
+ let(:yaml_serializer) { double :yaml_serializer, load: nil }
88
+
89
+ before do
90
+ Rambling::Trie.config do |c|
91
+ c.serializers.add :default, default_serializer
92
+ c.serializers.add :marshal, marshal_serializer
93
+ c.serializers.add :yml, yaml_serializer
94
+ c.serializers.add :yaml, yaml_serializer
95
+
96
+ c.serializers.default = default_serializer
97
+ end
98
+ end
99
+
100
+ it 'determines the serializer based on the file extension' do
101
+ trie = Rambling::Trie.load 'test.marshal'
102
+ expect(marshal_serializer).to have_received(:load).with 'test.marshal'
103
+
104
+ trie = Rambling::Trie.load 'test.yml'
105
+ expect(yaml_serializer).to have_received(:load).with 'test.yml'
106
+
107
+ trie = Rambling::Trie.load 'test.yaml'
108
+ expect(yaml_serializer).to have_received(:load).with 'test.yaml'
109
+
110
+ trie = Rambling::Trie.load 'test'
111
+ expect(default_serializer).to have_received(:load).with 'test'
112
+ end
113
+ end
114
+
115
+ context 'with a block' do
116
+ it 'yields the new container' do
117
+ yielded = nil
118
+
119
+ Rambling::Trie.load filepath, serializer do |trie|
120
+ yielded = trie
121
+ end
122
+
123
+ expect(yielded).to eq container
124
+ end
125
+ end
126
+ end
127
+
128
+ describe '.dump' do
129
+ let(:filename) { 'a trie' }
130
+ let(:root) { double :root }
131
+ let(:compressor) { double :compressor }
132
+ let(:trie) { Rambling::Trie::Container.new root, compressor }
133
+
134
+ let(:marshal_serializer) { double :marshal_serializer, dump: nil }
135
+ let(:yaml_serializer) { double :yaml_serializer, dump: nil }
136
+ let(:default_serializer) { double :default_serializer, dump: nil }
137
+
138
+ before do
139
+ Rambling::Trie.config do |c|
140
+ c.serializers.add :default, default_serializer
141
+ c.serializers.add :marshal, marshal_serializer
142
+ c.serializers.add :yml, yaml_serializer
143
+
144
+ c.serializers.default = default_serializer
145
+ end
146
+ end
147
+
148
+ it 'uses the configured default serializer by default' do
149
+ Rambling::Trie.dump trie, filename
150
+ expect(default_serializer).to have_received(:dump).with root, filename
151
+ end
152
+
153
+ context 'when provided with a format' do
154
+ it 'uses the corresponding serializer' do
155
+ Rambling::Trie.dump trie, "#{filename}.marshal"
156
+ expect(marshal_serializer).to have_received(:dump).with root, "#{filename}.marshal"
157
+
158
+ Rambling::Trie.dump trie, "#{filename}.yml"
159
+ expect(yaml_serializer).to have_received(:dump).with root, "#{filename}.yml"
160
+ end
161
+ end
162
+ end
163
+
164
+ describe '.config' do
165
+ it 'returns the properties' do
166
+ expect(Rambling::Trie.config).to eq Rambling::Trie.send :properties
167
+ end
168
+
169
+ it 'yields the properties' do
170
+ yielded = nil
171
+ Rambling::Trie.config { |c| yielded = c }
172
+ expect(yielded).to eq Rambling::Trie.send :properties
173
+ end
174
+ end
62
175
  end
@@ -4,7 +4,7 @@ require 'coveralls'
4
4
 
5
5
  Coveralls.wear!
6
6
 
7
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new [
7
+ SimpleCov.formatters = [
8
8
  SimpleCov::Formatter::HTMLFormatter,
9
9
  CodeClimate::TestReporter::Formatter,
10
10
  Coveralls::SimpleCov::Formatter
@@ -26,3 +26,9 @@ RSpec.configure do |config|
26
26
  config.run_all_when_everything_filtered = true
27
27
  config.raise_errors_for_deprecations!
28
28
  end
29
+
30
+ require 'support/config'
31
+ require 'support/shared_examples/a_compressable_trie'
32
+ require 'support/shared_examples/a_serializable_trie'
33
+ require 'support/shared_examples/a_serializer'
34
+ require 'support/shared_examples/a_trie_data_structure'
@@ -0,0 +1,5 @@
1
+ RSpec.configure do |c|
2
+ c.before do
3
+ Rambling::Trie.config.reset
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for 'a compressable trie' do
2
+ context 'and the trie is not compressed' do
3
+ it_behaves_like 'a trie data structure'
4
+
5
+ it 'does not alter the input' do
6
+ word = 'string'
7
+ trie.add word
8
+
9
+ expect(word).to eq 'string'
10
+ end
11
+
12
+ it 'is marked as not compressed' do
13
+ expect(trie).not_to be_compressed
14
+ end
15
+ end
16
+
17
+ context 'and the trie is compressed' do
18
+ before { trie.compress! }
19
+
20
+ it_behaves_like 'a trie data structure'
21
+
22
+ it 'is marked as compressed' do
23
+ expect(trie).to be_compressed
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for 'a serializable trie' do
2
+ context 'and the trie is not compressed' do
3
+ before do
4
+ Rambling::Trie.dump trie_to_serialize, trie_filepath, serializer
5
+ end
6
+
7
+ it_behaves_like 'a compressable trie' do
8
+ let(:trie) { loaded_trie }
9
+ end
10
+ end
11
+
12
+ context 'and the trie is compressed' do
13
+ let(:trie) { loaded_trie }
14
+
15
+ before do
16
+ FileUtils.rm_f trie_filepath
17
+ Rambling::Trie.dump trie_to_serialize.compress!, trie_filepath, serializer
18
+ end
19
+
20
+ it_behaves_like 'a trie data structure'
21
+
22
+ it 'is marked as compressed' do
23
+ expect(trie).to be_compressed
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ shared_examples_for 'a serializer' do
2
+ before do
3
+ FileUtils.rm_f filepath
4
+ end
5
+
6
+ describe '#dump' do
7
+ before do
8
+ serializer.dump content, filepath
9
+ end
10
+
11
+ it 'creates the file with the provided path' do
12
+ expect(File.exist? filepath).to be true
13
+ end
14
+
15
+ it 'converts the contents to the appropriate format' do
16
+ expect(File.read(filepath).size).to eq formatted_content.size
17
+ end
18
+ end
19
+
20
+ describe '#load' do
21
+ before do
22
+ serializer.dump content, filepath
23
+ end
24
+
25
+ it 'loads the dumped object back into memory' do
26
+ expect(serializer.load filepath).to eq content
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ shared_examples_for 'a trie data structure' do
2
+ it 'contains all the words previously provided' do
3
+ words.each do |word|
4
+ expect(trie).to include word
5
+ expect(trie.word? word).to be true
6
+ end
7
+ end
8
+
9
+ it 'matches the start of all the words from the file' do
10
+ words.each do |word|
11
+ expect(trie.match? word).to be true
12
+ expect(trie.match? word[0..-2]).to be true
13
+ expect(trie.partial_word? word).to be true
14
+ expect(trie.partial_word? word[0..-2]).to be true
15
+ end
16
+ end
17
+
18
+ it 'identifies words within larger strings' do
19
+ words.each do |word|
20
+ phrase = "x#{word}y"
21
+ expect(trie.words_within phrase).to include word
22
+ expect(trie.words_within? phrase).to be true
23
+ end
24
+ end
25
+
26
+ it 'allows iterating over all the words' do
27
+ expect(trie.to_a.sort).to eq words.sort
28
+ end
29
+ end
File without changes
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.3
4
+ version: 1.0.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: 2017-01-07 00:00:00.000000000 Z
12
+ date: 2017-01-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -53,9 +53,8 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: 0.9.5
56
- description: The Rambling Trie is a custom implementation of the Trie data structure
57
- with Ruby, which includes compression abilities and is designed to be very fast
58
- to traverse.
56
+ description: The Rambling Trie is a Ruby implementation of the trie data structure,
57
+ which includes compression abilities and is designed to be very fast to traverse.
59
58
  email:
60
59
  - edggonzalezg@gmail.com
61
60
  - lilibethdlc@gmail.com
@@ -70,44 +69,58 @@ files:
70
69
  - Rakefile
71
70
  - lib/rambling-trie.rb
72
71
  - lib/rambling/trie.rb
72
+ - lib/rambling/trie/comparable.rb
73
+ - lib/rambling/trie/compressable.rb
73
74
  - lib/rambling/trie/compressed_node.rb
74
- - lib/rambling/trie/compression.rb
75
75
  - lib/rambling/trie/compressor.rb
76
+ - lib/rambling/trie/configuration.rb
77
+ - lib/rambling/trie/configuration/properties.rb
78
+ - lib/rambling/trie/configuration/provider_collection.rb
76
79
  - lib/rambling/trie/container.rb
77
80
  - lib/rambling/trie/enumerable.rb
78
81
  - lib/rambling/trie/forwardable.rb
79
- - lib/rambling/trie/inspector.rb
82
+ - lib/rambling/trie/inspectable.rb
80
83
  - lib/rambling/trie/invalid_operation.rb
81
84
  - lib/rambling/trie/missing_node.rb
82
85
  - lib/rambling/trie/node.rb
83
- - lib/rambling/trie/plain_text_reader.rb
84
86
  - lib/rambling/trie/raw_node.rb
85
- - lib/rambling/trie/tasks/gem.rb
86
- - lib/rambling/trie/tasks/helpers/path.rb
87
- - lib/rambling/trie/tasks/helpers/performance_report.rb
88
- - lib/rambling/trie/tasks/helpers/time.rb
89
- - lib/rambling/trie/tasks/performance.rb
90
- - lib/rambling/trie/tasks/performance/all.rb
91
- - lib/rambling/trie/tasks/performance/benchmark.rb
92
- - lib/rambling/trie/tasks/performance/directory.rb
93
- - lib/rambling/trie/tasks/performance/flamegraph.rb
94
- - lib/rambling/trie/tasks/performance/profile/call_tree.rb
95
- - lib/rambling/trie/tasks/performance/profile/memory.rb
87
+ - lib/rambling/trie/readers.rb
88
+ - lib/rambling/trie/readers/plain_text.rb
89
+ - lib/rambling/trie/serializers.rb
90
+ - lib/rambling/trie/serializers/file.rb
91
+ - lib/rambling/trie/serializers/marshal.rb
92
+ - lib/rambling/trie/serializers/yaml.rb
93
+ - lib/rambling/trie/serializers/zip.rb
94
+ - lib/rambling/trie/stringifyable.rb
96
95
  - lib/rambling/trie/version.rb
97
96
  - rambling-trie.gemspec
98
97
  - spec/assets/test_words.en_US.txt
99
98
  - spec/assets/test_words.es_DO.txt
100
99
  - spec/integration/rambling/trie_spec.rb
100
+ - spec/lib/rambling/trie/comparable_spec.rb
101
101
  - spec/lib/rambling/trie/compressed_node_spec.rb
102
102
  - spec/lib/rambling/trie/compressor_spec.rb
103
+ - spec/lib/rambling/trie/configuration/properties_spec.rb
104
+ - spec/lib/rambling/trie/configuration/provider_collection_spec.rb
103
105
  - spec/lib/rambling/trie/container_spec.rb
104
106
  - spec/lib/rambling/trie/enumerable_spec.rb
105
- - spec/lib/rambling/trie/inspector_spec.rb
107
+ - spec/lib/rambling/trie/inspectable_spec.rb
106
108
  - spec/lib/rambling/trie/node_spec.rb
107
- - spec/lib/rambling/trie/plain_text_reader_spec.rb
108
109
  - spec/lib/rambling/trie/raw_node_spec.rb
110
+ - spec/lib/rambling/trie/readers/plain_text_spec.rb
111
+ - spec/lib/rambling/trie/serializers/file_spec.rb
112
+ - spec/lib/rambling/trie/serializers/marshal_spec.rb
113
+ - spec/lib/rambling/trie/serializers/yaml_spec.rb
114
+ - spec/lib/rambling/trie/serializers/zip_spec.rb
115
+ - spec/lib/rambling/trie/stringifyable_spec.rb
109
116
  - spec/lib/rambling/trie_spec.rb
110
117
  - spec/spec_helper.rb
118
+ - spec/support/config.rb
119
+ - spec/support/shared_examples/a_compressable_trie.rb
120
+ - spec/support/shared_examples/a_serializable_trie.rb
121
+ - spec/support/shared_examples/a_serializer.rb
122
+ - spec/support/shared_examples/a_trie_data_structure.rb
123
+ - spec/tmp/.gitkeep
111
124
  homepage: http://github.com/gonzedge/rambling-trie
112
125
  licenses:
113
126
  - MIT
@@ -131,18 +144,32 @@ rubyforge_project:
131
144
  rubygems_version: 2.6.8
132
145
  signing_key:
133
146
  specification_version: 4
134
- summary: A custom implementation of the trie data structure.
147
+ summary: A Ruby implementation of the trie data structure.
135
148
  test_files:
136
149
  - spec/assets/test_words.en_US.txt
137
150
  - spec/assets/test_words.es_DO.txt
138
151
  - spec/integration/rambling/trie_spec.rb
152
+ - spec/lib/rambling/trie/comparable_spec.rb
139
153
  - spec/lib/rambling/trie/compressed_node_spec.rb
140
154
  - spec/lib/rambling/trie/compressor_spec.rb
155
+ - spec/lib/rambling/trie/configuration/properties_spec.rb
156
+ - spec/lib/rambling/trie/configuration/provider_collection_spec.rb
141
157
  - spec/lib/rambling/trie/container_spec.rb
142
158
  - spec/lib/rambling/trie/enumerable_spec.rb
143
- - spec/lib/rambling/trie/inspector_spec.rb
159
+ - spec/lib/rambling/trie/inspectable_spec.rb
144
160
  - spec/lib/rambling/trie/node_spec.rb
145
- - spec/lib/rambling/trie/plain_text_reader_spec.rb
146
161
  - spec/lib/rambling/trie/raw_node_spec.rb
162
+ - spec/lib/rambling/trie/readers/plain_text_spec.rb
163
+ - spec/lib/rambling/trie/serializers/file_spec.rb
164
+ - spec/lib/rambling/trie/serializers/marshal_spec.rb
165
+ - spec/lib/rambling/trie/serializers/yaml_spec.rb
166
+ - spec/lib/rambling/trie/serializers/zip_spec.rb
167
+ - spec/lib/rambling/trie/stringifyable_spec.rb
147
168
  - spec/lib/rambling/trie_spec.rb
148
169
  - spec/spec_helper.rb
170
+ - spec/support/config.rb
171
+ - spec/support/shared_examples/a_compressable_trie.rb
172
+ - spec/support/shared_examples/a_serializable_trie.rb
173
+ - spec/support/shared_examples/a_serializer.rb
174
+ - spec/support/shared_examples/a_trie_data_structure.rb
175
+ - spec/tmp/.gitkeep
@@ -1,13 +0,0 @@
1
- module Rambling
2
- module Trie
3
- # Provides the compressing behavior for the Trie data structure.
4
- module Compression
5
- # Indicates if the current [Rambling::Trie::Node] can be compressed.
6
- # @return [Boolean] `true` for non-terminal nodes with one child,
7
- # `false` otherwise.
8
- def compressable?
9
- !(root? || terminal?) && children_tree.size == 1
10
- end
11
- end
12
- end
13
- end