configliere 0.3.4 → 0.4.4

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 (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