fedux_org-stdlib 0.6.11 → 0.6.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|