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
@@ -1,147 +0,0 @@
1
- namespace :performance do
2
- namespace :profile do
3
- include Helpers::Path
4
- include Helpers::Time
5
-
6
- def performance_report
7
- @performance_report ||= PerformanceReport.new
8
- end
9
-
10
- def output
11
- performance_report.output
12
- end
13
-
14
- class CallTreeProfile
15
- def initialize dirname
16
- @dirname = dirname
17
- end
18
-
19
- def perform times, params = nil
20
- params = Array params
21
- params << nil unless params.any?
22
-
23
- result = RubyProf.profile merge_fibers: true do
24
- params.each do |param|
25
- times.times do
26
- yield param
27
- end
28
- end
29
- end
30
-
31
- path = path 'reports', Rambling::Trie::VERSION, 'call-tree', time, dirname
32
- FileUtils.mkdir_p path
33
- printer = RubyProf::CallTreePrinter.new result
34
- printer.print path: path
35
- end
36
-
37
- private
38
-
39
- attr_reader :dirname
40
- end
41
-
42
- def generate_lookups_call_tree
43
- output.puts 'Generating call tree profiling reports for lookups...'
44
-
45
- words = %w(hi help beautiful impressionism anthropological)
46
-
47
- trie = Rambling::Trie.create dictionary
48
- compressed_trie = Rambling::Trie.create(dictionary).compress!
49
-
50
- [ trie, compressed_trie ].each do |trie|
51
- prefix = "profile-#{trie.compressed? ? 'compressed' : 'uncompressed'}"
52
-
53
- call_tree_profile = CallTreeProfile.new "#{prefix}-word"
54
- call_tree_profile.perform 200_000, words do
55
- trie.word? word
56
- end
57
-
58
- call_tree_profile = CallTreeProfile.new "#{prefix}-partial-word"
59
- call_tree_profile.perform 200_000, words do
60
- trie.partial_word? word
61
- end
62
- end
63
-
64
- output.puts 'Done'
65
- end
66
-
67
- def generate_scans_call_tree
68
- output.puts 'Generating call tree profiling reports for scans...'
69
-
70
- words = {
71
- hi: 1_000,
72
- help: 100_000,
73
- beautiful: 100_000,
74
- impressionism: 200_000,
75
- anthropological: 200_000,
76
- }
77
-
78
- trie = Rambling::Trie.create dictionary
79
- compressed_trie = Rambling::Trie.create(dictionary).compress!
80
-
81
- [ trie, compressed_trie ].each do |trie|
82
- dirname = "profile-#{trie.compressed? ? 'compressed' : 'uncompressed'}-scan"
83
- call_tree_profile = CallTreeProfile.new dirname
84
-
85
- words.each do |word, times|
86
- call_tree_profile.perform times, word.to_s do |word|
87
- trie.scan(word).size
88
- end
89
- end
90
- end
91
-
92
- output.puts 'Done'
93
- end
94
-
95
- namespace :call_tree do
96
- desc 'Output banner'
97
- task :banner do
98
- performance_report.start 'Call Tree profile'
99
- end
100
-
101
- desc 'Generate call tree profiling reports for creation'
102
- task creation: ['performance:directory', :banner] do
103
- output.puts 'Generating call tree profiling reports for creation...'
104
-
105
- call_tree_profile = CallTreeProfile.new 'profile-new-trie'
106
- call_tree_profile.perform 5 do
107
- trie = Rambling::Trie.create dictionary
108
- end
109
-
110
- output.puts 'Done'
111
- end
112
-
113
- desc 'Generate call tree profiling reports for compression'
114
- task compression: ['performance:directory', :banner] do
115
- output.puts 'Generating call tree profiling reports for compression...'
116
-
117
- tries = []
118
- 5.times { tries << Rambling::Trie.create(dictionary) }
119
-
120
- call_tree_profile = CallTreeProfile.new 'profile-compressed-trie'
121
- call_tree_profile.perform 5, tries do |trie|
122
- trie.compress!; nil
123
- end
124
-
125
- output.puts 'Done'
126
- end
127
-
128
- desc 'Generate call tree profiling reports for lookups'
129
- task lookups: ['performance:directory', :banner] do
130
- generate_lookups_call_tree
131
- end
132
-
133
- desc 'Generate call tree profiling reports for scans'
134
- task scans: ['performance:directory', :banner] do
135
- generate_scans_call_tree
136
- end
137
-
138
- desc 'Generate all call tree profiling reports'
139
- task all: [
140
- :creation,
141
- :compression,
142
- :lookups,
143
- :scans,
144
- ]
145
- end
146
- end
147
- end
@@ -1,143 +0,0 @@
1
- namespace :performance do
2
- namespace :profile do
3
- include Helpers::Path
4
- include Helpers::Time
5
-
6
- def performance_report
7
- @performance_report ||= PerformanceReport.new
8
- end
9
-
10
- def output
11
- performance_report.output
12
- end
13
-
14
- class MemoryProfile
15
- def initialize name
16
- @name = name
17
- end
18
-
19
- def perform
20
- result = MemoryProfiler.report allow_files: 'lib/rambling/trie', ignore_files: 'lib/rambling/trie/tasks' do
21
- with_gc_stats do
22
- yield
23
- end
24
- end
25
-
26
- dir = path 'reports', Rambling::Trie::VERSION, 'memory', time
27
- FileUtils.mkdir_p dir
28
- result.pretty_print to_file: File.join(dir, name)
29
- end
30
-
31
- private
32
-
33
- attr_reader :name
34
- end
35
-
36
- def with_gc_stats
37
- output.puts "Live objects before - #{GC.stat[:heap_live_slots]}"
38
- yield
39
- output.puts "Live objects after - #{GC.stat[:heap_live_slots]}"
40
- end
41
-
42
- namespace :memory do
43
- desc 'Output banner'
44
- task :banner do
45
- performance_report.start 'Memory profile'
46
- end
47
-
48
- desc 'Generate memory profiling reports for creation'
49
- task creation: ['performance:directory', :banner] do
50
- output.puts 'Generating memory profiling reports for creation...'
51
-
52
- trie = nil
53
-
54
- memory_profile = MemoryProfile.new 'memory-profile-new-trie'
55
- memory_profile.perform do
56
- trie = Rambling::Trie.create dictionary
57
- end
58
- end
59
-
60
- desc 'Generate memory profiling reports for compression'
61
- task compression: ['performance:directory', :banner] do
62
- output.puts 'Generating memory profiling reports for compression...'
63
- trie = Rambling::Trie.create dictionary
64
-
65
- memory_profile = MemoryProfile.new 'memory-profile-trie-and-compress'
66
- memory_profile.perform do
67
- trie.compress!
68
- end
69
-
70
- with_gc_stats { GC.start }
71
- end
72
-
73
- desc 'Generate memory profiling reports for lookups'
74
- task lookups: ['performance:directory', :banner] do
75
- output.puts 'Generating memory profiling reports for lookups...'
76
-
77
- words = %w(hi help beautiful impressionism anthropological)
78
-
79
- trie = Rambling::Trie.create dictionary
80
- compressed_trie = Rambling::Trie.create(dictionary).compress!
81
- [ trie, compressed_trie ].each do |trie|
82
- times = 10
83
-
84
- prefix = "memory-profile-#{trie.compressed? ? 'compressed' : 'uncompressed'}-trie"
85
- name = "#{prefix}-word"
86
- memory_profile = MemoryProfile.new name
87
- memory_profile.perform do
88
- words.each do |word|
89
- times.times do
90
- trie.word? word
91
- end
92
- end
93
- end
94
-
95
- name = "#{prefix}-partial-word"
96
- memory_profile = MemoryProfile.new name
97
- memory_profile.perform do
98
- words.each do |word|
99
- times.times do
100
- trie.partial_word? word
101
- end
102
- end
103
- end
104
- end
105
- end
106
-
107
- desc 'Generate memory profiling reports for scans'
108
- task scans: ['performance:directory', :banner] do
109
- output.puts 'Generating memory profiling reports for scans...'
110
-
111
- words = {
112
- hi: 1,
113
- help: 100,
114
- beautiful: 100,
115
- impressionism: 200,
116
- anthropological: 200,
117
- }
118
-
119
- trie = Rambling::Trie.create dictionary
120
- compressed_trie = Rambling::Trie.create(dictionary).compress!
121
- [ trie, compressed_trie ].each do |trie|
122
- name = "memory-profile-#{trie.compressed? ? 'compressed' : 'uncompressed'}-trie-scan"
123
- memory_profile = MemoryProfile.new name
124
- memory_profile.perform do
125
- words.each do |word, times|
126
- times.times do
127
- trie.scan(word.to_s).size
128
- end
129
- end
130
- end
131
- end
132
- end
133
-
134
- desc 'Generate all memory profiling reports'
135
- task all: [
136
- :creation,
137
- :compression,
138
- :lookups,
139
- :scans,
140
- ]
141
- end
142
- end
143
- end
@@ -1,18 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Rambling
4
- module Trie
5
- describe PlainTextReader do
6
- describe '#each_word' do
7
- let(:filepath) { File.join(::SPEC_ROOT, 'assets', 'test_words.en_US.txt') }
8
- let(:words) { File.readlines(filepath).map &:chomp }
9
-
10
- it 'yields every word yielded by the file' do
11
- yielded_words = []
12
- subject.each_word(filepath) { |word| yielded_words << word }
13
- expect(yielded_words).to eq words
14
- end
15
- end
16
- end
17
- end
18
- end