configatron 1.2.2 → 2.0.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/README +61 -34
- data/doc/classes/Configatron.html +241 -0
- data/doc/classes/Configatron/ProtectedParameter.html +146 -0
- data/doc/classes/Configatron/Store.html +241 -121
- data/doc/classes/Kernel.html +13 -20
- data/doc/created.rid +1 -1
- data/doc/files/README.html +85 -43
- data/doc/files/lib/configatron/{configuration_rb.html → configatron_rb.html} +11 -4
- data/doc/files/lib/configatron/{helpers_rb.html → errors_rb.html} +4 -4
- data/doc/files/lib/configatron/kernel_rb.html +1 -1
- data/doc/files/lib/configatron/store_rb.html +1 -1
- data/doc/files/lib/configatron_rb.html +1 -2
- data/doc/fr_class_index.html +2 -4
- data/doc/fr_file_index.html +2 -3
- data/doc/fr_method_index.html +15 -21
- data/lib/configatron.rb +5 -44
- data/lib/configatron/configatron.rb +44 -0
- data/lib/configatron/errors.rb +7 -0
- data/lib/configatron/kernel.rb +3 -9
- data/lib/configatron/store.rb +148 -56
- data/spec/lib/configatron_spec.rb +293 -0
- data/spec/lib/futurama.yml +6 -0
- data/spec/spec_helper.rb +3 -2
- metadata +11 -18
- data/doc/classes/Configatron/Configuration.html +0 -402
- data/doc/classes/Configatron/Helpers.html +0 -174
- data/doc/classes/Configatron/YamlStore.html +0 -203
- data/doc/classes/Hash.html +0 -193
- data/doc/files/lib/configatron/yaml_store_rb.html +0 -101
- data/lib/configatron/configuration.rb +0 -112
- data/lib/configatron/helpers.rb +0 -27
- data/lib/configatron/yaml_store.rb +0 -33
- data/spec/unit/configuration_spec.rb +0 -299
- data/spec/unit/family_guy.yml +0 -2
- data/spec/unit/helpers_spec.rb +0 -115
- data/spec/unit/kernel_spec.rb +0 -48
- data/spec/unit/store_spec.rb +0 -91
@@ -1,101 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
-
<!DOCTYPE html
|
3
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
-
|
6
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
-
<head>
|
8
|
-
<title>File: yaml_store.rb</title>
|
9
|
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
-
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
-
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
-
<script type="text/javascript">
|
13
|
-
// <![CDATA[
|
14
|
-
|
15
|
-
function popupCode( url ) {
|
16
|
-
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
-
}
|
18
|
-
|
19
|
-
function toggleCode( id ) {
|
20
|
-
if ( document.getElementById )
|
21
|
-
elem = document.getElementById( id );
|
22
|
-
else if ( document.all )
|
23
|
-
elem = eval( "document.all." + id );
|
24
|
-
else
|
25
|
-
return false;
|
26
|
-
|
27
|
-
elemStyle = elem.style;
|
28
|
-
|
29
|
-
if ( elemStyle.display != "block" ) {
|
30
|
-
elemStyle.display = "block"
|
31
|
-
} else {
|
32
|
-
elemStyle.display = "none"
|
33
|
-
}
|
34
|
-
|
35
|
-
return true;
|
36
|
-
}
|
37
|
-
|
38
|
-
// Make codeblocks hidden by default
|
39
|
-
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
-
|
41
|
-
// ]]>
|
42
|
-
</script>
|
43
|
-
|
44
|
-
</head>
|
45
|
-
<body>
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
<div id="fileHeader">
|
50
|
-
<h1>yaml_store.rb</h1>
|
51
|
-
<table class="header-table">
|
52
|
-
<tr class="top-aligned-row">
|
53
|
-
<td><strong>Path:</strong></td>
|
54
|
-
<td>lib/configatron/yaml_store.rb
|
55
|
-
</td>
|
56
|
-
</tr>
|
57
|
-
<tr class="top-aligned-row">
|
58
|
-
<td><strong>Last Update:</strong></td>
|
59
|
-
<td>Fri Sep 05 16:22:37 -0400 2008</td>
|
60
|
-
</tr>
|
61
|
-
</table>
|
62
|
-
</div>
|
63
|
-
<!-- banner header -->
|
64
|
-
|
65
|
-
<div id="bodyContent">
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
<div id="contextContent">
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
</div>
|
74
|
-
|
75
|
-
|
76
|
-
</div>
|
77
|
-
|
78
|
-
|
79
|
-
<!-- if includes -->
|
80
|
-
|
81
|
-
<div id="section">
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
<!-- if method_list -->
|
91
|
-
|
92
|
-
|
93
|
-
</div>
|
94
|
-
|
95
|
-
|
96
|
-
<div id="validator-badges">
|
97
|
-
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
98
|
-
</div>
|
99
|
-
|
100
|
-
</body>
|
101
|
-
</html>
|
@@ -1,112 +0,0 @@
|
|
1
|
-
module Configatron
|
2
|
-
# The central class for managing the configurations.
|
3
|
-
class Configuration
|
4
|
-
include Singleton
|
5
|
-
include Configatron::Helpers
|
6
|
-
|
7
|
-
# If nil_for_missing is set to true nil will be returned if the configuration
|
8
|
-
# parameter doesn't exist. If set to false, default, then a NoMethodError exception
|
9
|
-
# will be raised.
|
10
|
-
attr_accessor :nil_for_missing
|
11
|
-
|
12
|
-
def initialize # :nodoc:
|
13
|
-
@_storage_list = []
|
14
|
-
@_nil_for_missing = false
|
15
|
-
end
|
16
|
-
|
17
|
-
# Yields a new Configatron::Store class.
|
18
|
-
def configure
|
19
|
-
storage = Configatron::Store.new
|
20
|
-
yield storage
|
21
|
-
unless storage.parameters.empty?
|
22
|
-
@_storage_list << storage
|
23
|
-
load_methods(storage)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Used to load configuration settings from a Hash.
|
28
|
-
def configure_from_hash(parameters)
|
29
|
-
parameters = self.to_hash.recursive_merge(parameters)
|
30
|
-
storage = Configatron::Store.new(parameters)
|
31
|
-
@_storage_list << storage
|
32
|
-
load_methods(storage)
|
33
|
-
end
|
34
|
-
|
35
|
-
# Used to load configuration settings from a YAML file.
|
36
|
-
def configure_from_yaml(path)
|
37
|
-
begin
|
38
|
-
storage = Configatron::YamlStore.new(path)
|
39
|
-
@_storage_list << storage
|
40
|
-
load_methods(storage)
|
41
|
-
rescue Errno::ENOENT => e
|
42
|
-
puts e.message
|
43
|
-
# file doesn't exist.
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Replays the history of configurations.
|
48
|
-
def reload
|
49
|
-
@_storage_list.each do |storage|
|
50
|
-
storage.reload
|
51
|
-
load_methods(storage)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Does a hard reset of the Configatron::Configuration class.
|
56
|
-
# All methods are undefined, the list of configuration parameters
|
57
|
-
# is emptied, and the nil_for_missing method gets reset to false.
|
58
|
-
def reset!
|
59
|
-
reset
|
60
|
-
self.nil_for_missing = false
|
61
|
-
@_storage_list = []
|
62
|
-
end
|
63
|
-
|
64
|
-
# All methods are undefined.
|
65
|
-
def reset
|
66
|
-
@_storage_list.each do |storage|
|
67
|
-
storage.parameters.each do |k,v|
|
68
|
-
Configatron::Configuration.instance_eval do
|
69
|
-
begin
|
70
|
-
undef_method(k)
|
71
|
-
rescue NameError => e
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Peels back n number of configuration parameters.
|
79
|
-
def revert(step = 1)
|
80
|
-
reset
|
81
|
-
step.times {@_storage_list.pop}
|
82
|
-
reload
|
83
|
-
end
|
84
|
-
|
85
|
-
def method_missing(sym, *args) # :nodoc:
|
86
|
-
handle_missing_parameter(sym)
|
87
|
-
end
|
88
|
-
|
89
|
-
def to_hash
|
90
|
-
@_storage_list.inject({}) { |acc, storage| acc.merge(storage.to_hash) }
|
91
|
-
end
|
92
|
-
|
93
|
-
private
|
94
|
-
def load_methods(store)
|
95
|
-
store.parameters.each do |k,v|
|
96
|
-
if k.is_a?(Configatron::Store)
|
97
|
-
load_methods(k)
|
98
|
-
else
|
99
|
-
if v.is_a?(Hash)
|
100
|
-
v = (store.parameters[k] = Configatron::Store.new(v))
|
101
|
-
end
|
102
|
-
Configatron::Configuration.instance_eval do
|
103
|
-
define_method(k) do
|
104
|
-
v
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
end # Configuration
|
112
|
-
end # Configatron
|
data/lib/configatron/helpers.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Configatron
|
2
|
-
module Helpers
|
3
|
-
|
4
|
-
# Checks whether or not configuration parameter exists.
|
5
|
-
def exists?(name)
|
6
|
-
self.respond_to?(name)
|
7
|
-
end
|
8
|
-
|
9
|
-
def handle_missing_parameter(param) # :nodoc:
|
10
|
-
if configatron.nil_for_missing
|
11
|
-
return nil
|
12
|
-
else
|
13
|
-
raise NoMethodError.new(param.to_s)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# Retrieves the specified config parameter. An optional second
|
18
|
-
# parameter can be passed that will be returned if the config
|
19
|
-
# parameter doesn't exist.
|
20
|
-
def retrieve(name, default_value = ArgumentError)
|
21
|
-
return self.send(name) if exists?(name)
|
22
|
-
return default_value unless default_value == ArgumentError
|
23
|
-
handle_missing_parameter(name)
|
24
|
-
end
|
25
|
-
|
26
|
-
end # Helpers
|
27
|
-
end # Configatron
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'store')
|
2
|
-
module Configatron
|
3
|
-
# Used to store each of the 'sets' of configuration parameters that came from a YAML file.
|
4
|
-
class YamlStore < Configatron::Store
|
5
|
-
|
6
|
-
attr_accessor :file_location
|
7
|
-
|
8
|
-
# Takes the full path to the YAML file.
|
9
|
-
def initialize(file_location)
|
10
|
-
super(params_from_yaml(file_location))
|
11
|
-
@file_location = file_location
|
12
|
-
end
|
13
|
-
|
14
|
-
# Re-reads the YAML file.
|
15
|
-
def reload
|
16
|
-
if self.file_location
|
17
|
-
params_from_yaml(self.file_location)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
def params_from_yaml(file_location)
|
23
|
-
begin
|
24
|
-
@parameters = YAML.load(File.read(file_location))
|
25
|
-
return @parameters
|
26
|
-
rescue Errno::ENOENT => e
|
27
|
-
puts e
|
28
|
-
end
|
29
|
-
return {}
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
@@ -1,299 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'pathname'
|
3
|
-
require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
|
4
|
-
|
5
|
-
describe Configatron::Configuration do
|
6
|
-
|
7
|
-
before :each do
|
8
|
-
configatron.reset!
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should be a Singleton" do
|
12
|
-
lambda{Configatron::Configuration.new}.should raise_error(NoMethodError)
|
13
|
-
Configatron::Configuration.instance.should == Configatron::Configuration.instance
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "configure_from_hash" do
|
17
|
-
|
18
|
-
it "should take a Hash with the same outcome as the configure method" do
|
19
|
-
configatron.should_not respond_to(:bart)
|
20
|
-
configatron.should_not respond_to(:homer)
|
21
|
-
|
22
|
-
configatron.configure_from_hash(:bart => "Bart Simpson", "homer" => "Homer Simpson")
|
23
|
-
|
24
|
-
configatron.should respond_to(:bart)
|
25
|
-
configatron.should respond_to(:homer)
|
26
|
-
|
27
|
-
configatron.bart.should == "Bart Simpson"
|
28
|
-
configatron.homer.should == "Homer Simpson"
|
29
|
-
end
|
30
|
-
|
31
|
-
it "doesn't wipe out existing configurations" do
|
32
|
-
configatron do |c|
|
33
|
-
c.namespace(:mack) do |mack|
|
34
|
-
mack.one = 1
|
35
|
-
mack.two = 2
|
36
|
-
mack.three = 3
|
37
|
-
end
|
38
|
-
c.a = 'a'
|
39
|
-
c.b = 'b'
|
40
|
-
end
|
41
|
-
configatron.to_hash.should == {:mack => {:one => 1, :two => 2, :three => 3}, :a => 'a', :b => 'b'}
|
42
|
-
configatron.configure_from_hash(:mack => {:one => 'one'}, :b => 'bee')
|
43
|
-
configatron.to_hash.should == {:mack => {:one => 'one', :two => 2, :three => 3}, :a => 'a', :b => 'bee'}
|
44
|
-
configatron.revert
|
45
|
-
configatron.to_hash.should == {:mack => {:one => 1, :two => 2, :three => 3}, :a => 'a', :b => 'b'}
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "hashes to namespace" do
|
51
|
-
|
52
|
-
before :each do
|
53
|
-
configatron.reset!
|
54
|
-
@futurama = File.join(File.dirname(__FILE__), 'futurama.yml')
|
55
|
-
FileUtils.rm_f(@futurama)
|
56
|
-
end
|
57
|
-
|
58
|
-
after :each do
|
59
|
-
FileUtils.rm_f(@futurama)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should namespace hashes from yaml" do
|
63
|
-
|
64
|
-
configatron.should_not respond_to(:cartoon)
|
65
|
-
|
66
|
-
File.open(@futurama, 'w') do |f|
|
67
|
-
f.puts %{
|
68
|
-
cartoon:
|
69
|
-
characters:
|
70
|
-
fry: human
|
71
|
-
leela: mutant
|
72
|
-
bender: robot
|
73
|
-
transportation: space ship
|
74
|
-
fans:
|
75
|
-
one: Mark Bates
|
76
|
-
two: Dylan Bates
|
77
|
-
}
|
78
|
-
end
|
79
|
-
|
80
|
-
configatron.configure_from_yaml(@futurama)
|
81
|
-
|
82
|
-
configatron.should respond_to(:cartoon)
|
83
|
-
configatron.cartoon.should be_an_instance_of(Configatron::Store)
|
84
|
-
|
85
|
-
configatron.cartoon.characters.fry.should == 'human'
|
86
|
-
configatron.cartoon.transportation.should == 'space ship'
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should namespace hashes" do
|
91
|
-
|
92
|
-
configatron.should_not respond_to(:cartoon)
|
93
|
-
|
94
|
-
configatron.configure_from_hash({:cartoon => {:characters => {:fry => 'human', :leela => 'mutant', :bender => 'robot'}, :transportation => 'space ship'}, :fans => {:one => 'Mark Bates', :two => 'Dylan Bates'}})
|
95
|
-
|
96
|
-
configatron.should respond_to(:cartoon)
|
97
|
-
configatron.cartoon.should be_an_instance_of(Configatron::Store)
|
98
|
-
|
99
|
-
configatron.cartoon.characters.fry.should == 'human'
|
100
|
-
configatron.cartoon.transportation.should == 'space ship'
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
|
-
describe "configure_from_yaml" do
|
107
|
-
|
108
|
-
before :each do
|
109
|
-
configatron.reset!
|
110
|
-
@futurama = File.join(File.dirname(__FILE__), 'futurama.yml')
|
111
|
-
FileUtils.rm_f(@futurama)
|
112
|
-
end
|
113
|
-
|
114
|
-
after :each do
|
115
|
-
FileUtils.rm_f(@futurama)
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should take a path to YAML file and use it configure configatron" do
|
119
|
-
configatron.should_not respond_to(:family_guy)
|
120
|
-
configatron.should_not respond_to(:lois)
|
121
|
-
|
122
|
-
configatron.configure_from_yaml(File.join(File.dirname(__FILE__), 'family_guy.yml'))
|
123
|
-
|
124
|
-
configatron.should respond_to(:family_guy)
|
125
|
-
configatron.should respond_to(:lois)
|
126
|
-
|
127
|
-
configatron.family_guy.should == "Peter Griffin"
|
128
|
-
configatron.lois.should == "Lois Griffin"
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should silently fail if the file doesn't exist" do
|
132
|
-
lambda {configatron.configure_from_yaml(File.join(File.dirname(__FILE__), 'i_dont_exist.yml'))}.should_not raise_error(Errno::ENOENT)
|
133
|
-
end
|
134
|
-
|
135
|
-
it "should re-read the file during a reload" do
|
136
|
-
File.open(@futurama, 'w') do |f|
|
137
|
-
f.puts 'bender: robot'
|
138
|
-
f.puts 'fry: human'
|
139
|
-
end
|
140
|
-
|
141
|
-
configatron.should_not respond_to(:bender)
|
142
|
-
configatron.should_not respond_to(:fry)
|
143
|
-
|
144
|
-
configatron.configure_from_yaml(@futurama)
|
145
|
-
|
146
|
-
configatron.should respond_to(:bender)
|
147
|
-
configatron.should respond_to(:fry)
|
148
|
-
|
149
|
-
configatron.bender.should == 'robot'
|
150
|
-
configatron.fry.should == 'human'
|
151
|
-
|
152
|
-
File.open(@futurama, 'w') do |f|
|
153
|
-
f.puts 'bender: Bending Robot'
|
154
|
-
f.puts 'fry: Human Male'
|
155
|
-
end
|
156
|
-
|
157
|
-
configatron.reload
|
158
|
-
|
159
|
-
configatron.bender.should == 'Bending Robot'
|
160
|
-
configatron.fry.should == 'Human Male'
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
describe "revert" do
|
167
|
-
|
168
|
-
it "should roll back 1 level by default" do
|
169
|
-
configatron.should_not respond_to(:bart)
|
170
|
-
configatron.should_not respond_to(:homer)
|
171
|
-
|
172
|
-
configatron do |config|
|
173
|
-
config.bart = "Bart Simpson"
|
174
|
-
end
|
175
|
-
configatron do |config|
|
176
|
-
config.homer = "Homer Simpson"
|
177
|
-
end
|
178
|
-
|
179
|
-
configatron.should respond_to(:bart)
|
180
|
-
configatron.should respond_to(:homer)
|
181
|
-
|
182
|
-
configatron.bart.should == "Bart Simpson"
|
183
|
-
configatron.homer.should == "Homer Simpson"
|
184
|
-
|
185
|
-
configatron.revert
|
186
|
-
|
187
|
-
configatron.should respond_to(:bart)
|
188
|
-
configatron.should_not respond_to(:homer)
|
189
|
-
configatron.bart.should == "Bart Simpson"
|
190
|
-
lambda{configatron.homer}.should raise_error(NoMethodError)
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should roll back n levels if specified" do
|
194
|
-
configatron.should_not respond_to(:bart)
|
195
|
-
configatron.should_not respond_to(:homer)
|
196
|
-
|
197
|
-
configatron do |config|
|
198
|
-
config.bart = "Bart Simpson"
|
199
|
-
end
|
200
|
-
configatron do |config|
|
201
|
-
config.homer = "Homer Simpson"
|
202
|
-
end
|
203
|
-
|
204
|
-
configatron.should respond_to(:bart)
|
205
|
-
configatron.should respond_to(:homer)
|
206
|
-
|
207
|
-
configatron.bart.should == "Bart Simpson"
|
208
|
-
configatron.homer.should == "Homer Simpson"
|
209
|
-
|
210
|
-
configatron.revert(2)
|
211
|
-
|
212
|
-
configatron.should_not respond_to(:bart)
|
213
|
-
configatron.should_not respond_to(:homer)
|
214
|
-
lambda{configatron.bart}.should raise_error(NoMethodError)
|
215
|
-
lambda{configatron.homer}.should raise_error(NoMethodError)
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
|
220
|
-
describe "reset" do
|
221
|
-
|
222
|
-
it "should remove all added methods" do
|
223
|
-
configatron.should_not respond_to(:rst1)
|
224
|
-
configatron.should_not respond_to(:rst2)
|
225
|
-
|
226
|
-
configatron.nil_for_missing.should == false
|
227
|
-
|
228
|
-
configatron do |config|
|
229
|
-
config.rst1 = "RST1"
|
230
|
-
config.rst2 = "RST2"
|
231
|
-
end
|
232
|
-
|
233
|
-
configatron.should respond_to(:rst1)
|
234
|
-
configatron.should respond_to(:rst2)
|
235
|
-
|
236
|
-
configatron.nil_for_missing = true
|
237
|
-
configatron.nil_for_missing.should == true
|
238
|
-
|
239
|
-
configatron.reset
|
240
|
-
|
241
|
-
configatron.nil_for_missing.should == true
|
242
|
-
|
243
|
-
configatron.should_not respond_to(:rst1)
|
244
|
-
configatron.should_not respond_to(:rst2)
|
245
|
-
|
246
|
-
end
|
247
|
-
|
248
|
-
end
|
249
|
-
|
250
|
-
describe "reset!" do
|
251
|
-
|
252
|
-
it "should remove all added methods and revert the nil_for_missing setting" do
|
253
|
-
configatron.should_not respond_to(:rst1)
|
254
|
-
configatron.should_not respond_to(:rst2)
|
255
|
-
|
256
|
-
configatron.nil_for_missing.should == false
|
257
|
-
|
258
|
-
configatron do |config|
|
259
|
-
config.rst1 = "RST1"
|
260
|
-
config.rst2 = "RST2"
|
261
|
-
end
|
262
|
-
|
263
|
-
configatron.should respond_to(:rst1)
|
264
|
-
configatron.should respond_to(:rst2)
|
265
|
-
|
266
|
-
configatron.nil_for_missing = true
|
267
|
-
configatron.nil_for_missing.should == true
|
268
|
-
|
269
|
-
configatron.reset!
|
270
|
-
|
271
|
-
configatron.nil_for_missing.should == false
|
272
|
-
|
273
|
-
configatron.should_not respond_to(:rst1)
|
274
|
-
configatron.should_not respond_to(:rst2)
|
275
|
-
end
|
276
|
-
|
277
|
-
end
|
278
|
-
|
279
|
-
describe 'to_hash' do
|
280
|
-
it "should convert entire configuration to a hash" do
|
281
|
-
hash = {:foo => 'bar', :baz => {:quux => 'foobar'}}
|
282
|
-
|
283
|
-
configatron.configure_from_hash(hash)
|
284
|
-
|
285
|
-
configatron.to_hash.should == hash
|
286
|
-
end
|
287
|
-
|
288
|
-
it 'should convert the configration with multiple calls to configure' do
|
289
|
-
hash1 = {:foo => 'bar', :baz => {:quux => 'foobar'}}
|
290
|
-
hash2 = {:foo => 'notbar', :beep => 'boop'}
|
291
|
-
|
292
|
-
configatron.configure_from_hash(hash1)
|
293
|
-
configatron.configure_from_hash(hash2)
|
294
|
-
|
295
|
-
configatron.to_hash.should == hash1.merge(hash2)
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
end
|