LittleWeasel 4.0.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -1
- data/Jenkinsfile +20 -0
- data/LittleWeasel.gemspec +3 -3
- data/README.md +1 -1
- data/lib/LittleWeasel/dictionary_key.rb +2 -2
- data/lib/LittleWeasel/dictionary_manager.rb +10 -4
- data/lib/LittleWeasel/metadata/metadatable.rb +5 -7
- data/lib/LittleWeasel/modules/dictionary_cache_validatable.rb +3 -5
- data/lib/LittleWeasel/modules/dictionary_key_validatable.rb +3 -5
- data/lib/LittleWeasel/modules/dictionary_metadata_validatable.rb +3 -5
- data/lib/LittleWeasel/modules/dictionary_source_validatable.rb +15 -0
- data/lib/LittleWeasel/modules/dictionary_sourceable.rb +66 -6
- data/lib/LittleWeasel/modules/dictionary_validatable.rb +0 -12
- data/lib/LittleWeasel/modules/language.rb +10 -9
- data/lib/LittleWeasel/modules/language_validatable.rb +2 -4
- data/lib/LittleWeasel/modules/locale.rb +7 -24
- data/lib/LittleWeasel/modules/order_validatable.rb +3 -5
- data/lib/LittleWeasel/modules/region.rb +10 -9
- data/lib/LittleWeasel/modules/region_validatable.rb +2 -4
- data/lib/LittleWeasel/modules/tag_validatable.rb +2 -4
- data/lib/LittleWeasel/preprocessors/preprocessed_word.rb +1 -0
- data/lib/LittleWeasel/preprocessors/preprocessed_word_validatable.rb +1 -0
- data/lib/LittleWeasel/preprocessors/preprocessed_words.rb +6 -2
- data/lib/LittleWeasel/preprocessors/preprocessed_words_validatable.rb +1 -0
- data/lib/LittleWeasel/preprocessors/word_preprocessor.rb +1 -0
- data/lib/LittleWeasel/services/dictionary_cache_service.rb +11 -62
- data/lib/LittleWeasel/services/dictionary_creator_service.rb +2 -2
- data/lib/LittleWeasel/services/dictionary_file_loader_service.rb +1 -1
- data/lib/LittleWeasel/services/dictionary_metadata_service.rb +4 -2
- data/lib/LittleWeasel/version.rb +1 -1
- data/spec/factories/dictionary_cache_service.rb +2 -2
- data/spec/lib/LittleWeasel/dictionary_manager_spec.rb +52 -2
- data/spec/lib/LittleWeasel/metadata/invalid_words_metadata_spec.rb +1 -1
- data/spec/lib/LittleWeasel/modules/dictionary_sourceable_spec.rb +56 -19
- data/spec/lib/LittleWeasel/modules/language_spec.rb +65 -5
- data/spec/lib/LittleWeasel/modules/locale_spec.rb +4 -49
- data/spec/lib/LittleWeasel/modules/region_spec.rb +65 -5
- data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_managable_spec.rb +28 -2
- data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_spec.rb +43 -0
- data/spec/lib/LittleWeasel/services/dictionary_cache_service_spec.rb +25 -25
- data/spec/support/file_helpers.rb +17 -3
- data/spec/support/shared_contexts.rb +0 -1
- metadata +12 -15
- data/lib/LittleWeasel/modules/dictionary_loader_servicable.rb +0 -27
- data/lib/LittleWeasel/services/dictionary_loader_service.rb +0 -59
- data/spec/factories/dictionary_loader_service.rb +0 -14
- data/spec/lib/LittleWeasel/services/dictionary_loader_service_spec.rb +0 -50
@@ -4,7 +4,6 @@ require_relative '../modules/dictionary_cache_keys'
|
|
4
4
|
require_relative '../modules/dictionary_cache_validatable'
|
5
5
|
require_relative '../modules/dictionary_keyable'
|
6
6
|
require_relative '../modules/dictionary_sourceable'
|
7
|
-
require_relative '../modules/dictionary_validatable'
|
8
7
|
|
9
8
|
module LittleWeasel
|
10
9
|
module Services
|
@@ -17,11 +16,10 @@ module LittleWeasel
|
|
17
16
|
# objects to share dictionary information, in particular, the dictionary
|
18
17
|
# file and dictionary metadata.
|
19
18
|
class DictionaryCacheService
|
20
|
-
include Modules::DictionaryKeyable
|
21
|
-
include Modules::DictionaryCacheValidatable
|
22
19
|
include Modules::DictionaryCacheKeys
|
20
|
+
include Modules::DictionaryCacheValidatable
|
21
|
+
include Modules::DictionaryKeyable
|
23
22
|
include Modules::DictionarySourceable
|
24
|
-
include Modules::DictionaryValidatable
|
25
23
|
|
26
24
|
attr_reader :dictionary_cache
|
27
25
|
|
@@ -129,26 +127,6 @@ module LittleWeasel
|
|
129
127
|
dictionary_cache[DICTIONARY_CACHE][DICTIONARIES].key? dictionary_id
|
130
128
|
end
|
131
129
|
|
132
|
-
# Adds a dictionary source. A "dictionary source" specifies the source from which
|
133
|
-
# the dictionary ultimately obtains its words.
|
134
|
-
#
|
135
|
-
# @param source [String] the dictionary source. This can be a file path
|
136
|
-
# or a memory source indicator to signify that the dictionary was created
|
137
|
-
# dynamically from memory.
|
138
|
-
def add_dictionary_source(source:)
|
139
|
-
validate_dictionary_source_does_not_exist dictionary_cache_service: self
|
140
|
-
|
141
|
-
dictionary_id = dictionary_id_for_dictionary_source(source: source)
|
142
|
-
self.dictionary_reference = dictionary_id
|
143
|
-
# Only set the dictionary source if it doesn't already exist because settings
|
144
|
-
# the dictionary source wipes out the #dictionary_object; dictionary objects
|
145
|
-
# can have more than one dictionary reference pointing to them, and we don't
|
146
|
-
# want to blow away the #dictionary_object, metadata, or any other data
|
147
|
-
# associated with it if it already exists.
|
148
|
-
self.dictionary_source = source unless dictionary?
|
149
|
-
self
|
150
|
-
end
|
151
|
-
|
152
130
|
# Returns the dictionary id if there is a dictionary id in the dictionary
|
153
131
|
# cache associated with the given key; nil otherwise.
|
154
132
|
def dictionary_id
|
@@ -164,25 +142,19 @@ module LittleWeasel
|
|
164
142
|
raise ArgumentError, "A dictionary id could not be found for key '#{key}'."
|
165
143
|
end
|
166
144
|
|
167
|
-
def dictionary_source!
|
168
|
-
raise ArgumentError, "A dictionary source could not be found for key '#{key}'." unless dictionary_reference?
|
169
|
-
|
170
|
-
dictionary_cache[DICTIONARY_CACHE][DICTIONARIES][dictionary_id!][SOURCE]
|
171
|
-
end
|
172
|
-
alias dictionary_file! dictionary_source!
|
173
|
-
|
174
|
-
def dictionary_source
|
175
|
-
dictionary_cache.dig(DICTIONARY_CACHE, DICTIONARIES, dictionary_id, SOURCE)
|
176
|
-
end
|
177
|
-
alias dictionary_file dictionary_source
|
178
|
-
|
179
145
|
# This method returns true if the dictionary associated with the
|
180
146
|
# given dictionary key is loaded/cached. If this is the case,
|
181
147
|
# a dictionary object is available in the dictionary cache.
|
182
148
|
def dictionary_object?
|
183
149
|
dictionary_object.present?
|
184
150
|
end
|
185
|
-
alias
|
151
|
+
alias dictionary_exist? dictionary_object?
|
152
|
+
|
153
|
+
# <b>DEPRECATED:</b> Use <tt>dictionary_exist?</tt> instead.
|
154
|
+
def dictionary_exists?
|
155
|
+
warn "[DEPRECATION] 'dictionary_exists?' is deprecated. Please use 'dictionary_exist?' instead."
|
156
|
+
dictionary_object?
|
157
|
+
end
|
186
158
|
|
187
159
|
# Returns the dictionary object from the dictionary cache for the given
|
188
160
|
# key. This method raises an error if the dictionary is not in the cache;
|
@@ -209,7 +181,7 @@ module LittleWeasel
|
|
209
181
|
end
|
210
182
|
return if object.equal? dictionary_object
|
211
183
|
|
212
|
-
if
|
184
|
+
if dictionary_exist?
|
213
185
|
raise ArgumentError,
|
214
186
|
"The dictionary is already loaded/cached for key '#{key}'; use #unload or #kill first."
|
215
187
|
end
|
@@ -225,35 +197,12 @@ module LittleWeasel
|
|
225
197
|
dictionary_cache.dig(DICTIONARY_CACHE, DICTIONARY_REFERENCES, key)
|
226
198
|
end
|
227
199
|
|
228
|
-
def
|
200
|
+
def set_dictionary_reference(dictionary_id:)
|
229
201
|
dictionary_cache[DICTIONARY_CACHE][DICTIONARY_REFERENCES][key] = {
|
230
202
|
DICTIONARY_ID => dictionary_id
|
231
203
|
}
|
232
204
|
end
|
233
205
|
|
234
|
-
# Returns the dictionary_id for the source if it exists in dictionaries;
|
235
|
-
# otherwise, returns the new dictionary id that should be used.
|
236
|
-
def dictionary_id_for_dictionary_source(source:)
|
237
|
-
dictionary_source?(source: source) || SecureRandom.uuid[0..7]
|
238
|
-
end
|
239
|
-
|
240
|
-
# Returns the dictionary_id associated with source if source exists;
|
241
|
-
# nil otherwise.
|
242
|
-
def dictionary_source?(source:)
|
243
|
-
dictionaries = dictionary_cache.dig(DICTIONARY_CACHE, DICTIONARIES)
|
244
|
-
dictionaries&.each_pair do |dictionary_id, dictionary_hash|
|
245
|
-
return dictionary_id if source == dictionary_hash[SOURCE]
|
246
|
-
end
|
247
|
-
nil
|
248
|
-
end
|
249
|
-
|
250
|
-
def dictionary_source=(source)
|
251
|
-
dictionary_cache[DICTIONARY_CACHE][DICTIONARIES][dictionary_id!] = {
|
252
|
-
SOURCE => source,
|
253
|
-
DICTIONARY_OBJECT => {}
|
254
|
-
}
|
255
|
-
end
|
256
|
-
|
257
206
|
def dictionary_id?
|
258
207
|
dictionary_id.present?
|
259
208
|
end
|
@@ -77,7 +77,7 @@ module LittleWeasel
|
|
77
77
|
#
|
78
78
|
# @return returns a reference to self.
|
79
79
|
def add_dictionary_file_source(file:)
|
80
|
-
dictionary_cache_service.add_dictionary_source(
|
80
|
+
dictionary_cache_service.add_dictionary_source(dictionary_source: file)
|
81
81
|
end
|
82
82
|
|
83
83
|
# Adds a dictionary memory source. A "memory source" indicates that the
|
@@ -87,7 +87,7 @@ module LittleWeasel
|
|
87
87
|
#
|
88
88
|
# @return returns a reference to self.
|
89
89
|
def add_dictionary_memory_source
|
90
|
-
dictionary_cache_service.add_dictionary_source(
|
90
|
+
dictionary_cache_service.add_dictionary_source(dictionary_source: memory_source)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
@@ -42,7 +42,8 @@ module LittleWeasel
|
|
42
42
|
# initialized state - all data is lost, but the object reference is
|
43
43
|
# maintained.
|
44
44
|
def init(dictionary_metadata:)
|
45
|
-
Modules::DictionaryMetadataValidatable.
|
45
|
+
Modules::DictionaryMetadataValidatable.validate_dictionary_metadata \
|
46
|
+
dictionary_metadata: dictionary_metadata
|
46
47
|
|
47
48
|
dictionary_metadata.each_key { |key| dictionary_metadata.delete(key) }
|
48
49
|
dictionary_metadata
|
@@ -52,7 +53,8 @@ module LittleWeasel
|
|
52
53
|
# it's in the same state the dictionary metadata would be in if #init
|
53
54
|
# were called.
|
54
55
|
def init?(dictionary_metadata:)
|
55
|
-
Modules::DictionaryMetadataValidatable.
|
56
|
+
Modules::DictionaryMetadataValidatable.validate_dictionary_metadata \
|
57
|
+
dictionary_metadata: dictionary_metadata
|
56
58
|
|
57
59
|
initialized_dictionary_metadata = init(dictionary_metadata: {})
|
58
60
|
dictionary_metadata.eql?(initialized_dictionary_metadata)
|
data/lib/LittleWeasel/version.rb
CHANGED
@@ -70,9 +70,9 @@ FactoryBot.define do
|
|
70
70
|
else
|
71
71
|
dictionary_file_source
|
72
72
|
end
|
73
|
-
dictionary_cache_service.add_dictionary_source(
|
73
|
+
dictionary_cache_service.add_dictionary_source(dictionary_source: dictionary_path_for(file_name: file_name))
|
74
74
|
elsif dictionary_memory_source
|
75
|
-
dictionary_cache_service.add_dictionary_source(
|
75
|
+
dictionary_cache_service.add_dictionary_source(dictionary_source: LittleWeasel::Modules::DictionarSourceable.memory_source)
|
76
76
|
end
|
77
77
|
|
78
78
|
if load
|
@@ -3,6 +3,8 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe LittleWeasel::DictionaryManager do
|
6
|
+
include_context 'dictionary keys'
|
7
|
+
|
6
8
|
subject { create(:dictionary_manager) }
|
7
9
|
|
8
10
|
let(:dictionary_cache_service) { create(:dictionary_cache_service, dictionary_key: dictionary_key, dictionary_cache: dictionary_cache)}
|
@@ -31,6 +33,54 @@ RSpec.describe LittleWeasel::DictionaryManager do
|
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
36
|
+
#dictionary_exist?
|
37
|
+
describe '#dictionary_exist?' do
|
38
|
+
let!(:expected_dictionary_object) do
|
39
|
+
subject.create_dictionary_from_memory(dictionary_key: dictionary_key,
|
40
|
+
dictionary_words: %w(My dictionary words) )
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when the dictionary exists' do
|
44
|
+
it 'returns true' do
|
45
|
+
expect(subject.dictionary_exist? dictionary_key: dictionary_key)
|
46
|
+
.to eq true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when the dictionary DOES NOT exist' do
|
51
|
+
let(:en_gb_dictionary_key) { dictionary_key_for(language: :en, region: :gb) }
|
52
|
+
|
53
|
+
it 'returns false' do
|
54
|
+
expect(subject.dictionary_exist? dictionary_key: en_gb_dictionary_key)
|
55
|
+
.to eq false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#dictionary_for
|
61
|
+
describe '#dictionary_for' do
|
62
|
+
let!(:expected_dictionary_object) do
|
63
|
+
subject.create_dictionary_from_memory(dictionary_key: dictionary_key,
|
64
|
+
dictionary_words: %w(My dictionary words) )
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when the dictionary exists' do
|
68
|
+
it 'returns the dictionary object' do
|
69
|
+
expect(subject.dictionary_for dictionary_key: dictionary_key)
|
70
|
+
.to be expected_dictionary_object
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when the dictionary DOES NOT exist' do
|
75
|
+
let(:en_gb_dictionary_key) { dictionary_key_for(language: :en, region: :gb) }
|
76
|
+
|
77
|
+
it 'raises an error' do
|
78
|
+
expect { subject.dictionary_for dictionary_key: en_gb_dictionary_key }
|
79
|
+
.to raise_error("The dictionary object associated with argument key '#{en_gb_dictionary_key.key}' is not in the cache.")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
34
84
|
#create_dictionary_from_file
|
35
85
|
describe '#create_dictionary_from_file' do
|
36
86
|
context 'when the dictionary DOES NOT exist' do
|
@@ -85,7 +135,7 @@ RSpec.describe LittleWeasel::DictionaryManager do
|
|
85
135
|
it 'removes the dictionary, file source reference and metadata from the dictionary cache' do
|
86
136
|
metadata_key # Capture this before we unload the dictionary
|
87
137
|
subject.kill_dictionary(dictionary_key: dictionary_key)
|
88
|
-
expect(dictionary_cache_service.
|
138
|
+
expect(dictionary_cache_service.dictionary_exist?).to eq false
|
89
139
|
expect(dictionary_cache_service.dictionary_reference?).to eq false
|
90
140
|
expect(dictionary_metadata_service.dictionary_metadata?(metadata_key: metadata_key)).to eq false
|
91
141
|
end
|
@@ -103,7 +153,7 @@ RSpec.describe LittleWeasel::DictionaryManager do
|
|
103
153
|
it 'removes the dictionary, memory source reference and metadata from the dictionary cache' do
|
104
154
|
metadata_key # Capture this before we unload the dictionary
|
105
155
|
subject.kill_dictionary(dictionary_key: dictionary_key)
|
106
|
-
expect(dictionary_cache_service.
|
156
|
+
expect(dictionary_cache_service.dictionary_exist?).to eq false
|
107
157
|
expect(dictionary_cache_service.dictionary_reference?).to eq false
|
108
158
|
expect(dictionary_metadata_service.dictionary_metadata?(metadata_key: metadata_key)).to eq false
|
109
159
|
end
|
@@ -35,7 +35,7 @@ RSpec.describe LittleWeasel::Metadata::InvalidWordsMetadata do
|
|
35
35
|
subject { invalid_words_metadata }
|
36
36
|
|
37
37
|
before do
|
38
|
-
dictionary_cache_service.add_dictionary_source(
|
38
|
+
dictionary_cache_service.add_dictionary_source(dictionary_source: file)
|
39
39
|
end
|
40
40
|
|
41
41
|
context 'with invalid dictionary metadata object' do
|
@@ -3,10 +3,24 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
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 }
|
6
20
|
|
7
21
|
#.MEMORY_SOURCE
|
8
22
|
describe '::MEMORY_SOURCE' do
|
9
|
-
it 'returns the memory source
|
23
|
+
it 'returns the memory source prefix' do
|
10
24
|
expect(described_class::MEMORY_SOURCE).to eq '*'
|
11
25
|
end
|
12
26
|
end
|
@@ -14,31 +28,54 @@ RSpec.describe LittleWeasel::Modules::DictionarySourceable, type: :module do
|
|
14
28
|
#.memory_source
|
15
29
|
describe '.memory_source' do
|
16
30
|
it 'returns a new memory source' do
|
17
|
-
expect(described_class.memory_source
|
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
|
18
47
|
end
|
19
48
|
end
|
20
49
|
|
21
50
|
#.memory_source?
|
22
51
|
describe '.memory_source?' do
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
28
73
|
end
|
29
74
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
expect(described_class.memory_source? '*aBcDeFg0').to be_falsey
|
35
|
-
expect(described_class.memory_source? '$12345678').to be_falsey
|
36
|
-
|
37
|
-
expect(described_class.memory_source? '123456789').to be_falsey
|
38
|
-
expect(described_class.memory_source? 'abcdefg0').to be_falsey
|
39
|
-
expect(described_class.memory_source? 'ABCDEFG0').to be_falsey
|
40
|
-
expect(described_class.memory_source? 'aBcDeFg0').to be_falsey
|
41
|
-
expect(described_class.memory_source? '123456789').to be_falsey
|
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
|
42
79
|
end
|
43
80
|
end
|
44
81
|
end
|
@@ -23,14 +23,66 @@ RSpec.describe LittleWeasel::Modules::Language, type: :module do
|
|
23
23
|
|
24
24
|
let(:language) {}
|
25
25
|
|
26
|
-
#
|
27
|
-
describe '#
|
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
|
28
80
|
context 'with a non-nil language' do
|
29
81
|
context 'when passing a Symbol' do
|
30
82
|
let(:language) { :AbCdEfG }
|
31
83
|
|
32
84
|
it 'converts the language to a lower-case Symbol' do
|
33
|
-
expect(
|
85
|
+
expect(described_class.normalize_language(language)).to eq :abcdefg
|
34
86
|
end
|
35
87
|
end
|
36
88
|
|
@@ -38,14 +90,22 @@ RSpec.describe LittleWeasel::Modules::Language, type: :module do
|
|
38
90
|
let(:language) { 'AbCdEfG' }
|
39
91
|
|
40
92
|
it 'converts the language to a lower-case String' do
|
41
|
-
expect(
|
93
|
+
expect(described_class.normalize_language(language)).to eq 'abcdefg'
|
42
94
|
end
|
43
95
|
end
|
44
96
|
end
|
45
97
|
|
46
98
|
context 'with a nil language' do
|
47
99
|
it 'returns nil' do
|
48
|
-
expect(
|
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'/)
|
49
109
|
end
|
50
110
|
end
|
51
111
|
end
|
@@ -25,51 +25,6 @@ RSpec.describe LittleWeasel::Modules::Locale, type: :module do
|
|
25
25
|
let(:language) {}
|
26
26
|
let(:region) {}
|
27
27
|
|
28
|
-
#.locale
|
29
|
-
describe '.locale' do
|
30
|
-
it 'adds the class method when included' do
|
31
|
-
expect(subject.class).to respond_to(:locale)
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'with valid arguments' do
|
35
|
-
let(:language) { :en }
|
36
|
-
let(:region) { :us }
|
37
|
-
|
38
|
-
it 'returns the locale as a string' do
|
39
|
-
expect(subject.class.locale language: language, region: region).to eq 'en-US'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'with INVALID arguments' do
|
44
|
-
context 'with an invalid language' do
|
45
|
-
let(:language) {}
|
46
|
-
let(:region) { :us }
|
47
|
-
|
48
|
-
it 'raises an error' do
|
49
|
-
expect { subject.class.locale language: language, region: region }.to raise_error 'Argument language does not respond to :downcase'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'when region is nil' do
|
54
|
-
let(:language) { :en }
|
55
|
-
let(:region) {}
|
56
|
-
|
57
|
-
it 'returns the expected locale as a string' do
|
58
|
-
expect(subject.class.locale language: language, region: region).to eq language.downcase.to_s
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'when region is invalid' do
|
63
|
-
let(:language) { :en }
|
64
|
-
let(:region) { 1 }
|
65
|
-
|
66
|
-
it 'raises an error' do
|
67
|
-
expect { subject.class.locale language: language, region: region }.to raise_error 'Argument region does not respond to :upcase'
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
28
|
#locale
|
74
29
|
describe '#locale' do
|
75
30
|
context 'with valid arguments' do
|
@@ -119,20 +74,20 @@ RSpec.describe LittleWeasel::Modules::Locale, type: :module do
|
|
119
74
|
end
|
120
75
|
|
121
76
|
context 'with invalid arguments' do
|
122
|
-
context '
|
77
|
+
context 'when argument language does not respond to #downcase' do
|
123
78
|
let(:language) { 1 }
|
124
79
|
|
125
80
|
it 'raises an error' do
|
126
|
-
expect { subject.locale }.to raise_error
|
81
|
+
expect { subject.locale }.to raise_error(NoMethodError, /undefined method `downcase'/)
|
127
82
|
end
|
128
83
|
end
|
129
84
|
|
130
|
-
context '
|
85
|
+
context 'when argument region does not respond to #upcase' do
|
131
86
|
let(:language) { :en }
|
132
87
|
let(:region) { 1 }
|
133
88
|
|
134
89
|
it 'raises an error' do
|
135
|
-
expect { subject.locale }.to raise_error
|
90
|
+
expect { subject.locale }.to raise_error(NoMethodError, /undefined method `upcase'/)
|
136
91
|
end
|
137
92
|
end
|
138
93
|
end
|
@@ -23,14 +23,66 @@ RSpec.describe LittleWeasel::Modules::Region, type: :module do
|
|
23
23
|
|
24
24
|
let(:region) {}
|
25
25
|
|
26
|
-
#
|
27
|
-
describe '#
|
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
|
28
80
|
context 'with a non-nil region' do
|
29
81
|
context 'when passing a Symbol' do
|
30
82
|
let(:region) { :AbCdEfG }
|
31
83
|
|
32
84
|
it 'converts the region to a upper-case Symbol' do
|
33
|
-
expect(
|
85
|
+
expect(described_class.normalize_region(region)).to eq :ABCDEFG
|
34
86
|
end
|
35
87
|
end
|
36
88
|
|
@@ -38,14 +90,22 @@ RSpec.describe LittleWeasel::Modules::Region, type: :module do
|
|
38
90
|
let(:region) { 'AbCdEfG' }
|
39
91
|
|
40
92
|
it 'converts the region to a upper-case String' do
|
41
|
-
expect(
|
93
|
+
expect(described_class.normalize_region(region)).to eq 'ABCDEFG'
|
42
94
|
end
|
43
95
|
end
|
44
96
|
end
|
45
97
|
|
46
98
|
context 'with a nil region' do
|
47
99
|
it 'returns nil' do
|
48
|
-
expect(
|
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'/)
|
49
109
|
end
|
50
110
|
end
|
51
111
|
end
|