jeckyl 0.2.5 → 0.2.7

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 (4) hide show
  1. data/History.txt +8 -0
  2. data/lib/jeckyl.rb +548 -548
  3. data/lib/jeckyl/version.rb +8 -8
  4. metadata +4 -4
data/History.txt CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  == History
6
6
 
7
+ [jeckyl-0.2.7 15-Nov-2012]
8
+
9
+ Change base directory for configs to /etc/jerbil consistent with the main jerbil gem
10
+
11
+ [jeckyl-0.2.6 25-Oct-2012]
12
+
13
+ Revert to /etc/jermine while working through changes to over gems
14
+
7
15
  [jeckyl-0.2.5 25-Oct-2012]
8
16
 
9
17
  Clean up unwanted git files and update README links (e.g. rubydoc)
data/lib/jeckyl.rb CHANGED
@@ -21,13 +21,13 @@ module Jeckyl
21
21
 
22
22
  #default location for all config files
23
23
  # @deprecated Use {Jeckyl.config_dir} instead
24
- ConfigRoot = '/etc/jeckyl'
24
+ ConfigRoot = '/etc/jerbil'
25
25
 
26
26
  # the default system location for jeckyl config file
27
27
  #
28
28
  # This location can be set with the environment variable JECKYL_CONFIG_DIR
29
29
  def Jeckyl.config_dir
30
- ENV['JECKYL_CONFIG_DIR'] || '/etc/jeckyl'
30
+ ENV['JECKYL_CONFIG_DIR'] || '/etc/jerbil'
31
31
  end
32
32
 
33
33
  # This is the main Jeckyl class from which to create specific application
@@ -38,584 +38,584 @@ module Jeckyl
38
38
  # More details are available in the {file:README.md Readme} file
39
39
  class Config < Hash
40
40
 
41
- # create a configuration hash by evaluating the parameters defined in the given config file.
42
- #
43
- # @param [String] config_file string path to a ruby file,
44
- # @param [Hash] opts contains the following options.
45
- # @option opts [Boolean] :flag_errors_on_defaults will raise exceptions from checks during default
46
- # evaluation - although why is not clear, so best not to use it.
47
- # @option opts [Boolean] :local limits generated defaults to the direct class being evaluated
48
- # and should only be set internally on this call
49
- # @option opts [Boolean] :relax, if set to true will not check for parameter methods but instead
50
- # add unknown methods to the hash unchecked.
51
- #
52
- # If no config file is given then the hash of options returned will only have
53
- # the defaults defined for the given class.
54
- #
55
- #
56
- def initialize(config_file=nil, opts={})
57
- # do whatever a hash has to do
58
- super()
41
+ # create a configuration hash by evaluating the parameters defined in the given config file.
42
+ #
43
+ # @param [String] config_file string path to a ruby file,
44
+ # @param [Hash] opts contains the following options.
45
+ # @option opts [Boolean] :flag_errors_on_defaults will raise exceptions from checks during default
46
+ # evaluation - although why is not clear, so best not to use it.
47
+ # @option opts [Boolean] :local limits generated defaults to the direct class being evaluated
48
+ # and should only be set internally on this call
49
+ # @option opts [Boolean] :relax, if set to true will not check for parameter methods but instead
50
+ # add unknown methods to the hash unchecked.
51
+ #
52
+ # If no config file is given then the hash of options returned will only have
53
+ # the defaults defined for the given class.
54
+ #
55
+ #
56
+ def initialize(config_file=nil, opts={})
57
+ # do whatever a hash has to do
58
+ super()
59
+
60
+ flag_errors_on_defaults = opts[:flag_errors_on_defaults] || false
61
+ local = opts[:local] || false
62
+ @_relax = opts[:relax] || false
59
63
 
60
- flag_errors_on_defaults = opts[:flag_errors_on_defaults] || false
61
- local = opts[:local] || false
62
- @_relax = opts[:relax] || false
63
-
64
- # somewhere to save the most recently set symbol
65
- @_last_symbol = nil
66
- # hash for comments accessed with the same symbol
67
- @_comments = {}
68
- # hash for input defaults
69
- @_defaults={}
70
- # save order in which methods are defined for generating config files
71
- @_order = Array.new
72
-
73
- # get the defaults defined in the config parser
74
- get_defaults(:local=> local, :flag_errors => flag_errors_on_defaults)
75
-
76
- return self if config_file.nil?
77
-
78
- # remember where the config file itself is
79
- self[:config_files] = [config_file]
64
+ # somewhere to save the most recently set symbol
65
+ @_last_symbol = nil
66
+ # hash for comments accessed with the same symbol
67
+ @_comments = {}
68
+ # hash for input defaults
69
+ @_defaults={}
70
+ # save order in which methods are defined for generating config files
71
+ @_order = Array.new
72
+
73
+ # get the defaults defined in the config parser
74
+ get_defaults(:local=> local, :flag_errors => flag_errors_on_defaults)
75
+
76
+ return self if config_file.nil?
77
+
78
+ # remember where the config file itself is
79
+ self[:config_files] = [config_file]
80
+
81
+ # and finally get the values from the config file itself
82
+ self.instance_eval(File.read(config_file), config_file)
80
83
 
81
- # and finally get the values from the config file itself
82
- self.instance_eval(File.read(config_file), config_file)
83
-
84
- rescue SyntaxError => err
85
- raise ConfigSyntaxError, err.message
86
- rescue Errno::ENOENT
87
- # duff file path so tell the caller
88
- raise ConfigFileMissing, "#{config_file}"
89
- end
90
-
91
- # gives access to a hash containing an entry for each parameter and the comments
92
- # defined by the class definitions - used internally by class methods
93
- def comments
94
- @_comments
95
- end
96
-
97
- # This contains an array of the parameter names - used internally by class methods
98
- def order
99
- @_order
100
- end
101
-
102
- # this contains a hash of the defaults for each parameter - used internally by class methods
103
- def defaults
104
- @_defaults
105
- end
106
-
107
- # a class method to check a given config file one item at a time
108
- #
109
- # This evaluates the given config file and reports if there are any errors to the
110
- # report_file, which defaults to Stdout. Can only do the checking one error at a time.
111
- #
112
- # To use this method, it is necessary to write a script that calls it for the particular
113
- # subclass.
114
- #
115
- # @param [String] config_file is the file to check
116
- # @param [String] report_file is a file to write the report to, or stdout
117
- # @return [Boolean] indicates if the check was OK or not
118
- #
119
- def self.check_config(config_file, report_file=nil)
120
-
121
- # create myself to generate defaults, but nothing else
122
- me = self.new
123
-
124
- success = true
125
- message = "No errors found in: #{config_file}"
126
-
127
- begin
128
- # evaluate the config file
129
- me.instance_eval(File.read(config_file), config_file)
130
-
131
- rescue Errno::ENOENT
132
- message = "No such config file: #{config_file}"
133
- success = false
134
- rescue JeckylError => err
135
- message = err.message
136
- success = false
137
84
  rescue SyntaxError => err
138
- message = err.message
139
- success = false
85
+ raise ConfigSyntaxError, err.message
86
+ rescue Errno::ENOENT
87
+ # duff file path so tell the caller
88
+ raise ConfigFileMissing, "#{config_file}"
140
89
  end
141
-
142
- begin
143
- if report_file.nil? then
144
- puts message
145
- else
146
- File.open(report_file, "w") do |rfile|
147
- rfile.puts message
90
+
91
+ # gives access to a hash containing an entry for each parameter and the comments
92
+ # defined by the class definitions - used internally by class methods
93
+ def comments
94
+ @_comments
95
+ end
96
+
97
+ # This contains an array of the parameter names - used internally by class methods
98
+ def order
99
+ @_order
100
+ end
101
+
102
+ # this contains a hash of the defaults for each parameter - used internally by class methods
103
+ def defaults
104
+ @_defaults
105
+ end
106
+
107
+ # a class method to check a given config file one item at a time
108
+ #
109
+ # This evaluates the given config file and reports if there are any errors to the
110
+ # report_file, which defaults to Stdout. Can only do the checking one error at a time.
111
+ #
112
+ # To use this method, it is necessary to write a script that calls it for the particular
113
+ # subclass.
114
+ #
115
+ # @param [String] config_file is the file to check
116
+ # @param [String] report_file is a file to write the report to, or stdout
117
+ # @return [Boolean] indicates if the check was OK or not
118
+ #
119
+ def self.check_config(config_file, report_file=nil)
120
+
121
+ # create myself to generate defaults, but nothing else
122
+ me = self.new
123
+
124
+ success = true
125
+ message = "No errors found in: #{config_file}"
126
+
127
+ begin
128
+ # evaluate the config file
129
+ me.instance_eval(File.read(config_file), config_file)
130
+
131
+ rescue Errno::ENOENT
132
+ message = "No such config file: #{config_file}"
133
+ success = false
134
+ rescue JeckylError => err
135
+ message = err.message
136
+ success = false
137
+ rescue SyntaxError => err
138
+ message = err.message
139
+ success = false
140
+ end
141
+
142
+ begin
143
+ if report_file.nil? then
144
+ puts message
145
+ else
146
+ File.open(report_file, "w") do |rfile|
147
+ rfile.puts message
148
+ end
148
149
  end
150
+ return success
151
+ rescue Errno::ENOENT
152
+ raise ReportFileError, "Error with file: #{report_file}"
149
153
  end
150
- return success
151
- rescue Errno::ENOENT
152
- raise ReportFileError, "Error with file: #{report_file}"
154
+
153
155
  end
154
-
155
- end
156
-
157
- # a class method to generate a config file from the class definition
158
- #
159
- # This calls each of the parameter methods, and creates a commented template
160
- # with the comments and default lines
161
- #
162
- # @param [Boolean] local when set to true will limit the parameters to those defined in the
163
- # immediate class and excludes any ancestors.
164
- #
165
- def self.generate_config(local=false)
166
- me = self.new(nil, :local => local)
167
- # everything should now exist
168
- me.order.each do |key|
169
-
170
- if me.comments.has_key?(key) then
171
- me.comments[key].each do |comment|
172
- puts "# #{comment}"
156
+
157
+ # a class method to generate a config file from the class definition
158
+ #
159
+ # This calls each of the parameter methods, and creates a commented template
160
+ # with the comments and default lines
161
+ #
162
+ # @param [Boolean] local when set to true will limit the parameters to those defined in the
163
+ # immediate class and excludes any ancestors.
164
+ #
165
+ def self.generate_config(local=false)
166
+ me = self.new(nil, :local => local)
167
+ # everything should now exist
168
+ me.order.each do |key|
169
+
170
+ if me.comments.has_key?(key) then
171
+ me.comments[key].each do |comment|
172
+ puts "# #{comment}"
173
+ end
173
174
  end
175
+ def_value = me.defaults[key]
176
+ default = def_value.nil? ? '' : def_value.inspect
177
+
178
+ puts "##{key.to_s} #{default}"
179
+ puts ""
174
180
  end
175
- def_value = me.defaults[key]
176
- default = def_value.nil? ? '' : def_value.inspect
177
-
178
- puts "##{key.to_s} #{default}"
179
- puts ""
180
181
  end
181
- end
182
-
183
- # extract only those parameters in a hash that are from the given class
184
- #
185
- # @param [Hash] full_config is the config from which to extract the intersecting options
186
- # and it can be an instance of Jeckyl::Config or a hash
187
- # @return [Hash] containing all of the intersecting parameters
188
- #
189
- # @note this returns a plain hash and not an instance of Jeckyl::Config
190
- #
191
- def self.intersection(full_config)
192
- me = self.new # create the defaults for this class
193
- my_hash = {}
194
- me.order.each do |my_key|
195
- if full_config.has_key?(my_key) then
196
- my_hash[my_key] = full_config[my_key]
182
+
183
+ # extract only those parameters in a hash that are from the given class
184
+ #
185
+ # @param [Hash] full_config is the config from which to extract the intersecting options
186
+ # and it can be an instance of Jeckyl::Config or a hash
187
+ # @return [Hash] containing all of the intersecting parameters
188
+ #
189
+ # @note this returns a plain hash and not an instance of Jeckyl::Config
190
+ #
191
+ def self.intersection(full_config)
192
+ me = self.new # create the defaults for this class
193
+ my_hash = {}
194
+ me.order.each do |my_key|
195
+ if full_config.has_key?(my_key) then
196
+ my_hash[my_key] = full_config[my_key]
197
+ end
197
198
  end
199
+ return my_hash
198
200
  end
199
- return my_hash
200
- end
201
-
202
- # return a list of descendant classes in the current context. This is provided to help
203
- # find classes for the jeckyl utility, e.g. to generate a default config file
204
- #
205
- # @return [Array] classes that are descendants of this class, sorted with the least ancestral
206
- # first
207
- #
208
- def self.descendants
209
- descs = Array.new
210
- ObjectSpace.each_object {|obj| descs << obj if obj.kind_of?(Class) && obj < self}
211
- descs.sort! {|a,b| a < b ? -1 : 1}
212
- return descs
213
- end
214
-
215
-
216
- # set the prefix to the parameter names that should be used for corresponding
217
- # parameter methods defined for a subclass. Parameter names in config files
218
- # are mapped onto parameter method by prefixing the methods with the results of
219
- # this function. So, for a parameter named 'greeting', the parameter method used
220
- # to check the parameter will be, by default, 'configure_greeting'.
221
- #
222
- # For example, to define parameter methods prefix with 'set' redefine this
223
- # method to return 'set'. The greeting parameter method should then be called
224
- # 'set_greeting'
225
- #
226
- def prefix
227
- 'configure'
228
- end
229
-
230
- # Delete those parameters that are in the given hash from this instance of Jeckyl::Config.
231
- # Useful for tailoring parameter sets to specific uses (e.g. removing logging parameters)
232
- #
233
- # @param [Hash] conf_to_remove which is a hash or an instance of Jeckyl::Config
234
- #
235
- def complement(conf_to_remove)
236
- self.delete_if {|key, value| conf_to_remove.has_key?(key)}
237
- end
238
-
239
- # Read, check and merge another parameter file into this one, being of the same config class.
240
- #
241
- # @param [String] conf_file - path to file to parse
242
- #
243
- def merge(conf_file)
244
201
 
245
- self[:config_files] << conf_file
202
+ # return a list of descendant classes in the current context. This is provided to help
203
+ # find classes for the jeckyl utility, e.g. to generate a default config file
204
+ #
205
+ # @return [Array] classes that are descendants of this class, sorted with the least ancestral
206
+ # first
207
+ #
208
+ def self.descendants
209
+ descs = Array.new
210
+ ObjectSpace.each_object {|obj| descs << obj if obj.kind_of?(Class) && obj < self}
211
+ descs.sort! {|a,b| a < b ? -1 : 1}
212
+ return descs
213
+ end
246
214
 
247
- # get the values from the config file itself
248
- self.instance_eval(File.read(conf_file), conf_file)
249
-
250
- rescue SyntaxError => err
251
- raise ConfigSyntaxError, err.message
252
- rescue Errno::ENOENT
253
- # duff file path so tell the caller
254
- raise ConfigFileMissing, "#{conf_file}"
255
- end
256
-
257
-
258
- protected
259
-
260
- # create a description for the current parameter, to be used when generating a config template
261
- #
262
- # @param [*String] being one or more string arguments that are used to generate config file templates
263
- # and documents
264
- def comment(*strings)
265
- @_comments[@_last_symbol] = strings unless @_last_symbol.nil?
266
- end
267
-
268
- # set default value(s) for the current parameter.
269
- #
270
- # @param [Object] val - any valid object as expected by the parameter method
271
- def default(val)
272
- return if @_last_symbol.nil? || @_defaults.has_key?(@_last_symbol)
273
- @_defaults[@_last_symbol] = val
274
- end
275
-
276
- # the following are all helper methods to parse values and raise exceptions if the values are not correct
277
-
278
- # file helpers - meanings should be apparent
279
-
280
- # check that the parameter is a directory and that the directory is writable
281
- #
282
- # Jeckyl checking method to be used in parameter methods to check the validity of
283
- # given parameters, returning the parameter if valid or else raising an exception
284
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
285
- # the parameter is not validly formed
286
- #
287
- # @param [String] - path
288
- #
289
- def a_writable_dir(path)
290
- if FileTest.directory?(path) && FileTest.writable?(path) then
291
- path
292
- else
293
- raise_config_error(path, "directory is not writable or does not exist")
215
+
216
+ # set the prefix to the parameter names that should be used for corresponding
217
+ # parameter methods defined for a subclass. Parameter names in config files
218
+ # are mapped onto parameter method by prefixing the methods with the results of
219
+ # this function. So, for a parameter named 'greeting', the parameter method used
220
+ # to check the parameter will be, by default, 'configure_greeting'.
221
+ #
222
+ # For example, to define parameter methods prefix with 'set' redefine this
223
+ # method to return 'set'. The greeting parameter method should then be called
224
+ # 'set_greeting'
225
+ #
226
+ def prefix
227
+ 'configure'
294
228
  end
295
- end
296
-
297
- # check parameter is a readable file
298
- #
299
- # Jeckyl checking method to be used in parameter methods to check the validity of
300
- # given parameters, returning the parameter if valid or else raising an exception
301
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
302
- # the parameter is not validly formed
303
- #
304
- # @param [String] - path to file
305
- #
306
- def a_readable_file(path)
307
- if FileTest.readable?(path) then
308
- path
309
- else
310
- raise_config_error(path, "file does not exist")
229
+
230
+ # Delete those parameters that are in the given hash from this instance of Jeckyl::Config.
231
+ # Useful for tailoring parameter sets to specific uses (e.g. removing logging parameters)
232
+ #
233
+ # @param [Hash] conf_to_remove which is a hash or an instance of Jeckyl::Config
234
+ #
235
+ def complement(conf_to_remove)
236
+ self.delete_if {|key, value| conf_to_remove.has_key?(key)}
311
237
  end
312
- end
313
-
314
- # simple type helpers
315
-
316
- # check the parameter is of the required type
317
- #
318
- # Jeckyl checking method to be used in parameter methods to check the validity of
319
- # given parameters, returning the parameter if valid or else raising an exception
320
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
321
- # the parameter is not validly formed
322
- #
323
- # @param [Object] obj to check type of
324
- # @param [Class] type, being a class constant such as Numeric, String
325
- #
326
- def a_type_of(obj, type)
327
- if obj.kind_of?(type) then
328
- obj
329
- else
330
- raise_config_error(obj, "value is not of required type: #{type}")
238
+
239
+ # Read, check and merge another parameter file into this one, being of the same config class.
240
+ #
241
+ # @param [String] conf_file - path to file to parse
242
+ #
243
+ def merge(conf_file)
244
+
245
+ self[:config_files] << conf_file
246
+
247
+ # get the values from the config file itself
248
+ self.instance_eval(File.read(conf_file), conf_file)
249
+
250
+ rescue SyntaxError => err
251
+ raise ConfigSyntaxError, err.message
252
+ rescue Errno::ENOENT
253
+ # duff file path so tell the caller
254
+ raise ConfigFileMissing, "#{conf_file}"
331
255
  end
332
- end
333
-
334
- # check that the parameter is within the required range
335
- #
336
- # Jeckyl checking method to be used in parameter methods to check the validity of
337
- # given parameters, returning the parameter if valid or else raising an exception
338
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
339
- # the parameter is not validly formed
340
- #
341
- # @param [Numeric] val to check
342
- # @param [Numeric] lower bound of range
343
- # @param [Numeric] upper bound of range
344
- #
345
- def in_range(val, lower, upper)
346
- raise_syntax_error("#{lower.to_s}..#{upper.to_s} is not a range") unless (lower .. upper).kind_of?(Range)
347
- if (lower .. upper) === val then
348
- val
349
- else
350
- raise_config_error(val, "value is not within required range: #{lower.to_s}..#{upper.to_s}")
256
+
257
+
258
+ protected
259
+
260
+ # create a description for the current parameter, to be used when generating a config template
261
+ #
262
+ # @param [*String] being one or more string arguments that are used to generate config file templates
263
+ # and documents
264
+ def comment(*strings)
265
+ @_comments[@_last_symbol] = strings unless @_last_symbol.nil?
351
266
  end
352
- end
353
-
354
-
355
- # boolean helpers
356
-
357
- # check parameter is a boolean, true or false but not strings "true" or "false"
358
- #
359
- # Jeckyl checking method to be used in parameter methods to check the validity of
360
- # given parameters, returning the parameter if valid or else raising an exception
361
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
362
- # the parameter is not validly formed
363
- #
364
- # @param [Boolean] val to check
365
- #
366
- def a_boolean(val)
367
- if val.kind_of?(TrueClass) || val.kind_of?(FalseClass) then
368
- val
369
- else
370
- raise_config_error(val, "Value is not a Boolean")
267
+
268
+ # set default value(s) for the current parameter.
269
+ #
270
+ # @param [Object] val - any valid object as expected by the parameter method
271
+ def default(val)
272
+ return if @_last_symbol.nil? || @_defaults.has_key?(@_last_symbol)
273
+ @_defaults[@_last_symbol] = val
371
274
  end
372
- end
373
-
374
- # check the parameter is a flag, being "true", "false", "yes", "no", "on", "off", or 1 , 0
375
- # and return a proper boolean
376
- #
377
- # Jeckyl checking method to be used in parameter methods to check the validity of
378
- # given parameters, returning the parameter if valid or else raising an exception
379
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
380
- # the parameter is not validly formed
381
- #
382
- # @param [String] val to check
383
- #
384
- def a_flag(val)
385
- val = val.downcase if val.kind_of?(String)
386
- case val
387
- when "true", "yes", "on", 1
388
- true
389
- when "false", "no", "off", 0
390
- false
391
- else
392
- raise_config_error(val, "Cannot convert to Boolean")
275
+
276
+ # the following are all helper methods to parse values and raise exceptions if the values are not correct
277
+
278
+ # file helpers - meanings should be apparent
279
+
280
+ # check that the parameter is a directory and that the directory is writable
281
+ #
282
+ # Jeckyl checking method to be used in parameter methods to check the validity of
283
+ # given parameters, returning the parameter if valid or else raising an exception
284
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
285
+ # the parameter is not validly formed
286
+ #
287
+ # @param [String] - path
288
+ #
289
+ def a_writable_dir(path)
290
+ if FileTest.directory?(path) && FileTest.writable?(path) then
291
+ path
292
+ else
293
+ raise_config_error(path, "directory is not writable or does not exist")
294
+ end
393
295
  end
394
- end
395
-
396
-
397
- # compound objects
398
-
399
- # check the parameter is an array
400
- #
401
- # Jeckyl checking method to be used in parameter methods to check the validity of
402
- # given parameters, returning the parameter if valid or else raising an exception
403
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
404
- # the parameter is not validly formed
405
- #
406
- # @param [Array] ary to check
407
- #
408
- def an_array(ary)
409
- if ary.kind_of?(Array) then
410
- ary
411
- else
412
- raise_config_error(ary, "value is not an Array")
296
+
297
+ # check parameter is a readable file
298
+ #
299
+ # Jeckyl checking method to be used in parameter methods to check the validity of
300
+ # given parameters, returning the parameter if valid or else raising an exception
301
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
302
+ # the parameter is not validly formed
303
+ #
304
+ # @param [String] - path to file
305
+ #
306
+ def a_readable_file(path)
307
+ if FileTest.readable?(path) then
308
+ path
309
+ else
310
+ raise_config_error(path, "file does not exist")
311
+ end
413
312
  end
414
- end
415
-
416
- # check the parameter is an array and the array is of the required type
417
- #
418
- # Jeckyl checking method to be used in parameter methods to check the validity of
419
- # given parameters, returning the parameter if valid or else raising an exception
420
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
421
- # the parameter is not validly formed
422
- #
423
- # @param [Array] ary of values to check
424
- # @param [Class] type being the class that the values must belong to
425
- #
426
- def an_array_of(ary, type)
427
- raise_syntax_error("Provided a value that is a type: #{type.to_s}") unless type.class == Class
428
- if ary.kind_of?(Array) then
429
- ary.each do |element|
430
- unless element.kind_of?(type) then
431
- raise_config_error(element, "element of array is not of type: #{type}")
313
+
314
+ # simple type helpers
315
+
316
+ # check the parameter is of the required type
317
+ #
318
+ # Jeckyl checking method to be used in parameter methods to check the validity of
319
+ # given parameters, returning the parameter if valid or else raising an exception
320
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
321
+ # the parameter is not validly formed
322
+ #
323
+ # @param [Object] obj to check type of
324
+ # @param [Class] type, being a class constant such as Numeric, String
325
+ #
326
+ def a_type_of(obj, type)
327
+ if obj.kind_of?(type) then
328
+ obj
329
+ else
330
+ raise_config_error(obj, "value is not of required type: #{type}")
331
+ end
332
+ end
333
+
334
+ # check that the parameter is within the required range
335
+ #
336
+ # Jeckyl checking method to be used in parameter methods to check the validity of
337
+ # given parameters, returning the parameter if valid or else raising an exception
338
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
339
+ # the parameter is not validly formed
340
+ #
341
+ # @param [Numeric] val to check
342
+ # @param [Numeric] lower bound of range
343
+ # @param [Numeric] upper bound of range
344
+ #
345
+ def in_range(val, lower, upper)
346
+ raise_syntax_error("#{lower.to_s}..#{upper.to_s} is not a range") unless (lower .. upper).kind_of?(Range)
347
+ if (lower .. upper) === val then
348
+ val
349
+ else
350
+ raise_config_error(val, "value is not within required range: #{lower.to_s}..#{upper.to_s}")
351
+ end
352
+ end
353
+
354
+
355
+ # boolean helpers
356
+
357
+ # check parameter is a boolean, true or false but not strings "true" or "false"
358
+ #
359
+ # Jeckyl checking method to be used in parameter methods to check the validity of
360
+ # given parameters, returning the parameter if valid or else raising an exception
361
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
362
+ # the parameter is not validly formed
363
+ #
364
+ # @param [Boolean] val to check
365
+ #
366
+ def a_boolean(val)
367
+ if val.kind_of?(TrueClass) || val.kind_of?(FalseClass) then
368
+ val
369
+ else
370
+ raise_config_error(val, "Value is not a Boolean")
371
+ end
372
+ end
373
+
374
+ # check the parameter is a flag, being "true", "false", "yes", "no", "on", "off", or 1 , 0
375
+ # and return a proper boolean
376
+ #
377
+ # Jeckyl checking method to be used in parameter methods to check the validity of
378
+ # given parameters, returning the parameter if valid or else raising an exception
379
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
380
+ # the parameter is not validly formed
381
+ #
382
+ # @param [String] val to check
383
+ #
384
+ def a_flag(val)
385
+ val = val.downcase if val.kind_of?(String)
386
+ case val
387
+ when "true", "yes", "on", 1
388
+ true
389
+ when "false", "no", "off", 0
390
+ false
391
+ else
392
+ raise_config_error(val, "Cannot convert to Boolean")
393
+ end
394
+ end
395
+
396
+
397
+ # compound objects
398
+
399
+ # check the parameter is an array
400
+ #
401
+ # Jeckyl checking method to be used in parameter methods to check the validity of
402
+ # given parameters, returning the parameter if valid or else raising an exception
403
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
404
+ # the parameter is not validly formed
405
+ #
406
+ # @param [Array] ary to check
407
+ #
408
+ def an_array(ary)
409
+ if ary.kind_of?(Array) then
410
+ ary
411
+ else
412
+ raise_config_error(ary, "value is not an Array")
413
+ end
414
+ end
415
+
416
+ # check the parameter is an array and the array is of the required type
417
+ #
418
+ # Jeckyl checking method to be used in parameter methods to check the validity of
419
+ # given parameters, returning the parameter if valid or else raising an exception
420
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
421
+ # the parameter is not validly formed
422
+ #
423
+ # @param [Array] ary of values to check
424
+ # @param [Class] type being the class that the values must belong to
425
+ #
426
+ def an_array_of(ary, type)
427
+ raise_syntax_error("Provided a value that is a type: #{type.to_s}") unless type.class == Class
428
+ if ary.kind_of?(Array) then
429
+ ary.each do |element|
430
+ unless element.kind_of?(type) then
431
+ raise_config_error(element, "element of array is not of type: #{type}")
432
+ end
432
433
  end
434
+ return ary
435
+ else
436
+ raise_config_error(ary, "value is not an Array")
433
437
  end
434
- return ary
435
- else
436
- raise_config_error(ary, "value is not an Array")
437
438
  end
438
- end
439
-
440
- # check the parameter is a hash
441
- #
442
- # Jeckyl checking method to be used in parameter methods to check the validity of
443
- # given parameters, returning the parameter if valid or else raising an exception
444
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
445
- # the parameter is not validly formed
446
- #
447
- # @param [Hash] hsh to check
448
- #
449
- def a_hash(hsh)
450
- if hsh.kind_of?(Hash) then
451
- true
452
- else
453
- raise_config_error(hsh, "value is not a Hash")
439
+
440
+ # check the parameter is a hash
441
+ #
442
+ # Jeckyl checking method to be used in parameter methods to check the validity of
443
+ # given parameters, returning the parameter if valid or else raising an exception
444
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
445
+ # the parameter is not validly formed
446
+ #
447
+ # @param [Hash] hsh to check
448
+ #
449
+ def a_hash(hsh)
450
+ if hsh.kind_of?(Hash) then
451
+ true
452
+ else
453
+ raise_config_error(hsh, "value is not a Hash")
454
+ end
454
455
  end
455
- end
456
-
457
- # strings and text and stuff
458
-
459
- # check the parameter is a string
460
- #
461
- # Jeckyl checking method to be used in parameter methods to check the validity of
462
- # given parameters, returning the parameter if valid or else raising an exception
463
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
464
- # the parameter is not validly formed
465
- #
466
- # @param [String] str to check
467
- #
468
- def a_string(str)
469
- if str.kind_of?(String) then
470
- str
471
- else
472
- raise_config_error(str.to_s, "is not a String")
456
+
457
+ # strings and text and stuff
458
+
459
+ # check the parameter is a string
460
+ #
461
+ # Jeckyl checking method to be used in parameter methods to check the validity of
462
+ # given parameters, returning the parameter if valid or else raising an exception
463
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
464
+ # the parameter is not validly formed
465
+ #
466
+ # @param [String] str to check
467
+ #
468
+ def a_string(str)
469
+ if str.kind_of?(String) then
470
+ str
471
+ else
472
+ raise_config_error(str.to_s, "is not a String")
473
+ end
473
474
  end
474
- end
475
-
476
- # check the parameter is a string and matches the required pattern
477
- #
478
- # Jeckyl checking method to be used in parameter methods to check the validity of
479
- # given parameters, returning the parameter if valid or else raising an exception
480
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
481
- # the parameter is not validly formed
482
- #
483
- # @param [String] str to match against the pattern
484
- # @param [Regexp] pattern to match with
485
- #
486
- def a_matching_string(str, pattern)
487
- raise_syntax_error("Attempt to pattern match without a Regexp") unless pattern.kind_of?(Regexp)
488
- if pattern =~ a_string(str) then
489
- str
490
- else
491
- raise_config_error(str, "does not match required pattern: #{pattern.source}")
475
+
476
+ # check the parameter is a string and matches the required pattern
477
+ #
478
+ # Jeckyl checking method to be used in parameter methods to check the validity of
479
+ # given parameters, returning the parameter if valid or else raising an exception
480
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
481
+ # the parameter is not validly formed
482
+ #
483
+ # @param [String] str to match against the pattern
484
+ # @param [Regexp] pattern to match with
485
+ #
486
+ def a_matching_string(str, pattern)
487
+ raise_syntax_error("Attempt to pattern match without a Regexp") unless pattern.kind_of?(Regexp)
488
+ if pattern =~ a_string(str) then
489
+ str
490
+ else
491
+ raise_config_error(str, "does not match required pattern: #{pattern.source}")
492
+ end
492
493
  end
493
- end
494
-
495
- # set membership - set is an array of members, usually symbols
496
- #
497
- # Jeckyl checking method to be used in parameter methods to check the validity of
498
- # given parameters, returning the parameter if valid or else raising an exception
499
- # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
500
- # the parameter is not validly formed
501
- #
502
- # @param [Symbol] symb being the symbol to check
503
- # @param [Array] set containing the valid symbols that symb should belong to
504
- #
505
- def a_member_of(symb, set)
506
- raise_syntax_error("Sets to test membership must be arrays") unless set.kind_of?(Array)
507
- if set.include?(symb) then
508
- symb
509
- else
510
- raise_config_error(symb, "is not a member of: #{set.join(', ')}")
494
+
495
+ # set membership - set is an array of members, usually symbols
496
+ #
497
+ # Jeckyl checking method to be used in parameter methods to check the validity of
498
+ # given parameters, returning the parameter if valid or else raising an exception
499
+ # which is either ConfigError if the parameter fails the check or ConfigSyntaxError if
500
+ # the parameter is not validly formed
501
+ #
502
+ # @param [Symbol] symb being the symbol to check
503
+ # @param [Array] set containing the valid symbols that symb should belong to
504
+ #
505
+ def a_member_of(symb, set)
506
+ raise_syntax_error("Sets to test membership must be arrays") unless set.kind_of?(Array)
507
+ if set.include?(symb) then
508
+ symb
509
+ else
510
+ raise_config_error(symb, "is not a member of: #{set.join(', ')}")
511
+ end
511
512
  end
512
- end
513
-
514
-
515
- private
516
-
517
- # decides what to do with parameters that have not been defined.
518
- # unless @_relax then it will raise an exception. Otherwise it will create a key value pair
519
- #
520
- # This method also remembers the method name as the key to prevent the parsers etc from
521
- # having to carry this around just to do things like report on it.
522
- #
523
- def method_missing(symb, parameter)
524
-
525
- @_last_symbol = symb
526
- #@parameter = parameter
527
- method_to_call = ("#{self.prefix}_" + symb.to_s).to_sym
528
- set_method = self.method(method_to_call)
529
-
530
- self[@_last_symbol] = set_method.call(parameter)
531
-
532
- rescue NameError
533
- #raise if @@debug
534
- # no parser method defined.
535
- unless @_relax then
536
- # not tolerable
537
- raise UnknownParameter, format_error(symb, parameter, "Unknown parameter")
538
- else
539
- # feeling relaxed, so lets store it anyway.
540
- self[symb] = parameter
513
+
514
+
515
+ private
516
+
517
+ # decides what to do with parameters that have not been defined.
518
+ # unless @_relax then it will raise an exception. Otherwise it will create a key value pair
519
+ #
520
+ # This method also remembers the method name as the key to prevent the parsers etc from
521
+ # having to carry this around just to do things like report on it.
522
+ #
523
+ def method_missing(symb, parameter)
524
+
525
+ @_last_symbol = symb
526
+ #@parameter = parameter
527
+ method_to_call = ("#{self.prefix}_" + symb.to_s).to_sym
528
+ set_method = self.method(method_to_call)
529
+
530
+ self[@_last_symbol] = set_method.call(parameter)
531
+
532
+ rescue NameError
533
+ #raise if @@debug
534
+ # no parser method defined.
535
+ unless @_relax then
536
+ # not tolerable
537
+ raise UnknownParameter, format_error(symb, parameter, "Unknown parameter")
538
+ else
539
+ # feeling relaxed, so lets store it anyway.
540
+ self[symb] = parameter
541
+ end
542
+
541
543
  end
542
-
543
- end
544
-
545
- # get_defaults
546
- #
547
- # calls each method with the specified prefix with no parameters so that the defaults
548
- # defined for each will be passed back and used to set the hash before the
549
- # config file is evaluated.
550
- #
551
- def get_defaults(opts={})
552
- flag_errors = opts[:flag_errors]
553
- local = opts[:local]
554
-
555
- # go through all of the methods
556
- self.class.instance_methods(!local).each do |method_name|
557
- if md = /^#{self.prefix}_/.match(method_name) then
558
-
559
- # its a prefixed method so call it
560
-
561
- pref_method = self.method(method_name.to_sym)
562
- # get the corresponding symbol for the hash
563
- @_last_symbol = md.post_match.to_sym
564
- @_order << @_last_symbol
565
- # and call the method with no parameters, which will
566
- # call the comment method and the default method where defined
567
- # and thereby capture their values
568
- begin
569
- a_value = pref_method.call(1)
570
- rescue Exception
571
- # ignore any errors, which are bound to result from passing in 1
572
- end
573
- begin
574
- # now set the actual default by calling the method again and passing
575
- # the captured default, providing a result which may be different if the method transforms
576
- # the parameter!
577
- param = @_defaults[@_last_symbol]
578
- self[@_last_symbol] = pref_method.call(param) unless param.nil?
579
- rescue Exception
580
- raise if flag_errors
581
- # ignore any errors raised
544
+
545
+ # get_defaults
546
+ #
547
+ # calls each method with the specified prefix with no parameters so that the defaults
548
+ # defined for each will be passed back and used to set the hash before the
549
+ # config file is evaluated.
550
+ #
551
+ def get_defaults(opts={})
552
+ flag_errors = opts[:flag_errors]
553
+ local = opts[:local]
554
+
555
+ # go through all of the methods
556
+ self.class.instance_methods(!local).each do |method_name|
557
+ if md = /^#{self.prefix}_/.match(method_name) then
558
+
559
+ # its a prefixed method so call it
560
+
561
+ pref_method = self.method(method_name.to_sym)
562
+ # get the corresponding symbol for the hash
563
+ @_last_symbol = md.post_match.to_sym
564
+ @_order << @_last_symbol
565
+ # and call the method with no parameters, which will
566
+ # call the comment method and the default method where defined
567
+ # and thereby capture their values
568
+ begin
569
+ a_value = pref_method.call(1)
570
+ rescue Exception
571
+ # ignore any errors, which are bound to result from passing in 1
572
+ end
573
+ begin
574
+ # now set the actual default by calling the method again and passing
575
+ # the captured default, providing a result which may be different if the method transforms
576
+ # the parameter!
577
+ param = @_defaults[@_last_symbol]
578
+ self[@_last_symbol] = pref_method.call(param) unless param.nil?
579
+ rescue Exception
580
+ raise if flag_errors
581
+ # ignore any errors raised
582
+ end
582
583
  end
583
584
  end
584
585
  end
585
- end
586
-
587
- # really private helpers that should not be needed unless the parser method
588
- # is custom
589
-
590
- protected
591
-
592
- # helper method to format exception messages. A config error should be raised
593
- # when the given parameter does not match the checks.
594
- #
595
- # The exception is raised in the caller's context to ensure backtraces are accurate.
596
- #
597
- # @param [Object] value - the object that caused the error
598
- # @param [String] message to include in the exception
599
- #
600
- def raise_config_error(value, message)
601
- raise ConfigError, format_error(@_last_symbol, value, message), caller
602
- end
603
-
604
- # helper method to format exception messages. A syntax error should be raised
605
- # when the check method has been used incorrectly. See check methods for examples.
606
- #
607
- # The exception is raised in the caller's context to ensure backtraces are accurate.
608
- #
609
- # @param [String] message to include in the exception
610
- #
611
- def raise_syntax_error(message)
612
- raise ConfigSyntaxError, message, caller
613
- end
614
-
615
- # helper method to format an error
616
- def format_error(key, value, message)
617
- "[#{key}]: #{value} - #{message}"
618
- end
586
+
587
+ # really private helpers that should not be needed unless the parser method
588
+ # is custom
589
+
590
+ protected
591
+
592
+ # helper method to format exception messages. A config error should be raised
593
+ # when the given parameter does not match the checks.
594
+ #
595
+ # The exception is raised in the caller's context to ensure backtraces are accurate.
596
+ #
597
+ # @param [Object] value - the object that caused the error
598
+ # @param [String] message to include in the exception
599
+ #
600
+ def raise_config_error(value, message)
601
+ raise ConfigError, format_error(@_last_symbol, value, message), caller
602
+ end
603
+
604
+ # helper method to format exception messages. A syntax error should be raised
605
+ # when the check method has been used incorrectly. See check methods for examples.
606
+ #
607
+ # The exception is raised in the caller's context to ensure backtraces are accurate.
608
+ #
609
+ # @param [String] message to include in the exception
610
+ #
611
+ def raise_syntax_error(message)
612
+ raise ConfigSyntaxError, message, caller
613
+ end
614
+
615
+ # helper method to format an error
616
+ def format_error(key, value, message)
617
+ "[#{key}]: #{value} - #{message}"
618
+ end
619
619
 
620
620
  end
621
621
 
@@ -1,13 +1,13 @@
1
1
  # Created by Jevoom
2
2
  #
3
- # 25-Oct-2012
4
- # Clean up unwanted git files and update README links (e.g. rubydoc)
3
+ # 15-Nov-2012
4
+ # Change base directory for configs to /etc/jerbil consistent with the main jerbil gem
5
5
 
6
6
  module Jeckyl
7
- # version set to 0.2.5
8
- Version = '0.2.5'
9
- # date set to 25-Oct-2012
10
- Version_Date = '25-Oct-2012'
11
- #ident string set to: jeckyl-0.2.5 25-Oct-2012
12
- Ident = 'jeckyl-0.2.5 25-Oct-2012'
7
+ # version set to 0.2.7
8
+ Version = '0.2.7'
9
+ # date set to 15-Nov-2012
10
+ Version_Date = '15-Nov-2012'
11
+ #ident string set to: jeckyl-0.2.7 15-Nov-2012
12
+ Ident = 'jeckyl-0.2.7 15-Nov-2012'
13
13
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeckyl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 5
10
- version: 0.2.5
9
+ - 7
10
+ version: 0.2.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dr Robert
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-10-25 00:00:00 Z
18
+ date: 2012-11-15 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime