LittleWeasel 3.0.3 → 5.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/CHANGELOG.md +22 -1
- data/Gemfile +3 -1
- 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 +5 -184
- 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 +378 -38
- data/spec/checker/checker_spec.rb +0 -286
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Modules::DictionarySourceable, type: :module do
|
|
6
|
+
subject { MockDictionarySourceable.new(dictionary_memory_source) }
|
|
7
|
+
|
|
8
|
+
DictionarySourceable = described_class
|
|
9
|
+
|
|
10
|
+
class MockDictionarySourceable
|
|
11
|
+
include DictionarySourceable
|
|
12
|
+
|
|
13
|
+
def initialize(dictionary_source)
|
|
14
|
+
self.dictionary_source = dictionary_source
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:dictionary_memory_source) { described_class.memory_source }
|
|
19
|
+
let(:dictionary_file_source) { language_dictionary_path language: :en }
|
|
20
|
+
|
|
21
|
+
#.MEMORY_SOURCE
|
|
22
|
+
describe '::MEMORY_SOURCE' do
|
|
23
|
+
it 'returns the memory source prefix' do
|
|
24
|
+
expect(described_class::MEMORY_SOURCE).to eq '*'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#.memory_source
|
|
29
|
+
describe '.memory_source' do
|
|
30
|
+
it 'returns a new memory source' do
|
|
31
|
+
expect(described_class.memory_source).to be_truthy
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#.file_source?
|
|
36
|
+
describe '.file_source?' do
|
|
37
|
+
context 'when dictionary_source is a file source' do
|
|
38
|
+
it 'returns truthy' do
|
|
39
|
+
expect(described_class.file_source? dictionary_file_source).to be_truthy
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'when dictionary_source is NOT a file source' do
|
|
44
|
+
it 'returns falsey' do
|
|
45
|
+
expect(described_class.file_source? dictionary_memory_source).to be_falsey
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#.memory_source?
|
|
51
|
+
describe '.memory_source?' do
|
|
52
|
+
context 'when dictionary_source is a memory source' do
|
|
53
|
+
it 'returns truthy if argument is a valid memory source' do
|
|
54
|
+
expect(described_class.memory_source? '*12345678').to be_truthy
|
|
55
|
+
expect(described_class.memory_source? '*abcdef00').to be_truthy
|
|
56
|
+
expect(described_class.memory_source? '*ABCDEF00').to be_truthy
|
|
57
|
+
expect(described_class.memory_source? '*aBcDeF00').to be_truthy
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'returns falsey if argument is NOT a memory source' do
|
|
61
|
+
expect(described_class.memory_source? '*123456789').to be_falsey
|
|
62
|
+
expect(described_class.memory_source? '*abcdefg0').to be_falsey
|
|
63
|
+
expect(described_class.memory_source? '*ABCDEFG0').to be_falsey
|
|
64
|
+
expect(described_class.memory_source? '*aBcDeFg0').to be_falsey
|
|
65
|
+
expect(described_class.memory_source? '$12345678').to be_falsey
|
|
66
|
+
|
|
67
|
+
expect(described_class.memory_source? '123456789').to be_falsey
|
|
68
|
+
expect(described_class.memory_source? 'abcdefg0').to be_falsey
|
|
69
|
+
expect(described_class.memory_source? 'ABCDEFG0').to be_falsey
|
|
70
|
+
expect(described_class.memory_source? 'aBcDeFg0').to be_falsey
|
|
71
|
+
expect(described_class.memory_source? '123456789').to be_falsey
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'when dictionary_source is a file source' do
|
|
76
|
+
it 'returns falsey' do
|
|
77
|
+
expect(described_class.memory_source? dictionary_file_source).to be_falsey
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Modules::Language, type: :module do
|
|
6
|
+
Language = described_class
|
|
7
|
+
|
|
8
|
+
subject do
|
|
9
|
+
Class.new do
|
|
10
|
+
include Language
|
|
11
|
+
|
|
12
|
+
attr_reader :language
|
|
13
|
+
|
|
14
|
+
def initialize(language)
|
|
15
|
+
self.language = language
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
attr_writer :language
|
|
21
|
+
end.new(language)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
let(:language) {}
|
|
25
|
+
|
|
26
|
+
#language?
|
|
27
|
+
describe '#language?' do
|
|
28
|
+
context 'when language is present?' do
|
|
29
|
+
let(:language) { :es }
|
|
30
|
+
|
|
31
|
+
it 'returns true' do
|
|
32
|
+
expect(subject.language?).to eq true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'when language is NOT present?' do
|
|
37
|
+
it 'returns false' do
|
|
38
|
+
expect(subject.language?).to eq false
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#normalize_language!
|
|
44
|
+
describe '#normalize_language!' do
|
|
45
|
+
context 'when language is present?' do
|
|
46
|
+
context 'when language responds to #upcase!' do
|
|
47
|
+
before do
|
|
48
|
+
subject.normalize_language!
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
let(:language) { :AA }
|
|
52
|
+
|
|
53
|
+
it 'changes language to lower case' do
|
|
54
|
+
expect(subject.language).to eq :aa
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context 'when language DOES NOT respond to #downcase' do
|
|
59
|
+
let(:language) { Object.new }
|
|
60
|
+
|
|
61
|
+
it 'raises an error' do
|
|
62
|
+
expect { subject.normalize_language! }.to raise_error(NoMethodError, /undefined method `downcase'/)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context 'when language is NOT present?' do
|
|
68
|
+
before do
|
|
69
|
+
subject.normalize_language!
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'does nothing' do
|
|
73
|
+
expect(subject.language).to be_nil
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#.normalize_language
|
|
79
|
+
describe '#.normalize_language' do
|
|
80
|
+
context 'with a non-nil language' do
|
|
81
|
+
context 'when passing a Symbol' do
|
|
82
|
+
let(:language) { :AbCdEfG }
|
|
83
|
+
|
|
84
|
+
it 'converts the language to a lower-case Symbol' do
|
|
85
|
+
expect(described_class.normalize_language(language)).to eq :abcdefg
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context 'when passing a String' do
|
|
90
|
+
let(:language) { 'AbCdEfG' }
|
|
91
|
+
|
|
92
|
+
it 'converts the language to a lower-case String' do
|
|
93
|
+
expect(described_class.normalize_language(language)).to eq 'abcdefg'
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context 'with a nil language' do
|
|
99
|
+
it 'returns nil' do
|
|
100
|
+
expect(described_class.normalize_language(language)).to be_nil
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context 'when language does not respond to #downcase' do
|
|
105
|
+
let(:language) { 1 }
|
|
106
|
+
|
|
107
|
+
it 'returns nil' do
|
|
108
|
+
expect { described_class.normalize_language(language) }.to raise_error(NoMethodError, /undefined method `downcase'/)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Modules::Locale, type: :module do
|
|
6
|
+
Locale = described_class
|
|
7
|
+
|
|
8
|
+
subject do
|
|
9
|
+
Class.new do
|
|
10
|
+
include Locale
|
|
11
|
+
|
|
12
|
+
attr_reader :language, :region
|
|
13
|
+
|
|
14
|
+
def initialize(language, region)
|
|
15
|
+
self.language = language
|
|
16
|
+
self.region = region
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
attr_writer :language, :region
|
|
22
|
+
end.new(language, region)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
let(:language) {}
|
|
26
|
+
let(:region) {}
|
|
27
|
+
|
|
28
|
+
#locale
|
|
29
|
+
describe '#locale' do
|
|
30
|
+
context 'with valid arguments' do
|
|
31
|
+
context 'with valid language' do
|
|
32
|
+
let(:language) { :en }
|
|
33
|
+
|
|
34
|
+
it 'returns the expected locale (language only)' do
|
|
35
|
+
expect(subject.locale).to eq 'en'
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context 'with valid language and region' do
|
|
40
|
+
let(:language) { :en }
|
|
41
|
+
let(:region) { :us }
|
|
42
|
+
|
|
43
|
+
it 'returns the expected locale (language and region)' do
|
|
44
|
+
expect(subject.locale).to eq 'en-US'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe 'normalizes language and region to the proper case' do
|
|
48
|
+
let(:language) { :EN }
|
|
49
|
+
let(:region) { :us }
|
|
50
|
+
|
|
51
|
+
it 'returns the expected locale with language lowercase and region uppercase' do
|
|
52
|
+
expect(subject.locale).to eq 'en-US'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'with valid language and nil region' do
|
|
58
|
+
let(:language) { :en }
|
|
59
|
+
let(:region) {}
|
|
60
|
+
|
|
61
|
+
it 'returns the expected locale (language only)' do
|
|
62
|
+
expect(subject.locale).to eq 'en'
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context 'with valid language and blank region' do
|
|
67
|
+
let(:language) { :en }
|
|
68
|
+
let(:region) { '' }
|
|
69
|
+
|
|
70
|
+
it 'returns the expected locale (language only)' do
|
|
71
|
+
expect(subject.locale).to eq 'en'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context 'with invalid arguments' do
|
|
77
|
+
context 'when argument language does not respond to #downcase' do
|
|
78
|
+
let(:language) { 1 }
|
|
79
|
+
|
|
80
|
+
it 'raises an error' do
|
|
81
|
+
expect { subject.locale }.to raise_error(NoMethodError, /undefined method `downcase'/)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context 'when argument region does not respond to #upcase' do
|
|
86
|
+
let(:language) { :en }
|
|
87
|
+
let(:region) { 1 }
|
|
88
|
+
|
|
89
|
+
it 'raises an error' do
|
|
90
|
+
expect { subject.locale }.to raise_error(NoMethodError, /undefined method `upcase'/)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Modules::Region, type: :module do
|
|
6
|
+
Region = described_class
|
|
7
|
+
|
|
8
|
+
subject do
|
|
9
|
+
Class.new do
|
|
10
|
+
include Region
|
|
11
|
+
|
|
12
|
+
attr_reader :region
|
|
13
|
+
|
|
14
|
+
def initialize(region)
|
|
15
|
+
self.region = region
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
attr_writer :region
|
|
21
|
+
end.new(region)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
let(:region) {}
|
|
25
|
+
|
|
26
|
+
#region?
|
|
27
|
+
describe '#region?' do
|
|
28
|
+
context 'when region is present?' do
|
|
29
|
+
let(:region) { :es }
|
|
30
|
+
|
|
31
|
+
it 'returns true' do
|
|
32
|
+
expect(subject.region?).to eq true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'when region is NOT present?' do
|
|
37
|
+
it 'returns false' do
|
|
38
|
+
expect(subject.region?).to eq false
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#normalize_region!
|
|
44
|
+
describe '#normalize_region!' do
|
|
45
|
+
context 'when region is present?' do
|
|
46
|
+
context 'when region responds to #upcase' do
|
|
47
|
+
before do
|
|
48
|
+
subject.normalize_region!
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
let(:region) { :aa }
|
|
52
|
+
|
|
53
|
+
it 'changes region to upper case' do
|
|
54
|
+
expect(subject.region).to eq :AA
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context 'when region DOES NOT respond to #upcase' do
|
|
59
|
+
let(:region) { Object.new }
|
|
60
|
+
|
|
61
|
+
it 'raises an error' do
|
|
62
|
+
expect { subject.normalize_region! }.to raise_error(NoMethodError, /undefined method `upcase'/)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context 'when region is NOT present?' do
|
|
68
|
+
before do
|
|
69
|
+
subject.normalize_region!
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'does nothing' do
|
|
73
|
+
expect(subject.region).to be_nil
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#.normalize_region
|
|
79
|
+
describe '#.normalize_region' do
|
|
80
|
+
context 'with a non-nil region' do
|
|
81
|
+
context 'when passing a Symbol' do
|
|
82
|
+
let(:region) { :AbCdEfG }
|
|
83
|
+
|
|
84
|
+
it 'converts the region to a upper-case Symbol' do
|
|
85
|
+
expect(described_class.normalize_region(region)).to eq :ABCDEFG
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context 'when passing a String' do
|
|
90
|
+
let(:region) { 'AbCdEfG' }
|
|
91
|
+
|
|
92
|
+
it 'converts the region to a upper-case String' do
|
|
93
|
+
expect(described_class.normalize_region(region)).to eq 'ABCDEFG'
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context 'with a nil region' do
|
|
99
|
+
it 'returns nil' do
|
|
100
|
+
expect(described_class.normalize_region(region)).to be_nil
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context 'when region does not respond to #upcase' do
|
|
105
|
+
let(:region) { 1 }
|
|
106
|
+
|
|
107
|
+
it 'returns nil' do
|
|
108
|
+
expect { described_class.normalize_region(region) }.to raise_error(NoMethodError, /undefined method `upcase'/)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literals: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Preprocessors::EnUs::CapitalizePreprocessor do
|
|
6
|
+
subject { described_class.new }
|
|
7
|
+
|
|
8
|
+
#.new
|
|
9
|
+
describe '.new' do
|
|
10
|
+
it 'instantiates the object' do
|
|
11
|
+
expect { subject }.to_not raise_error
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#order' do
|
|
15
|
+
it 'sets #order to 0 by default' do
|
|
16
|
+
expect(subject.order).to eq 0
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe '#preprocessor_on' do
|
|
21
|
+
it 'sets #preprocessor_on to true by default' do
|
|
22
|
+
expect(subject.preprocessor_on).to eq true
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#.preprocess
|
|
28
|
+
describe '.preprocess' do
|
|
29
|
+
it 'processes and capitalizes the word' do
|
|
30
|
+
expect(described_class.preprocess 'wOrD').to eq [true, 'Word']
|
|
31
|
+
expect(described_class.preprocess 'Word').to eq [true, 'Word']
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe LittleWeasel::Preprocessors::PreprocessedWord do
|
|
6
|
+
subject do
|
|
7
|
+
described_class.new(
|
|
8
|
+
original_word: original_word,
|
|
9
|
+
preprocessed_word: preprocessed_word,
|
|
10
|
+
preprocessor: preprocessor,
|
|
11
|
+
preprocessed: preprocessed,
|
|
12
|
+
preprocessor_order: preprocessor_order
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
let(:original_word) { :original_word }
|
|
17
|
+
let(:preprocessed_word) { :preprocessed_word }
|
|
18
|
+
let(:preprocessor) { :preprocessor }
|
|
19
|
+
let(:preprocessed) { true }
|
|
20
|
+
let(:preprocessor_order) { :preprocessor_order }
|
|
21
|
+
|
|
22
|
+
#.new
|
|
23
|
+
describe '.new' do
|
|
24
|
+
context 'initializes the attributes' do
|
|
25
|
+
describe '#original_word' do
|
|
26
|
+
it 'is initialized' do
|
|
27
|
+
expect(subject.original_word).to eq :original_word
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe '#preprocessed_word' do
|
|
32
|
+
it 'is initialized' do
|
|
33
|
+
expect(subject.preprocessed_word).to eq :preprocessed_word
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe '#preprocessor' do
|
|
38
|
+
it 'is initialized' do
|
|
39
|
+
expect(subject.preprocessor).to eq :preprocessor
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe '#preprocessor_order' do
|
|
44
|
+
it 'is initialized' do
|
|
45
|
+
expect(subject.preprocessor_order).to eq :preprocessor_order
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# attributes
|
|
52
|
+
context 'attributes' do
|
|
53
|
+
describe 'original_word=' do
|
|
54
|
+
let(:changed_to) { :original_word_changed }
|
|
55
|
+
|
|
56
|
+
it 'sets the attribute' do
|
|
57
|
+
subject.original_word = changed_to
|
|
58
|
+
expect(subject.original_word).to eq changed_to
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe 'preprocessed_word=' do
|
|
63
|
+
let(:changed_to) { :preprocessed_word_changed }
|
|
64
|
+
|
|
65
|
+
it 'sets the attribute' do
|
|
66
|
+
subject.preprocessed_word = changed_to
|
|
67
|
+
expect(subject.preprocessed_word).to eq changed_to
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe 'preprocessor=' do
|
|
72
|
+
let(:changed_to) { :preprocessor_changed }
|
|
73
|
+
|
|
74
|
+
it 'sets the attribute' do
|
|
75
|
+
subject.preprocessor = changed_to
|
|
76
|
+
expect(subject.preprocessor).to eq changed_to
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe 'preprocessor_order=' do
|
|
81
|
+
let(:changed_to) { :preprocessor_order_changed }
|
|
82
|
+
|
|
83
|
+
it 'sets the attribute' do
|
|
84
|
+
subject.preprocessor_order = changed_to
|
|
85
|
+
expect(subject.preprocessor_order).to eq changed_to
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe '#preprocessed?' do
|
|
90
|
+
context 'when preprocessed is true' do
|
|
91
|
+
it 'returns true' do
|
|
92
|
+
expect(subject.preprocessed?).to eq true
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context 'when preprocessed is false' do
|
|
97
|
+
let(:preprocessed) { false }
|
|
98
|
+
|
|
99
|
+
it 'returns false' do
|
|
100
|
+
expect(subject.preprocessed?).to eq false
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -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
|