ridley 0.6.3 → 0.7.0.beta

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ridley/errors.rb CHANGED
@@ -15,7 +15,7 @@ module Ridley
15
15
  end
16
16
 
17
17
  def message
18
- errors.full_messages.join(', ')
18
+ errors.values
19
19
  end
20
20
  alias_method :to_s, :message
21
21
  end
@@ -1,17 +1,7 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- module Resource
4
- extend ActiveSupport::Concern
5
- include ActiveModel::AttributeMethods
6
- include ActiveModel::Validations
7
- include ActiveModel::Serializers::JSON
8
- include Comparable
9
-
10
- included do
11
- attribute_method_suffix('=')
12
- end
13
-
14
- module ClassMethods
3
+ class Resource
4
+ class << self
15
5
  # @return [String, nil]
16
6
  def chef_id
17
7
  @chef_id
@@ -62,29 +52,6 @@ module Ridley
62
52
  attribute(:json_class, default: klass)
63
53
  end
64
54
 
65
- # @return [Set]
66
- def attributes
67
- @attributes ||= Set.new
68
- end
69
-
70
- # @return [Hash]
71
- def attribute_defaults
72
- @attribute_defaults ||= HashWithIndifferentAccess.new
73
- end
74
-
75
- # @param [String, Symbol] name
76
- # @option options [Object] :default
77
- # defines the default value for the attribute
78
- #
79
- # @return [Set]
80
- def attribute(name, options = {})
81
- if options.has_key?(:default)
82
- default_for_attribute(name, options[:default])
83
- end
84
- define_attribute_method(name)
85
- attributes << name.to_sym
86
- end
87
-
88
55
  # @param [Ridley::Connection] connection
89
56
  #
90
57
  # @return [Array<Object>]
@@ -164,67 +131,16 @@ module Ridley
164
131
  resource = new(connection, object.to_hash)
165
132
  new(connection, connection.put("#{self.resource_path}/#{resource.chef_id}", resource.to_json).body)
166
133
  end
167
-
168
- private
169
-
170
- def default_for_attribute(name, value)
171
- attribute_defaults[name.to_sym] = value
172
- end
173
134
  end
174
135
 
136
+ include Chozo::VariaModel
137
+ include Comparable
138
+
175
139
  # @param [Ridley::Connection] connection
176
- # @param [Hash] attributes
177
- def initialize(connection, attributes = {})
140
+ # @param [Hash] new_attrs
141
+ def initialize(connection, new_attrs = {})
178
142
  @connection = connection
179
- self.attributes = self.class.attribute_defaults.deep_merge(attributes)
180
- end
181
-
182
- # @param [String, Symbol] key
183
- #
184
- # @return [Object]
185
- def attribute(key)
186
- if instance_variable_defined?("@#{key}")
187
- instance_variable_get("@#{key}")
188
- else
189
- self.class.attribute_defaults[key]
190
- end
191
- end
192
- alias_method :[], :attribute
193
-
194
- # @param [String, Symbol] key
195
- # @param [Object] value
196
- #
197
- # @return [Object]
198
- def attribute=(key, value)
199
- instance_variable_set("@#{key}", value)
200
- end
201
- alias_method :[]=, :attribute=
202
-
203
- # @param [String, Symbol] key
204
- #
205
- # @return [Boolean]
206
- def attribute?(key)
207
- attribute(key).present?
208
- end
209
-
210
- # @return [Hash]
211
- def attributes
212
- {}.tap do |attrs|
213
- self.class.attributes.each do |attr|
214
- attrs[attr] = attribute(attr)
215
- end
216
- end
217
- end
218
-
219
- # @param [#to_hash] new_attributes
220
- #
221
- # @return [Hash]
222
- def attributes=(new_attributes)
223
- new_attributes.to_hash.symbolize_keys!
224
-
225
- self.class.attributes.each do |attr_name|
226
- send(:attribute=, attr_name, new_attributes[attr_name.to_sym])
227
- end
143
+ mass_assign(new_attrs)
228
144
  end
229
145
 
230
146
  # Creates a resource on the target remote or updates one if the resource
@@ -237,7 +153,7 @@ module Ridley
237
153
  def save
238
154
  raise Errors::InvalidResource.new(self.errors) unless valid?
239
155
 
240
- self.attributes = self.class.create(connection, self).attributes
156
+ mass_assign(self.class.create(connection, self).attributes)
241
157
  true
242
158
  rescue Errors::HTTPConflict
243
159
  self.update
@@ -254,7 +170,7 @@ module Ridley
254
170
  def update
255
171
  raise Errors::InvalidResource.new(self.errors) unless valid?
256
172
 
257
- self.attributes = self.class.update(connection, self).attributes
173
+ mass_assign(self.class.update(connection, self).attributes)
258
174
  true
259
175
  end
260
176
 
@@ -262,44 +178,13 @@ module Ridley
262
178
  #
263
179
  # @return [Object]
264
180
  def reload
265
- self.attributes = self.class.find(connection, self).attributes
181
+ mass_assign(self.class.find(connection, self).attributes)
266
182
  self
267
183
  end
268
184
 
269
185
  # @return [String]
270
186
  def chef_id
271
- attribute(self.class.chef_id)
272
- end
273
-
274
- # @param [String] json
275
- # @option options [Boolean] :symbolize_keys
276
- # @option options [Class, Symbol, String] :adapter
277
- #
278
- # @return [Object]
279
- def from_json(json, options = {})
280
- self.attributes = MultiJson.decode(json, options)
281
- self
282
- end
283
-
284
- # @param [#to_hash] hash
285
- #
286
- # @return [Object]
287
- def from_hash(hash)
288
- self.attributes = hash.to_hash
289
- self
290
- end
291
-
292
- # @option options [Boolean] :symbolize_keys
293
- # @option options [Class, Symbol, String] :adapter
294
- #
295
- # @return [String]
296
- def to_json(options = {})
297
- MultiJson.encode(self.attributes, options)
298
- end
299
- alias_method :as_json, :to_json
300
-
301
- def to_hash
302
- self.attributes
187
+ get_attribute(self.class.chef_id)
303
188
  end
304
189
 
305
190
  def to_s
@@ -1,8 +1,6 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class Client
4
- include Ridley::Resource
5
-
3
+ class Client < Ridley::Resource
6
4
  class << self
7
5
  # Retrieves a client from the remote connection matching the given chef_id
8
6
  # and regenerates it's private key. An instance of the updated object will
@@ -28,25 +26,31 @@ module Ridley
28
26
  set_chef_json_class "Chef::ApiClient"
29
27
  set_resource_path "clients"
30
28
 
31
- attribute :name
32
- validates_presence_of :name
29
+ attribute :name,
30
+ type: String,
31
+ required: true
33
32
 
34
- attribute :admin, default: false
35
- validates_inclusion_of :admin, in: [ true, false ]
33
+ attribute :admin,
34
+ type: Boolean,
35
+ required: true,
36
+ default: false
36
37
 
37
- attribute :validator, default: false
38
- validates_inclusion_of :validator, in: [ true, false ]
38
+ attribute :validator,
39
+ type: Boolean,
40
+ required: true,
41
+ default: false
39
42
 
40
- attribute :certificate
41
- attribute :public_key
42
- attribute :private_key
43
- attribute :orgname
43
+ attribute :certificate,
44
+ type: String
44
45
 
45
- def attributes
46
- # @todo JW: reflect on the connection type to determine if we need to strip the
47
- # json_class attribute. Only OHC/OPC needs this stripped.
48
- super.except(:json_class)
49
- end
46
+ attribute :public_key,
47
+ type: String
48
+
49
+ attribute :private_key,
50
+ type: [ String, Boolean ]
51
+
52
+ attribute :orgname,
53
+ type: String
50
54
 
51
55
  # Regenerates the private key of the instantiated client object. The new
52
56
  # private key will be set to the value of the 'private_key' accessor
@@ -58,6 +62,16 @@ module Ridley
58
62
  self.private_key = true
59
63
  self.save
60
64
  end
65
+
66
+ # Override to_json to reflect to massage the returned attributes based on the type
67
+ # of connection. Only OHC/OPC requires the json_class attribute is not present.
68
+ def to_json
69
+ if connection.hosted?
70
+ attributes.except(:json_class).to_json
71
+ else
72
+ super
73
+ end
74
+ end
61
75
  end
62
76
 
63
77
  module DSL
@@ -1,8 +1,6 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class Cookbook
4
- include Ridley::Resource
5
-
3
+ class Cookbook < Ridley::Resource
6
4
  class << self
7
5
  # Save a new Cookbook Version of the given name, version with the
8
6
  # given manifest of files and checksums.
@@ -34,8 +32,8 @@ module Ridley
34
32
  set_chef_json_class "Chef::Cookbook"
35
33
  set_resource_path "cookbooks"
36
34
 
37
- attribute :name
38
- validates_presence_of :name
35
+ attribute :name,
36
+ required: true
39
37
  end
40
38
 
41
39
  module DSL
@@ -25,9 +25,7 @@ module Ridley
25
25
  end
26
26
 
27
27
  # @author Jamie Winsor <jamie@vialstudios.com>
28
- class DataBag
29
- include Ridley::Resource
30
-
28
+ class DataBag < Ridley::Resource
31
29
  class << self
32
30
  # @param [Ridley::Connection] connection
33
31
  # @param [String, #chef_id] object
@@ -56,8 +54,8 @@ module Ridley
56
54
  set_chef_id "name"
57
55
  set_resource_path "data"
58
56
 
59
- attribute :name
60
- validates_presence_of :name
57
+ attribute :name,
58
+ required: true
61
59
 
62
60
  def item
63
61
  DBIChainLink.new(self, connection)
@@ -1,9 +1,6 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class DataBagItem
4
- include ActiveModel::Validations
5
- include ActiveModel::Serialization
6
-
3
+ class DataBagItem < Ridley::Resource
7
4
  class << self
8
5
  # @param [Ridley::Connection] connection
9
6
  #
@@ -98,52 +95,28 @@ module Ridley
98
95
  end
99
96
  end
100
97
 
98
+ set_assignment_mode :carefree
99
+
101
100
  # @return [Ridley::DataBag]
102
101
  attr_reader :data_bag
103
- # @return [HashWithIndifferentAccess]
104
- attr_reader :attributes
105
102
 
106
- validates_presence_of :id
103
+ attribute :id,
104
+ type: String,
105
+ required: true
107
106
 
108
107
  # @param [Ridley::Connection] connection
109
108
  # @param [Ridley::DataBag] data_bag
110
- # @param [#to_hash] attributes
111
- def initialize(connection, data_bag, attributes = {})
112
- @connection = connection
109
+ # @param [#to_hash] new_attrs
110
+ def initialize(connection, data_bag, new_attrs = {})
111
+ super(connection, new_attrs)
113
112
  @data_bag = data_bag
114
- self.attributes = attributes
115
113
  end
116
114
 
117
115
  # Alias for accessing the value of the 'id' attribute
118
116
  #
119
117
  # @return [String]
120
118
  def chef_id
121
- @attributes[:id]
122
- end
123
- alias_method :id, :chef_id
124
-
125
- # @param [String, Symbol] key
126
- #
127
- # @return [Object]
128
- def attribute(key)
129
- @attributes[key]
130
- end
131
- alias_method :[], :attribute
132
-
133
- # @param [String, Symbol] key
134
- # @param [Object] value
135
- #
136
- # @return [Object]
137
- def attribute=(key, value)
138
- @attributes[key] = value
139
- end
140
- alias_method :[]=, :attribute=
141
-
142
- # @param [#to_hash] new_attributes
143
- #
144
- # @return [HashWithIndifferentAccess]
145
- def attributes=(new_attributes)
146
- @attributes = HashWithIndifferentAccess.new(new_attributes.to_hash)
119
+ get_attribute(:id)
147
120
  end
148
121
 
149
122
  # Creates a resource on the target remote or updates one if the resource
@@ -157,10 +130,10 @@ module Ridley
157
130
  def save
158
131
  raise Errors::InvalidResource.new(self.errors) unless valid?
159
132
 
160
- self.attributes = self.class.create(connection, data_bag, self).attributes
133
+ mass_assign(self.class.create(connection, data_bag, self).attributes)
161
134
  true
162
135
  rescue Errors::HTTPConflict
163
- self.attributes = self.class.update(connection, data_bag, self).attributes
136
+ self.update
164
137
  true
165
138
  end
166
139
 
@@ -169,7 +142,7 @@ module Ridley
169
142
  # @return [Hash] decrypted attributes
170
143
  def decrypt
171
144
  decrypted_hash = Hash[attributes.map { |key, value| [key, key == "id" ? value : decrypt_value(value)] }]
172
- self.attributes = HashWithIndifferentAccess.new(decrypted_hash)
145
+ mass_assign(decrypted_hash)
173
146
  end
174
147
 
175
148
  def decrypt_value(value)
@@ -183,27 +156,36 @@ module Ridley
183
156
  YAML.load(decrypted_value)
184
157
  end
185
158
 
186
- # @param [#to_hash] hash
159
+ # Reload the attributes of the instantiated resource
187
160
  #
188
161
  # @return [Object]
189
- def from_hash(hash)
190
- hash = HashWithIndifferentAccess.new(hash.to_hash)
191
-
192
- self.attributes = hash.has_key?(:raw_data) ? hash[:raw_data] : hash
162
+ def reload
163
+ mass_assign(self.class.find(connection, data_bag, self).attributes)
193
164
  self
194
165
  end
195
166
 
196
- # @option options [Boolean] :symbolize_keys
197
- # @option options [Class, Symbol, String] :adapter
167
+ # Updates the instantiated resource on the target remote with any changes made
168
+ # to self
198
169
  #
199
- # @return [String]
200
- def to_json(options = {})
201
- MultiJson.encode(self.attributes, options)
170
+ # @raise [Errors::InvalidResource]
171
+ # if the resource does not pass validations
172
+ #
173
+ # @return [Boolean]
174
+ def update
175
+ raise Errors::InvalidResource.new(self.errors) unless valid?
176
+
177
+ mass_assign(sself.class.update(connection, data_bag, self).attributes)
178
+ true
202
179
  end
203
- alias_method :as_json, :to_json
204
180
 
205
- def to_hash
206
- self.attributes
181
+ # @param [#to_hash] hash
182
+ #
183
+ # @return [Object]
184
+ def from_hash(hash)
185
+ hash = HashWithIndifferentAccess.new(hash.to_hash)
186
+
187
+ mass_assign(hash.has_key?(:raw_data) ? hash[:raw_data] : hash)
188
+ self
207
189
  end
208
190
 
209
191
  def to_s
@@ -1,8 +1,6 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class Environment
4
- include Ridley::Resource
5
-
3
+ class Environment < Ridley::Resource
6
4
  class << self
7
5
  # Delete all of the environments on the remote connection. The
8
6
  # '_default' environment will never be deleted.
@@ -21,27 +19,20 @@ module Ridley
21
19
  set_chef_json_class "Chef::Environment"
22
20
  set_resource_path "environments"
23
21
 
24
- attribute :name
25
- validates_presence_of :name
26
-
27
- attribute :description, default: String.new
28
- attribute :default_attributes, default: HashWithIndifferentAccess.new
29
- attribute :override_attributes, default: HashWithIndifferentAccess.new
30
- attribute :cookbook_versions, default: HashWithIndifferentAccess.new
31
-
32
- # @param [Hash] hash
33
- def default_attributes=(hash)
34
- super(HashWithIndifferentAccess.new(hash))
35
- end
22
+ attribute :name,
23
+ required: true
36
24
 
37
- # @param [Hash] hash
38
- def override_attributes=(hash)
39
- super(HashWithIndifferentAccess.new(hash))
40
- end
25
+ attribute :description,
26
+ default: String.new
41
27
 
42
- def cookbook_versions=(hash)
43
- super(HashWithIndifferentAccess.new(hash))
44
- end
28
+ attribute :default_attributes,
29
+ default: Hashie::Mash.new
30
+
31
+ attribute :override_attributes,
32
+ default: Hashie::Mash.new
33
+
34
+ attribute :cookbook_versions,
35
+ default: Hashie::Mash.new
45
36
 
46
37
  # Set an environment level default attribute given the dotted path representation of
47
38
  # the Chef attribute and value
@@ -1,6 +1,6 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class Node
3
+ class Node < Ridley::Resource
4
4
  class << self
5
5
  # @overload bootstrap(connection, nodes, options = {})
6
6
  # @param [Ridley::Connection] connection
@@ -68,50 +68,40 @@ module Ridley
68
68
  end
69
69
  end
70
70
 
71
- include Ridley::Resource
72
-
73
71
  set_chef_id "name"
74
72
  set_chef_type "node"
75
73
  set_chef_json_class "Chef::Node"
76
74
  set_resource_path "nodes"
77
75
 
78
- attribute :name
79
- validates_presence_of :name
76
+ attribute :name,
77
+ required: true
78
+
79
+ attribute :chef_environment,
80
+ default: "_default"
81
+
82
+ attribute :automatic,
83
+ default: Hashie::Mash.new
84
+
85
+ attribute :normal,
86
+ default: Hashie::Mash.new
80
87
 
81
- attribute :chef_environment, default: "_default"
82
- attribute :automatic, default: HashWithIndifferentAccess.new
83
- attribute :normal, default: HashWithIndifferentAccess.new
84
- attribute :default, default: HashWithIndifferentAccess.new
85
- attribute :override, default: HashWithIndifferentAccess.new
86
- attribute :run_list, default: Array.new
88
+ attribute :default,
89
+ default: Hashie::Mash.new
90
+
91
+ attribute :override,
92
+ default: Hashie::Mash.new
93
+
94
+ attribute :run_list,
95
+ default: Array.new
87
96
 
88
97
  alias_method :normal_attributes, :normal
89
98
  alias_method :automatic_attributes, :automatic
90
99
  alias_method :default_attributes, :default
91
100
  alias_method :override_attributes, :override
92
101
 
93
- # @param [Hash] hash
94
- def normal=(hash)
95
- super(HashWithIndifferentAccess.new(hash))
96
- end
97
102
  alias_method :normal_attributes=, :normal=
98
-
99
- # @param [Hash] hash
100
- def automatic=(hash)
101
- super(HashWithIndifferentAccess.new(hash))
102
- end
103
103
  alias_method :automatic_attributes=, :automatic=
104
-
105
- # @param [Hash] hash
106
- def default=(hash)
107
- super(HashWithIndifferentAccess.new(hash))
108
- end
109
104
  alias_method :default_attributes=, :default=
110
-
111
- # @param [Hash] hash
112
- def override=(hash)
113
- super(HashWithIndifferentAccess.new(hash))
114
- end
115
105
  alias_method :override_attributes=, :override=
116
106
 
117
107
  # Set a node level normal attribute given the dotted path representation of the Chef
@@ -123,14 +113,14 @@ module Ridley
123
113
  # @example setting and saving a node level normal attribute
124
114
  #
125
115
  # obj = node.find("jwinsor-1")
126
- # obj.set_attribute("my_app.billing.enabled", false)
116
+ # obj.set_chef_attribute("my_app.billing.enabled", false)
127
117
  # obj.save
128
118
  #
129
119
  # @param [String] key
130
120
  # @param [Object] value
131
121
  #
132
122
  # @return [HashWithIndifferentAccess]
133
- def set_attribute(key, value)
123
+ def set_chef_attribute(key, value)
134
124
  attr_hash = HashWithIndifferentAccess.from_dotted_path(key, value)
135
125
  self.normal = self.normal.deep_merge(attr_hash)
136
126
  end
@@ -1,31 +1,28 @@
1
1
  module Ridley
2
2
  # @author Jamie Winsor <jamie@vialstudios.com>
3
- class Role
4
- include Ridley::Resource
5
-
3
+ class Role < Ridley::Resource
6
4
  set_chef_id "name"
7
5
  set_chef_type "role"
8
6
  set_chef_json_class "Chef::Role"
9
7
  set_resource_path "roles"
10
8
 
11
- attribute :name
12
- validates_presence_of :name
9
+ attribute :name,
10
+ required: true
13
11
 
14
- attribute :description, default: String.new
15
- attribute :default_attributes, default: HashWithIndifferentAccess.new
16
- attribute :override_attributes, default: HashWithIndifferentAccess.new
17
- attribute :run_list, default: Array.new
18
- attribute :env_run_lists, default: Hash.new
12
+ attribute :description,
13
+ default: String.new
19
14
 
20
- # @param [Hash] hash
21
- def default_attributes=(hash)
22
- super(HashWithIndifferentAccess.new(hash))
23
- end
15
+ attribute :default_attributes,
16
+ default: Hashie::Mash.new
24
17
 
25
- # @param [Hash] hash
26
- def override_attributes=(hash)
27
- super(HashWithIndifferentAccess.new(hash))
28
- end
18
+ attribute :override_attributes,
19
+ default: Hashie::Mash.new
20
+
21
+ attribute :run_list,
22
+ default: Array.new
23
+
24
+ attribute :env_run_lists,
25
+ default: Hash.new
29
26
 
30
27
  # Set a role level override attribute given the dotted path representation of the Chef
31
28
  # attribute and value
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "0.6.3"
2
+ VERSION = "0.7.0.beta"
3
3
  end
data/lib/ridley.rb CHANGED
@@ -4,7 +4,6 @@ require 'celluloid'
4
4
  require 'faraday'
5
5
  require 'addressable/uri'
6
6
  require 'multi_json'
7
- require 'active_model'
8
7
  require 'active_support/inflector'
9
8
  require 'forwardable'
10
9
  require 'thread'
data/ridley.gemspec CHANGED
@@ -19,12 +19,11 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_runtime_dependency 'json', '>= 1.5.0'
21
21
  s.add_runtime_dependency 'multi_json', '>= 1.0.4'
22
- s.add_runtime_dependency 'chozo', '>= 0.2.2'
22
+ s.add_runtime_dependency 'chozo', '>= 0.4.1'
23
23
  s.add_runtime_dependency 'mixlib-log'
24
24
  s.add_runtime_dependency 'mixlib-authentication'
25
25
  s.add_runtime_dependency 'addressable'
26
26
  s.add_runtime_dependency 'faraday'
27
- s.add_runtime_dependency 'activemodel', '>= 3.2.0'
28
27
  s.add_runtime_dependency 'activesupport', '>= 3.2.0'
29
28
  s.add_runtime_dependency 'celluloid'
30
29
  s.add_runtime_dependency 'net-ssh'
@@ -1,5 +1,5 @@
1
1
  shared_examples_for "a Ridley Resource" do |resource_klass|
2
- let(:connection) { double('connection') }
2
+ let(:connection) { double('connection', hosted?: true) }
3
3
  let(:active_connection) { double('active-connection') }
4
4
  let(:response) { double('response') }
5
5
 
@@ -99,40 +99,6 @@ shared_examples_for "a Ridley Resource" do |resource_klass|
99
99
 
100
100
  subject { resource_klass.new(connection) }
101
101
 
102
- describe "#attribute" do
103
- it "returns the value of the attribute of the corresponding identifier" do
104
- subject.attributes.each do |attr, value|
105
- subject.attribute(attr).should eql(value)
106
- end
107
- end
108
- end
109
-
110
- describe "#attribute=" do
111
- it "assigns the desired to the attribute of the corresponding identifier" do
112
- subject.attributes.each do |attr, value|
113
- subject.send(:attribute=, attr, "testval")
114
- end
115
-
116
- subject.attributes.each do |attr, value|
117
- subject.attribute(attr).should eql("testval")
118
- end
119
- end
120
- end
121
-
122
- describe "#attributes" do
123
- it "returns a hash of attributes" do
124
- subject.attributes.should be_a(Hash)
125
- end
126
-
127
- it "includes attribute_defaults in the attributes" do
128
- subject.class.stub(:attributes).and_return(Set.new([:val_one]))
129
- subject.class.stub(:attribute_defaults).and_return(val_one: "value")
130
-
131
- subject.attributes.should have_key(:val_one)
132
- subject.attributes[:val_one].should eql("value")
133
- end
134
- end
135
-
136
102
  describe "#save" do
137
103
  context "when the object is valid" do
138
104
  before(:each) { subject.stub(:valid?).and_return(true) }
@@ -212,62 +178,6 @@ shared_examples_for "a Ridley Resource" do |resource_klass|
212
178
  end
213
179
  end
214
180
 
215
- describe "#from_hash" do
216
- before(:each) do
217
- subject.class.attribute(:name)
218
- @object = subject.from_hash(name: "reset")
219
- end
220
-
221
- it "returns an instance of the implementing class" do
222
- @object.should be_a(subject.class)
223
- end
224
-
225
- it "assigns the attributes to the values of the corresponding keys in the given Hash" do
226
- @object.name.should eql("reset")
227
- end
228
- end
229
-
230
- describe "#to_hash" do
231
- it "returns a hash" do
232
- subject.to_hash.should be_a(Hash)
233
- end
234
-
235
- it "delegates to .attributes" do
236
- subject.should_receive(:attributes)
237
-
238
- subject.to_hash
239
- end
240
- end
241
-
242
- describe "#to_json" do
243
- it "serializes the objects attributes using MultiJson" do
244
- MultiJson.should_receive(:encode).with(subject.attributes, kind_of(Hash))
245
-
246
- subject.to_json
247
- end
248
-
249
- it "returns the seralized value" do
250
- MultiJson.stub(:encode).and_return("{}")
251
-
252
- subject.to_json.should eql("{}")
253
- end
254
- end
255
-
256
- describe "#from_json" do
257
- before(:each) do
258
- subject.class.attribute(:name)
259
- @object = subject.from_json(%({"name": "reset"}))
260
- end
261
-
262
- it "returns an instance of the implementing class" do
263
- @object.should be_a(subject.class)
264
- end
265
-
266
- it "assigns the attributes to the values of the corresponding keys in the given JSON" do
267
- @object.name.should eql("reset")
268
- end
269
- end
270
-
271
181
  describe "#reload" do
272
182
  let(:updated_subject) { double('updated_subject', attributes: { fake_attribute: "some_value" }) }
273
183
 
@@ -5,95 +5,19 @@ describe Ridley::Resource do
5
5
 
6
6
  describe "ClassMethods" do
7
7
  subject do
8
- Class.new do
9
- include Ridley::Resource
10
- end
8
+ Class.new(Ridley::Resource)
11
9
  end
12
10
 
13
11
  it_behaves_like "a Ridley Resource", subject.call
14
12
 
15
13
  describe "::initialize" do
16
- it "has an empty Hash for attributes if no attributes have been defined" do
17
- klass = subject.new(connection)
18
-
19
- klass.attributes.should be_empty
20
- end
21
-
22
- it "assigns the given attributes to the attribute hash if the attribute is defined on the class" do
23
- subject.attribute(:name)
24
- klass = subject.new(connection, name: "a name")
25
-
26
- klass.name.should eql("a name")
27
- klass.attributes.should have_key(:name)
28
- end
29
-
30
- it "skips attributes which are not defined on the class when assigning attributes" do
31
- klass = subject.new(connection, fake: "not here")
32
-
33
- klass.attributes.should_not have_key(:fake)
34
- end
35
-
36
- it "merges the default values for attributes into the attributes hash" do
37
- subject.stub(:attributes).and_return(Set.new([:name]))
38
- subject.should_receive(:attribute_defaults).and_return(name: "whatever")
39
- klass = subject.new(connection)
40
-
41
- klass.attributes[:name].should eql("whatever")
42
- end
43
-
44
- it "explicit attributes take precedence over defaults" do
45
- subject.stub(:attributes).and_return(Set.new([:name]))
46
- subject.stub(:attribute_defaults).and_return(name: "default")
47
-
48
- klass = subject.new(connection, name: "explicit_name")
49
-
50
- klass.attributes[:name].should eql("explicit_name")
51
- end
52
- end
53
-
54
- describe "::attributes" do
55
- it "returns a Set" do
56
- subject.attributes.should be_a(Set)
57
- end
58
- end
59
-
60
- describe "::attribute" do
61
- it "adds the given symbol to the attributes Set" do
62
- subject.attribute(:name)
63
-
64
- subject.attributes.should include(:name)
65
- end
66
-
67
- it "convers the given string into a symbol and adds it to the attributes Set" do
68
- subject.attribute('last_name')
69
-
70
- subject.attributes.should include(:last_name)
71
- end
72
-
73
- describe "setting a default value for the attribute" do
74
- it "allows a string as the default value for the attribute" do
75
- subject.attribute(:name, default: "jamie")
76
-
77
- subject.attribute_defaults[:name].should eql("jamie")
78
- end
79
-
80
- it "allows a false boolean as the default value for the attribute" do
81
- subject.attribute(:admin, default: false)
82
-
83
- subject.attribute_defaults[:admin].should eql(false)
84
- end
14
+ it "mass assigns the given attributes" do
15
+ new_attrs = {
16
+ name: "a name"
17
+ }
85
18
 
86
- it "allows a true boolean as the default value for the attribute" do
87
- subject.attribute(:admin, default: true)
88
-
89
- subject.attribute_defaults[:admin].should eql(true)
90
- end
91
-
92
- it "allows nil as the default value for the attribute" do
93
- subject.attribute(:certificate, default: nil)
94
-
95
- subject.attribute_defaults[:certificate].should be_nil
96
- end
19
+ subject.any_instance.should_receive(:mass_assign).with(new_attrs)
20
+ subject.new(connection, new_attrs)
97
21
  end
98
22
  end
99
23
 
@@ -119,13 +43,6 @@ describe Ridley::Resource do
119
43
 
120
44
  subject.chef_json_class.should eql("Chef::Environment")
121
45
  end
122
-
123
- it "sets the value of the :json_class attribute default to the given value" do
124
- subject.set_chef_json_class("Chef::Environment")
125
-
126
- subject.attribute_defaults.should have_key(:json_class)
127
- subject.attribute_defaults[:json_class].should eql("Chef::Environment")
128
- end
129
46
  end
130
47
 
131
48
  describe "::set_chef_id" do
@@ -162,50 +79,17 @@ describe Ridley::Resource do
162
79
  end
163
80
 
164
81
  subject do
165
- Class.new do
166
- include Ridley::Resource
167
- end.new(connection)
82
+ Class.new(Ridley::Resource).new(connection)
168
83
  end
169
84
 
170
- describe "#attribute?" do
171
- context "if the class has the attribute defined" do
172
- before(:each) do
173
- subject.class.attribute(:name)
174
- end
175
-
176
- it "returns false if the attribute has no value" do
177
- subject.name = nil
178
-
179
- subject.attribute?(:name).should be_false
180
- end
181
-
182
- it "returns true if the attribute has a value" do
183
- subject.name = "reset"
184
-
185
- subject.attribute?(:name).should be_true
186
- end
187
- end
188
-
189
- context "if the class has the attribute defined with a default value" do
190
- before(:each) do
191
- subject.class.attribute(:name, default: "exception")
192
- end
193
-
194
- it "returns true if the attribute has not been explicitly set" do
195
- subject.attribute?(:name).should be_true
196
- end
197
- end
198
-
199
- context "if the class does not have the attribute defined" do
200
- it "returns false" do
201
- subject.attribute?(:name).should be_false
202
- end
85
+ describe "#attributes=" do
86
+ subject do
87
+ Class.new(Ridley::Resource) do
88
+ attribute :name
89
+ end.new(connection)
203
90
  end
204
- end
205
91
 
206
- describe "#attributes=" do
207
92
  it "assigns the hash of attributes to the objects attributes" do
208
- subject.class.attribute(:name)
209
93
  subject.attributes = { name: "reset" }
210
94
 
211
95
  subject.attributes[:name].should eql("reset")
@@ -214,9 +98,7 @@ describe Ridley::Resource do
214
98
 
215
99
  describe "comparable" do
216
100
  subject do
217
- Class.new do
218
- include Ridley::Resource
219
-
101
+ Class.new(Ridley::Resource) do
220
102
  set_chef_id "name"
221
103
 
222
104
  attribute "name"
@@ -253,9 +135,7 @@ describe Ridley::Resource do
253
135
 
254
136
  describe "uniqueness" do
255
137
  subject do
256
- Class.new do
257
- include Ridley::Resource
258
-
138
+ Class.new(Ridley::Resource) do
259
139
  set_chef_id "name"
260
140
 
261
141
  attribute "name"
@@ -75,35 +75,7 @@ describe Ridley::Environment do
75
75
 
76
76
  subject { Ridley::Environment.new(connection) }
77
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
78
  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
79
  it "sets an override node attribute at the nested path" do
108
80
  subject.set_override_attribute('deep.nested.item', true)
109
81
 
@@ -130,10 +102,6 @@ describe Ridley::Environment do
130
102
  end
131
103
 
132
104
  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
105
  it "sets an override node attribute at the nested path" do
138
106
  subject.set_default_attribute('deep.nested.item', true)
139
107
 
@@ -50,61 +50,9 @@ describe Ridley::Node do
50
50
 
51
51
  subject { Ridley::Node.new(connection) }
52
52
 
53
- describe "#override=" do
54
- context "given a Hash" do
55
- it "returns a HashWithIndifferentAccess" do
56
- subject.override = {
57
- "key" => "value"
58
- }
59
-
60
- subject.override.should be_a(HashWithIndifferentAccess)
61
- end
62
- end
63
- end
64
-
65
- describe "#automatic=" do
66
- context "given a Hash" do
67
- it "returns a HashWithIndifferentAccess" do
68
- subject.automatic = {
69
- "key" => "value"
70
- }
71
-
72
- subject.automatic.should be_a(HashWithIndifferentAccess)
73
- end
74
- end
75
- end
76
-
77
- describe "#normal=" do
78
- context "given a Hash" do
79
- it "returns a HashWithIndifferentAccess" do
80
- subject.normal = {
81
- "key" => "value"
82
- }
83
-
84
- subject.normal.should be_a(HashWithIndifferentAccess)
85
- end
86
- end
87
- end
88
-
89
- describe "#default=" do
90
- context "given a Hash" do
91
- it "returns a HashWithIndifferentAccess" do
92
- subject.default = {
93
- "key" => "value"
94
- }
95
-
96
- subject.default.should be_a(HashWithIndifferentAccess)
97
- end
98
- end
99
- end
100
-
101
- describe "#set_attribute" do
102
- it "returns a HashWithIndifferentAccess" do
103
- subject.set_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
104
- end
105
-
53
+ describe "#set_chef_attribute" do
106
54
  it "sets an normal node attribute at the nested path" do
107
- subject.set_attribute('deep.nested.item', true)
55
+ subject.set_chef_attribute('deep.nested.item', true)
108
56
 
109
57
  subject.normal.should have_key("deep")
110
58
  subject.normal["deep"].should have_key("nested")
@@ -121,7 +69,7 @@ describe Ridley::Node do
121
69
  }
122
70
  }
123
71
  }
124
- subject.set_attribute('deep.nested.item', true)
72
+ subject.set_chef_attribute('deep.nested.item', true)
125
73
 
126
74
  subject.normal["deep"]["nested"]["item"].should be_true
127
75
  end
@@ -7,35 +7,7 @@ describe Ridley::Role do
7
7
 
8
8
  subject { Ridley::Role.new(connection) }
9
9
 
10
- describe "#override_attributes=" do
11
- context "given a Hash" do
12
- it "returns a HashWithIndifferentAccess" do
13
- subject.override_attributes = {
14
- "key" => "value"
15
- }
16
-
17
- subject.override_attributes.should be_a(HashWithIndifferentAccess)
18
- end
19
- end
20
- end
21
-
22
- describe "#default_attributes=" do
23
- context "given a Hash" do
24
- it "returns a HashWithIndifferentAccess" do
25
- subject.default_attributes = {
26
- "key" => "value"
27
- }
28
-
29
- subject.default_attributes.should be_a(HashWithIndifferentAccess)
30
- end
31
- end
32
- end
33
-
34
10
  describe "#set_override_attribute" do
35
- it "returns a HashWithIndifferentAccess" do
36
- subject.set_override_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
37
- end
38
-
39
11
  it "sets an override node attribute at the nested path" do
40
12
  subject.set_override_attribute('deep.nested.item', true)
41
13
 
@@ -62,10 +34,6 @@ describe Ridley::Role do
62
34
  end
63
35
 
64
36
  describe "#set_default_attribute" do
65
- it "returns a HashWithIndifferentAccess" do
66
- subject.set_default_attribute('deep.nested.item', true).should be_a(HashWithIndifferentAccess)
67
- end
68
-
69
37
  it "sets an override node attribute at the nested path" do
70
38
  subject.set_default_attribute('deep.nested.item', true)
71
39
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
5
- prerelease:
4
+ version: 0.7.0.beta
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jamie Winsor
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-10 00:00:00.000000000 Z
12
+ date: 2013-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.2.2
53
+ version: 0.4.1
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.2.2
61
+ version: 0.4.1
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: mixlib-log
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -123,22 +123,6 @@ dependencies:
123
123
  - - ! '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: activemodel
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: 3.2.0
134
- type: :runtime
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: 3.2.0
142
126
  - !ruby/object:Gem::Dependency
143
127
  name: activesupport
144
128
  requirement: !ruby/object:Gem::Requirement
@@ -320,12 +304,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
320
304
  required_rubygems_version: !ruby/object:Gem::Requirement
321
305
  none: false
322
306
  requirements:
323
- - - ! '>='
307
+ - - ! '>'
324
308
  - !ruby/object:Gem::Version
325
- version: '0'
326
- segments:
327
- - 0
328
- hash: -3636346058198245509
309
+ version: 1.3.1
329
310
  requirements: []
330
311
  rubyforge_project:
331
312
  rubygems_version: 1.8.23