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