compat_resource 12.5.10 → 12.5.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0fa16b436f408af71be67cea805e6efe50489f91
4
- data.tar.gz: d9d1497a1f8053979e585cd1058b7d536dc93e65
3
+ metadata.gz: 945c69b844a9383c193df2623398c426f0022340
4
+ data.tar.gz: 1b6533381e1f85a1f12bd80042059f5ad2ea6ee5
5
5
  SHA512:
6
- metadata.gz: f29ddaf1dfee4d494888d4afd987696ecb393bd18d371049e71ae1b398292da6708c49d41b9a35e6084b2b734d6fff44c996393755cbe0dca90c1a2563262ec5
7
- data.tar.gz: f4747ca15c2b9ff2ca15e867f61168974657df45af2b2c7b625f90b70904e657e35d2746aeab9bf215ad776c9bbd515f67cf875d00f7e1c53e61a3b8e3a9d0a9
6
+ metadata.gz: e356b9380f8e99b432ab210d70134e1f6a711ef3b25db04f0998ae4cc83549fdb5b9a38c8fda4c0487a4718bfe26eb1c4a850e46333b3c84021893c8e009d97f
7
+ data.tar.gz: e398d09c2e35040aa9eff70979289126a322734157a5bae4b0207980df58e7fb1db5b07a13cca2375893c074a68d2cf195ad20e2bf4567ae28dbbec203ad0948
data/Rakefile CHANGED
@@ -15,11 +15,15 @@ task default: :spec
15
15
  #
16
16
  CHEF_FILES = %w(chef/constants chef/delayed_evaluator chef/property
17
17
  chef/resource chef/resource/action_class chef/provider
18
- chef/mixin/params_validate)
19
- SPEC_FILES = %w(unit/property_spec.rb unit/property/state_spec.rb unit/property/validation_spec.rb
18
+ chef/mixin/params_validate chef/mixin/properties)
19
+ SPEC_FILES = %w(unit/mixin/properties_spec.rb
20
+ unit/property_spec.rb
21
+ unit/property/state_spec.rb
22
+ unit/property/validation_spec.rb
20
23
  integration/recipes/resource_action_spec.rb
21
24
  integration/recipes/resource_converge_if_changed_spec.rb
22
- integration/recipes/resource_load_spec.rb)
25
+ integration/recipes/resource_load_spec.rb
26
+ )
23
27
  KEEP_FUNCTIONS = {
24
28
  'chef/resource' => %w(
25
29
  initialize
@@ -49,7 +53,7 @@ KEEP_FUNCTIONS = {
49
53
  ),
50
54
  }
51
55
  KEEP_INCLUDES = {
52
- 'chef/resource' => %w(Chef::Mixin::ParamsValidate),
56
+ 'chef/resource' => %w(Chef::Mixin::ParamsValidate Chef::Mixin::Properties),
53
57
  'chef/provider' => [],
54
58
  }
55
59
  KEEP_CLASSES = {
@@ -1,5 +1,6 @@
1
1
  require 'chef_compat/version'
2
2
  require 'chef_compat/resource'
3
+ require 'chef_compat/mixin/properties'
3
4
 
4
5
  module ChefCompat
5
6
  end
@@ -0,0 +1,324 @@
1
+ require 'chef_compat/copied_from_chef'
2
+ class Chef
3
+ module ::ChefCompat
4
+ module CopiedFromChef
5
+ require 'chef_compat/copied_from_chef/chef/delayed_evaluator'
6
+ require 'chef_compat/copied_from_chef/chef/mixin/params_validate'
7
+ require 'chef_compat/copied_from_chef/chef/property'
8
+
9
+ class Chef < (defined?(::Chef) ? ::Chef : Object)
10
+ module Mixin
11
+ if defined?(::Chef::Mixin)
12
+ require 'chef_compat/delegating_class'
13
+ extend DelegatingClass
14
+ @delegates_to = ::Chef::Mixin
15
+ end
16
+ module Properties
17
+ if defined?(::Chef::Mixin::Properties)
18
+ require 'chef_compat/delegating_class'
19
+ extend DelegatingClass
20
+ @delegates_to = ::Chef::Mixin::Properties
21
+ end
22
+ module ClassMethods
23
+ if defined?(::Chef::Mixin::Properties::ClassMethods)
24
+ require 'chef_compat/delegating_class'
25
+ extend DelegatingClass
26
+ @delegates_to = ::Chef::Mixin::Properties::ClassMethods
27
+ end
28
+ #
29
+ # The list of properties defined on this resource.
30
+ #
31
+ # Everything defined with `property` is in this list.
32
+ #
33
+ # @param include_superclass [Boolean] `true` to include properties defined
34
+ # on superclasses; `false` or `nil` to return the list of properties
35
+ # directly on this class.
36
+ #
37
+ # @return [Hash<Symbol,Property>] The list of property names and types.
38
+ #
39
+ def properties(include_superclass=true)
40
+ if include_superclass
41
+ result = {}
42
+ ancestors.reverse_each { |c| result.merge!(c.properties(false)) if c.respond_to?(:properties) }
43
+ result
44
+ else
45
+ @properties ||= {}
46
+ end
47
+ end
48
+
49
+ #
50
+ # Create a property on this resource class.
51
+ #
52
+ # If a superclass has this property, or if this property has already been
53
+ # defined by this resource, this will *override* the previous value.
54
+ #
55
+ # @param name [Symbol] The name of the property.
56
+ # @param type [Object,Array<Object>] The type(s) of this property.
57
+ # If present, this is prepended to the `is` validation option.
58
+ # @param options [Hash<Symbol,Object>] Validation options.
59
+ # @option options [Object,Array] :is An object, or list of
60
+ # objects, that must match the value using Ruby's `===` operator
61
+ # (`options[:is].any? { |v| v === value }`).
62
+ # @option options [Object,Array] :equal_to An object, or list
63
+ # of objects, that must be equal to the value using Ruby's `==`
64
+ # operator (`options[:is].any? { |v| v == value }`)
65
+ # @option options [Regexp,Array<Regexp>] :regex An object, or
66
+ # list of objects, that must match the value with `regex.match(value)`.
67
+ # @option options [Class,Array<Class>] :kind_of A class, or
68
+ # list of classes, that the value must be an instance of.
69
+ # @option options [Hash<String,Proc>] :callbacks A hash of
70
+ # messages -> procs, all of which match the value. The proc must
71
+ # return a truthy or falsey value (true means it matches).
72
+ # @option options [Symbol,Array<Symbol>] :respond_to A method
73
+ # name, or list of method names, the value must respond to.
74
+ # @option options [Symbol,Array<Symbol>] :cannot_be A property,
75
+ # or a list of properties, that the value cannot have (such as `:nil` or
76
+ # `:empty`). The method with a questionmark at the end is called on the
77
+ # value (e.g. `value.empty?`). If the value does not have this method,
78
+ # it is considered valid (i.e. if you don't respond to `empty?` we
79
+ # assume you are not empty).
80
+ # @option options [Proc] :coerce A proc which will be called to
81
+ # transform the user input to canonical form. The value is passed in,
82
+ # and the transformed value returned as output. Lazy values will *not*
83
+ # be passed to this method until after they are evaluated. Called in the
84
+ # context of the resource (meaning you can access other properties).
85
+ # @option options [Boolean] :required `true` if this property
86
+ # must be present; `false` otherwise. This is checked after the resource
87
+ # is fully initialized.
88
+ # @option options [Boolean] :name_property `true` if this
89
+ # property defaults to the same value as `name`. Equivalent to
90
+ # `default: lazy { name }`, except that #property_is_set? will
91
+ # return `true` if the property is set *or* if `name` is set.
92
+ # @option options [Boolean] :name_attribute Same as `name_property`.
93
+ # @option options [Object] :default The value this property
94
+ # will return if the user does not set one. If this is `lazy`, it will
95
+ # be run in the context of the instance (and able to access other
96
+ # properties).
97
+ # @option options [Boolean] :desired_state `true` if this property is
98
+ # part of desired state. Defaults to `true`.
99
+ # @option options [Boolean] :identity `true` if this property
100
+ # is part of object identity. Defaults to `false`.
101
+ #
102
+ # @example Bare property
103
+ # property :x
104
+ #
105
+ # @example With just a type
106
+ # property :x, String
107
+ #
108
+ # @example With just options
109
+ # property :x, default: 'hi'
110
+ #
111
+ # @example With type and options
112
+ # property :x, String, default: 'hi'
113
+ #
114
+ def property(name, type=NOT_PASSED, **options)
115
+ name = name.to_sym
116
+
117
+ options.each { |k,v| options[k.to_sym] = v if k.is_a?(String) }
118
+
119
+ options[:instance_variable_name] = :"@#{name}" if !options.has_key?(:instance_variable_name)
120
+ options.merge!(name: name, declared_in: self)
121
+
122
+ if type == NOT_PASSED
123
+ # If a type is not passed, the property derives from the
124
+ # superclass property (if any)
125
+ if properties.has_key?(name)
126
+ property = properties[name].derive(**options)
127
+ else
128
+ property = property_type(**options)
129
+ end
130
+
131
+ # If a Property is specified, derive a new one from that.
132
+ elsif type.is_a?(Property) || (type.is_a?(Class) && type <= Property)
133
+ property = type.derive(**options)
134
+
135
+ # If a primitive type was passed, combine it with "is"
136
+ else
137
+ if options[:is]
138
+ options[:is] = ([ type ] + [ options[:is] ]).flatten(1)
139
+ else
140
+ options[:is] = type
141
+ end
142
+ property = property_type(**options)
143
+ end
144
+
145
+ local_properties = properties(false)
146
+ local_properties[name] = property
147
+
148
+ property.emit_dsl
149
+ end
150
+
151
+ #
152
+ # Create a reusable property type that can be used in multiple properties
153
+ # in different resources.
154
+ #
155
+ # @param options [Hash<Symbol,Object>] Validation options. see #property for
156
+ # the list of options.
157
+ #
158
+ # @example
159
+ # property_type(default: 'hi')
160
+ #
161
+ def property_type(**options)
162
+ Property.derive(**options)
163
+ end
164
+
165
+ #
166
+ # Create a lazy value for assignment to a default value.
167
+ #
168
+ # @param block The block to run when the value is retrieved.
169
+ #
170
+ # @return [Chef::DelayedEvaluator] The lazy value
171
+ #
172
+ def lazy(&block)
173
+ DelayedEvaluator.new(&block)
174
+ end
175
+
176
+ #
177
+ # Get or set the list of desired state properties for this resource.
178
+ #
179
+ # State properties are properties that describe the desired state
180
+ # of the system, such as file permissions or ownership.
181
+ # In general, state properties are properties that could be populated by
182
+ # examining the state of the system (e.g., File.stat can tell you the
183
+ # permissions on an existing file). Contrarily, properties that are not
184
+ # "state properties" usually modify the way Chef itself behaves, for example
185
+ # by providing additional options for a package manager to use when
186
+ # installing a package.
187
+ #
188
+ # This list is used by the Chef client auditing system to extract
189
+ # information from resources to describe changes made to the system.
190
+ #
191
+ # This method is unnecessary when declaring properties with `property`;
192
+ # properties are added to state_properties by default, and can be turned off
193
+ # with `desired_state: false`.
194
+ #
195
+ # ```ruby
196
+ # property :x # part of desired state
197
+ # property :y, desired_state: false # not part of desired state
198
+ # ```
199
+ #
200
+ # @param names [Array<Symbol>] A list of property names to set as desired
201
+ # state.
202
+ #
203
+ # @return [Array<Property>] All properties in desired state.
204
+ #
205
+ def state_properties(*names)
206
+ if !names.empty?
207
+ names = names.map { |name| name.to_sym }.uniq
208
+
209
+ local_properties = properties(false)
210
+ # Add new properties to the list.
211
+ names.each do |name|
212
+ property = properties[name]
213
+ if !property
214
+ self.property name, instance_variable_name: false, desired_state: true
215
+ elsif !property.desired_state?
216
+ self.property name, desired_state: true
217
+ end
218
+ end
219
+
220
+ # If state_attrs *excludes* something which is currently desired state,
221
+ # mark it as desired_state: false.
222
+ local_properties.each do |name,property|
223
+ if property.desired_state? && !names.include?(name)
224
+ self.property name, desired_state: false
225
+ end
226
+ end
227
+ end
228
+
229
+ properties.values.select { |property| property.desired_state? }
230
+ end
231
+
232
+ #
233
+ # Set the identity of this resource to a particular set of properties.
234
+ #
235
+ # This drives #identity, which returns data that uniquely refers to a given
236
+ # resource on the given node (in such a way that it can be correlated
237
+ # across Chef runs).
238
+ #
239
+ # This method is unnecessary when declaring properties with `property`;
240
+ # properties can be added to identity during declaration with
241
+ # `identity: true`.
242
+ #
243
+ # ```ruby
244
+ # property :x, identity: true # part of identity
245
+ # property :y # not part of identity
246
+ # ```
247
+ #
248
+ # If no properties are marked as identity, "name" is considered the identity.
249
+ #
250
+ # @param names [Array<Symbol>] A list of property names to set as the identity.
251
+ #
252
+ # @return [Array<Property>] All identity properties.
253
+ #
254
+ def identity_properties(*names)
255
+ if !names.empty?
256
+ names = names.map { |name| name.to_sym }
257
+
258
+ # Add or change properties that are not part of the identity.
259
+ names.each do |name|
260
+ property = properties[name]
261
+ if !property
262
+ self.property name, instance_variable_name: false, identity: true
263
+ elsif !property.identity?
264
+ self.property name, identity: true
265
+ end
266
+ end
267
+
268
+ # If identity_properties *excludes* something which is currently part of
269
+ # the identity, mark it as identity: false.
270
+ properties.each do |name,property|
271
+ if property.identity? && !names.include?(name)
272
+
273
+ self.property name, identity: false
274
+ end
275
+ end
276
+ end
277
+
278
+ result = properties.values.select { |property| property.identity? }
279
+ result = [ properties[:name] ] if result.empty?
280
+ result
281
+ end
282
+
283
+ def included(other)
284
+ other.extend ClassMethods
285
+ end
286
+ end
287
+
288
+ def self.included(other)
289
+ other.extend ClassMethods
290
+ end
291
+
292
+ include Chef::Mixin::ParamsValidate
293
+
294
+ #
295
+ # Whether this property has been set (or whether it has a default that has
296
+ # been retrieved).
297
+ #
298
+ # @param name [Symbol] The name of the property.
299
+ # @return [Boolean] `true` if the property has been set.
300
+ #
301
+ def property_is_set?(name)
302
+ property = self.class.properties[name.to_sym]
303
+ raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
304
+ property.is_set?(self)
305
+ end
306
+
307
+ #
308
+ # Clear this property as if it had never been set. It will thereafter return
309
+ # the default.
310
+ # been retrieved).
311
+ #
312
+ # @param name [Symbol] The name of the property.
313
+ #
314
+ def reset_property(name)
315
+ property = self.class.properties[name.to_sym]
316
+ raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
317
+ property.reset(self)
318
+ end
319
+ end
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
@@ -28,26 +28,39 @@ super if defined?(::Chef::Provider)
28
28
  specified_properties = properties.select { |property| new_resource.property_is_set?(property) }
29
29
  modified = specified_properties.select { |p| new_resource.send(p) != current_resource.send(p) }
30
30
  if modified.empty?
31
- Chef::Log.debug("Skipping update of #{new_resource.to_s}: has not changed any of the specified properties #{specified_properties.map { |p| "#{p}=#{new_resource.send(p).inspect}" }.join(", ")}.")
31
+ properties_str = if sensitive
32
+ specified_properties.join(", ")
33
+ else
34
+ specified_properties.map { |p| "#{p}=#{new_resource.send(p).inspect}" }.join(", ")
35
+ end
36
+ Chef::Log.debug("Skipping update of #{new_resource.to_s}: has not changed any of the specified properties #{properties_str}.")
32
37
  return false
33
38
  end
34
39
 
35
40
  # Print the pretty green text and run the block
36
41
  property_size = modified.map { |p| p.size }.max
37
- modified = modified.map { |p| " set #{p.to_s.ljust(property_size)} to #{new_resource.send(p).inspect} (was #{current_resource.send(p).inspect})" }
42
+ modified.map! do |p|
43
+ properties_str = if sensitive
44
+ '(suppressed sensitive property)'
45
+ else
46
+ "#{new_resource.send(p).inspect} (was #{current_resource.send(p).inspect})"
47
+ end
48
+ " set #{p.to_s.ljust(property_size)} to #{properties_str}"
49
+ end
38
50
  converge_by([ "update #{current_resource.identity}" ] + modified, &converge_block)
39
51
 
40
52
  else
41
53
  # The resource doesn't exist. Mark that we are *creating* this, and
42
54
  # write down any properties we are setting.
43
55
  property_size = properties.map { |p| p.size }.max
44
- created = []
45
- properties.each do |property|
46
- if new_resource.property_is_set?(property)
47
- created << " set #{property.to_s.ljust(property_size)} to #{new_resource.send(property).inspect}"
56
+ created = properties.map do |property|
57
+ default = ' (default value)' unless new_resource.property_is_set?(property)
58
+ properties_str = if sensitive
59
+ '(suppressed sensitive property)'
48
60
  else
49
- created << " set #{property.to_s.ljust(property_size)} to #{new_resource.send(property).inspect} (default value)"
61
+ new_resource.send(property).inspect
50
62
  end
63
+ " set #{property.to_s.ljust(property_size)} to #{properties_str}#{default}"
51
64
  end
52
65
 
53
66
  converge_by([ "create #{new_resource.identity}" ] + created, &converge_block)
@@ -2,10 +2,12 @@ require 'chef_compat/copied_from_chef'
2
2
  class Chef
3
3
  module ::ChefCompat
4
4
  module CopiedFromChef
5
- require 'chef_compat/copied_from_chef/chef/mixin/params_validate'
6
5
  require 'chef_compat/copied_from_chef/chef/resource/action_class'
6
+ require 'chef_compat/copied_from_chef/chef/mixin/properties'
7
7
  class Chef < (defined?(::Chef) ? ::Chef : Object)
8
8
  class Resource < (defined?(::Chef::Resource) ? ::Chef::Resource : Object)
9
+ include Chef::Mixin::Properties
10
+ property :name, String, coerce: proc { |v| v.is_a?(Array) ? v.join(', ') : v.to_s }, desired_state: false
9
11
  def initialize(name, run_context=nil)
10
12
  super if defined?(::Chef::Resource)
11
13
  name(name) unless name.nil?
@@ -35,18 +37,6 @@ super if defined?(::Chef::Resource)
35
37
  @elapsed_time = 0
36
38
  @sensitive = false
37
39
  end
38
- def self.properties(include_superclass=true)
39
- @properties ||= {}
40
- if include_superclass
41
- if superclass.respond_to?(:properties)
42
- superclass.properties.merge(@properties)
43
- else
44
- @properties.dup
45
- end
46
- else
47
- @properties
48
- end
49
- end
50
40
  def action(arg=nil)
51
41
  if arg
52
42
  arg = Array(arg).map(&:to_sym)
@@ -82,113 +72,6 @@ super if defined?(::Chef::Resource)
82
72
  return result.values.first if identity_properties.size == 1
83
73
  result
84
74
  end
85
- include Chef::Mixin::ParamsValidate
86
- def self.property(name, type=NOT_PASSED, **options)
87
- name = name.to_sym
88
-
89
- options.each { |k,v| options[k.to_sym] = v if k.is_a?(String) }
90
-
91
- options[:instance_variable_name] = :"@#{name}" if !options.has_key?(:instance_variable_name)
92
- options.merge!(name: name, declared_in: self)
93
-
94
- if type == NOT_PASSED
95
- # If a type is not passed, the property derives from the
96
- # superclass property (if any)
97
- if properties.has_key?(name)
98
- property = properties[name].derive(**options)
99
- else
100
- property = property_type(**options)
101
- end
102
-
103
- # If a Property is specified, derive a new one from that.
104
- elsif type.is_a?(Property) || (type.is_a?(Class) && type <= Property)
105
- property = type.derive(**options)
106
-
107
- # If a primitive type was passed, combine it with "is"
108
- else
109
- if options[:is]
110
- options[:is] = ([ type ] + [ options[:is] ]).flatten(1)
111
- else
112
- options[:is] = type
113
- end
114
- property = property_type(**options)
115
- end
116
-
117
- local_properties = properties(false)
118
- local_properties[name] = property
119
-
120
- property.emit_dsl
121
- end
122
- def self.property_type(**options)
123
- Property.derive(**options)
124
- end
125
- property :name, String, coerce: proc { |v| v.is_a?(Array) ? v.join(', ') : v.to_s }, desired_state: false
126
- def property_is_set?(name)
127
- property = self.class.properties[name.to_sym]
128
- raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
129
- property.is_set?(self)
130
- end
131
- def reset_property(name)
132
- property = self.class.properties[name.to_sym]
133
- raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
134
- property.reset(self)
135
- end
136
- def self.lazy(&block)
137
- DelayedEvaluator.new(&block)
138
- end
139
- def self.state_properties(*names)
140
- if !names.empty?
141
- names = names.map { |name| name.to_sym }.uniq
142
-
143
- local_properties = properties(false)
144
- # Add new properties to the list.
145
- names.each do |name|
146
- property = properties[name]
147
- if !property
148
- self.property name, instance_variable_name: false, desired_state: true
149
- elsif !property.desired_state?
150
- self.property name, desired_state: true
151
- end
152
- end
153
-
154
- # If state_attrs *excludes* something which is currently desired state,
155
- # mark it as desired_state: false.
156
- local_properties.each do |name,property|
157
- if property.desired_state? && !names.include?(name)
158
- self.property name, desired_state: false
159
- end
160
- end
161
- end
162
-
163
- properties.values.select { |property| property.desired_state? }
164
- end
165
- def self.identity_properties(*names)
166
- if !names.empty?
167
- names = names.map { |name| name.to_sym }
168
-
169
- # Add or change properties that are not part of the identity.
170
- names.each do |name|
171
- property = properties[name]
172
- if !property
173
- self.property name, instance_variable_name: false, identity: true
174
- elsif !property.identity?
175
- self.property name, identity: true
176
- end
177
- end
178
-
179
- # If identity_properties *excludes* something which is currently part of
180
- # the identity, mark it as identity: false.
181
- properties.each do |name,property|
182
- if property.identity? && !names.include?(name)
183
- self.property name, identity: false
184
- end
185
- end
186
- end
187
-
188
- result = properties.values.select { |property| property.identity? }
189
- result = [ properties[:name] ] if result.empty?
190
- result
191
- end
192
75
  def self.identity_property(name=nil)
193
76
  result = identity_properties(*Array(name))
194
77
  if result.size > 1
@@ -0,0 +1,8 @@
1
+ require 'chef_compat/monkeypatches'
2
+ require 'chef_compat/copied_from_chef/chef/mixin/properties'
3
+
4
+ module ChefCompat
5
+ module Mixin
6
+ Properties = ChefCompat::CopiedFromChef::Chef::Mixin::Properties
7
+ end
8
+ end
@@ -3,7 +3,7 @@ class Chef
3
3
  # Earlier versions of Chef didn't have this message
4
4
  module ChefCompatDeprecation
5
5
  def log_deprecation(message, location=nil)
6
- if superclass.respond_to?(:log_deprecation)
6
+ if superclass.method(:log_deprecation).owner != ChefCompatDeprecation
7
7
  if !location
8
8
  # Pick the first caller that is *not* part of the Chef or ChefCompat gem,
9
9
  # that's the thing the user wrote.
@@ -1,3 +1,3 @@
1
1
  module ChefCompat
2
- VERSION = '12.5.10' if !defined?(VERSION)
2
+ VERSION = '12.5.11' if !defined?(VERSION)
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compat_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.5.10
4
+ version: 12.5.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-20 00:00:00.000000000 Z
11
+ date: 2015-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -96,11 +96,13 @@ files:
96
96
  - files/lib/chef_compat/copied_from_chef/chef/constants.rb
97
97
  - files/lib/chef_compat/copied_from_chef/chef/delayed_evaluator.rb
98
98
  - files/lib/chef_compat/copied_from_chef/chef/mixin/params_validate.rb
99
+ - files/lib/chef_compat/copied_from_chef/chef/mixin/properties.rb
99
100
  - files/lib/chef_compat/copied_from_chef/chef/property.rb
100
101
  - files/lib/chef_compat/copied_from_chef/chef/provider.rb
101
102
  - files/lib/chef_compat/copied_from_chef/chef/resource.rb
102
103
  - files/lib/chef_compat/copied_from_chef/chef/resource/action_class.rb
103
104
  - files/lib/chef_compat/delegating_class.rb
105
+ - files/lib/chef_compat/mixin/properties.rb
104
106
  - files/lib/chef_compat/monkeypatches.rb
105
107
  - files/lib/chef_compat/monkeypatches/chef.rb
106
108
  - files/lib/chef_compat/monkeypatches/chef/exceptions.rb