LittleWeasel 3.0.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.reek.yml +17 -0
  4. data/.rspec +4 -2
  5. data/.rubocop.yml +187 -0
  6. data/.ruby-version +1 -1
  7. data/.yardopts +2 -0
  8. data/Gemfile +3 -1
  9. data/LittleWeasel.gemspec +31 -18
  10. data/README.md +408 -42
  11. data/Rakefile +296 -3
  12. data/lib/LittleWeasel.rb +5 -184
  13. data/lib/LittleWeasel/block_results.rb +81 -0
  14. data/lib/LittleWeasel/configure.rb +98 -0
  15. data/lib/LittleWeasel/dictionary.rb +125 -0
  16. data/lib/LittleWeasel/dictionary_key.rb +48 -0
  17. data/lib/LittleWeasel/dictionary_manager.rb +85 -0
  18. data/lib/LittleWeasel/errors/dictionary_file_already_loaded_error.rb +9 -0
  19. data/lib/LittleWeasel/errors/dictionary_file_empty_error.rb +8 -0
  20. data/lib/LittleWeasel/errors/dictionary_file_not_found_error.rb +8 -0
  21. data/lib/LittleWeasel/errors/dictionary_file_too_large_error.rb +16 -0
  22. data/lib/LittleWeasel/errors/language_required_error.rb +8 -0
  23. data/lib/LittleWeasel/errors/must_override_error.rb +8 -0
  24. data/lib/LittleWeasel/filters/en_us/currency_filter.rb +19 -0
  25. data/lib/LittleWeasel/filters/en_us/numeric_filter.rb +19 -0
  26. data/lib/LittleWeasel/filters/en_us/single_character_word_filter.rb +21 -0
  27. data/lib/LittleWeasel/filters/word_filter.rb +59 -0
  28. data/lib/LittleWeasel/filters/word_filter_managable.rb +80 -0
  29. data/lib/LittleWeasel/filters/word_filter_validatable.rb +31 -0
  30. data/lib/LittleWeasel/filters/word_filterable.rb +19 -0
  31. data/lib/LittleWeasel/filters/word_filters_validatable.rb +29 -0
  32. data/lib/LittleWeasel/metadata/dictionary_metadata.rb +145 -0
  33. data/lib/LittleWeasel/metadata/invalid_words_metadata.rb +134 -0
  34. data/lib/LittleWeasel/metadata/invalid_words_service_results.rb +45 -0
  35. data/lib/LittleWeasel/metadata/metadata_observable_validatable.rb +22 -0
  36. data/lib/LittleWeasel/metadata/metadata_observerable.rb +90 -0
  37. data/lib/LittleWeasel/metadata/metadatable.rb +136 -0
  38. data/lib/LittleWeasel/modules/class_name_to_symbol.rb +26 -0
  39. data/lib/LittleWeasel/modules/configurable.rb +26 -0
  40. data/lib/LittleWeasel/modules/deep_dup.rb +11 -0
  41. data/lib/LittleWeasel/modules/dictionary_cache_keys.rb +34 -0
  42. data/lib/LittleWeasel/modules/dictionary_cache_servicable.rb +26 -0
  43. data/lib/LittleWeasel/modules/dictionary_cache_validatable.rb +20 -0
  44. data/lib/LittleWeasel/modules/dictionary_creator_servicable.rb +27 -0
  45. data/lib/LittleWeasel/modules/dictionary_file_loader.rb +67 -0
  46. data/lib/LittleWeasel/modules/dictionary_key_validatable.rb +19 -0
  47. data/lib/LittleWeasel/modules/dictionary_keyable.rb +24 -0
  48. data/lib/LittleWeasel/modules/dictionary_loader_servicable.rb +27 -0
  49. data/lib/LittleWeasel/modules/dictionary_metadata_servicable.rb +29 -0
  50. data/lib/LittleWeasel/modules/dictionary_metadata_validatable.rb +17 -0
  51. data/lib/LittleWeasel/modules/dictionary_sourceable.rb +26 -0
  52. data/lib/LittleWeasel/modules/dictionary_validatable.rb +30 -0
  53. data/lib/LittleWeasel/modules/language.rb +23 -0
  54. data/lib/LittleWeasel/modules/language_validatable.rb +16 -0
  55. data/lib/LittleWeasel/modules/locale.rb +40 -0
  56. data/lib/LittleWeasel/modules/order_validatable.rb +18 -0
  57. data/lib/LittleWeasel/modules/orderable.rb +17 -0
  58. data/lib/LittleWeasel/modules/region.rb +23 -0
  59. data/lib/LittleWeasel/modules/region_validatable.rb +16 -0
  60. data/lib/LittleWeasel/modules/tag_validatable.rb +16 -0
  61. data/lib/LittleWeasel/modules/taggable.rb +31 -0
  62. data/lib/LittleWeasel/modules/word_results_validatable.rb +28 -0
  63. data/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor.rb +22 -0
  64. data/lib/LittleWeasel/preprocessors/preprocessed_word.rb +28 -0
  65. data/lib/LittleWeasel/preprocessors/preprocessed_word_validatable.rb +55 -0
  66. data/lib/LittleWeasel/preprocessors/preprocessed_words.rb +55 -0
  67. data/lib/LittleWeasel/preprocessors/preprocessed_words_validatable.rb +27 -0
  68. data/lib/LittleWeasel/preprocessors/word_preprocessable.rb +19 -0
  69. data/lib/LittleWeasel/preprocessors/word_preprocessor.rb +122 -0
  70. data/lib/LittleWeasel/preprocessors/word_preprocessor_managable.rb +114 -0
  71. data/lib/LittleWeasel/preprocessors/word_preprocessor_validatable.rb +40 -0
  72. data/lib/LittleWeasel/preprocessors/word_preprocessors_validatable.rb +24 -0
  73. data/lib/LittleWeasel/services/dictionary_cache_service.rb +262 -0
  74. data/lib/LittleWeasel/services/dictionary_creator_service.rb +94 -0
  75. data/lib/LittleWeasel/services/dictionary_file_loader_service.rb +37 -0
  76. data/lib/LittleWeasel/services/dictionary_killer_service.rb +35 -0
  77. data/lib/LittleWeasel/services/dictionary_loader_service.rb +59 -0
  78. data/lib/LittleWeasel/services/dictionary_metadata_service.rb +114 -0
  79. data/lib/LittleWeasel/services/invalid_words_service.rb +59 -0
  80. data/lib/LittleWeasel/version.rb +3 -1
  81. data/lib/LittleWeasel/word_results.rb +146 -0
  82. data/spec/factories/dictionary.rb +43 -0
  83. data/spec/factories/dictionary_cache_service.rb +95 -0
  84. data/spec/factories/dictionary_creator_service.rb +16 -0
  85. data/spec/factories/dictionary_file_loader_service.rb +13 -0
  86. data/spec/factories/dictionary_hash.rb +39 -0
  87. data/spec/factories/dictionary_key.rb +14 -0
  88. data/spec/factories/dictionary_killer_service.rb +14 -0
  89. data/spec/factories/dictionary_loader_service.rb +14 -0
  90. data/spec/factories/dictionary_manager.rb +10 -0
  91. data/spec/factories/dictionary_metadata.rb +16 -0
  92. data/spec/factories/dictionary_metadata_service.rb +16 -0
  93. data/spec/factories/numeric_filter.rb +12 -0
  94. data/spec/factories/preprocessed_word.rb +16 -0
  95. data/spec/factories/preprocessed_words.rb +41 -0
  96. data/spec/factories/single_character_word_filter.rb +12 -0
  97. data/spec/factories/word_results.rb +16 -0
  98. data/spec/lib/LittleWeasel/block_results_spec.rb +248 -0
  99. data/spec/lib/LittleWeasel/configure_spec.rb +74 -0
  100. data/spec/lib/LittleWeasel/dictionary_key_spec.rb +118 -0
  101. data/spec/lib/LittleWeasel/dictionary_manager_spec.rb +116 -0
  102. data/spec/lib/LittleWeasel/dictionary_spec.rb +289 -0
  103. data/spec/lib/LittleWeasel/filters/en_us/currency_filter_spec.rb +80 -0
  104. data/spec/lib/LittleWeasel/filters/en_us/numeric_filter_spec.rb +66 -0
  105. data/spec/lib/LittleWeasel/filters/en_us/single_character_word_filter_spec.rb +58 -0
  106. data/spec/lib/LittleWeasel/filters/word_filter_managable_spec.rb +180 -0
  107. data/spec/lib/LittleWeasel/filters/word_filter_spec.rb +151 -0
  108. data/spec/lib/LittleWeasel/filters/word_filter_validatable_spec.rb +94 -0
  109. data/spec/lib/LittleWeasel/filters/word_filters_validatable_spec.rb +48 -0
  110. data/spec/lib/LittleWeasel/integraton_tests/dictionary_integration_spec.rb +201 -0
  111. data/spec/lib/LittleWeasel/metadata/dictionary_creator_servicable_spec.rb +54 -0
  112. data/spec/lib/LittleWeasel/metadata/dictionary_metadata_spec.rb +209 -0
  113. data/spec/lib/LittleWeasel/metadata/invalid_words_metadata_spec.rb +155 -0
  114. data/spec/lib/LittleWeasel/metadata/metadata_observerable_spec.rb +31 -0
  115. data/spec/lib/LittleWeasel/metadata/metadatable_spec.rb +35 -0
  116. data/spec/lib/LittleWeasel/modules/class_name_to_symbol_spec.rb +21 -0
  117. data/spec/lib/LittleWeasel/modules/dictionary_file_loader_spec.rb +125 -0
  118. data/spec/lib/LittleWeasel/modules/dictionary_sourceable_spec.rb +44 -0
  119. data/spec/lib/LittleWeasel/modules/language_spec.rb +52 -0
  120. data/spec/lib/LittleWeasel/modules/locale_spec.rb +140 -0
  121. data/spec/lib/LittleWeasel/modules/region_spec.rb +52 -0
  122. data/spec/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor_spec.rb +34 -0
  123. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_spec.rb +105 -0
  124. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_validatable_spec.rb +143 -0
  125. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_spec.rb +77 -0
  126. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_validatable_spec.rb +58 -0
  127. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_managable_spec.rb +216 -0
  128. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_spec.rb +175 -0
  129. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_validatable_spec.rb +109 -0
  130. data/spec/lib/LittleWeasel/preprocessors/word_preprocessors_validatable_spec.rb +49 -0
  131. data/spec/lib/LittleWeasel/services/dictionary_cache_service_spec.rb +444 -0
  132. data/spec/lib/LittleWeasel/services/dictionary_creator_service_spec.rb +119 -0
  133. data/spec/lib/LittleWeasel/services/dictionary_file_loader_service_spec.rb +71 -0
  134. data/spec/lib/LittleWeasel/services/dictionary_loader_service_spec.rb +50 -0
  135. data/spec/lib/LittleWeasel/services/dictionary_metadata_service_spec.rb +279 -0
  136. data/spec/lib/LittleWeasel/word_results_spec.rb +275 -0
  137. data/spec/lib/LittleWeasel/workflow/workflow_spec.rb +20 -0
  138. data/spec/spec_helper.rb +117 -6
  139. data/spec/support/factory_bot.rb +15 -0
  140. data/spec/support/file_helpers.rb +32 -0
  141. data/spec/support/files/empty-dictionary.txt +0 -0
  142. data/{lib/dictionary → spec/support/files/en-US-big.txt} +262156 -31488
  143. data/spec/support/files/en-US-tagged.txt +26 -0
  144. data/spec/support/files/en-US.txt +26 -0
  145. data/spec/support/files/en.txt +26 -0
  146. data/spec/support/files/es-ES.txt +27 -0
  147. data/spec/support/files/es.txt +27 -0
  148. data/spec/support/general_helpers.rb +68 -0
  149. data/spec/support/shared_contexts.rb +108 -0
  150. data/spec/support/shared_examples.rb +105 -0
  151. metadata +408 -65
  152. data/spec/checker/checker_spec.rb +0 -286
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'observer'
5
+
6
+ RSpec.describe LittleWeasel::Metadata::InvalidWordsMetadata do
7
+ subject do
8
+ dictionary.dictionary_metadata_object[:invalid_words_metadata]
9
+ end
10
+
11
+ let(:dictionary) { dictionary_manager.create_dictionary_from_file(dictionary_key: dictionary_key, file: file) }
12
+ let(:dictionary_manager) { create(:dictionary_manager) }
13
+
14
+ let(:dictionary_key) { create(:dictionary_key, language: language, region: region, tag: tag) }
15
+ let(:language) { :en }
16
+ let(:region) { :us }
17
+ let(:tag) {}
18
+ let(:dictionary_cache) { {} }
19
+ let(:dictionary_metadata) { {} }
20
+ let(:file) { dictionary_path_for file_name: dictionary_key.key }
21
+
22
+ let(:dictionary_cache_service) { create(:dictionary_cache_service, dictionary_key: dictionary_key, dictionary_cache: dictionary_cache) }
23
+ let(:invalid_words_metadata) { described_class.new(dictionary_metadata_object: dictionary_metadata_object, dictionary_words: dictionary_words, dictionary_key: dictionary_key, dictionary_cache: dictionary_cache, dictionary_metadata: dictionary_metadata) }
24
+ let(:dictionary_metadata_object) do
25
+ Class.new do
26
+ include Observable
27
+ end.new
28
+ end
29
+
30
+ let(:configuration) { LittleWeasel.configuration }
31
+
32
+ #new
33
+ describe '#new' do
34
+ context 'with invalid arguments' do
35
+ subject { invalid_words_metadata }
36
+
37
+ before do
38
+ dictionary_cache_service.add_dictionary_source(source: file)
39
+ end
40
+
41
+ context 'with invalid dictionary metadata object' do
42
+ let(:dictionary_words) { { 'a' => true, 'b' => true } }
43
+ let(:dictionary_metadata_object) { :wrong_type }
44
+
45
+ it 'raises an error' do
46
+ expect { subject }.to raise_error "Argument dictionary_metadata_object is not an Observable: #{dictionary_metadata_object.class}."
47
+ end
48
+ end
49
+
50
+ context 'with invalid dictionary metadata' do
51
+ let(:dictionary_words) { { 'a' => true, 'b' => true } }
52
+ let(:dictionary_metadata) { :wrong_type }
53
+
54
+ it 'raises an error' do
55
+ expect { subject }.to raise_error "Argument dictionary_metadata is not a valid Hash object: #{dictionary_metadata.class}"
56
+ end
57
+ end
58
+
59
+ context 'with an invalid dictionary' do
60
+ let(:dictionary_words) { :wrong_type }
61
+
62
+ it 'raises an error' do
63
+ expect { subject }.to raise_error "Argument dictionary_words is not a Hash: #{dictionary_words.class}."
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'with a valid arguments' do
69
+ before do
70
+ subject.word_search params: { word_results: word_results1 }
71
+ subject.word_search params: { word_results: word_results2 }
72
+ end
73
+
74
+ let(:word_results1) { create(:word_results, original_word: 'badword1') }
75
+ let(:word_results2) { create(:word_results, original_word: 'badword2') }
76
+
77
+ it 'instantiates without error' do
78
+ expect { subject }.to_not raise_error
79
+ end
80
+
81
+ it 'initializes the necessary object attributes' do
82
+ expect(subject.on?).to eq true
83
+ expect(subject.off?).to eq false
84
+ expect(subject.value).to eq configuration.max_invalid_words_bytesize
85
+ expect(subject.value_exceeded?).to eq false
86
+ expect(subject.current_invalid_word_bytesize).to eq 16
87
+ expect(subject.cache_invalid_words?).to eq true
88
+ end
89
+ end
90
+
91
+ context 'with an invalid dictionary words Hash' do
92
+ subject { invalid_words_metadata }
93
+
94
+ context 'when nil' do
95
+ let(:dictionary_words) {}
96
+
97
+ it 'raises an error' do
98
+ expect { subject }.to raise_error ArgumentError
99
+ end
100
+ end
101
+
102
+ context 'when not a Hash' do
103
+ let(:dictionary_words) { :not_an_array }
104
+
105
+ it 'raises an error' do
106
+ expect { subject }.to raise_error ArgumentError
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ #refresh
113
+ describe '#refresh' do
114
+ it 'the metadata is refreshed' do
115
+ expect(subject.current_invalid_word_bytesize).to eq 0
116
+ expect do
117
+ dictionary.word_results('badword')
118
+ subject.refresh
119
+ end.to change { subject.current_invalid_word_bytesize }
120
+ .from(0).to(7)
121
+ end
122
+ end
123
+
124
+ #init
125
+ describe '#init' do
126
+ it 'the metadata is initialized' do
127
+ expect do
128
+ subject.dictionary_metadata_object.dictionary_words['not-found'] = false
129
+ subject.init
130
+ end.to change { subject.current_invalid_word_bytesize }
131
+ .from(0).to(9)
132
+ end
133
+ end
134
+
135
+ #Update
136
+ describe '#update' do
137
+ context 'with an action NOT on the whitelist' do
138
+ let(:action) { :bad_action! }
139
+ let(:params) { :params }
140
+
141
+ it 'raises an error' do
142
+ expect { subject.update(action, params) }.to raise_error "Argument action is not in the actions_whitelist: #{action}"
143
+ end
144
+ end
145
+
146
+ context 'with an action on the whitelist' do
147
+ it 'carries out the requested action' do
148
+ expect do
149
+ dictionary.word_results 'not-found'
150
+ end.to change { subject.current_invalid_word_bytesize }
151
+ .from(0).to(9)
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Metadata::MetadataObserverable, type: :module do
6
+ MetadataObserverable = described_class
7
+
8
+ subject do
9
+ Class.new do
10
+ include MetadataObserverable
11
+ end.new
12
+ end
13
+
14
+ describe '#observe?' do
15
+ it 'returns false by default' do
16
+ expect(subject.observe?).to eq false
17
+ end
18
+ end
19
+
20
+ describe '#update' do
21
+ it 'raises an error if not overridden' do
22
+ expect { subject.update :action, args: :args }.to raise_error LittleWeasel::Errors::MustOverrideError
23
+ end
24
+ end
25
+
26
+ describe '#actions_whitelist' do
27
+ it 'returns an Array with :init and :refresh Symbols by default' do
28
+ expect(subject.actions_whitelist).to eq %i[init refresh]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Metadata::Metadatable, type: :module do
6
+ Metadatable = described_class
7
+
8
+ subject do
9
+ Class.new do
10
+ include Metadatable
11
+
12
+ def update_dictionary_metadata_test
13
+ update_dictionary_metadata value: :value
14
+ end
15
+ end.new
16
+ end
17
+
18
+ describe '#init' do
19
+ it 'raises an error if not overridden' do
20
+ expect { subject.init }.to raise_error LittleWeasel::Errors::MustOverrideError
21
+ end
22
+ end
23
+
24
+ describe '#refresh' do
25
+ it 'raises an error if not overridden' do
26
+ expect { subject.refresh }.to raise_error LittleWeasel::Errors::MustOverrideError
27
+ end
28
+ end
29
+
30
+ describe '#update_dictionary_metadata' do
31
+ it 'raises an error if not overridden' do
32
+ expect { subject.update_dictionary_metadata_test }.to raise_error LittleWeasel::Errors::MustOverrideError
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Modules::ClassNameToSymbol, type: :module do
6
+ ClassNameToSymbol = described_class
7
+
8
+ subject do
9
+ module TestModule
10
+ class TestMeUp
11
+ include ClassNameToSymbol
12
+ end
13
+ end
14
+ end
15
+
16
+ describe '#to_sym' do
17
+ it 'returns the class name as a snake-case Symbol with namespaces removed' do
18
+ expect(subject.new.to_sym).to eq :test_me_up
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Modules::DictionaryFileLoader, type: :module do
6
+ subject do
7
+ dictionary_cache_service.init dictionary_cache: dictionary_cache
8
+ dictionary_file_loader
9
+ end
10
+
11
+ let(:dictionary_file_loader) do
12
+ Class.new do
13
+ include LittleWeasel::Modules::DictionaryFileLoader
14
+
15
+ attr_reader :dictionary_key, :dictionary_cache, :config
16
+
17
+ def initialize(dictionary_key, dictionary_cache)
18
+ self.dictionary_key = dictionary_key
19
+ self.dictionary_cache = dictionary_cache
20
+ self.config = LittleWeasel.configuration
21
+ end
22
+
23
+ private
24
+
25
+ attr_writer :dictionary_key, :dictionary_cache, :config
26
+ end.new(dictionary_key, dictionary_cache)
27
+ end
28
+
29
+ let(:language) { :en }
30
+ let(:region) { :us }
31
+ let(:tag) {}
32
+
33
+ let(:dictionary_cache_service) { LittleWeasel::Services::DictionaryCacheService }
34
+ let(:dictionary_key) { LittleWeasel::DictionaryKey.new(language: language, region: region, tag: tag) }
35
+ let(:key) { dictionary_key.key }
36
+ let(:file) { dictionary_path_for locale: dictionary_key.locale }
37
+ let(:dictionary_file_key) { file }
38
+ let(:dictionary_cache) { {} }
39
+
40
+ #load
41
+ describe '#load' do
42
+ context 'with an invalid dictionary file' do
43
+ context 'when it cannot be found' do
44
+ let(:dictionary_path) { region_dictionary_path language: :bad, region: :worse }
45
+
46
+ it 'raises an error' do
47
+ expect { subject.load dictionary_path }.to raise_error LittleWeasel::Errors::DictionaryFileNotFoundError
48
+ end
49
+ end
50
+
51
+ context 'when it is empty' do
52
+ let(:dictionary_path) { dictionary_path_for file_name: 'empty-dictionary' }
53
+
54
+ it 'raises an error' do
55
+ expect { subject.load dictionary_path }.to raise_error LittleWeasel::Errors::DictionaryFileEmptyError
56
+ end
57
+ end
58
+
59
+ context 'when it is too large' do
60
+ before do
61
+ allow(LittleWeasel.configuration).to receive(:max_dictionary_file_bytes).and_return 1
62
+ end
63
+
64
+ let(:dictionary_path) { language_dictionary_path language: :en }
65
+
66
+ it 'raises an error' do
67
+ expect { subject.load dictionary_path }.to raise_error LittleWeasel::Errors::DictionaryFileTooLargeError
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'with a valid dictionary file' do
73
+ subject { dictionary_file_loader.load dictionary_path }
74
+
75
+ let(:dictionary_path) { region_dictionary_path language: language, region: region }
76
+
77
+ context 'when the dictionary file is already loaded/cached' do
78
+ before { subject }
79
+
80
+ it 'does not raise an error' do
81
+ expect { subject }.to_not raise_error
82
+ end
83
+ end
84
+
85
+ context 'when the dictionary is NOT already loaded/cached' do
86
+ let(:expected_dictionary_key_key) { LittleWeasel::DictionaryKey.new(language: language, region: region, tag: tag).key }
87
+ let(:expected_results) do
88
+ ['apple',
89
+ 'better',
90
+ 'cat',
91
+ 'dog',
92
+ 'everyone',
93
+ 'fat',
94
+ 'game',
95
+ 'help',
96
+ 'italic',
97
+ 'jasmine',
98
+ 'kelp',
99
+ 'love',
100
+ 'man',
101
+ 'nope',
102
+ 'octopus',
103
+ 'popeye',
104
+ 'queue',
105
+ 'ruby',
106
+ 'stop',
107
+ 'top',
108
+ 'ultimate',
109
+ 'very',
110
+ 'was',
111
+ 'xylophone',
112
+ 'yes',
113
+ 'zebra']
114
+ end
115
+
116
+ it 'returns an Array of dictionary words loaded from the file' do
117
+ # This test won't pass if we're not testing against an assumed
118
+ # dictionary file.
119
+ expect(dictionary_key.key).to eq expected_dictionary_key_key
120
+ expect(subject).to eq expected_results
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Modules::DictionarySourceable, type: :module do
6
+
7
+ #.MEMORY_SOURCE
8
+ describe '::MEMORY_SOURCE' do
9
+ it 'returns the memory source value' do
10
+ expect(described_class::MEMORY_SOURCE).to eq '*'
11
+ end
12
+ end
13
+
14
+ #.memory_source
15
+ describe '.memory_source' do
16
+ it 'returns a new memory source' do
17
+ expect(described_class.memory_source?(described_class.memory_source)).to be_truthy
18
+ end
19
+ end
20
+
21
+ #.memory_source?
22
+ describe '.memory_source?' do
23
+ it 'returns truthy if argument is a valid memory source' do
24
+ expect(described_class.memory_source? '*12345678').to be_truthy
25
+ expect(described_class.memory_source? '*abcdef00').to be_truthy
26
+ expect(described_class.memory_source? '*ABCDEF00').to be_truthy
27
+ expect(described_class.memory_source? '*aBcDeF00').to be_truthy
28
+ end
29
+
30
+ it 'returns falsey if argument is NOT a memory source' do
31
+ expect(described_class.memory_source? '*123456789').to be_falsey
32
+ expect(described_class.memory_source? '*abcdefg0').to be_falsey
33
+ expect(described_class.memory_source? '*ABCDEFG0').to be_falsey
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
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,52 @@
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
+ #normalize_language
27
+ describe '#normalize_language' do
28
+ context 'with a non-nil language' do
29
+ context 'when passing a Symbol' do
30
+ let(:language) { :AbCdEfG }
31
+
32
+ it 'converts the language to a lower-case Symbol' do
33
+ expect(subject.normalize_language).to eq :abcdefg
34
+ end
35
+ end
36
+
37
+ context 'when passing a String' do
38
+ let(:language) { 'AbCdEfG' }
39
+
40
+ it 'converts the language to a lower-case String' do
41
+ expect(subject.normalize_language).to eq 'abcdefg'
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'with a nil language' do
47
+ it 'returns nil' do
48
+ expect(subject.normalize_language).to be_nil
49
+ end
50
+ end
51
+ end
52
+ end