ridley 0.0.5 → 0.0.6

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.md CHANGED
@@ -274,6 +274,54 @@ Unlike a role, node, client, or environment, a data bag is a container for other
274
274
  conn.search(:node)
275
275
  conn.search(:node, "name:ridley-test.local")
276
276
 
277
+ ## Manipulating Attributes
278
+
279
+ Using Ridley you can quickly manipulate node or environment attributes. Attributes are identified by a dotted path notation.
280
+
281
+ default[:my_app][:billing][:enabled] => "my_app.billing.enabled"
282
+
283
+ Given the previous example you could set the default node attribute with the `set_default_attribute` function on a Node object
284
+
285
+ ### Node Attributes
286
+
287
+ Setting the `default[:my_app][:billing][:enabled]` node level default attribute on the node "jwinsor-1"
288
+
289
+ conn = Ridley.connection
290
+ conn.sync do
291
+ obj = node.find("jwinsor-1")
292
+ obj.set_default_attribute("my_app.billing.enabled", false)
293
+ obj.save
294
+ end
295
+
296
+ Other attribute precedence levels can be set with their own respective set attribute functions
297
+
298
+ conn = Ridley.connection
299
+ conn.sync do
300
+ obj = node.find("jwinsor-1")
301
+ obj.set_override_attribute("my_app.proxy.enabled", false)
302
+ obj.set_normal_attribute("my_app.webapp.enabled", false)
303
+ end
304
+
305
+ ### Environment Attributes
306
+
307
+ Setting a default environment attribute is just like setting a node level default attribute
308
+
309
+ conn = Ridley.connection
310
+ conn.sync do
311
+ obj = environment.find("production")
312
+ obj.set_default_attribute("my_app.proxy.enabled", false)
313
+ obj.save
314
+ end
315
+
316
+ And the same goes for setting an environment level override attribute
317
+
318
+ conn = Ridley.connection
319
+ conn.sync do
320
+ obj = environment.find("production")
321
+ obj.set_override_attribute("my_app.webapp.enabled", false)
322
+ obj.save
323
+ end
324
+
277
325
  # Authors and Contributors
278
326
 
279
327
  * Jamie Winsor (<jamie@vialstudios.com>)
@@ -8,6 +8,7 @@ require 'active_support/core_ext'
8
8
  require 'forwardable'
9
9
  require 'set'
10
10
  require 'thread'
11
+ require 'chozo/core_ext'
11
12
 
12
13
  require 'ridley/version'
13
14
  require 'ridley/errors'
@@ -25,9 +25,55 @@ module Ridley
25
25
  validates_presence_of :name
26
26
 
27
27
  attribute :description, default: String.new
28
- attribute :default_attributes, default: Hash.new
29
- attribute :override_attributes, default: Hash.new
28
+ attribute :default_attributes, default: HashWithIndifferentAccess.new
29
+ attribute :override_attributes, default: HashWithIndifferentAccess.new
30
30
  attribute :cookbook_versions, default: Hash.new
31
+
32
+ # @param [Hash] hash
33
+ def default_attributes=(hash)
34
+ super(HashWithIndifferentAccess.new(hash))
35
+ end
36
+
37
+ # @param [Hash] hash
38
+ def override_attributes=(hash)
39
+ super(HashWithIndifferentAccess.new(hash))
40
+ end
41
+
42
+ # Set an environment level default attribute given the dotted path representation of
43
+ # the Chef attribute and value
44
+ #
45
+ # @example setting and saving an environment level default attribute
46
+ #
47
+ # obj = environment.find("production")
48
+ # obj.set_defualt_attribute("my_app.billing.enabled", false)
49
+ # obj.save
50
+ #
51
+ # @param [String] key
52
+ # @param [Object] value
53
+ #
54
+ # @return [HashWithIndifferentAccess]
55
+ def set_default_attribute(key, value)
56
+ attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
57
+ self.default_attributes = self.default_attributes.merge(attr_hash)
58
+ end
59
+
60
+ # Set an environment level override attribute given the dotted path representation of
61
+ # the Chef attribute and value
62
+ #
63
+ # @example setting and saving an environment level override attribute
64
+ #
65
+ # obj = environment.find("production")
66
+ # obj.set_override_attribute("my_app.billing.enabled", false)
67
+ # obj.save
68
+ #
69
+ # @param [String] key
70
+ # @param [Object] value
71
+ #
72
+ # @return [HashWithIndifferentAccess]
73
+ def set_override_attribute(key, value)
74
+ attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
75
+ self.override_attributes = self.override_attributes.merge(attr_hash)
76
+ end
31
77
  end
32
78
 
33
79
  module DSL
@@ -12,11 +12,85 @@ module Ridley
12
12
  validates_presence_of :name
13
13
 
14
14
  attribute :chef_environment, default: "_default"
15
- attribute :automatic, default: Hash.new
16
- attribute :normal, default: Hash.new
17
- attribute :default, default: Hash.new
18
- attribute :override, default: Hash.new
15
+ attribute :automatic, default: HashWithIndifferentAccess.new
16
+ attribute :normal, default: HashWithIndifferentAccess.new
17
+ attribute :default, default: HashWithIndifferentAccess.new
18
+ attribute :override, default: HashWithIndifferentAccess.new
19
19
  attribute :run_list, default: Array.new
20
+
21
+ # @param [Hash] hash
22
+ def automatic=(hash)
23
+ super(HashWithIndifferentAccess.new(hash))
24
+ end
25
+
26
+ # @param [Hash] hash
27
+ def normal=(hash)
28
+ super(HashWithIndifferentAccess.new(hash))
29
+ end
30
+
31
+ # @param [Hash] hash
32
+ def default=(hash)
33
+ super(HashWithIndifferentAccess.new(hash))
34
+ end
35
+
36
+ # @param [Hash] hash
37
+ def override=(hash)
38
+ super(HashWithIndifferentAccess.new(hash))
39
+ end
40
+
41
+ # Set a node level override attribute given the dotted path representation of the Chef
42
+ # attribute and value
43
+ #
44
+ # @example setting and saving a node level override attribute
45
+ #
46
+ # obj = node.find("jwinsor-1")
47
+ # obj.set_override_attribute("my_app.billing.enabled", false)
48
+ # obj.save
49
+ #
50
+ # @param [String] key
51
+ # @param [Object] value
52
+ #
53
+ # @return [HashWithIndifferentAccess]
54
+ def set_override_attribute(key, value)
55
+ attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
56
+ self.override = self.override.merge(attr_hash)
57
+ end
58
+
59
+ # Set a node level default attribute given the dotted path representation of the Chef
60
+ # attribute and value
61
+ #
62
+ # @example setting and saving a node level default attribute
63
+ #
64
+ # obj = node.find("jwinsor-1")
65
+ # obj.set_default_attribute("my_app.billing.enabled", false)
66
+ # obj.save
67
+ #
68
+ # @param [String] key
69
+ # @param [Object] value
70
+ #
71
+ # @return [HashWithIndifferentAccess]
72
+ def set_default_attribute(key, value)
73
+ attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
74
+ self.default = self.default.merge(attr_hash)
75
+ end
76
+
77
+ # Set a node level normal attribute given the dotted path representation of the Chef
78
+ # attribute and value
79
+ #
80
+ # @example setting and saving a node level normal attribute
81
+ #
82
+ # obj = node.find("jwinsor-1")
83
+ # obj.set_normal_attribute("my_app.billing.enabled", false)
84
+ # obj.save
85
+ #
86
+ # @param [String] key
87
+ # @param [Object] value
88
+ #
89
+ # @return [HashWithIndifferentAccess]
90
+ def set_normal_attribute(key, value)
91
+ attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
92
+ self.normal = self.normal.merge(attr_hash)
93
+ end
20
94
  end
21
95
 
22
96
  module DSL
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.version = Ridley::VERSION
17
17
  s.required_ruby_version = ">= 1.9.1"
18
18
 
19
+ s.add_runtime_dependency 'chozo', '>= 0.0.2'
19
20
  s.add_runtime_dependency 'yajl-ruby'
20
21
  s.add_runtime_dependency 'mixlib-log'
21
22
  s.add_runtime_dependency 'mixlib-authentication'
@@ -70,4 +70,92 @@ describe Ridley::Environment do
70
70
  end
71
71
  end
72
72
  end
73
+
74
+ let(:connection) { double('connection') }
75
+
76
+ subject { Ridley::Environment.new(connection) }
77
+
78
+ describe "#default_attributes=" do
79
+ context "given a Hash" do
80
+ it "returns a HashWithIndifferentAccess" do
81
+ subject.default_attributes = {
82
+ "key" => "value"
83
+ }
84
+
85
+ subject.default_attributes.should be_a(HashWithIndifferentAccess)
86
+ end
87
+ end
88
+ end
89
+
90
+ describe "#override_attributes=" do
91
+ context "given a Hash" do
92
+ it "returns a HashWithIndifferentAccess" do
93
+ subject.override_attributes = {
94
+ "key" => "value"
95
+ }
96
+
97
+ subject.override_attributes.should be_a(HashWithIndifferentAccess)
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "#set_override_attribute" do
103
+ it "returns a HashWithIndifferentAccess" do
104
+ subject.set_override_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
105
+ end
106
+
107
+ it "sets an override node attribute at the nested path" do
108
+ subject.set_override_attribute('deep.nested.item', true)
109
+
110
+ subject.override_attributes.should have_key("deep")
111
+ subject.override_attributes["deep"].should have_key("nested")
112
+ subject.override_attributes["deep"]["nested"].should have_key("item")
113
+ subject.override_attributes["deep"]["nested"]["item"].should be_true
114
+ end
115
+
116
+ context "when the override attribute is already set" do
117
+ it "test" do
118
+ subject.override_attributes = {
119
+ deep: {
120
+ nested: {
121
+ item: false
122
+ }
123
+ }
124
+ }
125
+ subject.set_override_attribute('deep.nested.item', true)
126
+
127
+ subject.override_attributes["deep"]["nested"]["item"].should be_true
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#set_default_attribute" do
133
+ it "returns a HashWithIndifferentAccess" do
134
+ subject.set_default_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
135
+ end
136
+
137
+ it "sets an override node attribute at the nested path" do
138
+ subject.set_default_attribute('deep.nested.item', true)
139
+
140
+ subject.default_attributes.should have_key("deep")
141
+ subject.default_attributes["deep"].should have_key("nested")
142
+ subject.default_attributes["deep"]["nested"].should have_key("item")
143
+ subject.default_attributes["deep"]["nested"]["item"].should be_true
144
+ end
145
+
146
+ context "when the override attribute is already set" do
147
+ it "test" do
148
+ subject.default_attributes = {
149
+ deep: {
150
+ nested: {
151
+ item: false
152
+ }
153
+ }
154
+ }
155
+ subject.set_default_attribute('deep.nested.item', true)
156
+
157
+ subject.default_attributes["deep"]["nested"]["item"].should be_true
158
+ end
159
+ end
160
+ end
73
161
  end
@@ -2,4 +2,146 @@ require 'spec_helper'
2
2
 
3
3
  describe Ridley::Node do
4
4
  it_behaves_like "a Ridley Resource", Ridley::Node
5
+
6
+ let(:connection) { double("connection") }
7
+
8
+ subject { Ridley::Node.new(connection) }
9
+
10
+ describe "#override=" do
11
+ context "given a Hash" do
12
+ it "returns a HashWithIndifferentAccess" do
13
+ subject.override = {
14
+ "key" => "value"
15
+ }
16
+
17
+ subject.override.should be_a(HashWithIndifferentAccess)
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "#automatic=" do
23
+ context "given a Hash" do
24
+ it "returns a HashWithIndifferentAccess" do
25
+ subject.automatic = {
26
+ "key" => "value"
27
+ }
28
+
29
+ subject.automatic.should be_a(HashWithIndifferentAccess)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "#normal=" do
35
+ context "given a Hash" do
36
+ it "returns a HashWithIndifferentAccess" do
37
+ subject.normal = {
38
+ "key" => "value"
39
+ }
40
+
41
+ subject.normal.should be_a(HashWithIndifferentAccess)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#default=" do
47
+ context "given a Hash" do
48
+ it "returns a HashWithIndifferentAccess" do
49
+ subject.default = {
50
+ "key" => "value"
51
+ }
52
+
53
+ subject.default.should be_a(HashWithIndifferentAccess)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "#set_override_attribute" do
59
+ it "returns a HashWithIndifferentAccess" do
60
+ subject.set_override_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
61
+ end
62
+
63
+ it "sets an override node attribute at the nested path" do
64
+ subject.set_override_attribute('deep.nested.item', true)
65
+
66
+ subject.override.should have_key("deep")
67
+ subject.override["deep"].should have_key("nested")
68
+ subject.override["deep"]["nested"].should have_key("item")
69
+ subject.override["deep"]["nested"]["item"].should be_true
70
+ end
71
+
72
+ context "when the override attribute is already set" do
73
+ it "test" do
74
+ subject.override = {
75
+ deep: {
76
+ nested: {
77
+ item: false
78
+ }
79
+ }
80
+ }
81
+ subject.set_override_attribute('deep.nested.item', true)
82
+
83
+ subject.override["deep"]["nested"]["item"].should be_true
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "#set_normal_attribute" do
89
+ it "returns a HashWithIndifferentAccess" do
90
+ subject.set_normal_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
91
+ end
92
+
93
+ it "sets an normal node attribute at the nested path" do
94
+ subject.set_normal_attribute('deep.nested.item', true)
95
+
96
+ subject.normal.should have_key("deep")
97
+ subject.normal["deep"].should have_key("nested")
98
+ subject.normal["deep"]["nested"].should have_key("item")
99
+ subject.normal["deep"]["nested"]["item"].should be_true
100
+ end
101
+
102
+ context "when the normal attribute is already set" do
103
+ it "test" do
104
+ subject.normal = {
105
+ deep: {
106
+ nested: {
107
+ item: false
108
+ }
109
+ }
110
+ }
111
+ subject.set_normal_attribute('deep.nested.item', true)
112
+
113
+ subject.normal["deep"]["nested"]["item"].should be_true
114
+ end
115
+ end
116
+ end
117
+
118
+ describe "#set_default_attribute" do
119
+ it "returns a HashWithIndifferentAccess" do
120
+ subject.set_default_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
121
+ end
122
+
123
+ it "sets an default node attribute at the nested path" do
124
+ subject.set_default_attribute('deep.nested.item', true)
125
+
126
+ subject.default.should have_key("deep")
127
+ subject.default["deep"].should have_key("nested")
128
+ subject.default["deep"]["nested"].should have_key("item")
129
+ subject.default["deep"]["nested"]["item"].should be_true
130
+ end
131
+
132
+ context "when the default attribute is already set" do
133
+ it "test" do
134
+ subject.default = {
135
+ deep: {
136
+ nested: {
137
+ item: false
138
+ }
139
+ }
140
+ }
141
+ subject.set_default_attribute('deep.nested.item', true)
142
+
143
+ subject.default["deep"]["nested"]["item"].should be_true
144
+ end
145
+ end
146
+ end
5
147
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-22 00:00:00.000000000 Z
12
+ date: 2012-10-09 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chozo
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.2
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: yajl-ruby
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -418,7 +434,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
418
434
  version: '0'
419
435
  segments:
420
436
  - 0
421
- hash: 3051717703450695836
437
+ hash: -3992965463787136581
422
438
  requirements: []
423
439
  rubyforge_project:
424
440
  rubygems_version: 1.8.23