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.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.reek.yml +17 -0
- data/.rspec +4 -2
- data/.rubocop.yml +187 -0
- data/.ruby-version +1 -1
- data/.yardopts +2 -0
- data/Gemfile +3 -1
- data/LittleWeasel.gemspec +31 -18
- data/README.md +408 -42
- data/Rakefile +296 -3
- data/lib/LittleWeasel.rb +5 -184
- 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 +85 -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 +136 -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 +20 -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 +19 -0
- data/lib/LittleWeasel/modules/dictionary_keyable.rb +24 -0
- data/lib/LittleWeasel/modules/dictionary_loader_servicable.rb +27 -0
- data/lib/LittleWeasel/modules/dictionary_metadata_servicable.rb +29 -0
- data/lib/LittleWeasel/modules/dictionary_metadata_validatable.rb +17 -0
- data/lib/LittleWeasel/modules/dictionary_sourceable.rb +26 -0
- data/lib/LittleWeasel/modules/dictionary_validatable.rb +30 -0
- data/lib/LittleWeasel/modules/language.rb +23 -0
- data/lib/LittleWeasel/modules/language_validatable.rb +16 -0
- data/lib/LittleWeasel/modules/locale.rb +40 -0
- data/lib/LittleWeasel/modules/order_validatable.rb +18 -0
- data/lib/LittleWeasel/modules/orderable.rb +17 -0
- data/lib/LittleWeasel/modules/region.rb +23 -0
- data/lib/LittleWeasel/modules/region_validatable.rb +16 -0
- data/lib/LittleWeasel/modules/tag_validatable.rb +16 -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 +28 -0
- data/lib/LittleWeasel/preprocessors/preprocessed_word_validatable.rb +55 -0
- data/lib/LittleWeasel/preprocessors/preprocessed_words.rb +55 -0
- data/lib/LittleWeasel/preprocessors/preprocessed_words_validatable.rb +27 -0
- data/lib/LittleWeasel/preprocessors/word_preprocessable.rb +19 -0
- data/lib/LittleWeasel/preprocessors/word_preprocessor.rb +122 -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 +262 -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_loader_service.rb +59 -0
- data/lib/LittleWeasel/services/dictionary_metadata_service.rb +114 -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/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_loader_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 +116 -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 +44 -0
- data/spec/lib/LittleWeasel/modules/language_spec.rb +52 -0
- data/spec/lib/LittleWeasel/modules/locale_spec.rb +140 -0
- data/spec/lib/LittleWeasel/modules/region_spec.rb +52 -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 +216 -0
- data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_spec.rb +175 -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_loader_service_spec.rb +50 -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 +32 -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 +108 -0
- data/spec/support/shared_examples.rb +105 -0
- metadata +408 -65
- 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
|