configliere 0.3.4 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.document +3 -0
  2. data/.watchr +20 -0
  3. data/CHANGELOG.textile +99 -3
  4. data/Gemfile +26 -0
  5. data/Gemfile.lock +54 -0
  6. data/README.textile +162 -138
  7. data/Rakefile +30 -21
  8. data/VERSION +1 -1
  9. data/bin/configliere +77 -77
  10. data/bin/configliere-decrypt +85 -0
  11. data/bin/configliere-delete +85 -0
  12. data/bin/configliere-dump +85 -0
  13. data/bin/configliere-encrypt +85 -0
  14. data/bin/configliere-list +85 -0
  15. data/bin/configliere-set +85 -0
  16. data/configliere.gemspec +53 -23
  17. data/examples/config_block_script.rb +9 -2
  18. data/examples/encrypted_script.rb +28 -16
  19. data/examples/env_var_script.rb +2 -2
  20. data/examples/help_message_demo.rb +16 -0
  21. data/examples/independent_config.rb +28 -0
  22. data/examples/prompt.rb +23 -0
  23. data/examples/simple_script.rb +28 -15
  24. data/examples/simple_script.yaml +1 -1
  25. data/lib/configliere.rb +22 -24
  26. data/lib/configliere/commandline.rb +135 -116
  27. data/lib/configliere/commands.rb +38 -54
  28. data/lib/configliere/config_block.rb +4 -2
  29. data/lib/configliere/config_file.rb +30 -52
  30. data/lib/configliere/crypter.rb +8 -5
  31. data/lib/configliere/deep_hash.rb +368 -0
  32. data/lib/configliere/define.rb +83 -89
  33. data/lib/configliere/encrypted.rb +17 -18
  34. data/lib/configliere/env_var.rb +5 -7
  35. data/lib/configliere/param.rb +37 -64
  36. data/lib/configliere/prompt.rb +23 -0
  37. data/spec/configliere/commandline_spec.rb +156 -57
  38. data/spec/configliere/commands_spec.rb +75 -30
  39. data/spec/configliere/config_block_spec.rb +10 -1
  40. data/spec/configliere/config_file_spec.rb +83 -55
  41. data/spec/configliere/crypter_spec.rb +3 -2
  42. data/spec/configliere/deep_hash_spec.rb +401 -0
  43. data/spec/configliere/define_spec.rb +121 -42
  44. data/spec/configliere/encrypted_spec.rb +53 -20
  45. data/spec/configliere/env_var_spec.rb +24 -4
  46. data/spec/configliere/param_spec.rb +25 -27
  47. data/spec/configliere/prompt_spec.rb +50 -0
  48. data/spec/configliere_spec.rb +3 -9
  49. data/spec/spec_helper.rb +17 -6
  50. metadata +110 -35
  51. data/lib/configliere/core_ext.rb +0 -2
  52. data/lib/configliere/core_ext/blank.rb +0 -93
  53. data/lib/configliere/core_ext/hash.rb +0 -108
  54. data/lib/configliere/core_ext/sash.rb +0 -170
  55. data/spec/configliere/core_ext/hash_spec.rb +0 -78
  56. data/spec/configliere/core_ext/sash_spec.rb +0 -312
@@ -1,49 +1,68 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- Configliere.use :define
3
2
 
4
3
  describe "Configliere::Define" do
5
4
  before do
6
5
  @config = Configliere::Param.new :normal_param => 'normal'
7
6
  end
7
+
8
8
  describe 'defining any aspect of a param' do
9
9
  it 'adopts values' do
10
- @config.define :param, :description => 'desc'
11
- @config.param_definitions[:param].should == { :description => 'desc'}
10
+ @config.define :simple, :description => 'desc'
11
+ @config.definition_of(:simple).should == { :description => 'desc'}
12
12
  end
13
+
13
14
  it 'merges new definitions' do
14
- @config.define :param, :description => 'desc 1'
15
- @config.define :param, :description => 'desc 2'
16
- @config.param_definitions[:param].should == { :description => 'desc 2'}
17
- @config.define :param, :encrypted => true
18
- @config.param_definitions[:param].should == { :encrypted => true, :description => 'desc 2'}
15
+ @config.define :described_in_steps, :description => 'desc 1'
16
+ @config.define :described_in_steps, :description => 'desc 2'
17
+ @config.definition_of(:described_in_steps).should == { :description => 'desc 2'}
18
+ @config.define :described_in_steps, :encrypted => true
19
+ @config.definition_of(:described_in_steps).should == { :encrypted => true, :description => 'desc 2'}
19
20
  end
21
+
20
22
  it 'lists params defined as the given aspect' do
21
- @config.define :param_1, :description => 'desc 1'
22
- @config.define :param_2, :description => 'desc 2'
23
- @config.define :param_3, :something_else => 'foo'
24
- @config.send(:params_with, :description).should include(:param_1)
25
- @config.send(:params_with, :description).should include(:param_2)
23
+ @config.define :has_description, :description => 'desc 1'
24
+ @config.define :also_has_description, :description => 'desc 2'
25
+ @config.define :no_description, :something_else => 'foo'
26
+ @config.params_with(:description).should include(:has_description)
27
+ @config.params_with(:description).should include(:also_has_description)
28
+ @config.params_with(:description).should_not include(:no_description)
26
29
  end
27
30
  end
28
31
 
29
- describe 'defining descriptions' do
30
- before do
31
- @config.define :param_1, :description => 'desc 1'
32
- @config.define :param_2, :description => 'desc 2'
32
+ describe 'definition_of' do
33
+ it 'with a param, gives me the description hash' do
34
+ @config.define :has_description, :description => 'desc 1'
35
+ @config.definition_of(:has_description).should == { :description => 'desc 1' }
33
36
  end
34
- it 'shows description for a param' do
35
- @config.description_for(:param_1).should == 'desc 1'
37
+ it 'with a param and attr, gives me the description hash' do
38
+ @config.define :has_description, :description => 'desc 1'
39
+ @config.definition_of(:has_description, :description).should == 'desc 1'
40
+ end
41
+ it 'symbolizes the param' do
42
+ @config.define :has_description, :description => 'desc 1'
43
+ @config.definition_of('has_description').should == { :description => 'desc 1' }
44
+ @config.definition_of('has_description', 'description').should be_nil
45
+ end
46
+ end
47
+
48
+ describe 'has_definition?' do
49
+ before do
50
+ @config.define :i_am_defined, :description => 'desc 1'
36
51
  end
37
- it 'lists descriptions' do
38
- @config.descriptions.should == { :param_1 => 'desc 1', :param_2 => 'desc 2'}
52
+ it 'is true if defined' do
53
+ @config.has_definition?(:i_am_defined).should == true
39
54
  end
40
- it 'lists descriptions' do
41
- @config.described_params.should include(:param_1)
42
- @config.described_params.should include(:param_2)
55
+ it 'is false if not defined' do
56
+ @config.has_definition?(:i_am_not_defined).should == false
43
57
  end
44
58
  end
45
59
 
46
- require 'date'; require 'time'
60
+ it 'takes a description' do
61
+ @config.define :has_description, :description => 'desc 1'
62
+ @config.define :also_has_description, :description => 'desc 2'
63
+ @config.definition_of(:has_description, :description).should == 'desc 1'
64
+ end
65
+
47
66
  describe 'type coercion' do
48
67
  [
49
68
  [:boolean, '0', false], [:boolean, 0, false], [:boolean, '', false], [:boolean, [], true], [:boolean, nil, nil],
@@ -52,26 +71,48 @@ describe "Configliere::Define" do
52
71
  [Integer, '5', 5], [Integer, 5, 5], [Integer, nil, nil], [Integer, '', nil],
53
72
  [Float, '5.2', 5.2], [Float, 5.2, 5.2], [Float, nil, nil], [Float, '', nil],
54
73
  [Symbol, 'foo', :foo], [Symbol, :foo, :foo], [Symbol, nil, nil], [Symbol, '', nil],
55
- [Date, '1985-11-05', Date.parse('1985-11-05')], [Date, nil, nil], [Date, '', nil], [Date, 'blah', nil],
74
+ [Date, '1985-11-05', Date.parse('1985-11-05')], [Date, nil, nil], [Date, '', nil], [Date, 'blah', nil],
56
75
  [DateTime, '1985-11-05 11:00:00', DateTime.parse('1985-11-05 11:00:00')], [DateTime, nil, nil], [DateTime, '', nil], [DateTime, 'blah', nil],
57
76
  [Array, ['this', 'that', 'thother'], ['this', 'that', 'thother']],
58
77
  [Array, 'this,that,thother', ['this', 'that', 'thother']],
59
78
  [Array, 'alone', ['alone'] ],
60
79
  [Array, '', [] ],
61
80
  [Array, nil, nil ],
81
+ ['other', '5', '5'], ['other', 5, 5], ['other', nil, nil], ['other', '', nil],
62
82
  ].each do |type, orig, desired|
63
83
  it "for #{type} converts #{orig.inspect} to #{desired.inspect}" do
64
- @config.define :param, :type => type
65
- @config[:param] = orig ; @config.resolve! ; @config[:param].should == desired
84
+ @config.define :has_type, :type => type
85
+ @config[:has_type] = orig ; @config.resolve! ; @config[:has_type].should == desired
66
86
  end
67
87
  end
68
- it 'converts :now to the current moment' do
69
- @config.define :param, :type => DateTime
70
- @config[:param] = 'now' ; @config.resolve! ; @config[:param].should be_close(DateTime.now, 4)
71
- @config[:param] = :now ; @config.resolve! ; @config[:param].should be_close(DateTime.now, 4)
72
- @config.define :param, :type => Date
73
- @config[:param] = :now ; @config.resolve! ; @config[:param].should be_close(Date.today, 4)
74
- @config[:param] = 'now' ; @config.resolve! ; @config[:param].should be_close(Date.today, 4)
88
+ # it 'converts :now to the current moment' do
89
+ # @config.define :has_type, :type => DateTime
90
+ # @config[:has_type] = 'now' ; @config.resolve! ; @config[:has_type].should be_within(4).of(DateTime.now, 4)
91
+ # @config[:has_type] = :now ; @config.resolve! ; @config[:has_type].should be_within(4).of(DateTime.now, 4)
92
+ # @config.define :has_type, :type => Date
93
+ # @config[:has_type] = :now ; @config.resolve! ; @config[:has_type].should be_within(4).of(Date.today, 4)
94
+ # @config[:has_type] = 'now' ; @config.resolve! ; @config[:has_type].should be_within(4).of(Date.today, 4)
95
+ # end
96
+ end
97
+
98
+ describe 'creates magical methods' do
99
+ before do
100
+ @config.define :has_magic_method, :default => 'val1'
101
+ @config[:no_magic_method] = 'val2'
102
+ end
103
+ it 'answers to a getter if the param is defined' do
104
+ @config.has_magic_method.should == 'val1'
105
+ end
106
+ it 'answers to a setter if the param is defined' do
107
+ @config.has_magic_method = 'new_val1'
108
+ @config.has_magic_method.should == 'new_val1'
109
+ @config[:has_magic_method].should == 'new_val1'
110
+ end
111
+ it 'does not answer to a getter if the param is not defined' do
112
+ lambda{ @config.no_magic_method }.should raise_error(NoMethodError)
113
+ end
114
+ it 'does not answer to a setter if the param is not defined' do
115
+ lambda{ @config.no_magic_method = 3 }.should raise_error(NoMethodError)
75
116
  end
76
117
  end
77
118
 
@@ -83,12 +124,12 @@ describe "Configliere::Define" do
83
124
  @config.define :optional_2
84
125
  end
85
126
  it 'lists required params' do
86
- @config.required_params.should include(:param_1)
87
- @config.required_params.should include(:param_2)
127
+ @config.params_with(:required).should include(:param_1)
128
+ @config.params_with(:required).should include(:param_2)
88
129
  end
89
- it 'counts false values as required' do
130
+ it 'counts false values as present' do
90
131
  @config.defaults :param_1 => true, :param_2 => false
91
- @config.validate!.should == true
132
+ @config.validate!.should equal(@config)
92
133
  end
93
134
  it 'counts nil-but-set values as missing' do
94
135
  @config.defaults :param_1 => true, :param_2 => nil
@@ -98,10 +139,48 @@ describe "Configliere::Define" do
98
139
  lambda{ @config.validate! }.should raise_error(RuntimeError)
99
140
  end
100
141
  it 'lists all missing values when it raises' do
101
- Configliere.use :define
102
- lambda{ @config.validate! }.should raise_error(RuntimeError)
142
+ lambda{ @config.validate! }.should raise_error(RuntimeError, "Missing values for: param_1, param_2")
103
143
  end
104
144
  end
105
- end
106
145
 
146
+ describe 'defining deep keys' do
147
+ it 'allows required params' do
148
+ @config.define 'delorean.power_supply', :required => true
149
+ @config[:'delorean.power_supply'] = 'household waste'
150
+ @config.params_with(:required).should include(:'delorean.power_supply')
151
+ @config.should == { :normal_param=>"normal", :delorean => { :power_supply => 'household waste' } }
152
+ lambda{ @config.validate! }.should_not raise_error
153
+ end
154
+
155
+ it 'allows flags' do
156
+ @config.define 'delorean.power_supply', :flag => 'p'
157
+ @config.use :commandline
158
+ ARGV.replace ['-p', 'household waste']
159
+ @config.params_with(:flag).should include(:'delorean.power_supply')
160
+ @config.resolve!
161
+ @config.should == { :normal_param=>"normal", :delorean => { :power_supply => 'household waste' } }
162
+ ARGV.replace []
163
+ end
164
+
165
+ it 'type converts' do
166
+ @config.define 'delorean.power_supply', :type => Array
167
+ @config.use :commandline
168
+ ARGV.replace ['--delorean.power_supply=household waste,plutonium,lightning']
169
+ @config.definition_of('delorean.power_supply', :type).should == Array
170
+ @config.resolve!
171
+ @config.should == { :normal_param=>"normal", :delorean => { :power_supply => ['household waste', 'plutonium', 'lightning'] } }
172
+ ARGV.replace []
173
+ end
174
+ end
175
+
176
+ describe '#resolve!' do
177
+ it 'calls super and returns self' do
178
+ Configliere::ParamParent.class_eval do def resolve!() dummy ; end ; end
179
+ @config.should_receive(:dummy)
180
+ @config.resolve!.should equal(@config)
181
+ Configliere::ParamParent.class_eval do def resolve!() self ; end ; end
182
+ end
183
+ end
184
+
185
+ end
107
186
 
@@ -1,60 +1,76 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- Configliere.use :encrypted
3
2
 
4
3
  describe "Configliere::Encrypted" do
5
4
  before do
6
5
  @config = Configliere::Param.new :secret => 'encrypt_me', :normal_param => 'normal'
6
+ @config.use :encrypted
7
7
  @config.define :secret, :encrypted => true
8
- @config.encrypt_pass = 'pass'
8
+ @config[:encrypt_pass] = 'pass'
9
9
  end
10
10
 
11
- describe 'defining encrypted params' do
12
- it 'is encrypted if defined with :encrypted => true' do
11
+ describe 'defines encrypted params' do
12
+ it 'with :encrypted => true' do
13
13
  @config.send(:encrypted_params).should include(:secret)
14
14
  end
15
- it 'is not encrypted if defined with :encrypted => false' do
15
+ it 'but not if :encrypted => false' do
16
16
  @config.define :another_param, :encrypted => false
17
17
  @config.send(:encrypted_params).should_not include(:another_param)
18
18
  @config.send(:encrypted_params).should include(:secret)
19
19
  end
20
- it 'is encrypted if not defined' do
20
+ it 'only if :encrypted is given' do
21
21
  @config.send(:encrypted_params).should_not include(:missing_param)
22
22
  end
23
23
  end
24
24
 
25
- describe 'encrypting encryptable params' do
26
- it 'encrypts all params marked encrypted' do
27
- Configliere::Crypter.should_receive(:encrypt).with('encrypt_me', 'pass').and_return('ok_encrypted')
28
- @config.send(:export).should == { :normal_param => 'normal', :encrypted_secret => 'ok_encrypted'}
25
+ describe 'the encrypt_pass' do
26
+ it 'will take an environment variable if any exists' do
27
+ @config[:encrypt_pass] = nil
28
+ ENV.should_receive(:[]).with('ENCRYPT_PASS').at_least(:once).and_return('monkey')
29
+ @config.send(:export)
30
+ @config.send(:instance_variable_get, "@encrypt_pass").should == 'monkey'
29
31
  end
30
- it 'gets encrypted params successfully' do
32
+ it 'will take an internal value if given, and remove it' do
33
+ @config[:encrypt_pass] = 'hello'
34
+ @config.send(:export)
35
+ @config.send(:instance_variable_get, "@encrypt_pass").should == 'hello'
36
+ @config[:encrypt_pass].should be_nil
37
+ @config.has_key?(:encrypt_pass).should_not be_true
38
+ end
39
+ end
40
+
41
+ describe 'encrypts' do
42
+ it 'all params with :encrypted' do
31
43
  Configliere::Crypter.should_receive(:encrypt).with('encrypt_me', 'pass').and_return('ok_encrypted')
32
- @config.send(:encrypted, @config[:secret]).should == 'ok_encrypted'
44
+ @config.send(:export).should == { :normal_param => 'normal', :encrypted_secret => 'ok_encrypted'}
33
45
  end
34
- it 'fails if no pass is set' do
46
+
47
+ it 'fails unless encrypt_pass is set' do
35
48
  # create the config but don't set an encrypt_pass
36
49
  @config = Configliere::Param.new :secret => 'encrypt_me', :normal_param => 'normal'
37
- lambda{ @config.send(:encrypted, @config[:secret]) }.should raise_error('Blank encryption password!')
50
+ @config.use :encrypted
51
+ lambda{ @config.send(:encrypted, @config[:secret]) }.should raise_error('Missing encryption password!')
38
52
  end
39
53
  end
40
54
 
41
- describe 'decrypting encryptable params' do
42
- it 'decrypts all params marked encrypted' do
55
+ describe 'decrypts' do
56
+ it 'all params marked encrypted' do
43
57
  @config.delete :secret
44
58
  @config.defaults :encrypted_secret => 'decrypt_me'
45
59
  Configliere::Crypter.should_receive(:decrypt).with('decrypt_me', 'pass').and_return('ok_decrypted')
46
60
  @config.send(:resolve_encrypted!)
47
- @config.should == { :normal_param => 'normal', :secret => 'ok_decrypted'}
61
+ @config.should == { :normal_param => 'normal', :secret => 'ok_decrypted' }
48
62
  end
49
63
  end
50
64
 
51
65
  describe 'loading a file' do
52
66
  before do
53
- @encrypted_str = "*\210BM\305\353\325\240.\226\212g\266f|\177\221\252k\263\363\260\031\263\371\035\257\024f+\001\350"
67
+ @encrypted_str = "KohCTcXr1aAulopntmZ8f5Gqa7PzsBmz+R2vFGYrAeg=\n"
54
68
  end
55
69
  it 'encrypts' do
56
70
  Configliere::Crypter.should_receive(:encrypt).and_return(@encrypted_str)
57
- Configliere::ConfigFile.should_receive(:write_yaml_file).with('/fake/file', :normal_param=>"normal", :encrypted_secret => @encrypted_str)
71
+ FileUtils.stub(:mkdir_p)
72
+ File.should_receive(:open).and_yield([])
73
+ YAML.should_receive(:dump).with({ :normal_param => "normal", :encrypted_secret => @encrypted_str })
58
74
  @config.save! '/fake/file'
59
75
  end
60
76
  it 'decrypts' do
@@ -63,9 +79,26 @@ describe "Configliere::Encrypted" do
63
79
  YAML.should_receive(:load).and_return(@hsh)
64
80
  @config.read 'file.yaml'
65
81
  @config.resolve!
82
+ @config.should_not include(:encrypted_secret)
66
83
  @config.should == { :loaded_param => "loaded", :secret => 'decrypt_me', :normal_param => 'normal' }
67
84
  end
68
85
  end
69
- end
70
86
 
87
+ describe '#resolve!' do
88
+ it 'calls super and returns self' do
89
+ Configliere::ParamParent.class_eval do def resolve!() dummy ; end ; end
90
+ @config.should_receive(:dummy)
91
+ @config.resolve!.should equal(@config)
92
+ Configliere::ParamParent.class_eval do def resolve!() self ; end ; end
93
+ end
71
94
 
95
+ it 'removes the encrypt_pass from sight' do
96
+ @config[:encrypt_pass] = 'hello'
97
+ @config.resolve!
98
+ @config.send(:instance_variable_get, "@encrypt_pass").should == 'hello'
99
+ @config[:encrypt_pass].should be_nil
100
+ @config.has_key?(:encrypt_pass).should_not be_true
101
+ end
102
+ end
103
+
104
+ end
@@ -1,24 +1,44 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- Configliere.use :env_var
3
2
 
4
3
  describe "Configliere::EnvVar" do
5
4
  before do
6
5
  @config = Configliere::Param.new
6
+ @config.use :env_var
7
7
  end
8
8
 
9
- describe 'loads environment variables' do
10
- it 'loads a simple value into the corresponding symbolic key' do
9
+ describe 'environment variables can be defined' do
10
+ it 'with #env_vars, a simple value like "HOME" uses the corresponding key :home' do
11
11
  ENV.should_receive(:[]).with('HOME').and_return('/fake/path')
12
12
  @config.env_vars 'HOME'
13
13
  @config[:home].should == '/fake/path'
14
14
  end
15
- it 'loads a hash into the individual params' do
15
+
16
+ it 'with #env_vars, a hash pairs environment variables into the individual params' do
16
17
  ENV.should_receive(:[]).with('HOME').and_return('/fake/path')
17
18
  ENV.should_receive(:[]).with('POWER_SUPPLY').and_return('1.21 jigawatts')
18
19
  @config.env_vars :home => 'HOME', 'delorean.power_supply' => 'POWER_SUPPLY'
19
20
  @config[:home].should == '/fake/path'
20
21
  @config[:delorean][:power_supply].should == '1.21 jigawatts'
21
22
  end
23
+
24
+ it 'with #define' do
25
+ ENV.should_receive(:[]).with('HOME').and_return('/fake/path')
26
+ ENV.should_receive(:[]).with('POWER_SUPPLY').and_return('1.21 jigawatts')
27
+ @config.define :home, :env_var => 'HOME'
28
+ @config.define 'delorean.power_supply', :env_var => 'POWER_SUPPLY'
29
+ @config[:home].should == '/fake/path'
30
+ @config[:delorean][:power_supply].should == '1.21 jigawatts'
31
+ end
22
32
  end
33
+
34
+ describe '#resolve!' do
35
+ it 'calls super and returns self' do
36
+ Configliere::ParamParent.class_eval do def resolve!() dummy ; end ; end
37
+ @config.should_receive(:dummy)
38
+ @config.resolve!.should equal(@config)
39
+ Configliere::ParamParent.class_eval do def resolve!() self ; end ; end
40
+ end
41
+ end
42
+
23
43
  end
24
44
 
@@ -5,45 +5,43 @@ describe "Configliere::Param" do
5
5
  @config = Configliere::Param.new :hat => :cat, :basket => :lotion, :moon => { :man => :smiling }
6
6
  end
7
7
 
8
- describe '#defaults' do
8
+ describe 'calling #defaults' do
9
9
  it 'deep_merges new params' do
10
10
  @config.defaults :basket => :tasket, :moon => { :cow => :jumping }
11
11
  @config.should == { :hat => :cat, :basket => :tasket, :moon => { :man => :smiling, :cow => :jumping } }
12
12
  end
13
+ it 'returns self, to allow chaining' do
14
+ obj = @config.defaults(:basket => :ball)
15
+ obj.should equal(@config)
16
+ end
13
17
  end
14
18
 
15
- describe '#[]=' do
16
- it 'symbolizes keys' do
17
- @config['hat'] = :fedora
18
- @config['new'] = :unseen
19
- # @config.should == { :hat => :fedora, :basket => :lotion, :new => :unseen, :moon => { :man => :smiling } }
19
+ describe 'adding plugins with #use' do
20
+ before do
21
+ Configliere.should_receive(:use).with(:foobar)
20
22
  end
21
- it 'deep-sets dotted vals, replacing values' do
22
- @config['moon.man'] = :cheesy
23
- @config[:moon][:man].should == :cheesy
23
+ it 'requires the corresponding library' do
24
+ obj = @config.use(:foobar)
24
25
  end
25
- it 'deep-sets dotted vals, creating new values' do
26
- @config['moon.cheese.type'] = :tilsit
27
- @config[:moon][:cheese][:type].should == :tilsit
26
+ it 'returns self, to allow chaining' do
27
+ obj = @config.use(:foobar)
28
+ obj.should equal(@config)
28
29
  end
29
- it 'deep-sets dotted vals, auto-vivifying intermediate hashes' do
30
- @config['this.that.the_other'] = :fuhgeddaboudit
31
- @config[:this][:that][:the_other].should == :fuhgeddaboudit
30
+ it 'invokes the on_use handler' do
31
+ Configliere::Param.on_use(:foobar) do
32
+ method_on_config(:param)
33
+ end
34
+ @config.should_receive(:method_on_config).with(:param)
35
+ @config.use(:foobar)
32
36
  end
33
37
  end
34
38
 
35
- describe '#[]' do
36
- it 'deep-gets dotted vals' do
37
- hsh = { :hat => :cat, :basket => :lotion, :moon => { :man => :smiling, :cheese => {:type => :tilsit} } }
38
- @config = Configliere::Param.new hsh.dup
39
- @config['moon.man'].should == :smiling
40
- @config['moon.cheese.type'].should == :tilsit
41
- @config['moon.cheese.smell'].should be_nil
42
- @config['moon.non.existent.interim.values'].should be_nil
43
- @config['moon.non'].should be_nil
44
- if (RUBY_VERSION >= '1.9') then lambda{ @config['hat.cat'] }.should raise_error(TypeError)
45
- else lambda{ @config['hat.cat'] }.should raise_error(NoMethodError, 'undefined method `[]\' for :cat:Symbol') end
46
- @config.should == hsh # shouldn't change from reading (specifically, shouldn't autovivify)
39
+ describe '#resolve!' do
40
+ it 'calls super and returns self' do
41
+ Configliere::ParamParent.class_eval do def resolve!() dummy ; end ; end
42
+ @config.should_receive(:dummy)
43
+ @config.resolve!.should equal(@config)
44
+ Configliere::ParamParent.class_eval do def resolve!() self ; end ; end
47
45
  end
48
46
  end
49
47