mixlib-config 1.0.12 → 1.1.0.rc01
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/.gitignore +6 -0
- data/NOTICE +27 -0
- data/Rakefile +3 -1
- data/VERSION.yml +4 -3
- data/features/mixlib_config.feature +31 -0
- data/features/step_definitions/mixlib_config_steps.rb +0 -0
- data/features/steps/config_steps.rb +66 -0
- data/features/support/bobo.config +3 -0
- data/features/support/config_it.rb +28 -0
- data/features/support/env.rb +31 -0
- data/lib/mixlib/config.rb +23 -23
- data/spec/mixlib/config_spec.rb +20 -21
- metadata +27 -7
data/.gitignore
ADDED
data/NOTICE
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Mixin::Config NOTICE
|
2
|
+
=================
|
3
|
+
|
4
|
+
Developed at Opscode (http://www.opscode.com).
|
5
|
+
|
6
|
+
* Copyright 2009, Opscode, Inc. <legal@opscode.com>
|
7
|
+
|
8
|
+
Mixin::Config incorporates code from Chef. The Chef notice file follows:
|
9
|
+
|
10
|
+
Chef NOTICE
|
11
|
+
===========
|
12
|
+
|
13
|
+
Developed at Opscode (http://www.opscode.com).
|
14
|
+
|
15
|
+
Contributors and Copyright holders:
|
16
|
+
|
17
|
+
* Copyright 2008, Adam Jacob <adam@opscode.com>
|
18
|
+
* Copyright 2008, Arjuna Christensen <aj@hjksolutions.com>
|
19
|
+
* Copyright 2008, Bryan McLellan <btm@loftninjas.org>
|
20
|
+
* Copyright 2008, Ezra Zygmuntowicz <ezra@engineyard.com>
|
21
|
+
* Copyright 2009, Sean Cribbs <seancribbs@gmail.com>
|
22
|
+
* Copyright 2009, Christopher Brown <cb@opscode.com>
|
23
|
+
* Copyright 2009, Thom May <thom@clearairturbulence.org>
|
24
|
+
|
25
|
+
Chef incorporates code modified from Open4 (http://www.codeforpeople.com/lib/ruby/open4/), which was written by Ara T. Howard.
|
26
|
+
|
27
|
+
Chef incorporates code modified from Merb (http://www.merbivore.com), which is Copyright (c) 2008 Engine Yard.
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
14
|
end
|
15
15
|
rescue LoadError
|
16
|
-
|
16
|
+
puts "Jeweler (or a dependency) not available. Install from gemcutter with: sudo gem install gemcutter jeweler"
|
17
17
|
end
|
18
18
|
|
19
19
|
require 'spec/rake/spectask'
|
@@ -62,3 +62,5 @@ end
|
|
62
62
|
|
63
63
|
desc "Run the spec and features"
|
64
64
|
task :test => [ :features, :spec ]
|
65
|
+
|
66
|
+
Jeweler::GemcutterTasks.new
|
data/VERSION.yml
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
Feature: Configure an application
|
2
|
+
In order to make it trivial to configure an application
|
3
|
+
As a Developer
|
4
|
+
I want to utilize a simple configuration object
|
5
|
+
|
6
|
+
Scenario: Set a configuration option to a string
|
7
|
+
Given a configuration class 'ConfigIt'
|
8
|
+
When I set 'foo' to 'bar' in configuration class 'ConfigIt'
|
9
|
+
Then config option 'foo' is 'bar'
|
10
|
+
|
11
|
+
Scenario: Set the same configuration option to different strings for two configuration classes
|
12
|
+
Given a configuration class 'ConfigIt'
|
13
|
+
And a configuration class 'ConfigItToo'
|
14
|
+
When I set 'foo' to 'bar' in configuration class 'ConfigIt'
|
15
|
+
And I set 'foo' to 'bar2' in configuration class 'ConfigItToo'
|
16
|
+
Then in configuration class 'ConfigItToo' config option 'foo' is 'bar2'
|
17
|
+
And in configuration class 'ConfigIt' config option 'foo' is 'bar'
|
18
|
+
|
19
|
+
Scenario: Set a configuration option to an Array
|
20
|
+
Given a configuration class 'ConfigIt'
|
21
|
+
When I set 'foo' to:
|
22
|
+
|key|
|
23
|
+
|bar|
|
24
|
+
|baz|
|
25
|
+
Then an array is returned for 'foo'
|
26
|
+
|
27
|
+
Scenario: Set a configuration option from a file
|
28
|
+
Given a configuration file 'bobo.config'
|
29
|
+
When I load the configuration
|
30
|
+
Then config option 'foo' is 'bar'
|
31
|
+
And config option 'baz' is 'snarl'
|
File without changes
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
Given /^a configuration class '(.+)'$/ do |classname|
|
20
|
+
end
|
21
|
+
|
22
|
+
When /^I set '(.+)' to '(.+)' in configuration class '(.+)'$/ do |key, value, classname|
|
23
|
+
|
24
|
+
#ConfigIt[key.to_sym] = value
|
25
|
+
if classname == 'ConfigIt'
|
26
|
+
ConfigIt[key.to_sym] = value
|
27
|
+
elsif classname == 'ConfigItToo'
|
28
|
+
ConfigItToo[key.to_sym] = value
|
29
|
+
else
|
30
|
+
raise ArgumentError, "configuration class must be ConfigIt or ConfigItToo"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Then /^config option '(.+)' is '(.+)'$/ do |key, value|
|
35
|
+
ConfigIt[key.to_sym].should == value
|
36
|
+
end
|
37
|
+
|
38
|
+
Then /^in configuration class '(.+)' config option '(.+)' is '(.+)'$/ do |classname, key, value|
|
39
|
+
if classname == 'ConfigIt'
|
40
|
+
ConfigIt[key.to_sym].should == value
|
41
|
+
elsif classname == 'ConfigItToo'
|
42
|
+
ConfigItToo[key.to_sym].should == value
|
43
|
+
else
|
44
|
+
raise ArgumentError, "configuration class must be ConfigIt or ConfigItToo"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
When /^I set '(.+)' to:$/ do |key, foo_table|
|
49
|
+
ConfigIt[key.to_sym] = Array.new
|
50
|
+
foo_table.hashes.each do |hash|
|
51
|
+
ConfigIt[key.to_sym] << hash['key']
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
Then /^an array is returned for '(.+)'$/ do |key|
|
56
|
+
ConfigIt[key.to_sym].should be_a_kind_of(Array)
|
57
|
+
end
|
58
|
+
|
59
|
+
Given /^a configuration file '(.+)'$/ do |filename|
|
60
|
+
@config_file = File.join(File.dirname(__FILE__), "..", "support", filename)
|
61
|
+
end
|
62
|
+
|
63
|
+
When /^I load the configuration$/ do
|
64
|
+
ConfigIt.from_file(@config_file)
|
65
|
+
end
|
66
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
$: << File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
20
|
+
require 'mixlib/config'
|
21
|
+
|
22
|
+
class ConfigIt
|
23
|
+
extend Mixlib::Config
|
24
|
+
end
|
25
|
+
|
26
|
+
class ConfigItToo
|
27
|
+
extend Mixlib::Config
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
$: << File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
20
|
+
|
21
|
+
require 'spec/expectations'
|
22
|
+
require 'mixlib/config'
|
23
|
+
require 'tmpdir'
|
24
|
+
require 'stringio'
|
25
|
+
|
26
|
+
class MyWorld
|
27
|
+
end
|
28
|
+
|
29
|
+
World do
|
30
|
+
MyWorld.new
|
31
|
+
end
|
data/lib/mixlib/config.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
4
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
3
5
|
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
6
|
# License:: Apache License, Version 2.0
|
5
7
|
#
|
@@ -16,16 +18,13 @@
|
|
16
18
|
# limitations under the License.
|
17
19
|
#
|
18
20
|
|
19
|
-
class Object # http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
|
20
|
-
def meta_def name, &blk
|
21
|
-
(class << self; self; end).instance_eval { define_method name, &blk }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
21
|
module Mixlib
|
26
22
|
module Config
|
27
|
-
|
28
|
-
|
23
|
+
|
24
|
+
def self.extended(base)
|
25
|
+
class << base; attr_accessor :configuration; end
|
26
|
+
base.configuration = Hash.new
|
27
|
+
end
|
29
28
|
|
30
29
|
# Loads a given ruby file, and runs instance_eval against it in the context of the current
|
31
30
|
# object.
|
@@ -38,14 +37,14 @@ module Mixlib
|
|
38
37
|
self.instance_eval(IO.read(filename), filename, 1)
|
39
38
|
end
|
40
39
|
|
41
|
-
# Pass Mixlib::Config.configure() a block, and it will yield
|
40
|
+
# Pass Mixlib::Config.configure() a block, and it will yield self.configuration.
|
42
41
|
#
|
43
42
|
# === Parameters
|
44
|
-
# <block>:: A block that is sent
|
43
|
+
# <block>:: A block that is sent self.configuration as its argument
|
45
44
|
def configure(&block)
|
46
|
-
block.call(
|
45
|
+
block.call(self.configuration)
|
47
46
|
end
|
48
|
-
|
47
|
+
|
49
48
|
# Get the value of a configuration option
|
50
49
|
#
|
51
50
|
# === Parameters
|
@@ -57,7 +56,7 @@ module Mixlib
|
|
57
56
|
# === Raises
|
58
57
|
# <ArgumentError>:: If the configuration option does not exist
|
59
58
|
def [](config_option)
|
60
|
-
|
59
|
+
self.configuration[config_option.to_sym]
|
61
60
|
end
|
62
61
|
|
63
62
|
# Set the value of a configuration option
|
@@ -81,7 +80,7 @@ module Mixlib
|
|
81
80
|
# <True>:: If the configuration option exists
|
82
81
|
# <False>:: If the configuration option does not exist
|
83
82
|
def has_key?(key)
|
84
|
-
|
83
|
+
self.configuration.has_key?(key.to_sym)
|
85
84
|
end
|
86
85
|
|
87
86
|
# Merge an incoming hash with our config options
|
@@ -92,7 +91,7 @@ module Mixlib
|
|
92
91
|
# === Returns
|
93
92
|
# result of Hash#merge!
|
94
93
|
def merge!(hash)
|
95
|
-
|
94
|
+
self.configuration.merge!(hash)
|
96
95
|
end
|
97
96
|
|
98
97
|
# Return the set of config hash keys
|
@@ -100,7 +99,7 @@ module Mixlib
|
|
100
99
|
# === Returns
|
101
100
|
# result of Hash#keys
|
102
101
|
def keys
|
103
|
-
|
102
|
+
self.configuration.keys
|
104
103
|
end
|
105
104
|
|
106
105
|
# Creates a shallow copy of the internal hash
|
@@ -108,7 +107,7 @@ module Mixlib
|
|
108
107
|
# === Returns
|
109
108
|
# result of Hash#dup
|
110
109
|
def hash_dup
|
111
|
-
|
110
|
+
self.configuration.dup
|
112
111
|
end
|
113
112
|
|
114
113
|
# Internal dispatch setter, calling either the real defined method or setting the
|
@@ -120,10 +119,10 @@ module Mixlib
|
|
120
119
|
#
|
121
120
|
def internal_set(method_symbol,value)
|
122
121
|
method_name = method_symbol.id2name
|
123
|
-
if
|
122
|
+
if self.respond_to?("#{method_name}=".to_sym)
|
124
123
|
self.send("#{method_name}=", value)
|
125
124
|
else
|
126
|
-
|
125
|
+
self.configuration[method_symbol] = value
|
127
126
|
end
|
128
127
|
end
|
129
128
|
|
@@ -137,9 +136,10 @@ module Mixlib
|
|
137
136
|
# value<Object>:: Value to be set in config hash
|
138
137
|
#
|
139
138
|
def config_attr_writer(method_symbol, &blk)
|
140
|
-
|
141
|
-
|
142
|
-
|
139
|
+
meta = class << self; self; end
|
140
|
+
method_name = "#{method_symbol.to_s}=".to_sym
|
141
|
+
meta.send :define_method, method_name do |value|
|
142
|
+
self.configuration[method_symbol] = blk.call(value)
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
@@ -165,7 +165,7 @@ module Mixlib
|
|
165
165
|
end
|
166
166
|
|
167
167
|
# Returning
|
168
|
-
|
168
|
+
self.configuration[method_symbol]
|
169
169
|
|
170
170
|
end
|
171
171
|
end
|
data/spec/mixlib/config_spec.rb
CHANGED
@@ -18,6 +18,11 @@
|
|
18
18
|
|
19
19
|
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
20
20
|
|
21
|
+
class ConfigIt
|
22
|
+
extend ::Mixlib::Config
|
23
|
+
end
|
24
|
+
|
25
|
+
|
21
26
|
describe Mixlib::Config do
|
22
27
|
before(:each) do
|
23
28
|
ConfigIt.configure do |c|
|
@@ -96,47 +101,41 @@ describe Mixlib::Config do
|
|
96
101
|
|
97
102
|
describe "when a class method override accessor exists" do
|
98
103
|
before do
|
99
|
-
|
100
|
-
|
104
|
+
@klass = Class.new
|
105
|
+
@klass.extend(::Mixlib::Config)
|
106
|
+
@klass.class_eval(<<-EVAL)
|
101
107
|
config_attr_writer :test_method do |blah|
|
102
108
|
blah.is_a?(Integer) ? blah * 1000 : blah
|
103
109
|
end
|
104
|
-
|
105
|
-
|
110
|
+
pp self.methods
|
111
|
+
EVAL
|
106
112
|
end
|
107
113
|
|
108
114
|
it "should multiply an integer by 1000" do
|
109
|
-
|
110
|
-
|
115
|
+
@klass[:test_method] = 53
|
116
|
+
@klass[:test_method].should == 53000
|
111
117
|
end
|
112
118
|
|
113
119
|
it "should multiply an integer by 1000 with the method_missing form" do
|
114
|
-
|
115
|
-
|
120
|
+
@klass.test_method = 63
|
121
|
+
@klass.test_method.should == 63000
|
116
122
|
end
|
117
123
|
|
118
124
|
it "should multiply an integer by 1000 with the instance_eval DSL form" do
|
119
|
-
|
120
|
-
|
125
|
+
@klass.instance_eval("test_method 73")
|
126
|
+
@klass.test_method.should == 73000
|
121
127
|
end
|
122
128
|
|
123
129
|
it "should multiply an integer by 1000 via from-file, too" do
|
124
130
|
IO.stub!(:read).with('config.rb').and_return("test_method 99")
|
125
|
-
|
126
|
-
|
131
|
+
@klass.from_file('config.rb')
|
132
|
+
@klass.test_method.should == 99000
|
127
133
|
end
|
128
134
|
|
129
135
|
it "should receive internal_set with the method name and config value" do
|
130
|
-
|
131
|
-
|
136
|
+
@klass.should_receive(:internal_set).with(:test_method, 53).and_return(true)
|
137
|
+
@klass[:test_method] = 53
|
132
138
|
end
|
133
139
|
|
134
|
-
after do
|
135
|
-
class ConfigIt
|
136
|
-
class << self
|
137
|
-
undef test_method=
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
140
|
end
|
142
141
|
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: true
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- rc01
|
10
|
+
version: 1.1.0.rc01
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Opscode, Inc.
|
@@ -9,7 +15,7 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-06-15 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
@@ -23,10 +29,18 @@ extra_rdoc_files:
|
|
23
29
|
- LICENSE
|
24
30
|
- README.rdoc
|
25
31
|
files:
|
32
|
+
- .gitignore
|
26
33
|
- LICENSE
|
34
|
+
- NOTICE
|
27
35
|
- README.rdoc
|
28
36
|
- Rakefile
|
29
37
|
- VERSION.yml
|
38
|
+
- features/mixlib_config.feature
|
39
|
+
- features/step_definitions/mixlib_config_steps.rb
|
40
|
+
- features/steps/config_steps.rb
|
41
|
+
- features/support/bobo.config
|
42
|
+
- features/support/config_it.rb
|
43
|
+
- features/support/env.rb
|
30
44
|
- lib/mixlib/config.rb
|
31
45
|
- spec/mixlib/config_spec.rb
|
32
46
|
- spec/spec.opts
|
@@ -41,21 +55,27 @@ rdoc_options:
|
|
41
55
|
require_paths:
|
42
56
|
- lib
|
43
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
44
59
|
requirements:
|
45
60
|
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
47
64
|
version: "0"
|
48
|
-
version:
|
49
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
50
67
|
requirements:
|
51
|
-
- - "
|
68
|
+
- - ">"
|
52
69
|
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
|
70
|
+
segments:
|
71
|
+
- 1
|
72
|
+
- 3
|
73
|
+
- 1
|
74
|
+
version: 1.3.1
|
55
75
|
requirements: []
|
56
76
|
|
57
77
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.3.
|
78
|
+
rubygems_version: 1.3.7
|
59
79
|
signing_key:
|
60
80
|
specification_version: 3
|
61
81
|
summary: A class based config mixin, similar to the one found in Chef.
|