LittleWeasel 3.0.4 → 4.0.0

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.
Files changed (152) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.reek.yml +17 -0
  4. data/.rspec +4 -2
  5. data/.rubocop.yml +187 -0
  6. data/.ruby-version +1 -1
  7. data/.yardopts +2 -0
  8. data/Gemfile +3 -1
  9. data/LittleWeasel.gemspec +31 -18
  10. data/README.md +408 -42
  11. data/Rakefile +296 -3
  12. data/lib/LittleWeasel.rb +5 -184
  13. data/lib/LittleWeasel/block_results.rb +81 -0
  14. data/lib/LittleWeasel/configure.rb +98 -0
  15. data/lib/LittleWeasel/dictionary.rb +125 -0
  16. data/lib/LittleWeasel/dictionary_key.rb +48 -0
  17. data/lib/LittleWeasel/dictionary_manager.rb +85 -0
  18. data/lib/LittleWeasel/errors/dictionary_file_already_loaded_error.rb +9 -0
  19. data/lib/LittleWeasel/errors/dictionary_file_empty_error.rb +8 -0
  20. data/lib/LittleWeasel/errors/dictionary_file_not_found_error.rb +8 -0
  21. data/lib/LittleWeasel/errors/dictionary_file_too_large_error.rb +16 -0
  22. data/lib/LittleWeasel/errors/language_required_error.rb +8 -0
  23. data/lib/LittleWeasel/errors/must_override_error.rb +8 -0
  24. data/lib/LittleWeasel/filters/en_us/currency_filter.rb +19 -0
  25. data/lib/LittleWeasel/filters/en_us/numeric_filter.rb +19 -0
  26. data/lib/LittleWeasel/filters/en_us/single_character_word_filter.rb +21 -0
  27. data/lib/LittleWeasel/filters/word_filter.rb +59 -0
  28. data/lib/LittleWeasel/filters/word_filter_managable.rb +80 -0
  29. data/lib/LittleWeasel/filters/word_filter_validatable.rb +31 -0
  30. data/lib/LittleWeasel/filters/word_filterable.rb +19 -0
  31. data/lib/LittleWeasel/filters/word_filters_validatable.rb +29 -0
  32. data/lib/LittleWeasel/metadata/dictionary_metadata.rb +145 -0
  33. data/lib/LittleWeasel/metadata/invalid_words_metadata.rb +134 -0
  34. data/lib/LittleWeasel/metadata/invalid_words_service_results.rb +45 -0
  35. data/lib/LittleWeasel/metadata/metadata_observable_validatable.rb +22 -0
  36. data/lib/LittleWeasel/metadata/metadata_observerable.rb +90 -0
  37. data/lib/LittleWeasel/metadata/metadatable.rb +136 -0
  38. data/lib/LittleWeasel/modules/class_name_to_symbol.rb +26 -0
  39. data/lib/LittleWeasel/modules/configurable.rb +26 -0
  40. data/lib/LittleWeasel/modules/deep_dup.rb +11 -0
  41. data/lib/LittleWeasel/modules/dictionary_cache_keys.rb +34 -0
  42. data/lib/LittleWeasel/modules/dictionary_cache_servicable.rb +26 -0
  43. data/lib/LittleWeasel/modules/dictionary_cache_validatable.rb +20 -0
  44. data/lib/LittleWeasel/modules/dictionary_creator_servicable.rb +27 -0
  45. data/lib/LittleWeasel/modules/dictionary_file_loader.rb +67 -0
  46. data/lib/LittleWeasel/modules/dictionary_key_validatable.rb +19 -0
  47. data/lib/LittleWeasel/modules/dictionary_keyable.rb +24 -0
  48. data/lib/LittleWeasel/modules/dictionary_loader_servicable.rb +27 -0
  49. data/lib/LittleWeasel/modules/dictionary_metadata_servicable.rb +29 -0
  50. data/lib/LittleWeasel/modules/dictionary_metadata_validatable.rb +17 -0
  51. data/lib/LittleWeasel/modules/dictionary_sourceable.rb +26 -0
  52. data/lib/LittleWeasel/modules/dictionary_validatable.rb +30 -0
  53. data/lib/LittleWeasel/modules/language.rb +23 -0
  54. data/lib/LittleWeasel/modules/language_validatable.rb +16 -0
  55. data/lib/LittleWeasel/modules/locale.rb +40 -0
  56. data/lib/LittleWeasel/modules/order_validatable.rb +18 -0
  57. data/lib/LittleWeasel/modules/orderable.rb +17 -0
  58. data/lib/LittleWeasel/modules/region.rb +23 -0
  59. data/lib/LittleWeasel/modules/region_validatable.rb +16 -0
  60. data/lib/LittleWeasel/modules/tag_validatable.rb +16 -0
  61. data/lib/LittleWeasel/modules/taggable.rb +31 -0
  62. data/lib/LittleWeasel/modules/word_results_validatable.rb +28 -0
  63. data/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor.rb +22 -0
  64. data/lib/LittleWeasel/preprocessors/preprocessed_word.rb +28 -0
  65. data/lib/LittleWeasel/preprocessors/preprocessed_word_validatable.rb +55 -0
  66. data/lib/LittleWeasel/preprocessors/preprocessed_words.rb +55 -0
  67. data/lib/LittleWeasel/preprocessors/preprocessed_words_validatable.rb +27 -0
  68. data/lib/LittleWeasel/preprocessors/word_preprocessable.rb +19 -0
  69. data/lib/LittleWeasel/preprocessors/word_preprocessor.rb +122 -0
  70. data/lib/LittleWeasel/preprocessors/word_preprocessor_managable.rb +114 -0
  71. data/lib/LittleWeasel/preprocessors/word_preprocessor_validatable.rb +40 -0
  72. data/lib/LittleWeasel/preprocessors/word_preprocessors_validatable.rb +24 -0
  73. data/lib/LittleWeasel/services/dictionary_cache_service.rb +262 -0
  74. data/lib/LittleWeasel/services/dictionary_creator_service.rb +94 -0
  75. data/lib/LittleWeasel/services/dictionary_file_loader_service.rb +37 -0
  76. data/lib/LittleWeasel/services/dictionary_killer_service.rb +35 -0
  77. data/lib/LittleWeasel/services/dictionary_loader_service.rb +59 -0
  78. data/lib/LittleWeasel/services/dictionary_metadata_service.rb +114 -0
  79. data/lib/LittleWeasel/services/invalid_words_service.rb +59 -0
  80. data/lib/LittleWeasel/version.rb +3 -1
  81. data/lib/LittleWeasel/word_results.rb +146 -0
  82. data/spec/factories/dictionary.rb +43 -0
  83. data/spec/factories/dictionary_cache_service.rb +95 -0
  84. data/spec/factories/dictionary_creator_service.rb +16 -0
  85. data/spec/factories/dictionary_file_loader_service.rb +13 -0
  86. data/spec/factories/dictionary_hash.rb +39 -0
  87. data/spec/factories/dictionary_key.rb +14 -0
  88. data/spec/factories/dictionary_killer_service.rb +14 -0
  89. data/spec/factories/dictionary_loader_service.rb +14 -0
  90. data/spec/factories/dictionary_manager.rb +10 -0
  91. data/spec/factories/dictionary_metadata.rb +16 -0
  92. data/spec/factories/dictionary_metadata_service.rb +16 -0
  93. data/spec/factories/numeric_filter.rb +12 -0
  94. data/spec/factories/preprocessed_word.rb +16 -0
  95. data/spec/factories/preprocessed_words.rb +41 -0
  96. data/spec/factories/single_character_word_filter.rb +12 -0
  97. data/spec/factories/word_results.rb +16 -0
  98. data/spec/lib/LittleWeasel/block_results_spec.rb +248 -0
  99. data/spec/lib/LittleWeasel/configure_spec.rb +74 -0
  100. data/spec/lib/LittleWeasel/dictionary_key_spec.rb +118 -0
  101. data/spec/lib/LittleWeasel/dictionary_manager_spec.rb +116 -0
  102. data/spec/lib/LittleWeasel/dictionary_spec.rb +289 -0
  103. data/spec/lib/LittleWeasel/filters/en_us/currency_filter_spec.rb +80 -0
  104. data/spec/lib/LittleWeasel/filters/en_us/numeric_filter_spec.rb +66 -0
  105. data/spec/lib/LittleWeasel/filters/en_us/single_character_word_filter_spec.rb +58 -0
  106. data/spec/lib/LittleWeasel/filters/word_filter_managable_spec.rb +180 -0
  107. data/spec/lib/LittleWeasel/filters/word_filter_spec.rb +151 -0
  108. data/spec/lib/LittleWeasel/filters/word_filter_validatable_spec.rb +94 -0
  109. data/spec/lib/LittleWeasel/filters/word_filters_validatable_spec.rb +48 -0
  110. data/spec/lib/LittleWeasel/integraton_tests/dictionary_integration_spec.rb +201 -0
  111. data/spec/lib/LittleWeasel/metadata/dictionary_creator_servicable_spec.rb +54 -0
  112. data/spec/lib/LittleWeasel/metadata/dictionary_metadata_spec.rb +209 -0
  113. data/spec/lib/LittleWeasel/metadata/invalid_words_metadata_spec.rb +155 -0
  114. data/spec/lib/LittleWeasel/metadata/metadata_observerable_spec.rb +31 -0
  115. data/spec/lib/LittleWeasel/metadata/metadatable_spec.rb +35 -0
  116. data/spec/lib/LittleWeasel/modules/class_name_to_symbol_spec.rb +21 -0
  117. data/spec/lib/LittleWeasel/modules/dictionary_file_loader_spec.rb +125 -0
  118. data/spec/lib/LittleWeasel/modules/dictionary_sourceable_spec.rb +44 -0
  119. data/spec/lib/LittleWeasel/modules/language_spec.rb +52 -0
  120. data/spec/lib/LittleWeasel/modules/locale_spec.rb +140 -0
  121. data/spec/lib/LittleWeasel/modules/region_spec.rb +52 -0
  122. data/spec/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor_spec.rb +34 -0
  123. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_spec.rb +105 -0
  124. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_validatable_spec.rb +143 -0
  125. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_spec.rb +77 -0
  126. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_validatable_spec.rb +58 -0
  127. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_managable_spec.rb +216 -0
  128. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_spec.rb +175 -0
  129. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_validatable_spec.rb +109 -0
  130. data/spec/lib/LittleWeasel/preprocessors/word_preprocessors_validatable_spec.rb +49 -0
  131. data/spec/lib/LittleWeasel/services/dictionary_cache_service_spec.rb +444 -0
  132. data/spec/lib/LittleWeasel/services/dictionary_creator_service_spec.rb +119 -0
  133. data/spec/lib/LittleWeasel/services/dictionary_file_loader_service_spec.rb +71 -0
  134. data/spec/lib/LittleWeasel/services/dictionary_loader_service_spec.rb +50 -0
  135. data/spec/lib/LittleWeasel/services/dictionary_metadata_service_spec.rb +279 -0
  136. data/spec/lib/LittleWeasel/word_results_spec.rb +275 -0
  137. data/spec/lib/LittleWeasel/workflow/workflow_spec.rb +20 -0
  138. data/spec/spec_helper.rb +117 -6
  139. data/spec/support/factory_bot.rb +15 -0
  140. data/spec/support/file_helpers.rb +32 -0
  141. data/spec/support/files/empty-dictionary.txt +0 -0
  142. data/{lib/dictionary → spec/support/files/en-US-big.txt} +262156 -31488
  143. data/spec/support/files/en-US-tagged.txt +26 -0
  144. data/spec/support/files/en-US.txt +26 -0
  145. data/spec/support/files/en.txt +26 -0
  146. data/spec/support/files/es-ES.txt +27 -0
  147. data/spec/support/files/es.txt +27 -0
  148. data/spec/support/general_helpers.rb +68 -0
  149. data/spec/support/shared_contexts.rb +108 -0
  150. data/spec/support/shared_examples.rb +105 -0
  151. metadata +408 -65
  152. data/spec/checker/checker_spec.rb +0 -286
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::PreprocessedWords, type: :module do
6
+ subject { create(:preprocessed_words, original_word: original_word, preprocessed_words: preprocessed_words) }
7
+
8
+ let(:original_word) { 'word' }
9
+ let(:preprocessed_words) {}
10
+
11
+ #.new
12
+ describe '.new' do
13
+ it 'instantiates an object' do
14
+ expect { subject }.to_not raise_error
15
+ end
16
+
17
+ context 'arguments' do
18
+ context '#original_word' do
19
+ it 'sets the original_word attribute' do
20
+ expect(subject.original_word).to eq original_word
21
+ end
22
+ end
23
+
24
+ context '#preprocessed_words' do
25
+ let(:preprocessed_words) { [:preprocessed_words] }
26
+
27
+ it 'sets the original_word attribute' do
28
+ expect(subject.preprocessed_words).to eq preprocessed_words
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ #preprocessed_word
35
+ describe '#preprocessed_word' do
36
+ subject do
37
+ create(:preprocessed_words,
38
+ with_word_processors: 3,
39
+ original_word: original_word,
40
+ preprocessed_words: preprocessed_words)
41
+ end
42
+
43
+ it 'returns the preprocessed word' do
44
+ expect(subject.preprocessed_word).to eq 'word-0-1-2'
45
+ end
46
+ end
47
+
48
+ #preprocessed?
49
+ describe '#preprocessed?' do
50
+ context 'when the word has been preprocessed' do
51
+ subject do
52
+ create(:preprocessed_words,
53
+ with_word_processors: 1,
54
+ original_word: original_word,
55
+ preprocessed_words: preprocessed_words)
56
+ end
57
+
58
+ it 'returns the preprocessed word' do
59
+ expect(subject.preprocessed?).to eq true
60
+ end
61
+ end
62
+
63
+ context 'when the word has NOT been preprocessed' do
64
+ subject do
65
+ create(:preprocessed_words,
66
+ original_word: original_word,
67
+ preprocessed_words: preprocessed_words)
68
+ end
69
+
70
+ it 'returns the preprocessed word' do
71
+ expect(subject.preprocessed?).to eq false
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::PreprocessedWordsValidatable, type: :module do
6
+ PreprocessedWordsValidatable = described_class
7
+
8
+ class MockSubject
9
+ include PreprocessedWordsValidatable
10
+ end
11
+
12
+ subject do
13
+ MockSubject.new
14
+ end
15
+
16
+ before do
17
+ allow(preprocessed_words).to receive(:respond_to?).and_call_original
18
+ end
19
+
20
+ let(:preprocessed_words) do
21
+ create(:preprocessed_words,
22
+ original_word: original_word,
23
+ with_word_processors: with_word_processors)
24
+ end
25
+ let(:original_word) { 'word' }
26
+ let(:with_word_processors) { 0 }
27
+
28
+ #.validate_prepreprocessed_words
29
+ describe '.validate_prepreprocessed_words' do
30
+ context 'when the object is valid' do
31
+ it 'does not raise an error' do
32
+ expect { PreprocessedWordsValidatable.validate_prepreprocessed_words(preprocessed_words: preprocessed_words) }.to_not raise_error
33
+ end
34
+ end
35
+
36
+ context 'when the object is INVALID' do
37
+ let(:expected_error) { /Argument preprocessed_words does not respond to:.+##{method}/ }
38
+
39
+ context 'when the object does not respond to #original_word' do
40
+ before { allow(preprocessed_words).to receive(:respond_to?).with(method).and_return(false) }
41
+ let(:method) { :original_word }
42
+
43
+ it 'raises an error' do
44
+ expect{ PreprocessedWordsValidatable.validate_prepreprocessed_words(preprocessed_words: preprocessed_words) }.to raise_error expected_error
45
+ end
46
+ end
47
+
48
+ context 'when the object does not respond to #preprocessed_words' do
49
+ before { allow(preprocessed_words).to receive(:respond_to?).with(method).and_return(false) }
50
+ let(:method) { :preprocessed_words }
51
+
52
+ it 'raises an error' do
53
+ expect{ PreprocessedWordsValidatable.validate_prepreprocessed_words(preprocessed_words: preprocessed_words) }.to raise_error expected_error
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,216 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::WordPreprocessorManagable, type: :module do
6
+ subject { MockSubject.new }
7
+
8
+ WordPreprocessorManagable = described_class
9
+
10
+ class MockSubject
11
+ include WordPreprocessorManagable
12
+ end
13
+
14
+ subject { MockSubject.new }
15
+
16
+ class MockWordPreprocessor01 < LittleWeasel::Preprocessors::WordPreprocessor
17
+ def initialize(order: 0)
18
+ super order: order
19
+ end
20
+
21
+ class << self
22
+ def preprocess(word) [true, "#{word}-0"]; end
23
+ end
24
+ end
25
+
26
+ class MockWordPreprocessor02 < MockWordPreprocessor01
27
+ def initialize
28
+ super order: 1
29
+ end
30
+
31
+ class << self
32
+ def preprocess(word) [true, "#{word}-1"]; end
33
+ end
34
+ end
35
+
36
+ class MockWordPreprocessor03 < MockWordPreprocessor01
37
+ def initialize
38
+ super order: 2
39
+ end
40
+
41
+ class << self
42
+ def preprocess(word) [true, "#{word}-2"]; end
43
+ end
44
+ end
45
+
46
+ let(:word_preprocessors_01_thru_03) do
47
+ [MockWordPreprocessor03.new,
48
+ MockWordPreprocessor02.new,
49
+ MockWordPreprocessor01.new]
50
+ end
51
+
52
+ class MockWordPreprocessor04 < MockWordPreprocessor01
53
+ def initialize
54
+ super order: 3
55
+ end
56
+
57
+ class << self
58
+ def preprocess(word) [true, "#{word}-3"]; end
59
+ end
60
+ end
61
+
62
+ class MockWordPreprocessor05 < MockWordPreprocessor01
63
+ def initialize
64
+ super order: 4
65
+ end
66
+
67
+ class << self
68
+ def preprocess(word) [true, "#{word}-4"]; end
69
+ end
70
+ end
71
+
72
+ class MockWordPreprocessor06 < MockWordPreprocessor01
73
+ def initialize
74
+ super order: 5
75
+ end
76
+
77
+ class << self
78
+ def preprocess(word) [true, "#{word}-5"]; end
79
+ end
80
+ end
81
+
82
+ let(:word_preprocessors_04_thru_06) do
83
+ [MockWordPreprocessor06.new,
84
+ MockWordPreprocessor05.new,
85
+ MockWordPreprocessor04.new]
86
+ end
87
+
88
+ #preprocessed_word
89
+ describe '#preprocessed_word' do
90
+ context 'when word is blank' do
91
+ it 'returns nil' do
92
+ expect(subject.preprocessed_word word: 'word').to be_nil
93
+ end
94
+ end
95
+
96
+ context 'when word is not a String' do
97
+ it 'returns nil' do
98
+ expect(subject.preprocessed_word word: :not_a_word).to be_nil
99
+ end
100
+ end
101
+
102
+ context 'when word is NOT blank' do
103
+ before do
104
+ subject.replace_preprocessors word_preprocessors: word_preprocessors_01_thru_03
105
+ end
106
+
107
+ it 'returns the preprocessed word' do
108
+ expect(subject.preprocessed_word word: 'word').to eq 'word-0-1-2'
109
+ end
110
+ end
111
+ end
112
+
113
+ #word_preprocessors
114
+ describe '#word_preprocessors' do
115
+ it 'returns an empty Array ([]) by default' do
116
+ expect(subject.word_preprocessors).to eq []
117
+ end
118
+ end
119
+
120
+ #clear_preprocessors
121
+ describe '#clear_preprocessors' do
122
+ before do
123
+ subject.replace_preprocessors word_preprocessors: word_preprocessors_01_thru_03
124
+ end
125
+
126
+ it 'clears #word_preprocessors' do
127
+ expect { subject.clear_preprocessors }.to change { subject.word_preprocessors.count }.from(3).to(0)
128
+ end
129
+ end
130
+
131
+ #add_preprocessors
132
+ describe '#add_preprocessors' do
133
+ context 'when passing an INVALID argument' do
134
+ context 'when passing an Array of invalid word preprocessors' do
135
+ it 'raises an error' do
136
+ expect { subject.add_preprocessors(word_preprocessors: %i(bad word preprocessors)) }.to raise_error(/Argument word_preprocessor: does not respond to/)
137
+ end
138
+ end
139
+ end
140
+
141
+ context 'when passing a valid argument' do
142
+ before do
143
+ subject.replace_preprocessors word_preprocessors: word_preprocessors_04_thru_06
144
+ end
145
+
146
+ let(:expected_results) do
147
+ word_preprocessors_01_thru_03.concat(word_preprocessors_04_thru_06).sort_by(&:order)
148
+ end
149
+
150
+ it 'adds the word preprocessors to the #word_preprocessors and sorts the #word_preprocessors Array by WordPreprocessor#order' do
151
+ expect { subject.add_preprocessors word_preprocessors: word_preprocessors_01_thru_03 }.to \
152
+ change { subject.word_preprocessors.count }.from(3).to(6)
153
+ expect(subject.word_preprocessors).to eq expected_results
154
+ end
155
+ end
156
+ end
157
+
158
+ #replace_preprocessors
159
+ describe '#replace_preprocessors' do
160
+ before do
161
+ subject.add_preprocessors word_preprocessors: word_preprocessors_01_thru_03
162
+ end
163
+
164
+ let(:expected_results) do
165
+ word_preprocessors_04_thru_06.sort_by(&:order)
166
+ end
167
+
168
+ it 'replaces the word preprocessors in #word_preprocessors and sorts the #word_preprocessors Array by WordPreprocessor#order' do
169
+ expect(subject.word_preprocessors).to match_array word_preprocessors_01_thru_03
170
+ expect(subject.replace_preprocessors word_preprocessors: word_preprocessors_04_thru_06).to eq expected_results
171
+ expect(subject.word_preprocessors).to eq expected_results
172
+ end
173
+ end
174
+
175
+ #preprocessors_on=
176
+ describe '#preprocessors_on=' do
177
+ context 'when assigning true' do
178
+ before do
179
+ subject.preprocessors_on = false
180
+ expect(subject.word_preprocessors.map(&:preprocessor_on)).to all(be false)
181
+ end
182
+
183
+ it 'sets all preprocessors on' do
184
+ subject.preprocessors_on = true
185
+ expect(subject.word_preprocessors.map(&:preprocessor_on)).to all(be true)
186
+ end
187
+ end
188
+
189
+ context 'when assigning false' do
190
+ before do
191
+ subject.preprocessors_on = true
192
+ expect(subject.word_preprocessors.map(&:preprocessor_on)).to all(be true)
193
+ end
194
+
195
+ it 'sets all preprocessors off' do
196
+ subject.preprocessors_on = false
197
+ expect(subject.word_preprocessors.map(&:preprocessor_on)).to all(be false)
198
+ end
199
+ end
200
+ end
201
+
202
+ #preprocess
203
+ describe '#preprocess' do
204
+ before do
205
+ subject.add_preprocessors word_preprocessors: word_preprocessors
206
+ end
207
+
208
+ let(:word) { 'word' }
209
+ let(:word_preprocessors) { word_preprocessors_01_thru_03 }
210
+
211
+ it 'preprocesses the word' do
212
+ expect(subject.word_preprocessors.count).to eq word_preprocessors.count
213
+ expect(subject.preprocess(word: word).preprocessed_words.map(&:preprocessed_word)).to eq %w(word-0 word-0-1 word-0-1-2)
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,175 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::WordPreprocessor do
6
+ subject do
7
+ word_preprocessor = described_class.new order: order
8
+ word_preprocessor.preprocessor_on = preprocessor_on
9
+ word_preprocessor
10
+ end
11
+
12
+ let(:preprocessor_on) { true }
13
+ let(:order) { 0 }
14
+ let(:word) { 'word' }
15
+
16
+ #.new
17
+ describe '.new' do
18
+ context 'when arguments are valid' do
19
+ it 'instantiates the object' do
20
+ expect { subject }.to_not raise_error
21
+ end
22
+ end
23
+
24
+ context 'when arguments are INVALID' do
25
+ context 'when argument order is invalid' do
26
+ context 'when order is not an Integer' do
27
+ let(:order) { :not_an_integer }
28
+
29
+ it 'raises an error' do
30
+ expect { subject }.to raise_error(/Argument order is not an Integer/)
31
+ end
32
+ end
33
+
34
+ context 'when order is negative' do
35
+ let(:order) { -1 }
36
+
37
+ it 'raises an error' do
38
+ expect { subject }.to raise_error "Argument order '#{order}' is not a a number from 0-n"
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'when argument preprocessor_on is invalid' do
44
+ context 'when preprocessor_on is not true or false' do
45
+ let(:preprocessor_on) { :not_true_or_false }
46
+
47
+ it 'raises an error' do
48
+ expect { subject }.to raise_error "Argument value is not true or false: #{preprocessor_on}"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ #.preprocess
56
+ describe '.preprocess' do
57
+ context 'when not overridden' do
58
+ it 'raises an error' do
59
+ expect { subject.class.preprocess word }.to raise_error LittleWeasel::Errors::MustOverrideError
60
+ end
61
+ end
62
+ end
63
+
64
+ #preprocessor_on
65
+ describe '#preprocessor_on' do
66
+ context 'when set to true' do
67
+ before do
68
+ subject.preprocessor_on = true
69
+ end
70
+
71
+ it 'returns true' do
72
+ expect(subject.preprocessor_on).to eq true
73
+ end
74
+ end
75
+
76
+ context 'when set to false' do
77
+ before do
78
+ subject.preprocessor_on = false
79
+ end
80
+
81
+ it 'returns false' do
82
+ expect(subject.preprocessor_on).to eq false
83
+ end
84
+ end
85
+ end
86
+
87
+ #preprocessor_on?
88
+ describe '#preprocessor_on?' do
89
+ context 'when #preprocessor_on is true' do
90
+ it 'returns true' do
91
+ expect(subject.preprocessor_on?).to eq true
92
+ end
93
+ end
94
+
95
+ context 'when #preprocessor_on is false' do
96
+ let(:preprocessor_on) { false }
97
+
98
+ it 'returns false' do
99
+ expect(subject.preprocessor_on?).to eq false
100
+ end
101
+ end
102
+ end
103
+
104
+ #preprocess
105
+ describe '#preprocess' do
106
+ context 'when not overridden' do
107
+ it 'raises an error' do
108
+ expect { subject.preprocess 'x' }.to raise_error LittleWeasel::Errors::MustOverrideError
109
+ end
110
+ end
111
+
112
+ context 'when overridden' do
113
+ before do
114
+ allow(described_class).to receive(:preprocess?)
115
+ .and_return true
116
+ allow(described_class).to receive(:preprocess)
117
+ .and_return [true, 'preprocessed-word']
118
+ end
119
+
120
+ context 'when #preprocessor_on? is true' do
121
+ it 'calls .preprocess and returns a ProcessedWord object' do
122
+ expect(described_class).to receive(:preprocess)
123
+ expect(subject.preprocess word).to be_kind_of LittleWeasel::Preprocessors::PreprocessedWord
124
+ end
125
+ end
126
+
127
+ context 'when #preprocessor_on? is false' do
128
+ let(:preprocessor_on) { false }
129
+
130
+ it 'does NOT call .preprocess and returns a ProcessedWord object' do
131
+ expect(described_class).to_not receive(:preprocess)
132
+ expect(subject.preprocess word).to be_kind_of LittleWeasel::Preprocessors::PreprocessedWord
133
+ end
134
+
135
+ end
136
+ end
137
+ end
138
+
139
+ #preprocess?
140
+ describe '#preprocess?' do
141
+ let(:word) { 'word' }
142
+
143
+ it 'returns true by default' do
144
+ expect(subject.preprocess? word).to be true
145
+ end
146
+
147
+ context 'when #preprocess? returns true' do
148
+ before { allow(subject.class).to receive(:preprocess?).and_return(true) }
149
+
150
+ context 'when #preprocessor_on? is true' do
151
+ it_behaves_like 'the preprocessor matches and #preprocessor_on? is true'
152
+ end
153
+
154
+ context 'when #preprocessor_on? is false' do
155
+ let(:preprocessor_on) { false }
156
+
157
+ it_behaves_like 'the preprocessor matches and #preprocessor_on? is false'
158
+ end
159
+ end
160
+
161
+ context 'when #preprocess? returns false' do
162
+ before { allow(subject.class).to receive(:preprocess?).and_return(false) }
163
+
164
+ context 'when #preprocessor_on? is true' do
165
+ it_behaves_like 'the preprocessor DOES NOT match and #preprocessor_on? is true'
166
+ end
167
+
168
+ context 'when #preprocessor_on? is false' do
169
+ let(:preprocessor_on) { false }
170
+
171
+ it_behaves_like 'the preprocessor DOES NOT match and #preprocessor_on? is false'
172
+ end
173
+ end
174
+ end
175
+ end