fedux_org-stdlib 0.6.11 → 0.6.12
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 +4 -4
- data/lib/fedux_org_stdlib/app_config.rb +28 -14
- data/lib/fedux_org_stdlib/version.rb +1 -1
- data/spec/app_config_spec.rb +147 -42
- data/spec/support/generator.rb +14 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b6d4b263098c38be3d3499fdd03734a2c1efbd8
|
4
|
+
data.tar.gz: c7a34b1c7f3b72378eea3c10bdfe9b6d76723cfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb1230859eae20347dfd17ef155d45026b8271a6dc9ebc9e2d6515e4e5ab188e916b2ff2190e382fe7f502a6ab777b2bccf1b41408ea0cc459659be7d6f89bc8
|
7
|
+
data.tar.gz: 80459da9eb8de1d77e37ef78cad19d8f0aa2ace3e405b827ee342fa4f2b136e51291712ae46112ef60663aef5c09b2e4cc6325630d762fa4f51efc1772107fee
|
@@ -4,7 +4,7 @@ require 'fedux_org_stdlib/app_config/exceptions'
|
|
4
4
|
require 'fedux_org_stdlib/process_environment'
|
5
5
|
require 'fedux_org_stdlib/core_ext/array'
|
6
6
|
require 'fedux_org_stdlib/logging/logger'
|
7
|
-
require_library %w{ json psych active_support/core_ext/string/inflections
|
7
|
+
require_library %w{ json psych active_support/core_ext/string/inflections set active_support/core_ext/hash/slice }
|
8
8
|
|
9
9
|
module FeduxOrgStdlib
|
10
10
|
# This class makes a config file available as an object. The config file
|
@@ -71,7 +71,7 @@ module FeduxOrgStdlib
|
|
71
71
|
class << self
|
72
72
|
|
73
73
|
# @api private
|
74
|
-
def
|
74
|
+
def _known_options
|
75
75
|
@options ||= Set.new
|
76
76
|
end
|
77
77
|
|
@@ -103,7 +103,7 @@ module FeduxOrgStdlib
|
|
103
103
|
_config.fetch(option, default_value)
|
104
104
|
end
|
105
105
|
|
106
|
-
self.
|
106
|
+
self._known_options << option
|
107
107
|
end
|
108
108
|
|
109
109
|
# Define a writer for option
|
@@ -130,7 +130,7 @@ module FeduxOrgStdlib
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
-
self.
|
133
|
+
self._known_options << option
|
134
134
|
end
|
135
135
|
|
136
136
|
# Define a writer and a reader for option
|
@@ -148,9 +148,10 @@ module FeduxOrgStdlib
|
|
148
148
|
|
149
149
|
private
|
150
150
|
|
151
|
-
#
|
152
|
-
|
153
|
-
|
151
|
+
# Holds the config
|
152
|
+
def _config
|
153
|
+
@__config
|
154
|
+
end
|
154
155
|
|
155
156
|
public
|
156
157
|
|
@@ -166,6 +167,10 @@ module FeduxOrgStdlib
|
|
166
167
|
# @param [Object] config_engine (Psych)
|
167
168
|
# The engine to read config file
|
168
169
|
#
|
170
|
+
# @param [true, false] check_unknown_options
|
171
|
+
# Should a warning be put to stdout if there are unknown options in yaml
|
172
|
+
# config file
|
173
|
+
#
|
169
174
|
# @raise [Exceptions::ConfigFileNotReadable]
|
170
175
|
# If an avaiable config file could not be read by the config engine
|
171
176
|
#
|
@@ -176,27 +181,36 @@ module FeduxOrgStdlib
|
|
176
181
|
def initialize(
|
177
182
|
file: _available_config_file,
|
178
183
|
config_engine: Psych,
|
179
|
-
logger: FeduxOrgStdlib::Logging::Logger.new
|
184
|
+
logger: FeduxOrgStdlib::Logging::Logger.new,
|
185
|
+
check_unknown_options: true
|
180
186
|
)
|
181
187
|
@logger = logger
|
182
188
|
|
183
189
|
unless file
|
184
190
|
logger.debug "No configuration file found at #{_allowed_config_file_paths.to_list}, using an empty config."
|
185
|
-
@
|
191
|
+
@__config = {}
|
186
192
|
|
187
193
|
return
|
188
194
|
end
|
189
195
|
|
190
196
|
begin
|
191
|
-
yaml = Psych.safe_load(File.read(file))
|
197
|
+
yaml = Psych.safe_load(File.read(file), [Symbol])
|
192
198
|
rescue StandardError => e
|
193
199
|
fail Exceptions::ConfigFileNotReadable, JSON.dump(message: e.message, file: file)
|
194
200
|
end
|
195
201
|
|
196
|
-
if yaml.respond_to? :[]
|
197
|
-
|
202
|
+
if yaml.respond_to? :[] and !yaml.kind_of? Array
|
203
|
+
yaml = yaml.deep_symbolize_keys
|
204
|
+
|
205
|
+
yaml_with_known_options = yaml.deep_symbolize_keys.slice(*self.class._known_options)
|
206
|
+
unknown_options = yaml.keys - yaml_with_known_options.keys
|
207
|
+
|
208
|
+
logger.warn "Unknown config options #{(unknown_options).to_list} in config file #{file} detected. Please define them in your config class or remove the entries in your config file or disable check via `check_unknown_options: false` to get rid of this warning." unless unknown_options.blank? && check_unknown_options == true
|
209
|
+
|
210
|
+
@__config = Hash(yaml_with_known_options)
|
198
211
|
else
|
199
|
-
|
212
|
+
logger.warn "There seems to be a problem transforming config file \"#{file}\" to a hash using an empty config."
|
213
|
+
@__config = {}
|
200
214
|
end
|
201
215
|
end
|
202
216
|
|
@@ -214,7 +228,7 @@ module FeduxOrgStdlib
|
|
214
228
|
result << sprintf("%20s | %s", 'option', 'value')
|
215
229
|
result << sprintf("%s + %s", '-' * 20, '-' * 80)
|
216
230
|
|
217
|
-
self.class.
|
231
|
+
self.class._known_options.each do |o|
|
218
232
|
result << sprintf("%20s | %s", o, Array(public_send(o)).join(', '))
|
219
233
|
end
|
220
234
|
|
data/spec/app_config_spec.rb
CHANGED
@@ -67,7 +67,28 @@ RSpec.describe AppConfig do
|
|
67
67
|
end.to raise_error FeduxOrgStdlib::AppConfig::Exceptions::OptionNameForbidden
|
68
68
|
end
|
69
69
|
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context '#lock' do
|
73
|
+
it 'raises error if config is locked and one tries to modify a config option' do
|
74
|
+
with_environment 'HOME' => working_directory do
|
75
|
+
config_klass = Class.new(AppConfig) do
|
76
|
+
option :opt1, nil
|
70
77
|
|
78
|
+
def _class_name
|
79
|
+
'TestConfig'
|
80
|
+
end
|
81
|
+
|
82
|
+
def _module_name
|
83
|
+
'MyApplication'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
config = config_klass.new
|
88
|
+
config.lock
|
89
|
+
expect { config.opt1 = 1 }.to raise_error FeduxOrgStdlib::AppConfig::Exceptions::ConfigLocked
|
90
|
+
end
|
91
|
+
end
|
71
92
|
end
|
72
93
|
|
73
94
|
context 'config files' do
|
@@ -118,76 +139,160 @@ RSpec.describe AppConfig do
|
|
118
139
|
expect(config.opt1).to eq 'hello world'
|
119
140
|
end
|
120
141
|
end
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
142
|
+
|
143
|
+
it 'looks at ~/.my_application/tests.yaml' do
|
144
|
+
with_environment 'HOME' => working_directory do
|
145
|
+
create_file '.my_application/tests.yaml', <<-EOS.strip_heredoc
|
125
146
|
---
|
126
147
|
opt1: hello world
|
127
|
-
|
148
|
+
EOS
|
128
149
|
|
129
|
-
|
130
|
-
|
150
|
+
config_klass = Class.new(AppConfig) do
|
151
|
+
option_reader :opt1, nil
|
131
152
|
|
132
|
-
|
133
|
-
|
134
|
-
|
153
|
+
def _class_name
|
154
|
+
'TestConfig'
|
155
|
+
end
|
135
156
|
|
136
|
-
|
137
|
-
|
157
|
+
def _module_name
|
158
|
+
'MyApplication'
|
159
|
+
end
|
138
160
|
end
|
139
|
-
end
|
140
161
|
|
141
|
-
|
142
|
-
|
162
|
+
config = config_klass.new
|
163
|
+
expect(config.opt1).to eq 'hello world'
|
164
|
+
end
|
143
165
|
end
|
144
|
-
end
|
145
166
|
|
146
|
-
|
147
|
-
|
148
|
-
|
167
|
+
it 'looks at ~/.tests.yaml' do
|
168
|
+
with_environment 'HOME' => working_directory do
|
169
|
+
create_file '.tests.yaml', <<-EOS.strip_heredoc
|
149
170
|
---
|
150
171
|
opt1: hello world
|
151
|
-
|
172
|
+
EOS
|
152
173
|
|
153
|
-
|
154
|
-
|
174
|
+
config_klass = Class.new(AppConfig) do
|
175
|
+
option_reader :opt1, nil
|
155
176
|
|
156
|
-
|
157
|
-
|
158
|
-
|
177
|
+
def _class_name
|
178
|
+
'TestConfig'
|
179
|
+
end
|
159
180
|
|
160
|
-
|
161
|
-
|
181
|
+
def _module_name
|
182
|
+
'MyApplication'
|
183
|
+
end
|
162
184
|
end
|
185
|
+
|
186
|
+
config = config_klass.new
|
187
|
+
expect(config.opt1).to eq 'hello world'
|
163
188
|
end
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'looks at ~/.testsrc' do
|
192
|
+
with_environment 'HOME' => working_directory do
|
193
|
+
create_file '.testsrc', <<-EOS.strip_heredoc
|
194
|
+
---
|
195
|
+
opt1: hello world
|
196
|
+
EOS
|
197
|
+
|
198
|
+
config_klass = Class.new(AppConfig) do
|
199
|
+
option_reader :opt1, nil
|
164
200
|
|
165
|
-
|
166
|
-
|
201
|
+
def _class_name
|
202
|
+
'TestConfig'
|
203
|
+
end
|
204
|
+
|
205
|
+
def _module_name
|
206
|
+
'MyApplication'
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
config = config_klass.new
|
211
|
+
expect(config.opt1).to eq 'hello world'
|
212
|
+
end
|
167
213
|
end
|
168
|
-
end
|
169
214
|
|
170
|
-
|
171
|
-
|
172
|
-
|
215
|
+
it 'loads yaml files with the following data types' do
|
216
|
+
with_environment 'HOME' => working_directory do
|
217
|
+
create_file '.testsrc', <<-EOS.strip_heredoc
|
173
218
|
---
|
174
219
|
opt1: hello world
|
175
|
-
|
220
|
+
opt2: :test
|
221
|
+
opt3: 1
|
222
|
+
opt4: true
|
223
|
+
opt5: false
|
224
|
+
opt6:
|
225
|
+
- a
|
226
|
+
- b
|
227
|
+
opt7:
|
228
|
+
name: berni
|
229
|
+
EOS
|
176
230
|
|
177
|
-
|
178
|
-
|
231
|
+
config_klass = Class.new(AppConfig) do
|
232
|
+
option_reader :opt1, nil
|
233
|
+
option_reader :opt2, nil
|
234
|
+
option_reader :opt3, nil
|
235
|
+
option_reader :opt4, nil
|
236
|
+
option_reader :opt5, nil
|
237
|
+
option_reader :opt6, nil
|
238
|
+
option_reader :opt7, nil
|
179
239
|
|
180
|
-
|
181
|
-
|
240
|
+
def _class_name
|
241
|
+
'TestConfig'
|
242
|
+
end
|
243
|
+
|
244
|
+
def _module_name
|
245
|
+
'MyApplication'
|
246
|
+
end
|
182
247
|
end
|
183
248
|
|
184
|
-
|
185
|
-
|
249
|
+
config = config_klass.new
|
250
|
+
expect(config.opt1).to eq 'hello world'
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'raises error on invalid yaml file' do
|
255
|
+
with_environment 'HOME' => working_directory do
|
256
|
+
create_file '.testsrc', random_binary_string(100)
|
257
|
+
|
258
|
+
config_klass = Class.new(AppConfig) do
|
259
|
+
def _class_name
|
260
|
+
'TestConfig'
|
261
|
+
end
|
262
|
+
|
263
|
+
def _module_name
|
264
|
+
'MyApplication'
|
265
|
+
end
|
186
266
|
end
|
267
|
+
|
268
|
+
expect { config_klass.new }.to raise_error FeduxOrgStdlib::AppConfig::Exceptions::ConfigFileNotReadable
|
187
269
|
end
|
270
|
+
end
|
188
271
|
|
189
|
-
|
190
|
-
|
272
|
+
it 'returns an empty config if data file cannot be transformed to hash' do
|
273
|
+
with_environment 'HOME' => working_directory do
|
274
|
+
create_file '.testsrc', <<-EOS.strip_heredoc
|
275
|
+
---
|
276
|
+
- hello
|
277
|
+
- world
|
278
|
+
EOS
|
279
|
+
|
280
|
+
config_klass = Class.new(AppConfig) do
|
281
|
+
def _class_name
|
282
|
+
'TestConfig'
|
283
|
+
end
|
284
|
+
|
285
|
+
def _module_name
|
286
|
+
'MyApplication'
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
result = capture :stderr do
|
291
|
+
config_klass.new
|
292
|
+
end
|
293
|
+
|
294
|
+
expect(result).to include "There seems"
|
295
|
+
end
|
191
296
|
end
|
192
297
|
end
|
193
298
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module FeduxOrgStdlib
|
3
|
+
module SpecHelper
|
4
|
+
module Generators
|
5
|
+
def random_binary_string(length)
|
6
|
+
Random.new.bytes(length)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec.configure do |c|
|
13
|
+
c.include FeduxOrgStdlib::SpecHelper::Generators
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fedux_org-stdlib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Meyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -159,6 +159,7 @@ files:
|
|
159
159
|
- spec/spec_helper.rb
|
160
160
|
- spec/support/environment.rb
|
161
161
|
- spec/support/filesystem.rb
|
162
|
+
- spec/support/generator.rb
|
162
163
|
- spec/support/reporting.rb
|
163
164
|
- spec/support/rspec.rb
|
164
165
|
- spec/support/string.rb
|
@@ -224,6 +225,7 @@ test_files:
|
|
224
225
|
- spec/spec_helper.rb
|
225
226
|
- spec/support/environment.rb
|
226
227
|
- spec/support/filesystem.rb
|
228
|
+
- spec/support/generator.rb
|
227
229
|
- spec/support/reporting.rb
|
228
230
|
- spec/support/rspec.rb
|
229
231
|
- spec/support/string.rb
|