poise 2.0.0

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.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.kitchen.travis.yml +9 -0
  4. data/.kitchen.yml +18 -0
  5. data/.rubocop.yml +2 -0
  6. data/.travis.yml +25 -0
  7. data/.yardopts +5 -0
  8. data/Berksfile +26 -0
  9. data/Berksfile.lock +10 -0
  10. data/CHANGELOG.md +58 -0
  11. data/Gemfile +32 -0
  12. data/LICENSE +202 -0
  13. data/README.md +198 -0
  14. data/Rakefile +17 -0
  15. data/lib/poise.rb +71 -0
  16. data/lib/poise/error.rb +24 -0
  17. data/lib/poise/helpers.rb +33 -0
  18. data/lib/poise/helpers/chefspec_matchers.rb +92 -0
  19. data/lib/poise/helpers/defined_in.rb +111 -0
  20. data/lib/poise/helpers/fused.rb +127 -0
  21. data/lib/poise/helpers/include_recipe.rb +62 -0
  22. data/lib/poise/helpers/inversion.rb +374 -0
  23. data/lib/poise/helpers/inversion/options_provider.rb +41 -0
  24. data/lib/poise/helpers/inversion/options_resource.rb +101 -0
  25. data/lib/poise/helpers/lazy_default.rb +62 -0
  26. data/lib/poise/helpers/lwrp_polyfill.rb +96 -0
  27. data/lib/poise/helpers/notifying_block.rb +78 -0
  28. data/lib/poise/helpers/option_collector.rb +117 -0
  29. data/lib/poise/helpers/resource_name.rb +99 -0
  30. data/lib/poise/helpers/subcontext_block.rb +58 -0
  31. data/lib/poise/helpers/subresources.rb +29 -0
  32. data/lib/poise/helpers/subresources/child.rb +217 -0
  33. data/lib/poise/helpers/subresources/container.rb +165 -0
  34. data/lib/poise/helpers/subresources/default_containers.rb +73 -0
  35. data/lib/poise/helpers/template_content.rb +165 -0
  36. data/lib/poise/provider.rb +55 -0
  37. data/lib/poise/resource.rb +75 -0
  38. data/lib/poise/subcontext.rb +27 -0
  39. data/lib/poise/subcontext/resource_collection.rb +56 -0
  40. data/lib/poise/subcontext/runner.rb +50 -0
  41. data/lib/poise/utils.rb +60 -0
  42. data/lib/poise/utils/resource_provider_mixin.rb +53 -0
  43. data/lib/poise/version.rb +20 -0
  44. data/poise.gemspec +38 -0
  45. data/test/cookbooks/poise_test/attributes/default.rb +17 -0
  46. data/test/cookbooks/poise_test/libraries/app.rb +43 -0
  47. data/test/cookbooks/poise_test/libraries/app_config.rb +46 -0
  48. data/test/cookbooks/poise_test/libraries/inversion.rb +67 -0
  49. data/test/cookbooks/poise_test/metadata.rb +18 -0
  50. data/test/cookbooks/poise_test/recipes/default.rb +25 -0
  51. data/test/cookbooks/poise_test/recipes/inversion.rb +42 -0
  52. data/test/gemfiles/chef-12.0.gemfile +18 -0
  53. data/test/gemfiles/chef-12.1.gemfile +18 -0
  54. data/test/gemfiles/chef-12.2.gemfile +18 -0
  55. data/test/gemfiles/chef-12.gemfile +18 -0
  56. data/test/gemfiles/master.gemfile +20 -0
  57. data/test/integration/default/serverspec/default_spec.rb +35 -0
  58. data/test/integration/default/serverspec/inversion_spec.rb +43 -0
  59. data/test/spec/helpers/chefspec_matchers_spec.rb +45 -0
  60. data/test/spec/helpers/defined_in_spec.rb +62 -0
  61. data/test/spec/helpers/fused_spec.rb +92 -0
  62. data/test/spec/helpers/include_recipe_spec.rb +34 -0
  63. data/test/spec/helpers/inversion/options_resource_spec.rb +212 -0
  64. data/test/spec/helpers/inversion_spec.rb +273 -0
  65. data/test/spec/helpers/lazy_default_spec.rb +74 -0
  66. data/test/spec/helpers/lwrp_polyfill_spec.rb +128 -0
  67. data/test/spec/helpers/notifying_block_spec.rb +87 -0
  68. data/test/spec/helpers/option_collector_spec.rb +82 -0
  69. data/test/spec/helpers/resource_name_spec.rb +39 -0
  70. data/test/spec/helpers/subcontext_block_spec.rb +94 -0
  71. data/test/spec/helpers/subresources/child_spec.rb +339 -0
  72. data/test/spec/helpers/subresources/container_spec.rb +175 -0
  73. data/test/spec/helpers/template_context_spec.rb +147 -0
  74. data/test/spec/poise_spec.rb +185 -0
  75. data/test/spec/provider_spec.rb +28 -0
  76. data/test/spec/resource_spec.rb +85 -0
  77. data/test/spec/spec_helper.rb +18 -0
  78. data/test/spec/utils/resource_provider_mixin_spec.rb +52 -0
  79. data/test/spec/utils_spec.rb +110 -0
  80. metadata +190 -0
@@ -0,0 +1,147 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe Poise::Helpers::TemplateContent do
20
+ resource(:poise_test) do
21
+ include described_class
22
+ attribute('', template: true)
23
+ end
24
+ provider(:poise_test)
25
+ recipe do
26
+ poise_test 'test'
27
+ end
28
+
29
+ # Stub out template rendering
30
+ let(:required_template_options) { Hash.new }
31
+ before do
32
+ @fake_finder = double('fake TemplateFinder')
33
+ allow(Chef::Provider::TemplateFinder).to receive(:new).and_return(@fake_finder)
34
+ allow(@fake_finder).to receive(:find)
35
+ @fake_ctx = double('fake TemplateContext')
36
+ if required_template_options.empty?
37
+ allow(Chef::Mixin::Template::TemplateContext).to receive(:new).and_return(@fake_ctx)
38
+ else
39
+ expect(Chef::Mixin::Template::TemplateContext).to receive(:new).with(hash_including(required_template_options)).and_return(@fake_ctx)
40
+ end
41
+ allow(@fake_ctx).to receive(:[]=)
42
+ allow(@fake_ctx).to receive(:render_template).and_return('rendered template')
43
+ # Also fake the cookbook lookup since that won't work in our test setup
44
+ allow(Poise::Utils).to receive(:find_cookbook_name).and_return('poise')
45
+ end
46
+
47
+ context 'with no input' do
48
+ recipe do
49
+ poise_test 'test'
50
+ end
51
+
52
+ it { is_expected.to run_poise_test('test').with(content: nil) }
53
+ end
54
+
55
+ context 'with a simple template' do
56
+ recipe do
57
+ poise_test 'test' do
58
+ source 'test.erb'
59
+ end
60
+ end
61
+
62
+ it { is_expected.to run_poise_test('test').with(source: 'test.erb', content: 'rendered template') }
63
+
64
+ it 'only runs the template render once' do
65
+ expect(@fake_ctx).to receive(:render_template).and_return('rendered template').once
66
+ subject.find_resource('poise_test', 'test').content
67
+ subject.find_resource('poise_test', 'test').content
68
+ end
69
+ end # /context with a template
70
+
71
+ context 'with some template variables' do
72
+ recipe do
73
+ poise_test 'test' do
74
+ source 'test.erb'
75
+ options do
76
+ one '1'
77
+ two 2
78
+ end
79
+ end
80
+ end
81
+ let(:required_template_options) { {'one' => '1', 'two' => 2} }
82
+
83
+ it { is_expected.to run_poise_test('test').with(source: 'test.erb', options: required_template_options, content: 'rendered template') }
84
+ end # /context with some template variables
85
+
86
+ context 'with explicit content' do
87
+ recipe do
88
+ poise_test 'test' do
89
+ content 'something explicit'
90
+ end
91
+ end
92
+
93
+ it { is_expected.to run_poise_test('test').with(content: 'something explicit') }
94
+ end # /context with explicit content
95
+
96
+ context 'with a default template' do
97
+ resource(:poise_test) do
98
+ include described_class
99
+ attribute('', template: true, default_source: 'test.erb')
100
+ end
101
+
102
+ it { is_expected.to run_poise_test('test').with(content: 'rendered template') }
103
+ end # /context with a default template
104
+
105
+ context 'with default content' do
106
+ resource(:poise_test) do
107
+ include described_class
108
+ attribute('', template: true, default: 'default content')
109
+ end
110
+
111
+ it { is_expected.to run_poise_test('test').with(content: 'default content') }
112
+ end # /context with default content
113
+
114
+ context 'with a name prefix' do
115
+ resource(:poise_test) do
116
+ include described_class
117
+ attribute(:config, template: true)
118
+ end
119
+ recipe do
120
+ poise_test 'test' do
121
+ config_source 'test.erb'
122
+ end
123
+ end
124
+
125
+ it { is_expected.to run_poise_test('test').with(config_content: 'rendered template') }
126
+ end # /context with a name prefix
127
+
128
+ context 'with required content' do
129
+ resource(:poise_test) do
130
+ include described_class
131
+ attribute(:config, template: true, required: true)
132
+ end
133
+
134
+ it { expect{chef_run}.to raise_error(Chef::Exceptions::ValidationFailed) }
135
+ end # /context with required content
136
+
137
+ context 'with both source and content' do
138
+ recipe do
139
+ poise_test 'test' do
140
+ source 'test.erb'
141
+ content 'content'
142
+ end
143
+ end
144
+
145
+ it { expect{chef_run}.to raise_error(Chef::Exceptions::ValidationFailed) }
146
+ end # /context with both source and content
147
+ end
@@ -0,0 +1,185 @@
1
+ #
2
+ # Copyright 2013-2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe Poise do
20
+ context 'with a Resource' do
21
+ resource(:poise_test) do
22
+ include Poise
23
+ end
24
+ subject { resource(:poise_test) }
25
+
26
+ it { is_expected.to include Poise::Resource }
27
+ it { is_expected.to include Poise::Helpers::LazyDefault }
28
+ it { is_expected.to include Poise::Helpers::LWRPPolyfill }
29
+ it { is_expected.to include Poise::Helpers::LWRPPolyfill::Resource }
30
+ it { is_expected.to include Poise::Helpers::OptionCollector }
31
+ it { is_expected.to include Poise::Helpers::ResourceName }
32
+ it { is_expected.to include Poise::Helpers::TemplateContent }
33
+ it { is_expected.to include Poise::Helpers::ChefspecMatchers }
34
+
35
+ context 'as a function call' do
36
+ context 'with no arguments' do
37
+ resource(:poise_test) do
38
+ include Poise()
39
+ end
40
+
41
+ it { is_expected.to include Poise }
42
+ it { is_expected.to include Poise::Resource }
43
+ end # /context with no arguments
44
+
45
+ context 'with a parent class' do
46
+ resource(:poise_test) do
47
+ include Poise(parent: Chef::Resource::RubyBlock)
48
+ end
49
+
50
+ it { is_expected.to include Poise }
51
+ it { is_expected.to include Poise::Resource }
52
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
53
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
54
+ its(:parent_optional) { is_expected.to be_falsey }
55
+ end # /context with a parent class
56
+
57
+ context 'with a parent class shortcut' do
58
+ resource(:poise_test) do
59
+ include Poise(Chef::Resource::RubyBlock)
60
+ end
61
+
62
+ it { is_expected.to include Poise }
63
+ it { is_expected.to include Poise::Resource }
64
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
65
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
66
+ its(:parent_optional) { is_expected.to be_falsey }
67
+ end # /context with a parent class shortcut
68
+
69
+ context 'with an optional parent' do
70
+ resource(:poise_test) do
71
+ include Poise(parent: Chef::Resource::RubyBlock, parent_optional: true)
72
+ end
73
+
74
+ it { is_expected.to include Poise }
75
+ it { is_expected.to include Poise::Resource }
76
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
77
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
78
+ its(:parent_optional) { is_expected.to be_truthy }
79
+ end # /context with an optional parent
80
+
81
+ context 'with a container' do
82
+ resource(:poise_test) do
83
+ include Poise(container: true)
84
+ end
85
+
86
+ it { is_expected.to include Poise }
87
+ it { is_expected.to include Poise::Resource }
88
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
89
+ end # /context with a container
90
+
91
+ context 'with a container namespace' do
92
+ resource(:poise_test) do
93
+ include Poise(container: true, container_namespace: true)
94
+ end
95
+
96
+ it { is_expected.to include Poise }
97
+ it { is_expected.to include Poise::Resource }
98
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
99
+ its(:container_namespace) { is_expected.to eq true }
100
+ end # /context with a container namespace
101
+
102
+ context 'with a container namespace as a string' do
103
+ resource(:poise_test) do
104
+ include Poise(container: true, container_namespace: 'example')
105
+ end
106
+
107
+ it { is_expected.to include Poise }
108
+ it { is_expected.to include Poise::Resource }
109
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
110
+ its(:container_namespace) { is_expected.to eq 'example' }
111
+ end # /context with a container namespaceas a string
112
+
113
+ context 'with a container namespace as a proc' do
114
+ resource(:poise_test) do
115
+ include Poise(container: true, container_namespace: Proc.new { name })
116
+ end
117
+
118
+ it { is_expected.to include Poise }
119
+ it { is_expected.to include Poise::Resource }
120
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
121
+ its(:container_namespace) { is_expected.to be_a Proc }
122
+ end # /context with a container namespaceas a proc
123
+
124
+ context 'with a no container namespace' do
125
+ resource(:poise_test) do
126
+ include Poise(container: true, container_namespace: false)
127
+ end
128
+
129
+ it { is_expected.to include Poise }
130
+ it { is_expected.to include Poise::Resource }
131
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
132
+ its(:container_namespace) { is_expected.to eq false }
133
+ end # /context with no container namespace
134
+
135
+ context 'with both a parent and a container' do
136
+ resource(:poise_test) do
137
+ include Poise(parent: Chef::Resource::RubyBlock, container: true)
138
+ end
139
+
140
+ it { is_expected.to include Poise }
141
+ it { is_expected.to include Poise::Resource }
142
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
143
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
144
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
145
+ its(:parent_optional) { is_expected.to be_falsey }
146
+ end # /context with both a parent and a container
147
+
148
+ context 'with fused' do
149
+ resource(:poise_test) do
150
+ include Poise(fused: true)
151
+ end
152
+
153
+ it { is_expected.to include Poise }
154
+ it { is_expected.to include Poise::Resource }
155
+ it { is_expected.to include Poise::Helpers::Fused }
156
+ end # /context with fused
157
+ end # /context as a function call
158
+ end # /context for a Resource
159
+
160
+ context 'with a Provider' do
161
+ provider(:poise_test) do
162
+ include Poise
163
+ end
164
+ subject { provider(:poise_test) }
165
+
166
+ it { is_expected.to include Poise::Provider }
167
+ it { is_expected.to include Poise::Helpers::IncludeRecipe }
168
+ it { is_expected.to include Poise::Helpers::LWRPPolyfill }
169
+ it { is_expected.to include Poise::Helpers::LWRPPolyfill::Provider }
170
+ it { is_expected.to include Poise::Helpers::NotifyingBlock }
171
+
172
+ context 'as a function call' do
173
+ provider(:poise_test) do
174
+ include Poise()
175
+ end
176
+
177
+ it { is_expected.to include Poise }
178
+ it { is_expected.to include Poise::Provider }
179
+ end # /context as a function call
180
+ end # /context for a Provider
181
+
182
+ it 'has a fake name when used a function' do
183
+ expect(Poise().name).to eq 'Poise'
184
+ end # /it has a fake name when used a function
185
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe Poise::Provider do
20
+ provider(:poise_test) do
21
+ include described_class
22
+ end
23
+ subject { provider(:poise_test) }
24
+
25
+ it { is_expected.to include(Poise::Helpers::IncludeRecipe) }
26
+ it { is_expected.to include(Poise::Helpers::LWRPPolyfill) }
27
+ it { is_expected.to include(Poise::Helpers::NotifyingBlock) }
28
+ end
@@ -0,0 +1,85 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe Poise::Resource do
20
+ resource(:poise_test) do
21
+ include described_class
22
+ end
23
+ subject { resource(:poise_test) }
24
+
25
+ it { is_expected.to include Poise::Helpers::LazyDefault }
26
+ it { is_expected.to include Poise::Helpers::LWRPPolyfill }
27
+ it { is_expected.to include Poise::Helpers::OptionCollector }
28
+ it { is_expected.to include Poise::Helpers::ResourceName }
29
+ it { is_expected.to include Poise::Helpers::TemplateContent }
30
+ it { is_expected.to include Poise::Helpers::ChefspecMatchers }
31
+
32
+ describe '#poise_subresource_container' do
33
+ resource(:poise_test) do
34
+ include described_class
35
+ poise_subresource_container
36
+ end
37
+
38
+ it { is_expected.to include Poise::Helpers::Subresources::Container }
39
+ end # /describe #poise_subresource_container
40
+
41
+ describe '#poise_subresource' do
42
+ context 'with no arguments' do
43
+ resource(:poise_test) do
44
+ include described_class
45
+ poise_subresource
46
+ end
47
+
48
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
49
+ its(:parent_type) { is_expected.to eq Chef::Resource }
50
+ its(:parent_optional) { is_expected.to be_falsey }
51
+ end # /context with no arguments
52
+
53
+ context 'with a parent class' do
54
+ resource(:poise_test) do
55
+ include described_class
56
+ poise_subresource(Chef::Resource::RubyBlock)
57
+ end
58
+
59
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
60
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
61
+ its(:parent_optional) { is_expected.to be_falsey }
62
+ end # /context with a parent class
63
+
64
+ context 'with an optional parent' do
65
+ resource(:poise_test) do
66
+ include described_class
67
+ poise_subresource(Chef::Resource::RubyBlock, true)
68
+ end
69
+
70
+ it { is_expected.to include Poise::Helpers::Subresources::Child }
71
+ its(:parent_type) { is_expected.to eq Chef::Resource::RubyBlock }
72
+ its(:parent_optional) { is_expected.to be_truthy }
73
+ end # /context with an optional parent
74
+ end # /describe #poise_subresource
75
+
76
+ context 'with fused' do
77
+ resource(:poise_test) do
78
+ include described_class
79
+ poise_fused
80
+ end
81
+
82
+ it { is_expected.to include Poise::Resource }
83
+ it { is_expected.to include Poise::Helpers::Fused }
84
+ end # /context with fused
85
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2013-2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise_boiler/spec_helper'
18
+ require 'poise'