poise 2.3.2 → 2.4.0

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: 4fb584605a370cd20300d0456630ffe8a0d5351a
4
- data.tar.gz: 7df0b817befc116a8cb5e8729ee604707771ae1b
3
+ metadata.gz: 2670b11e79bcee699172c7eaa7a842df9432324e
4
+ data.tar.gz: 56e5b571574d41de09f7af34da94034557fa741a
5
5
  SHA512:
6
- metadata.gz: fc97265d1907474050c72893815a35c1b20a31dbd1740bdb8d05ab70a60fb9e28dc0850a1afc52ad4202a49834c99580c2f139e8133cbcc5401af01c7c47aff9
7
- data.tar.gz: d4c49153950ba2736fba3d4f24054543edd4cf2c464205a40a73dca08257288ce8de497db11b8025da080cb76c76cedafb56dd320d6e367eab1e508b065aadd8
6
+ metadata.gz: 58b803a269f764c6a061077d27f608d14e14f572c2e016f3986eeee22adc39bf408683cac41c6714b32bc4ad56dba6d03e87095e1c228d6edebc6d744a685209
7
+ data.tar.gz: 047b174a37deae87fb3658b6e465be97fe86826028d4575c2f46298d573115eb1c83794289df262b66f6771f9d538ea14f07851aeb139d779cd9f22a38b69874
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## v2.4.0
4
+
5
+ * Added return value to `Container#register_subresource` to track if the resource
6
+ was already added.
7
+ * Improve inspect output for subresources and containers.
8
+ * Ensure notifications work with subresources.
9
+ * Inversion providers process name equivalences.
10
+
3
11
  ## v2.3.2
4
12
 
5
13
  * Improve handling of deeply nested subresources.
data/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  ## What is Poise?
11
11
 
12
12
  The poise cookbook is a set of libraries for writing reusable cookbooks. It
13
- providers helpers for common patterns and a standard structure to make it easier to create flexible cookbooks.
13
+ provides helpers for common patterns and a standard structure to make it easier to create flexible cookbooks.
14
14
 
15
15
  ## Writing your first resource
16
16
 
@@ -78,7 +78,11 @@ module Poise
78
78
  # end
79
79
  def provider(val=nil)
80
80
  if val && !val.is_a?(Class)
81
- provider_class = Poise::Helpers::Inversion.provider_for(resource_name, node, val)
81
+ resource_names = [resource_name]
82
+ # If subclass_providers! might be in play, check for those names too.
83
+ resource_names.concat(self.class.subclass_resource_equivalents) if self.class.respond_to?(:subclass_resource_equivalents)
84
+ # Silly ruby tricks to find the first provider that exists and no more.
85
+ provider_class = resource_names.lazy.map {|name| Poise::Helpers::Inversion.provider_for(name, node, val) }.select {|x| x }.first
82
86
  Chef::Log.debug("[#{self}] Checking for an inversion provider for #{val}: #{provider_class && provider_class.name}")
83
87
  val = provider_class if provider_class
84
88
  end
@@ -27,8 +27,8 @@ module Poise
27
27
  include ResourceName
28
28
 
29
29
  module ClassMethods
30
- def subclass_providers!(superclass_resource_name=nil)
31
- resource_name = self.resource_name
30
+ def subclass_providers!(superclass_resource_name=nil, resource_name: nil)
31
+ resource_name ||= self.resource_name
32
32
  superclass_resource_name ||= if superclass.respond_to?(:resource_name)
33
33
  superclass.resource_name
34
34
  elsif superclass.respond_to?(:dsl_name)
@@ -57,6 +57,7 @@ module Poise
57
57
  else
58
58
  subclass_resource_equivalents << superclass_resource_name
59
59
  end
60
+ subclass_resource_equivalents.uniq!
60
61
  end
61
62
 
62
63
  # An array of names for the resources this class is equivalent to for
@@ -37,6 +37,10 @@ module Poise
37
37
  @resource = resource
38
38
  end
39
39
 
40
+ def inspect
41
+ to_text
42
+ end
43
+
40
44
  def to_text
41
45
  if @resource.nil?
42
46
  'nil'
@@ -31,6 +31,10 @@ module Poise
31
31
  # is used to show the value of @subresources during Chef's error formatting.
32
32
  # @api private
33
33
  class NoPrintingResourceCollection < Chef::ResourceCollection
34
+ def inspect
35
+ to_text
36
+ end
37
+
34
38
  def to_text
35
39
  "[#{all_resources.map(&:to_s).join(', ')}]"
36
40
  end
@@ -80,12 +84,24 @@ module Poise
80
84
  end
81
85
  @run_context.resource_collection.insert(order_fixer)
82
86
  @subcontexts.each do |ctx|
87
+ # Copy all resources to the outer context.
83
88
  ctx.resource_collection.each do |r|
84
89
  Chef::Log.debug(" * #{r}")
85
90
  # Fix the subresource to use the outer run context.
86
91
  r.run_context = @run_context
87
92
  @run_context.resource_collection.insert(r)
88
93
  end
94
+ # Copy all notifications to the outer context.
95
+ %w{immediate delayed}.each do |notification_type|
96
+ ctx.send(:"#{notification_type}_notification_collection").each do |key, notifications|
97
+ notifications.each do |notification|
98
+ parent_notifications = @run_context.send(:"#{notification_type}_notification_collection")[key]
99
+ unless parent_notifications.any? { |existing_notification| existing_notification.duplicates?(notification) }
100
+ parent_notifications << notification
101
+ end
102
+ end
103
+ end
104
+ end
89
105
  end
90
106
  Chef::Log.debug("Collection: #{@run_context.resource_collection.map(&:to_s).join(', ')}")
91
107
  end
@@ -140,11 +156,19 @@ module Poise
140
156
  resource.first
141
157
  end
142
158
 
159
+ # Register a resource as part of this container. Returns true if the
160
+ # resource was added to the collection and false if it was already
161
+ # known.
162
+ #
163
+ # @note Return value added in 2.4.0.
164
+ # @return [Boolean]
143
165
  def register_subresource(resource)
144
166
  subresources.lookup(resource)
167
+ false
145
168
  rescue Chef::Exceptions::ResourceNotFound
146
169
  Chef::Log.debug("[#{self}] Adding #{resource} to subresources")
147
170
  subresources.insert(resource)
171
+ true
148
172
  end
149
173
 
150
174
  private
@@ -193,6 +217,7 @@ module Poise
193
217
  super
194
218
  klass.extend(ClassMethods)
195
219
  klass.const_get(:HIDDEN_IVARS) << :@subcontexts
220
+ klass.const_get(:FORBIDDEN_IVARS) << :@subcontexts
196
221
  end
197
222
  end
198
223
 
data/lib/poise/version.rb CHANGED
@@ -16,5 +16,5 @@
16
16
 
17
17
 
18
18
  module Poise
19
- VERSION = '2.3.2'
19
+ VERSION = '2.4.0'
20
20
  end
@@ -29,7 +29,7 @@ module PoiseTestSubclass
29
29
  include Poise
30
30
  provides(:poise_test_subclass)
31
31
  def action_run
32
- node.run_state[:really_did_run] = true
32
+ (node.run_state[:really_did_run] ||= []) << new_resource.name
33
33
  end
34
34
  end
35
35
  end
@@ -45,7 +45,24 @@ describe Poise::Helpers::ResourceSubclass do
45
45
  end
46
46
 
47
47
  it { is_expected.to run_poise_sub('test') }
48
- it { expect(chef_run.node.run_state[:really_did_run]).to be true }
48
+ it { expect(chef_run.node.run_state[:really_did_run]).to eq %w{test} }
49
+
50
+ context 'with multiple resource names' do
51
+ before { step_into << :poise_test_subclass_other_name }
52
+ resource(:poise_sub, parent: PoiseTestSubclass::Resource) do
53
+ provides(:poise_sub)
54
+ provides(:poise_test_subclass_other_name)
55
+ subclass_providers!
56
+ end
57
+ recipe do
58
+ poise_sub 'test'
59
+ poise_test_subclass_other_name 'test2'
60
+ end
61
+
62
+ it { is_expected.to run_poise_sub('test') }
63
+ it { is_expected.to ChefSpec::Matchers::ResourceMatcher.new('poise_test_subclass_other_name', 'run', 'test2') }
64
+ it { expect(chef_run.node.run_state[:really_did_run]).to eq %w{test test2} }
65
+ end # /context with multiple resource names
49
66
  end # /describe .subclass_providers!
50
67
 
51
68
  describe '.subclass_resource_equivalents' do
@@ -286,4 +286,54 @@ describe Poise::Helpers::Subresources::Container do
286
286
  it { is_expected.to run_poise_child('three').with(parent: chef_run.poise_parent('two'), order: 3) }
287
287
  end # /context un-nested
288
288
  end # /describe triple nesting
289
+
290
+ describe 'subresources with notifications' do
291
+ step_into(:ruby_block)
292
+ resource(:poise_parent) do
293
+ include described_class
294
+ end
295
+ provider(:poise_parent)
296
+ resource(:poise_child) do
297
+ include Poise::Helpers::Subresources::Child
298
+ parent_type :poise_parent
299
+ end
300
+ provider(:poise_child) do
301
+ def action_run
302
+ new_resource.updated_by_last_action(true)
303
+ end
304
+ end
305
+ subject { chef_run.node.run_state['poise_notified'] }
306
+
307
+ context 'delayed notification' do
308
+ recipe(subject: false) do
309
+ ruby_block 'one' do
310
+ action :nothing
311
+ block { node.run_state['poise_notified'] = true }
312
+ end
313
+ poise_parent 'two' do
314
+ poise_child 'three' do
315
+ notifies :run, 'ruby_block[one]', :delayed
316
+ end
317
+ end
318
+ end
319
+
320
+ it { is_expected.to be true }
321
+ end # /context delayed notification
322
+
323
+ context 'immediate notification' do
324
+ recipe(subject: false) do
325
+ ruby_block 'one' do
326
+ action :nothing
327
+ block { node.run_state['poise_notified'] = true }
328
+ end
329
+ poise_parent 'two' do
330
+ poise_child 'three' do
331
+ notifies :run, 'ruby_block[one]', :immediately
332
+ end
333
+ end
334
+ end
335
+
336
+ it { is_expected.to be true }
337
+ end # /context immediate notification
338
+ end # /describe subresources with notifications
289
339
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poise
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noah Kantrowitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-31 00:00:00.000000000 Z
11
+ date: 2015-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: halite