svutil 0.1.8 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/svutil.rb +1 -1
- data/lib/svutil/config.rb +55 -30
- data/test/test_config.rb +42 -40
- data/test/test_config_handle_options.rb +33 -0
- data/test/test_validations.rb +26 -0
- metadata +12 -8
data/lib/svutil.rb
CHANGED
data/lib/svutil/config.rb
CHANGED
@@ -27,6 +27,7 @@ module SVUtil
|
|
27
27
|
end
|
28
28
|
|
29
29
|
class Config
|
30
|
+
|
30
31
|
class << self
|
31
32
|
attr_writer :config_file
|
32
33
|
attr_reader :attrs
|
@@ -34,12 +35,11 @@ module SVUtil
|
|
34
35
|
# Used mainly for testing
|
35
36
|
attr_accessor :option_source
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
end
|
38
|
+
attr_accessor :cli_options
|
39
|
+
attr_accessor :cli_option_handlers
|
40
40
|
|
41
|
-
def
|
42
|
-
|
41
|
+
def self.config_class
|
42
|
+
subclasses_of(self).first || self
|
43
43
|
end
|
44
44
|
|
45
45
|
def set(options = {})
|
@@ -55,55 +55,75 @@ module SVUtil
|
|
55
55
|
yield @defaults
|
56
56
|
end
|
57
57
|
|
58
|
+
def config_file
|
59
|
+
@config_file ||= "settings"
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_cli_option(option, value)
|
63
|
+
@cli_options ||= {}
|
64
|
+
@cli_options[option.to_s] = value
|
65
|
+
end
|
66
|
+
|
67
|
+
def handle_options(&block)
|
68
|
+
@cli_option_handlers ||= []
|
69
|
+
@cli_option_handlers << block
|
70
|
+
end
|
71
|
+
|
72
|
+
def validator(&block)
|
73
|
+
@validate_block = block
|
74
|
+
end
|
75
|
+
|
58
76
|
def validate
|
59
77
|
# TODO: Check file perms
|
60
78
|
if ((pid_file.nil? or pid_file.empty? or File.directory?(pid_file)) && self.daemon)
|
61
|
-
|
62
|
-
exit 1
|
79
|
+
err("PID file must be a writable file")
|
63
80
|
end
|
81
|
+
# TODO: Validate the writability of the log file
|
82
|
+
@validate_block.call(self) unless @validate_block.nil?
|
64
83
|
true
|
65
84
|
end
|
66
85
|
|
67
86
|
def init
|
68
|
-
|
69
|
-
|
70
|
-
# If there is no config file and we haven't specified one then ignore
|
71
|
-
if File.exists?(self.config_file) || self.config_provided_on_cli
|
72
|
-
load_config_file
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
protected
|
78
|
-
# Overide in subclasses for additional options
|
79
|
-
def process_options
|
80
|
-
parse_options
|
81
|
-
end
|
82
|
-
|
83
|
-
def parse_options(&block)
|
87
|
+
set do |c|
|
88
|
+
self.config_provided_on_cli = false
|
84
89
|
OptionParser.new do |opts|
|
85
90
|
opts.on("-f", "--config [filename]", "Config file to use (default 'settings')") do |filename|
|
86
91
|
self.config_file = filename.strip
|
87
92
|
self.config_provided_on_cli = true
|
88
93
|
end
|
89
94
|
opts.on("-d", "--daemon", "Run in the background as a daemon") do
|
90
|
-
|
95
|
+
set_cli_option(:daemon, true)
|
91
96
|
end
|
92
97
|
opts.on("-l", "--debug-log [log-file]", "Debug Log File") do |log|
|
93
|
-
|
98
|
+
set_cli_option(:log_file, log)
|
94
99
|
end
|
95
100
|
opts.on("-T", "--trace", "Display backtrace on errors") do
|
96
|
-
|
101
|
+
set_cli_option(:trace, true)
|
97
102
|
end
|
98
103
|
opts.on("-P", "--pid [pid-file]", "PID File") do |pid|
|
99
|
-
|
104
|
+
set_cli_option(:pid_file, pid)
|
105
|
+
end
|
106
|
+
# Handle CLI passed options
|
107
|
+
(cli_option_handlers || []).each do |handler|
|
108
|
+
handler.call(opts)
|
100
109
|
end
|
101
|
-
yield opts if block_given?
|
102
110
|
end.parse!(self.option_source || ARGV)
|
111
|
+
|
112
|
+
# Process the config file
|
113
|
+
if (self.config_file && File.exists?(self.config_file)) || self.config_provided_on_cli
|
114
|
+
load_config_file
|
115
|
+
end
|
116
|
+
|
117
|
+
# Finally apply any CLI options
|
118
|
+
(cli_options || {}).each do |(k,v)|
|
119
|
+
c.send("#{k}=", v)
|
120
|
+
end
|
103
121
|
end
|
122
|
+
end
|
104
123
|
|
105
124
|
private
|
106
125
|
def method_missing(method_id, *args)
|
126
|
+
@defaults ||= Defaults.new
|
107
127
|
@attrs ||= {}
|
108
128
|
if method_id.to_s =~ /=$/
|
109
129
|
@attrs[method_id.to_s[0...-1]] = args.first
|
@@ -123,13 +143,18 @@ module SVUtil
|
|
123
143
|
contents.split("\n").each_with_index do |line, index|
|
124
144
|
pair = line.split("=")
|
125
145
|
if pair.size != 2
|
126
|
-
|
127
|
-
exit 1
|
146
|
+
err("Invalid config file '#{config_file}'. Syntax error at line #{index + 1}")
|
128
147
|
end
|
129
148
|
self.send("#{pair[0].strip}=", pair[1].strip)
|
130
149
|
end
|
131
150
|
end
|
132
151
|
|
152
|
+
# TODO: This should be moved out to a Validator class
|
153
|
+
def err(message)
|
154
|
+
STDERR.puts(message)
|
155
|
+
exit 1
|
156
|
+
end
|
157
|
+
|
133
158
|
def subclasses_of(*superclasses) #:nodoc:
|
134
159
|
subclasses = []
|
135
160
|
superclasses.each do |sup|
|
data/test/test_config.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')
|
2
2
|
|
3
3
|
class CustomConfig < SVUtil::Config
|
4
4
|
defaults do |c|
|
@@ -13,69 +13,71 @@ class TestConfig < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_set
|
16
|
-
assert !
|
17
|
-
|
18
|
-
assert_equal 'abc',
|
19
|
-
|
20
|
-
assert_equal 10,
|
16
|
+
assert !CustomConfig.my_symbol
|
17
|
+
CustomConfig.my_symbol = 'abc'
|
18
|
+
assert_equal 'abc', CustomConfig.my_symbol
|
19
|
+
CustomConfig.my_var = 10
|
20
|
+
assert_equal 10, CustomConfig.my_var
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_set_with_block
|
24
|
-
|
25
|
-
|
24
|
+
CustomConfig.expects(:validate).times(1)
|
25
|
+
CustomConfig.set do |c|
|
26
26
|
c.another = 'abc'
|
27
27
|
c.some_var = 123
|
28
28
|
c.foobar = true
|
29
29
|
end
|
30
|
-
assert_equal 'abc',
|
31
|
-
assert_equal 123,
|
32
|
-
assert
|
30
|
+
assert_equal 'abc', CustomConfig.another
|
31
|
+
assert_equal 123, CustomConfig.some_var
|
32
|
+
assert CustomConfig.foobar
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_standard_cli_options
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
assert_equal "test/settings",
|
40
|
-
assert_equal "debug",
|
41
|
-
assert
|
42
|
-
assert
|
36
|
+
CustomConfig.expects(:validate).times(1)
|
37
|
+
CustomConfig.option_source = [ "-f", "test/settings", "-d", "-l", "debug", "-T" ]
|
38
|
+
CustomConfig.init
|
39
|
+
assert_equal "test/settings", CustomConfig.config_file
|
40
|
+
assert_equal "debug", CustomConfig.log_file
|
41
|
+
assert CustomConfig.daemon
|
42
|
+
assert CustomConfig.trace
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_config_file
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
assert_equal 'bar',
|
46
|
+
CustomConfig.expects(:validate).times(1)
|
47
|
+
CustomConfig.config_file = "test/settings"
|
48
|
+
CustomConfig.init
|
49
|
+
assert_equal 'bar', CustomConfig.foo
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_load_config_file
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
assert_equal 'bar',
|
53
|
+
CustomConfig.expects(:load_config_file).times(1)
|
54
|
+
CustomConfig.config_file = "test/settings"
|
55
|
+
CustomConfig.init
|
56
|
+
assert_equal 'bar', CustomConfig.foo
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_validations_on_cli_with_no_config_file
|
60
|
+
CustomConfig.expects(:validate).times(1)
|
61
|
+
CustomConfig.config_file = nil
|
62
|
+
CustomConfig.init
|
57
63
|
end
|
58
64
|
|
59
|
-
# Command Line
|
65
|
+
# Command Line wins!
|
60
66
|
def test_file_overide
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
assert_equal "
|
67
|
+
CustomConfig.expects(:validate).times(1)
|
68
|
+
CustomConfig.config_file = "test/settings"
|
69
|
+
CustomConfig.option_source = [ "-l", "logfile_set_on_cli" ]
|
70
|
+
CustomConfig.init
|
71
|
+
assert_equal "logfile_set_on_cli", CustomConfig.log_file
|
66
72
|
end
|
67
73
|
|
68
74
|
def test_defaults
|
69
|
-
|
75
|
+
CustomConfig.defaults do |c|
|
70
76
|
c.manager = 'daniel'
|
71
77
|
end
|
72
|
-
assert_equal 'daniel',
|
73
|
-
|
74
|
-
assert_equal 'james',
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_validations
|
78
|
-
|
78
|
+
assert_equal 'daniel', CustomConfig.manager
|
79
|
+
CustomConfig.manager = 'james'
|
80
|
+
assert_equal 'james', CustomConfig.manager
|
79
81
|
end
|
80
82
|
|
81
83
|
def test_custom_defaults
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')
|
2
|
+
|
3
|
+
class MyConfig < SVUtil::Config
|
4
|
+
handle_options do |opts|
|
5
|
+
opts.on("-Q", "--restless", "Feeling restless?") do
|
6
|
+
set_cli_option(:restless, true)
|
7
|
+
end
|
8
|
+
opts.on("-x", "--x-value [value]", "X Value") do |x|
|
9
|
+
set_cli_option(:x, x)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class TestConfigHandleOptions < Test::Unit::TestCase
|
15
|
+
include SVUtil
|
16
|
+
|
17
|
+
def setup
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_handle_options
|
21
|
+
MyConfig.option_source = [ "-P", "foo", "-x", "12345", "-Q" ]
|
22
|
+
MyConfig.init
|
23
|
+
assert MyConfig.pid_file = "foo"
|
24
|
+
assert MyConfig.x = '1234'
|
25
|
+
assert MyConfig.restless
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_built_in_options
|
29
|
+
MyConfig.option_source = [ "-d", "-P", "foo" ]
|
30
|
+
MyConfig.init
|
31
|
+
assert MyConfig.daemon
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')
|
2
|
+
|
3
|
+
class ValidatedConfig < SVUtil::Config
|
4
|
+
validator do |c|
|
5
|
+
err("Output dir must be provided") unless c.output_dir
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestValidations < Test::Unit::TestCase
|
10
|
+
include SVUtil
|
11
|
+
|
12
|
+
def setup
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_custom_validation_error
|
16
|
+
ValidatedConfig.expects(:err).times(1)
|
17
|
+
ValidatedConfig.output_dir = nil
|
18
|
+
ValidatedConfig.validate
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_custom_validation
|
22
|
+
ValidatedConfig.expects(:err).never
|
23
|
+
ValidatedConfig.output_dir = "foo"
|
24
|
+
assert ValidatedConfig.validate
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svutil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: newgem
|
16
|
-
requirement: &
|
16
|
+
requirement: &70175710061260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.5.3
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70175710061260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hoe
|
27
|
-
requirement: &
|
27
|
+
requirement: &70175710060100 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '2.12'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70175710060100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rdoc
|
38
|
-
requirement: &
|
38
|
+
requirement: &70175705942700 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '3.10'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70175705942700
|
47
47
|
description: A simple managed process builder for Ruby projects
|
48
48
|
email:
|
49
49
|
- daniel@netfox.com
|
@@ -66,7 +66,9 @@ files:
|
|
66
66
|
- test/test_helper.rb
|
67
67
|
- test/test_svutil.rb
|
68
68
|
- test/test_config.rb
|
69
|
+
- test/test_config_handle_options.rb
|
69
70
|
- test/test_defaults.rb
|
71
|
+
- test/test_validations.rb
|
70
72
|
- .gemtest
|
71
73
|
homepage: http://svutil.rubyforge.org
|
72
74
|
licenses: []
|
@@ -96,6 +98,8 @@ specification_version: 3
|
|
96
98
|
summary: Simple Process Builder for Ruby
|
97
99
|
test_files:
|
98
100
|
- test/test_config.rb
|
101
|
+
- test/test_config_handle_options.rb
|
99
102
|
- test/test_defaults.rb
|
100
103
|
- test/test_helper.rb
|
101
104
|
- test/test_svutil.rb
|
105
|
+
- test/test_validations.rb
|