svutil 0.0.13 → 0.1.2

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 CHANGED
@@ -6,5 +6,5 @@ require 'svutil/log'
6
6
  require 'svutil/process_manager'
7
7
 
8
8
  module SVUtil
9
- VERSION = '0.0.13'
9
+ VERSION = '0.1.2'
10
10
  end
data/lib/svutil/config.rb CHANGED
@@ -7,10 +7,32 @@ module SVUtil
7
7
  def self.config
8
8
  Config.config_class
9
9
  end
10
-
10
+
11
+ class Defaults
12
+ def initialize
13
+ @attrs = {}
14
+ end
15
+
16
+ def default_for(name)
17
+ @attrs[name]
18
+ end
19
+
20
+ private
21
+ def method_missing(method_id, *args)
22
+ @attrs ||= {}
23
+ if method_id.to_s =~ /=$/
24
+ @attrs[method_id.to_s[0...-1]] = args.first
25
+ end
26
+ end
27
+ end
28
+
11
29
  class Config
12
30
  class << self
13
31
  attr_writer :config_file
32
+ attr_reader :attrs
33
+ attr_reader :defaults
34
+ # Used mainly for testing
35
+ attr_accessor :option_source
14
36
 
15
37
  def config_class
16
38
  subclasses_of(self).first || self
@@ -20,47 +42,17 @@ module SVUtil
20
42
  @config_file || 'settings'
21
43
  end
22
44
 
23
- def load_and_parse
24
- process_options
25
- load_config_file
26
- set_defaults
27
- apply_all
28
- validate
29
- end
30
-
31
- def set_defaults
32
- # Overide this method in subclasses
33
- end
34
-
35
- def default(name, value)
36
- @temp_hash ||= {}
37
- if !@temp_hash.has_key?(name) || @temp_hash[name].nil?
38
- set(name, value)
45
+ def set(options = {})
46
+ @attrs ||= {}
47
+ if block_given?
48
+ yield self
39
49
  end
50
+ self.validate
40
51
  end
41
52
 
42
- def set(name, value)
43
- @temp_hash ||= {}
44
- @temp_hash[name.to_s] = value
45
- end
46
-
47
- def apply(name, value)
48
- @hash ||= {}
49
- @hash[name.to_s] = value
50
- end
51
-
52
- def apply_all
53
- @hash ||= {}
54
- @hash.merge!(@temp_hash) if @temp_hash
55
- end
56
-
57
- def method_missing(method_id, *args)
58
- return nil unless @hash
59
- if method_id.to_s =~ /=$/
60
- @hash[method_id.to_s[0...-1]] = args.first
61
- else
62
- @hash[method_id.to_s]
63
- end
53
+ def defaults(&block)
54
+ @defaults ||= Defaults.new
55
+ yield @defaults
64
56
  end
65
57
 
66
58
  def validate
@@ -72,29 +64,52 @@ module SVUtil
72
64
  true
73
65
  end
74
66
 
75
- def process_options
76
- parse_options
77
- end
78
-
79
- def parse_options
80
- OptionParser.new do |opts|
81
- opts.on("-f", "--config [filename]", "Config file to use (default 'settings')") do |filename|
82
- self.config_file = filename
83
- end
84
- opts.on("-d", "--daemon", "Run in the background as a daemon") do
85
- self.set(:daemon, true)
86
- end
87
- opts.on("-l", "--debug-log [log-file]", "Debug Log File") do |log|
88
- self.set(log_file, log)
89
- end
90
- opts.on("-T", "--trace", "Display backtrace on errors") do
91
- self.set(:trace, true)
92
- end
93
- yield opts if block_given?
94
- end.parse!
67
+ def init
68
+ self.set do |c|
69
+ process_options
70
+ load_config_file
71
+ end
95
72
  end
96
73
 
74
+ protected
75
+ # Overide in subclasses for additional options
76
+ def process_options
77
+ parse_options
78
+ end
79
+
80
+ def parse_options(&block)
81
+ OptionParser.new do |opts|
82
+ opts.on("-f", "--config [filename]", "Config file to use (default 'settings')") do |filename|
83
+ self.config_file = filename.strip
84
+ end
85
+ opts.on("-d", "--daemon", "Run in the background as a daemon") do
86
+ self.daemon = true
87
+ end
88
+ opts.on("-l", "--debug-log [log-file]", "Debug Log File") do |log|
89
+ self.log_file = log
90
+ end
91
+ opts.on("-T", "--trace", "Display backtrace on errors") do
92
+ self.trace = true
93
+ end
94
+ yield opts if block_given?
95
+ end.parse!(self.option_source || ARGV)
96
+ end
97
+
97
98
  private
99
+ def method_missing(method_id, *args)
100
+ @attrs ||= {}
101
+ if method_id.to_s =~ /=$/
102
+ @attrs[method_id.to_s[0...-1]] = args.first
103
+ else
104
+ value = @attrs[method_id.to_s]
105
+ if !value && @defaults
106
+ @defaults.default_for(method_id.to_s)
107
+ else
108
+ value
109
+ end
110
+ end
111
+ end
112
+
98
113
  def load_config_file
99
114
  contents = ""
100
115
  File.open(config_file, "r") { |file| contents << file.read }
@@ -104,7 +119,7 @@ module SVUtil
104
119
  STDERR.puts "Invalid config file '#{config_file}'. Syntax error at line #{index + 1}"
105
120
  exit 1
106
121
  end
107
- config_class.apply(pair[0].strip, pair[1].strip)
122
+ self.send("#{pair[0].strip}=", pair[1].strip)
108
123
  end
109
124
  end
110
125
 
@@ -0,0 +1,78 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class CustomConfig < SVUtil::Config
4
+ defaults do |c|
5
+ c.foo = 'bar'
6
+ end
7
+ end
8
+
9
+ class TestConfig < Test::Unit::TestCase
10
+ include SVUtil
11
+
12
+ def setup
13
+ end
14
+
15
+ def test_set
16
+ assert !Config.my_symbol
17
+ Config.my_symbol = 'abc'
18
+ assert_equal 'abc', Config.my_symbol
19
+ Config.my_var = 10
20
+ assert_equal 10, Config.my_var
21
+ end
22
+
23
+ def test_set_with_block
24
+ Config.expects(:validate).times(1)
25
+ Config.set do |c|
26
+ c.another = 'abc'
27
+ c.some_var = 123
28
+ c.foobar = true
29
+ end
30
+ assert_equal 'abc', Config.another
31
+ assert_equal 123, Config.some_var
32
+ assert Config.foobar
33
+ end
34
+
35
+ def test_standard_cli_options
36
+ Config.expects(:validate).times(1)
37
+ Config.option_source = [ "-f", "test/settings", "-d", "-l", "debug", "-T" ]
38
+ Config.init
39
+ assert_equal "test/settings", Config.config_file
40
+ assert_equal "debug", Config.log_file
41
+ assert Config.daemon
42
+ assert Config.trace
43
+ end
44
+
45
+ def test_config_file
46
+ Config.expects(:validate).times(1)
47
+ Config.config_file = "test/settings"
48
+ Config.init
49
+ assert_equal 'bar', Config.foo
50
+ end
51
+
52
+ # Command Line loses!
53
+ def test_file_overide
54
+ Config.expects(:validate).times(1)
55
+ Config.config_file = "test/settings"
56
+ Config.option_source = [ "-l", "logfile_set_on_cli" ]
57
+ Config.init
58
+ assert_equal "logfile_set_in_config_file", Config.log_file
59
+
60
+ end
61
+
62
+ def test_defaults
63
+ Config.defaults do |c|
64
+ c.manager = 'daniel'
65
+ end
66
+ assert_equal 'daniel', Config.manager
67
+ Config.manager = 'james'
68
+ assert_equal 'james', Config.manager
69
+ end
70
+
71
+ def test_validations
72
+
73
+ end
74
+
75
+ def test_custom_defaults
76
+ assert_equal 'bar', CustomConfig.foo
77
+ end
78
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestDefaults < Test::Unit::TestCase
4
+ include SVUtil
5
+
6
+ def test_set
7
+ defaults = Defaults.new
8
+ assert !defaults.default_for('person')
9
+ defaults.person = 'daniel'
10
+ assert_equal 'daniel', defaults.default_for('person')
11
+ end
12
+ end
13
+
data/test/test_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'stringio'
2
2
  require 'test/unit'
3
+ require 'mocha'
3
4
  require File.dirname(__FILE__) + '/../lib/svutil'
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 0
8
- - 13
9
- version: 0.0.13
7
+ - 1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Draper
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-03 00:00:00 +10:30
17
+ date: 2011-02-08 00:00:00 +10:30
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -40,9 +40,9 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  segments:
42
42
  - 2
43
- - 6
43
+ - 4
44
44
  - 0
45
- version: 2.6.0
45
+ version: 2.4.0
46
46
  type: :development
47
47
  version_requirements: *id002
48
48
  description: A simple managed process builder for Ruby projects
@@ -100,5 +100,7 @@ signing_key:
100
100
  specification_version: 3
101
101
  summary: Simple Process Builder for Ruby
102
102
  test_files:
103
+ - test/test_config.rb
104
+ - test/test_defaults.rb
103
105
  - test/test_helper.rb
104
106
  - test/test_svutil.rb