params 0.0.2 → 0.0.8
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.
- data/lib/params/version.rb +5 -0
- data/lib/params.rb +318 -7
- data/test/params/params_spec.rb +282 -0
- data/test/params/params_test.rb +45 -0
- metadata +9 -5
- data/lib/params/argument_parser.rb +0 -24
data/lib/params.rb
CHANGED
@@ -1,11 +1,322 @@
|
|
1
|
-
#
|
1
|
+
# Author: Yaron Dror (yaron.dror.bb@gmail.com)
|
2
|
+
# Description: The file contains 'Params' module implementation.
|
3
|
+
# Notes:
|
4
|
+
# module.init should be called if user wants to override defined parameters by file or command line.
|
5
|
+
# Parameter can be defined only once.
|
6
|
+
# Parameters have to be defined before they are accessed. see examples below.
|
7
|
+
#
|
8
|
+
# Examples of definitions:
|
9
|
+
# Params.string('parameter_str', 'this is a string' ,'description_for_string')
|
10
|
+
# Params.integer('parameter_int',1 , 'description_for_integer')
|
11
|
+
# Params.float('parameter_float',2.6 , 'description_for_float')
|
12
|
+
# Params.boolean('parameter_true', true, 'description_for_true')
|
13
|
+
# Params.boolean('parameter_false',false , 'description_for_false')
|
14
|
+
# Note. Parameters have to be defined before they are accessed.
|
15
|
+
#
|
16
|
+
# Examples of usages (get\set access is through the [] operator).
|
17
|
+
# local_var_of_type_string = Params['parameter_str']
|
18
|
+
# puts local_var_of_type_string # Will produce --> this is a string
|
19
|
+
# Params['parameter_float'] = 3.8
|
20
|
+
# puts Params['parameter_float'] # Will produce --> 3.8
|
21
|
+
# Params['parameter_float'] = 3
|
22
|
+
# puts Params['parameter_float'] # Will produce --> 3.0 (note the casting)
|
23
|
+
# Note. only after definition, the [] operator will work. Else an error is raised.
|
24
|
+
# Params['new_param'] = true # will raise an error, since the param was not defined yet.
|
25
|
+
# Params.boolean 'new_param', true, 'this is correct' # this is the definition.
|
26
|
+
# Params['new_param'] = false # Will set new value.
|
27
|
+
# puts Params['new_param'] # Will produce --> false
|
28
|
+
#
|
29
|
+
# Type check.
|
30
|
+
# A type check is forced both when overriding with file or command line and in [] usage.
|
31
|
+
# if parameter was defined as a Float using Params.float method (e.g. 2.6) and user
|
32
|
+
# provided an integer when overriding or when using [] operator then the integer will
|
33
|
+
# be casted to float.
|
34
|
+
#
|
35
|
+
# Params.Init - override parameters.
|
36
|
+
# implementation of the init sequence allows the override of
|
37
|
+
# defined parameters with new values through input file and\or command line args.
|
38
|
+
# Note that only defined parameters can be overridden. If new parameter is parsed
|
39
|
+
# through file\command line, then an error will be raised.
|
40
|
+
# Input config file override:
|
41
|
+
# Default configuration input file path is: '~/.bbfs/conf/<executable name>.conf'
|
42
|
+
# This path can be overridden by the command line arguments (see ahead).
|
43
|
+
# If path and file exist then the parameters in the file will override the defined
|
44
|
+
# parameters. File parameters format per line:<param_name>: <param value>
|
45
|
+
# Note: Space char after the colon is mandatory
|
46
|
+
# Command line arguments override:
|
47
|
+
# General format per argument is:--<param_name>=<param_value>
|
48
|
+
# those parameters will override the defined parameters and the file parameters.
|
49
|
+
# Override input config file:
|
50
|
+
# User can override the input file by using:--conf_file=<new_file_path>
|
51
|
+
#
|
52
|
+
# More examples in bbfs/examples/params/rb
|
53
|
+
|
54
|
+
require 'optparse'
|
55
|
+
require 'yaml'
|
56
|
+
|
2
57
|
module BBFS
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
58
|
+
module Params
|
59
|
+
|
60
|
+
@init_debug_messages = []
|
61
|
+
@help_messages = []
|
62
|
+
|
63
|
+
def Params.get_init_messages
|
64
|
+
return @init_debug_messages
|
65
|
+
end
|
66
|
+
|
67
|
+
# Represents a parameter.
|
68
|
+
class Param
|
69
|
+
attr_accessor :name
|
70
|
+
attr_accessor :value
|
71
|
+
attr_accessor :desc
|
72
|
+
attr_accessor :type
|
73
|
+
|
74
|
+
# value_type_check method:
|
75
|
+
# 1. Check if member:'type' is one of:Integer, Float, String or Boolean.
|
76
|
+
# 2. input parameter:'value' class type is valid to override this parameter.
|
77
|
+
# 3. Return value. The value to override with correct type. A cast from integer to Float will
|
78
|
+
# be made for Float parameters which are set with integer values.
|
79
|
+
# 4. Check will be skipped for nil value.
|
80
|
+
def value_type_check(value)
|
81
|
+
case( @type )
|
82
|
+
when 'Integer' then
|
83
|
+
if not @value.nil?
|
84
|
+
if not ((value.class.eql? Integer) or
|
85
|
+
(value.class.eql? Fixnum))
|
86
|
+
raise "Parameter:'#{@name}' type:'Integer' but value type to override " \
|
87
|
+
"is:'#{value.class}'."
|
88
|
+
end
|
89
|
+
end
|
90
|
+
when 'Float' then
|
91
|
+
if not @value.nil?
|
92
|
+
if not value.class.eql? Float
|
93
|
+
if not ((value.class.eql? Integer) or
|
94
|
+
(value.class.eql? Fixnum))
|
95
|
+
raise("Parameter:'#{@name}' type:'Float' but value type to override " \
|
96
|
+
"is:'#{value.class}'.")
|
97
|
+
else
|
98
|
+
return value.to_f
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
when 'String' then
|
103
|
+
if not @value.nil?
|
104
|
+
if not value.class.eql? String
|
105
|
+
raise("Parameter:'#{@name}' type:'String' but value type to override " \
|
106
|
+
"is:'#{value.class}'.")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
when 'Boolean' then
|
110
|
+
if not @value.nil?
|
111
|
+
if not((value.class.eql? TrueClass) or (value.class.eql? FalseClass))
|
112
|
+
raise("Parameter:'#{@name}' type:'Boolean' but value type to override " \
|
113
|
+
"is:'#{value.class}'.")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
else
|
117
|
+
raise("Parameter:'#{@name}' type:'#{@value.class}' but parameter " \
|
118
|
+
"type to override:'#{value.class}' is not supported. " + \
|
119
|
+
"Supported types are:Integer, Float, String or Boolean.")
|
120
|
+
end
|
121
|
+
return value
|
122
|
+
end
|
123
|
+
|
124
|
+
# supported types are: String, Integer, Float and Boolean
|
125
|
+
def initialize(name, value, type, desc)
|
126
|
+
@name = name
|
127
|
+
@type = type
|
128
|
+
@desc = desc
|
129
|
+
@value = value_type_check value
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# The globals data structure.
|
134
|
+
@globals_db = Hash.new
|
135
|
+
|
136
|
+
def Params.raise_error_if_param_does_not_exist(name)
|
137
|
+
if not @globals_db[name]
|
138
|
+
raise("before using parameter:'#{name}', it should first be defined through Param module methods:" \
|
139
|
+
"Params.string, Params.integer, Params.float or Params.boolean.")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def Params.raise_error_if_param_exists(name)
|
144
|
+
if @globals_db[name]
|
145
|
+
raise("Parameter:'#{name}', can only be defined once.")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Read global param value by other modules.
|
150
|
+
# Note that this operator should only be used, after parameter has been defined through
|
151
|
+
# one of Param module methods: Params.string, Params.integer,
|
152
|
+
# Params.float or Params.boolean."
|
153
|
+
def Params.[](name)
|
154
|
+
raise_error_if_param_does_not_exist(name)
|
155
|
+
@globals_db[name].value
|
156
|
+
end
|
157
|
+
|
158
|
+
# Write global param value by other modules.
|
159
|
+
# Note that this operator should only be used, after parameter has been defined through
|
160
|
+
# one of Param module methods: Params.string, Params.integer,
|
161
|
+
# Params.float or Params.boolean."
|
162
|
+
def Params.[]=(name, value)
|
163
|
+
raise_error_if_param_does_not_exist(name)
|
164
|
+
set_value = @globals_db[name].value_type_check(value)
|
165
|
+
@globals_db[name].value = set_value
|
166
|
+
end
|
167
|
+
|
168
|
+
#override parameter should only be called by Params module methods.
|
169
|
+
def Params.override_param(name, value)
|
170
|
+
existing_param = @globals_db[name]
|
171
|
+
if existing_param.nil?
|
172
|
+
raise("Parameter:'#{name}' has not been defined and can not be overridden. " \
|
173
|
+
"It should first be defined through Param module methods:" \
|
174
|
+
"Params.string, Params.integer, Params.float or Params.boolean.")
|
175
|
+
end
|
176
|
+
if value.nil?
|
177
|
+
existing_param.value = nil
|
178
|
+
elsif existing_param.type.eql?('String')
|
179
|
+
existing_param.value = value.to_s
|
180
|
+
else
|
181
|
+
set_value = existing_param.value_type_check(value)
|
182
|
+
existing_param.value = set_value
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# Define new global parameter of type Integer.
|
187
|
+
def Params.integer(name, value, description)
|
188
|
+
raise_error_if_param_exists(name)
|
189
|
+
@globals_db[name] = Param.new(name, value, 'Integer', description)
|
190
|
+
end
|
191
|
+
|
192
|
+
# Define new global parameter of type Float.
|
193
|
+
def Params.float(name, value, description)
|
194
|
+
raise_error_if_param_exists(name)
|
195
|
+
@globals_db[name] = Param.new(name, value, 'Float', description)
|
196
|
+
end
|
197
|
+
|
198
|
+
# Define new global parameter of type String.
|
199
|
+
def Params.string(name, value, description)
|
200
|
+
raise_error_if_param_exists(name)
|
201
|
+
@globals_db[name] = Param.new(name, value, 'String', description)
|
202
|
+
end
|
203
|
+
|
204
|
+
# Define new global parameter of type Boolean.
|
205
|
+
def Params.boolean(name, value, description)
|
206
|
+
raise_error_if_param_exists(name)
|
207
|
+
@globals_db[name] = Param.new(name, value, 'Boolean', description)
|
208
|
+
end
|
209
|
+
|
210
|
+
# Initializes the project parameters.
|
211
|
+
# Precedence is: Defined params, file and command line is highest.
|
212
|
+
def Params.init(args)
|
213
|
+
@init_debug_messages = []
|
214
|
+
results = parse_command_line_arguments(args)
|
215
|
+
if not results['conf_file'].nil?
|
216
|
+
@init_debug_messages << "Configuration file was overridden. New path:'#{results['conf_file']}'"
|
217
|
+
Params['conf_file'] = results['conf_file']
|
218
|
+
end
|
219
|
+
|
220
|
+
#load yml params
|
221
|
+
if (not Params['conf_file'].nil?) and (File.exist?(File.expand_path Params['conf_file']))
|
222
|
+
@init_debug_messages << 'Configuration file path exists. Loading file parameters.'
|
223
|
+
read_yml_params(File.open(Params['conf_file'], 'r'))
|
224
|
+
else
|
225
|
+
@init_debug_messages << 'Configuration file path does not exist. Skipping loading file parameters.'
|
226
|
+
end
|
227
|
+
|
228
|
+
#override command line argument
|
229
|
+
results.keys.each do |result_name|
|
230
|
+
override_param(result_name, results[result_name])
|
231
|
+
end
|
232
|
+
|
233
|
+
print_global_parameters
|
234
|
+
|
235
|
+
# Prints help and parameters if needed.
|
236
|
+
puts @help_messages unless @help_messages.empty?
|
237
|
+
puts @init_debug_messages if Params['print_params_to_stdout']
|
238
|
+
exit unless @help_messages.empty?
|
239
|
+
end
|
240
|
+
|
241
|
+
# Load yml params and override default values.
|
242
|
+
# raise exception if a loaded yml param does not exist. or if types mismatch occurs.
|
243
|
+
def Params.read_yml_params(yml_input_io)
|
244
|
+
proj_params = YAML::load(yml_input_io)
|
245
|
+
proj_params.keys.each do |param_name|
|
246
|
+
override_param(param_name, proj_params[param_name])
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
# Parse command line arguments
|
251
|
+
def Params.parse_command_line_arguments(args)
|
252
|
+
results = Hash.new # Hash to store parsing results.
|
253
|
+
options = Hash.new # Hash of parsing options from Params.
|
254
|
+
|
255
|
+
# Define options switch for parsing
|
256
|
+
# Define List of options see example on
|
257
|
+
# http://ruby.about.com/od/advancedruby/a/optionparser2.htm
|
258
|
+
opts = OptionParser.new do |opts|
|
259
|
+
@globals_db.values.each do |param|
|
260
|
+
tmp_name_long = "--" + param.name + "=MANDATORY" # Define a command with single mandatory parameter
|
261
|
+
tmp_value = "Default value:" + param.value.to_s # Description and Default value
|
262
|
+
|
263
|
+
# Define type of the mandatory value
|
264
|
+
# It can be integer, float or String(for all other types).
|
265
|
+
case( param.type )
|
266
|
+
when 'Integer' then value_type = Integer
|
267
|
+
when 'Float' then value_type = Float
|
268
|
+
else value_type = String
|
269
|
+
end
|
270
|
+
# Switches definition - according to what
|
271
|
+
# was pre-defined in the Params
|
272
|
+
opts.on(tmp_name_long, value_type, tmp_value) do |result|
|
273
|
+
if result.to_s.upcase.eql? 'TRUE'
|
274
|
+
results[param.name] = true
|
275
|
+
elsif result.to_s.upcase.eql? 'FALSE'
|
276
|
+
results[param.name] = false
|
277
|
+
else
|
278
|
+
results[param.name] = result
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# Define help command for available options
|
284
|
+
# executing --help will printout all pre-defined switch options
|
285
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
286
|
+
@help_messages << opts
|
287
|
+
end
|
288
|
+
|
289
|
+
opts.parse(args) # Parse command line
|
290
|
+
end
|
291
|
+
return results
|
292
|
+
end # end of Parse function
|
293
|
+
|
294
|
+
def Params.print_global_parameters
|
295
|
+
@init_debug_messages << "\n"
|
296
|
+
@init_debug_messages << 'Initialized global parameters:'
|
297
|
+
@init_debug_messages << '---------------------------------'
|
298
|
+
counter=0
|
299
|
+
@globals_db.values.each do |param|
|
300
|
+
counter += 1
|
301
|
+
@init_debug_messages << "#{counter}: #{param.name}=#{param.value}"
|
302
|
+
end
|
303
|
+
@init_debug_messages << '---------------------------------'
|
304
|
+
end
|
305
|
+
|
306
|
+
#Auxiliary method to retrieve the executable name
|
307
|
+
def Params.executable_name
|
308
|
+
/([a-zA-Z0-9\-_\.]+):\d+/ =~ caller[caller.size-1]
|
309
|
+
return $1
|
310
|
+
end
|
311
|
+
#define default params:
|
312
|
+
# 1. configuration file
|
313
|
+
Params.string('conf_file', File.expand_path("~/.bbfs/conf/#{executable_name}.conf"), 'Default configuration file.')
|
314
|
+
# 2. Print params to stdout
|
315
|
+
Params.boolean('print_params_to_stdout', false, 'print_params_to_stdout or not during Params.init')
|
316
|
+
|
317
|
+
private_class_method :print_global_parameters, :parse_command_line_arguments, \
|
318
|
+
:raise_error_if_param_exists, :raise_error_if_param_does_not_exist, \
|
319
|
+
:read_yml_params, :override_param, :executable_name
|
7
320
|
end
|
8
|
-
module_function :parameter
|
9
|
-
end
|
10
321
|
end
|
11
322
|
|
@@ -0,0 +1,282 @@
|
|
1
|
+
# Author: Yaron Dror (yaron.dror.bb@gmail.com)
|
2
|
+
# Description: The file contains 'Param' module tests
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
require_relative '../../lib/params.rb'
|
8
|
+
|
9
|
+
module BBFS
|
10
|
+
module Params
|
11
|
+
# make private methods or Params public for testing capability.
|
12
|
+
public_class_method :print_global_parameters, :parse_command_line_arguments, \
|
13
|
+
:raise_error_if_param_exists, :raise_error_if_param_does_not_exist, \
|
14
|
+
:read_yml_params, :override_param
|
15
|
+
|
16
|
+
module Spec
|
17
|
+
|
18
|
+
describe 'Params::parameter' do
|
19
|
+
|
20
|
+
it 'should define a new parameters' do
|
21
|
+
Params.string 'par_str', 'sss' ,'desc_str'
|
22
|
+
Params.integer 'par_int',1 , 'desc_int'
|
23
|
+
Params.float 'par_float',2.6 , 'desc_float'
|
24
|
+
Params.boolean 'par_true', true, 'desc_true'
|
25
|
+
Params.boolean 'par_false',false , 'desc_false'
|
26
|
+
Params['par_str'].should eq 'sss'
|
27
|
+
Params['par_int'].should eq 1
|
28
|
+
Params['par_float'].should eq 2.6
|
29
|
+
Params['par_true'].should eq true
|
30
|
+
Params['par_false'].should eq false
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should raise an error for wrong parameter type definition.' do
|
34
|
+
expect { Params::Param.new 'bad_type', nil, 'non_existing_type', 'desc_bad_type' }.should raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should raise an error when trying to define twice the same parameter' do
|
38
|
+
Params.string 'only_once', '1st' ,''
|
39
|
+
expect { Params.string 'only_once', '2nd' ,'' }.to raise_error \
|
40
|
+
"Parameter:'only_once', can only be defined once."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'Params::read_yml_params' do
|
45
|
+
it 'should raise error when yml parameter is not defined' do
|
46
|
+
expect { Params::read_yml_params StringIO.new 'not_defined: 10' }.to raise_error \
|
47
|
+
"Parameter:'not_defined' has not been defined and can not be overridden. " \
|
48
|
+
"It should first be defined through Param module methods:" \
|
49
|
+
"Params.string, Params.integer, Params.float or Params.boolean."
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'Will test yml parameter loading' do
|
53
|
+
# string to other. Will not raise error. Instead a cast is made.
|
54
|
+
Params.string('tmp4str', 'string_value', 'tmp4 def')
|
55
|
+
expect { Params::read_yml_params StringIO.new 'tmp4str: strr' }.to_not raise_error
|
56
|
+
expect { Params::read_yml_params StringIO.new 'tmp4str: 4' }.to_not raise_error
|
57
|
+
expect { Params::read_yml_params StringIO.new 'tmp4str: 4.5' }.to_not raise_error
|
58
|
+
expect { Params::read_yml_params StringIO.new 'tmp4str: true' }.to_not raise_error
|
59
|
+
expect { Params::read_yml_params StringIO.new 'tmp4str: false' }.to_not raise_error
|
60
|
+
|
61
|
+
# override integer with other types.
|
62
|
+
Params.integer('tmp4int', 1, 'tmp4 def')
|
63
|
+
expect { Params::read_yml_params StringIO.new 'tmp4int: strr' }.to raise_error \
|
64
|
+
"Parameter:'tmp4int' type:'Integer' but value type to override " \
|
65
|
+
"is:'String'."
|
66
|
+
expect { Params::read_yml_params StringIO.new 'tmp4int: 4' }.to_not raise_error
|
67
|
+
expect { Params::read_yml_params StringIO.new 'tmp4int: 4.5' }.to raise_error \
|
68
|
+
"Parameter:'tmp4int' type:'Integer' but value type to override " \
|
69
|
+
"is:'Float'."
|
70
|
+
expect { Params::read_yml_params StringIO.new 'tmp4int: true' }.to raise_error \
|
71
|
+
"Parameter:'tmp4int' type:'Integer' but value type to override " \
|
72
|
+
"is:'TrueClass'."
|
73
|
+
expect { Params::read_yml_params StringIO.new 'tmp4int: false' }.to raise_error \
|
74
|
+
"Parameter:'tmp4int' type:'Integer' but value type to override " \
|
75
|
+
"is:'FalseClass'."
|
76
|
+
|
77
|
+
# override float with other types.
|
78
|
+
Params.float('tmp4float', 1.1, 'tmp4 def')
|
79
|
+
expect { Params::read_yml_params StringIO.new 'tmp4float: strr' }.to raise_error \
|
80
|
+
"Parameter:'tmp4float' type:'Float' but value type to override " \
|
81
|
+
"is:'String'."
|
82
|
+
expect { Params::read_yml_params StringIO.new 'tmp4float: 4' }.to_not raise_error
|
83
|
+
expect { Params::read_yml_params StringIO.new 'tmp4float: 4.5' }.to_not raise_error
|
84
|
+
expect { Params::read_yml_params StringIO.new 'tmp4float: true' }.to raise_error \
|
85
|
+
"Parameter:'tmp4float' type:'Float' but value type to override " \
|
86
|
+
"is:'TrueClass'."
|
87
|
+
expect { Params::read_yml_params StringIO.new 'tmp4float: false' }.to raise_error \
|
88
|
+
"Parameter:'tmp4float' type:'Float' but value type to override " \
|
89
|
+
"is:'FalseClass'."
|
90
|
+
# override boolean with other types.
|
91
|
+
Params.boolean('tmp4true', true, 'tmp4 def')
|
92
|
+
expect { Params::read_yml_params StringIO.new 'tmp4true: strr' }.to raise_error \
|
93
|
+
"Parameter:'tmp4true' type:'Boolean' but value type to override " \
|
94
|
+
"is:'String'."
|
95
|
+
expect { Params::read_yml_params StringIO.new 'tmp4true: 4' }.to raise_error \
|
96
|
+
"Parameter:'tmp4true' type:'Boolean' but value type to override " \
|
97
|
+
"is:'Fixnum'."
|
98
|
+
expect { Params::read_yml_params StringIO.new 'tmp4true: 4.5' }.to raise_error \
|
99
|
+
"Parameter:'tmp4true' type:'Boolean' but value type to override " \
|
100
|
+
"is:'Float'."
|
101
|
+
expect { Params::read_yml_params StringIO.new 'tmp4true: true' }.to_not raise_error
|
102
|
+
expect { Params.read_yml_params StringIO.new 'tmp4true: false' }.to_not raise_error
|
103
|
+
|
104
|
+
Params.boolean('tmp4False', true, 'tmp4 def')
|
105
|
+
expect { Params.read_yml_params StringIO.new 'tmp4False: strr' }.to raise_error \
|
106
|
+
"Parameter:'tmp4False' type:'Boolean' but value type to override " \
|
107
|
+
"is:'String'."
|
108
|
+
expect { Params.read_yml_params StringIO.new 'tmp4False: 4' }.to raise_error \
|
109
|
+
"Parameter:'tmp4False' type:'Boolean' but value type to override " \
|
110
|
+
"is:'Fixnum'."
|
111
|
+
expect { Params.read_yml_params StringIO.new 'tmp4False: 4.5' }.to raise_error \
|
112
|
+
"Parameter:'tmp4False' type:'Boolean' but value type to override " \
|
113
|
+
"is:'Float'."
|
114
|
+
expect { Params.read_yml_params StringIO.new 'tmp4False: true' }.to_not raise_error
|
115
|
+
expect { Params.read_yml_params StringIO.new 'tmp4False: false' }.to_not raise_error
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should raise error when yml file format is bad' do
|
120
|
+
expect { Params.read_yml_params StringIO.new 'bad yml format' }.to raise_error
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should override defined values with yml values' do
|
124
|
+
Params.string('tmp5str', 'aaa', 'tmp5 def')
|
125
|
+
Params.integer('tmp5int', 11, 'tmp5 def')
|
126
|
+
Params.float('tmp5float', 11.11, 'tmp5 def')
|
127
|
+
Params.boolean('tmp5true', true, 'tmp5 def')
|
128
|
+
Params.boolean('tmp5false', false, 'tmp5 def')
|
129
|
+
Params.read_yml_params StringIO.new "tmp5str: bbb\ntmp5int: 12\ntmp5float: 12.12\n"
|
130
|
+
Params.read_yml_params StringIO.new "tmp5true: false\ntmp5false: true\n"
|
131
|
+
Params['tmp5str'].should eq 'bbb'
|
132
|
+
Params['tmp5int'].should eq 12
|
133
|
+
Params['tmp5float'].should eq 12.12
|
134
|
+
Params['tmp5true'].should eq false
|
135
|
+
Params['tmp5false'].should eq true
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe 'Params.parse_command_line_arguments' do
|
140
|
+
it 'should raise error when command line parameter is not defined' do
|
141
|
+
expect { Params.parse_command_line_arguments ['--new_param=9]'] }.to raise_error
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should parse parameter from command line.' do
|
145
|
+
# Override string with types.
|
146
|
+
Params.string('tmp6str', 'dummy', 'tmp6str def')
|
147
|
+
expect { Params.parse_command_line_arguments ['--tmp6str=9'] }.to_not raise_error
|
148
|
+
expect { Params.parse_command_line_arguments ['--tmp6str=8.1'] }.to_not raise_error
|
149
|
+
expect { Params.parse_command_line_arguments ['--tmp6str=ff'] }.to_not raise_error
|
150
|
+
expect { Params.parse_command_line_arguments ['--tmp6str=true'] }.to_not raise_error
|
151
|
+
expect { Params.parse_command_line_arguments ['--tmp6str=false'] }.to_not raise_error
|
152
|
+
|
153
|
+
# from fixnum to other types.
|
154
|
+
Params.integer('tmp6', 8, 'tmp6 def')
|
155
|
+
expect { Params.parse_command_line_arguments ['--tmp6=9'] }.to_not raise_error
|
156
|
+
expect { Params.parse_command_line_arguments ['--tmp6=8.1'] }.to raise_error
|
157
|
+
expect { Params.parse_command_line_arguments ['--tmp6=ff'] }.to raise_error
|
158
|
+
expect { Params.parse_command_line_arguments ['--tmp6=true'] }.to raise_error
|
159
|
+
expect { Params.parse_command_line_arguments ['--tmp6=false'] }.to raise_error
|
160
|
+
|
161
|
+
# from float to other types.
|
162
|
+
Params.float('tmp7', 8.9, 'tmp7 def')
|
163
|
+
# Casting fix num to float
|
164
|
+
expect { Params.parse_command_line_arguments ['--tmp7=9'] }.to_not raise_error
|
165
|
+
expect { Params.parse_command_line_arguments ['--tmp7=3.4'] }.to_not raise_error
|
166
|
+
expect { Params.parse_command_line_arguments ['--tmp7=ff'] }.to raise_error
|
167
|
+
expect { Params.parse_command_line_arguments ['--tmp7=true'] }.to raise_error
|
168
|
+
expect { Params.parse_command_line_arguments ['--tmp7=false'] }.to raise_error
|
169
|
+
|
170
|
+
# from TrueClass to other types.
|
171
|
+
Params.boolean('tmp8', true, 'tmp8 def')
|
172
|
+
expect { Params.parse_command_line_arguments ['--tmp8=9'] }.to_not raise_error
|
173
|
+
expect { Params.parse_command_line_arguments ['--tmp8=3.4'] }.to_not raise_error
|
174
|
+
expect { Params.parse_command_line_arguments ['--tmp8=ff'] }.to_not raise_error
|
175
|
+
expect { Params.parse_command_line_arguments ['--tmp8=true'] }.to_not raise_error
|
176
|
+
expect { Params.parse_command_line_arguments ['--tmp8=false'] }.to_not raise_error
|
177
|
+
|
178
|
+
# from FalseClass to other types.
|
179
|
+
Params.boolean('tmp9', false, 'tmp9 def')
|
180
|
+
expect { Params.parse_command_line_arguments ['--tmp9=9'] }.to_not raise_error
|
181
|
+
expect { Params.parse_command_line_arguments ['--tmp9=3.4'] }.to_not raise_error
|
182
|
+
expect { Params.parse_command_line_arguments ['--tmp9=ff'] }.to_not raise_error
|
183
|
+
expect { Params.parse_command_line_arguments ['--tmp9=true'] }.to_not raise_error
|
184
|
+
expect { Params.parse_command_line_arguments ['--tmp9=false'] }.to_not raise_error
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe 'Params.init' do
|
189
|
+
it 'should override command line arguments correctly.' do
|
190
|
+
File.stub(:exist?).and_return false
|
191
|
+
# Override string with types.
|
192
|
+
Params.string('tmp6str2', 'dummy', 'tmp6str def')
|
193
|
+
expect { Params.init ['--tmp6str2=9'] }.to_not raise_error
|
194
|
+
expect { Params.init ['--tmp6str2=8.1'] }.to_not raise_error
|
195
|
+
expect { Params.init ['--tmp6str2=ff'] }.to_not raise_error
|
196
|
+
expect { Params.init ['--tmp6str2=true'] }.to_not raise_error
|
197
|
+
expect { Params.init ['--tmp6str2=false'] }.to_not raise_error
|
198
|
+
|
199
|
+
# from fixnum to other types.
|
200
|
+
Params.integer('tmp6Fixnum2', 8, 'tmp6 def')
|
201
|
+
expect { Params.init ['--tmp6Fixnum2=9'] }.to_not raise_error
|
202
|
+
expect { Params.init ['--tmp6Fixnum2=8.1'] }.to raise_error
|
203
|
+
expect { Params.init ['--tmp6Fixnum2=ff'] }.to raise_error
|
204
|
+
expect { Params.init ['--tmp6Fixnum2=true'] }.to raise_error
|
205
|
+
expect { Params.init ['--tmp6Fixnum2=false'] }.to raise_error
|
206
|
+
|
207
|
+
# from float to other types.
|
208
|
+
Params.float('tmp7float2', 8.9, 'tmp7 def')
|
209
|
+
# Casting fix num to float
|
210
|
+
expect { Params.init ['--tmp7float2=9'] }.to_not raise_error
|
211
|
+
expect { Params.init ['--tmp7float2=3.4'] }.to_not raise_error
|
212
|
+
expect { Params.init ['--tmp7float2=ff'] }.to raise_error
|
213
|
+
expect { Params.init ['--tmp7float2=true'] }.to raise_error
|
214
|
+
expect { Params.init ['--tmp7float2=false'] }.to raise_error
|
215
|
+
|
216
|
+
# from TrueClass to other types.
|
217
|
+
Params.boolean('tmp8true2', true, 'tmp8 def')
|
218
|
+
expect { Params.init ['--tmp8true2=9'] }.to raise_error
|
219
|
+
expect { Params.init ['--tmp8true2=3.4'] }.to raise_error
|
220
|
+
expect { Params.init ['--tmp8true2=ff'] }.to raise_error
|
221
|
+
expect { Params.init ['--tmp8true2=true'] }.to_not raise_error
|
222
|
+
expect { Params.init ['--tmp8true2=false'] }.to_not raise_error
|
223
|
+
|
224
|
+
# from FalseClass to other types.
|
225
|
+
Params.boolean('tmp9false2', false, 'tmp9 def')
|
226
|
+
expect { Params.init ['--tmp9false2=9'] }.to raise_error
|
227
|
+
expect { Params.init ['--tmp9false2=3.4'] }.to raise_error
|
228
|
+
expect { Params.init ['--tmp9false2=ff'] }.to raise_error
|
229
|
+
expect { Params.init ['--tmp9false2=true'] }.to_not raise_error
|
230
|
+
expect { Params.init ['--tmp9false2=false'] }.to_not raise_error
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'should override defined values with command line values' do
|
234
|
+
File.stub(:exist?).and_return false
|
235
|
+
Params.string('tmp10str', 'aaa', 'tmp10 def')
|
236
|
+
Params.integer('tmp10int', 11, 'tmp10 def')
|
237
|
+
Params.float('tmp10float', 11.11, 'tmp10 def')
|
238
|
+
Params.boolean('tmp10true', true, 'tmp10 def')
|
239
|
+
Params.boolean('tmp10false', false, 'tmp10 def')
|
240
|
+
Params.init ['--tmp10str=bbb', '--tmp10int=12', '--tmp10float=12.12', \
|
241
|
+
'--tmp10true=false', '--tmp10false=true']
|
242
|
+
Params['tmp10str'].should eq 'bbb'
|
243
|
+
Params['tmp10int'].should eq 12
|
244
|
+
Params['tmp10float'].should eq 12.12
|
245
|
+
Params['tmp10true'].should eq false
|
246
|
+
Params['tmp10false'].should eq true
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'init should override parameters with file and command' do
|
250
|
+
Params.string('init_param', 'code', '')
|
251
|
+
File.stub(:exist?).and_return true
|
252
|
+
File.stub(:open).and_return StringIO.new 'init_param: yml'
|
253
|
+
Params.init ['--conf_file=dummy_file', '--init_param=command-line']
|
254
|
+
Params['init_param'].should eq 'command-line'
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'init should override parameters with file only' do
|
258
|
+
Params.string('init_param2', 'code', '')
|
259
|
+
File.stub(:exist?).and_return true
|
260
|
+
File.stub(:open).and_return StringIO.new 'init_param2: yml'
|
261
|
+
Params.init ['--conf_file=dummy_file']
|
262
|
+
Params['init_param2'].should eq 'yml'
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'init should override parameters with command line only' do
|
266
|
+
Params.string('init_param3', 'code', '')
|
267
|
+
File.stub(:exist?).and_return false
|
268
|
+
Params.init ['--init_param3=command-line']
|
269
|
+
Params['init_param3'].should eq 'command-line'
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'init should not override any parameters' do
|
273
|
+
Params.string('init_param4', 'code', '')
|
274
|
+
File.stub(:exist?).and_return false
|
275
|
+
Params.init []
|
276
|
+
Params['init_param4'].should eq 'code'
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author: Yaron Dror (yaron.dror.bb@gmail.com)
|
2
|
+
# Description: Params test file.
|
3
|
+
# run: rake test.
|
4
|
+
# Note: This file will be tested along with all project tests.
|
5
|
+
|
6
|
+
require 'params'
|
7
|
+
require 'test/unit'
|
8
|
+
require_relative '../../lib/params.rb'
|
9
|
+
|
10
|
+
module BBFS
|
11
|
+
|
12
|
+
class TestLog < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def test_parsing_of_the_defined_parameters
|
15
|
+
# Define options
|
16
|
+
Params.integer('remote_server1', 3333,
|
17
|
+
'Listening port for backup server content data.')
|
18
|
+
Params.string('backup_username1', 'tmp', 'Backup server username.')
|
19
|
+
Params.string('backup_password1', 'tmp', 'Backup server password.')
|
20
|
+
Params.string('backup_destination_folder1', '',
|
21
|
+
'Backup server destination folder, default is the relative local folder.')
|
22
|
+
Params.string('content_data_path1', File.expand_path('~/.bbfs/var/content.data'),
|
23
|
+
'ContentData file path.')
|
24
|
+
Params.string('monitoring_config_path1', File.expand_path('~/.bbfs/etc/file_monitoring.yml'),
|
25
|
+
'Configuration file for monitoring.')
|
26
|
+
Params.float('time_to_start1', 0.03,
|
27
|
+
'Time to start monitoring')
|
28
|
+
|
29
|
+
cmd = [ '--remote_server1=2222','--backup_username1=rami','--backup_password1=kavana',
|
30
|
+
'--backup_destination_folder1=C:\Users\Alexey\Backup',
|
31
|
+
'--content_data_path1=C:\Users\Alexey\Content',
|
32
|
+
'--monitoring_config_path1=C:\Users\Alexey\Config',
|
33
|
+
'--time_to_start1=1.5']
|
34
|
+
Params.init cmd
|
35
|
+
assert_equal(2222,Params['remote_server1'])
|
36
|
+
assert_equal('rami',Params['backup_username1'])
|
37
|
+
assert_equal('kavana',Params['backup_password1'])
|
38
|
+
assert_equal('C:\Users\Alexey\Backup',Params['backup_destination_folder1'])
|
39
|
+
assert_equal('C:\Users\Alexey\Content',Params['content_data_path1'])
|
40
|
+
assert_equal('C:\Users\Alexey\Config',Params['monitoring_config_path1'])
|
41
|
+
assert_equal(1.5,Params['time_to_start1'])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-09-02 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Dynamically stores, parses and providers params. Uses module local readers.
|
16
16
|
email: kolmanv@gmail.com
|
@@ -19,7 +19,9 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- lib/params.rb
|
22
|
-
- lib/params/
|
22
|
+
- lib/params/version.rb
|
23
|
+
- test/params/params_spec.rb
|
24
|
+
- test/params/params_test.rb
|
23
25
|
homepage: http://github.com/kolmanv/bbfs
|
24
26
|
licenses: []
|
25
27
|
post_install_message:
|
@@ -40,8 +42,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
42
|
version: '0'
|
41
43
|
requirements: []
|
42
44
|
rubyforge_project:
|
43
|
-
rubygems_version: 1.8.
|
45
|
+
rubygems_version: 1.8.23
|
44
46
|
signing_key:
|
45
47
|
specification_version: 3
|
46
48
|
summary: Dynamically stores, parses and providers params.
|
47
|
-
test_files:
|
49
|
+
test_files:
|
50
|
+
- test/params/params_spec.rb
|
51
|
+
- test/params/params_test.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class ReadArgs
|
2
|
-
def self.read_arguments(argv, parsed_arguments, commands = nil)
|
3
|
-
argv.each { |arg|
|
4
|
-
if arg.start_with?("--")
|
5
|
-
words = arg[2,arg.length-2].split('=')
|
6
|
-
parsed_arguments[words[0]]=words[1]
|
7
|
-
elsif commands != nil and not commands.key?(arg)
|
8
|
-
puts "Unknown command '%s'." % arg
|
9
|
-
return false
|
10
|
-
else
|
11
|
-
if parsed_arguments.key? arg
|
12
|
-
puts "Parse error, two commands found %s and %s" % parsed_arguments["command"], arg
|
13
|
-
return false
|
14
|
-
end
|
15
|
-
parsed_arguments["command"] = arg
|
16
|
-
end
|
17
|
-
}
|
18
|
-
|
19
|
-
return false unless commands == nil or parsed_arguments["command"] != nil
|
20
|
-
return false unless commands == nil or parsed_arguments["command"] != ""
|
21
|
-
|
22
|
-
return true
|
23
|
-
end
|
24
|
-
end
|