chef-gen-flavors 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/.rubocop.yml +23 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +242 -0
  7. data/Guardfile +15 -0
  8. data/History.md +10 -0
  9. data/LICENSE +15 -0
  10. data/Manifest.txt +46 -0
  11. data/README.md +311 -0
  12. data/Rakefile +85 -0
  13. data/chef-gen-flavors.gemspec +75 -0
  14. data/lib/chef_gen/flavor.rb +5 -0
  15. data/lib/chef_gen/flavor_base.rb +230 -0
  16. data/lib/chef_gen/flavors.rb +173 -0
  17. data/lib/chef_gen/snippet/attributes.rb +22 -0
  18. data/lib/chef_gen/snippet/chef_spec.rb +41 -0
  19. data/lib/chef_gen/snippet/cookbook_base.rb +64 -0
  20. data/lib/chef_gen/snippet/example_file.rb +23 -0
  21. data/lib/chef_gen/snippet/example_template.rb +25 -0
  22. data/lib/chef_gen/snippet/recipes.rb +22 -0
  23. data/lib/chef_gen/snippet/resource_provider.rb +24 -0
  24. data/lib/chef_gen/snippet/standard_ignore.rb +97 -0
  25. data/lib/chef_gen/snippet/style_rubocop.rb +14 -0
  26. data/lib/chef_gen/snippet/test_kitchen.rb +51 -0
  27. data/lib/chef_gen/snippets.rb +15 -0
  28. data/spec/lib/chef_gen/flavor_base_spec.rb +164 -0
  29. data/spec/lib/chef_gen/flavors_spec.rb +114 -0
  30. data/spec/lib/chef_gen/snippet/attributes_spec.rb +45 -0
  31. data/spec/lib/chef_gen/snippet/chef_spec_spec.rb +45 -0
  32. data/spec/lib/chef_gen/snippet/cookbook_base_spec.rb +37 -0
  33. data/spec/lib/chef_gen/snippet/example_file_spec.rb +45 -0
  34. data/spec/lib/chef_gen/snippet/example_template_spec.rb +45 -0
  35. data/spec/lib/chef_gen/snippet/recipes_spec.rb +45 -0
  36. data/spec/lib/chef_gen/snippet/resource_provider_spec.rb +45 -0
  37. data/spec/lib/chef_gen/snippet/standard_ignore_spec.rb +40 -0
  38. data/spec/lib/chef_gen/snippet/style_rubocop_spec.rb +36 -0
  39. data/spec/lib/chef_gen/snippet/test_kitchen_spec.rb +49 -0
  40. data/spec/spec_helper.rb +38 -0
  41. data/spec/support/fixtures/code_generator/metadata.rb +2 -0
  42. data/spec/support/fixtures/code_generator/recipes/cookbook.rb +1 -0
  43. data/spec/support/fixtures/code_generator_2/metadata.rb +2 -0
  44. data/spec/support/fixtures/code_generator_2/recipes/cookbook.rb +1 -0
  45. data/spec/support/fixtures/lib/chef_gen/flavor/bar.rb +21 -0
  46. data/spec/support/fixtures/lib/chef_gen/flavor/baz.rb +6 -0
  47. data/spec/support/fixtures/lib/chef_gen/flavor/foo.rb +9 -0
  48. metadata +317 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 946c3722860ef01d69ca49847202671db1846c9b
4
+ data.tar.gz: a51977f890bb4ef7be75e79d441f0338ba078bdb
5
+ SHA512:
6
+ metadata.gz: bb6c97a4fe43d518c45fdc5be85fc3c857524d79ac48a09417e160a6fafcfe4bb4f35df93ad725d602776d76d636be0a9191f97e7ef87c180820a3c94ffc12b5
7
+ data.tar.gz: 223a7f1f8652f75c5fa59eb1bd37e9cc56712550e5ea989b38f4ee446d1b74ace0c3f72cdfc0866fc697cbf7722a1ab5baf3185323837036e6a520d23bdbaacf
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,23 @@
1
+ AllCops:
2
+ Exclude:
3
+ - '**/Gemfile'
4
+ - '**/*.gemspec'
5
+ - 'pkg/**/*'
6
+
7
+ Style/RegexpLiteral:
8
+ Exclude:
9
+ - '**/Guardfile'
10
+
11
+ Style/Documentation:
12
+ Exclude:
13
+ - 'spec/**/*.rb'
14
+
15
+ Metrics/MethodLength:
16
+ Max: 15
17
+
18
+ Metrics/ClassLength:
19
+ Max: 150
20
+
21
+ Lint/UnusedMethodArgument:
22
+ Exclude:
23
+ - 'lib/chef_gen/snippet/*.rb'
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.1.6"
4
+ - "2.2.2"
5
+ install: bundle install --binstubs
6
+ env: TRAVIS_BUILD=true
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org/'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,242 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ chef-gen-flavors (0.3.0.20150514061941)
5
+ bogo-ui (~> 0.1)
6
+ little-plugger (~> 1.1)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.0.0)
12
+ astrolabe (1.3.0)
13
+ parser (>= 2.2.0.pre.3, < 3.0)
14
+ bogo (0.1.22)
15
+ hashie
16
+ multi_json
17
+ bogo-ui (0.1.10)
18
+ bogo
19
+ command_line_reporter
20
+ paint
21
+ builder (3.2.2)
22
+ celluloid (0.16.0)
23
+ timers (~> 4.0.0)
24
+ chef (12.3.0)
25
+ chef-zero (~> 4.1)
26
+ diff-lcs (~> 1.2, >= 1.2.4)
27
+ erubis (~> 2.7)
28
+ ffi-yajl (>= 1.2, < 3.0)
29
+ highline (~> 1.6, >= 1.6.9)
30
+ mixlib-authentication (~> 1.3)
31
+ mixlib-cli (~> 1.4)
32
+ mixlib-config (~> 2.0)
33
+ mixlib-log (~> 1.3)
34
+ mixlib-shellout (>= 2.0.0.rc.0, < 3.0)
35
+ net-ssh (~> 2.6)
36
+ net-ssh-multi (~> 1.1)
37
+ ohai (~> 8.0)
38
+ plist (~> 3.1.0)
39
+ pry (~> 0.9)
40
+ rspec-core (~> 3.2)
41
+ rspec-expectations (~> 3.2)
42
+ rspec-mocks (~> 3.2)
43
+ rspec_junit_formatter (~> 0.2.0)
44
+ serverspec (~> 2.7)
45
+ specinfra (~> 2.10)
46
+ chef-dk (0.5.1)
47
+ chef (~> 12.0, >= 12.2.1)
48
+ cookbook-omnifetch (~> 0.2)
49
+ diff-lcs (~> 1.0)
50
+ ffi-yajl (~> 1.0)
51
+ mixlib-cli (~> 1.5)
52
+ mixlib-shellout (>= 2.0.0.rc.0, < 3.0.0)
53
+ paint (~> 1.0)
54
+ solve (~> 1.2)
55
+ chef-zero (4.2.1)
56
+ ffi-yajl (>= 1.1, < 3.0)
57
+ hashie (~> 2.0)
58
+ mixlib-log (~> 1.3)
59
+ rack
60
+ uuidtools (~> 2.1)
61
+ coderay (1.1.0)
62
+ colored (1.2)
63
+ colorize (0.7.7)
64
+ command_line_reporter (3.3.5)
65
+ colored (>= 1.2)
66
+ cookbook-omnifetch (0.2.1)
67
+ minitar (~> 0.5.4)
68
+ dep-selector-libgecode (1.0.2)
69
+ dep_selector (1.0.3)
70
+ dep-selector-libgecode (~> 1.0)
71
+ ffi (~> 1.9)
72
+ diff-lcs (1.2.5)
73
+ docile (1.1.5)
74
+ erubis (2.7.0)
75
+ ffi (1.9.8)
76
+ ffi-yajl (1.4.0)
77
+ ffi (~> 1.5)
78
+ libyajl2 (~> 1.2)
79
+ formatador (0.2.5)
80
+ guard (2.12.5)
81
+ formatador (>= 0.2.4)
82
+ listen (~> 2.7)
83
+ lumberjack (~> 1.0)
84
+ nenv (~> 0.1)
85
+ notiffany (~> 0.0)
86
+ pry (>= 0.9.12)
87
+ shellany (~> 0.0)
88
+ thor (>= 0.18.1)
89
+ guard-compat (1.2.1)
90
+ guard-rake (0.0.10)
91
+ guard
92
+ rake
93
+ guard-rspec (4.5.0)
94
+ guard (~> 2.1)
95
+ guard-compat (~> 1.1)
96
+ rspec (>= 2.99.0, < 4.0)
97
+ guard-rubocop (1.2.0)
98
+ guard (~> 2.0)
99
+ rubocop (~> 0.20)
100
+ hashie (2.1.2)
101
+ highline (1.7.2)
102
+ hirb (0.7.3)
103
+ hitimes (1.2.2)
104
+ hoe (3.13.1)
105
+ rake (>= 0.8, < 11.0)
106
+ hoe-gemspec (1.0.0)
107
+ hoe (>= 2.2.0)
108
+ ipaddress (0.8.0)
109
+ json (1.8.2)
110
+ libyajl2 (1.2.0)
111
+ listen (2.10.0)
112
+ celluloid (~> 0.16.0)
113
+ rb-fsevent (>= 0.9.3)
114
+ rb-inotify (>= 0.9)
115
+ little-plugger (1.1.3)
116
+ lumberjack (1.0.9)
117
+ method_source (0.8.2)
118
+ mime-types (2.5)
119
+ minitar (0.5.4)
120
+ mixlib-authentication (1.3.0)
121
+ mixlib-log
122
+ mixlib-cli (1.5.0)
123
+ mixlib-config (2.1.0)
124
+ mixlib-log (1.6.0)
125
+ mixlib-shellout (2.0.1)
126
+ multi_json (1.11.0)
127
+ nenv (0.2.0)
128
+ net-scp (1.2.1)
129
+ net-ssh (>= 2.6.5)
130
+ net-ssh (2.9.2)
131
+ net-ssh-gateway (1.2.0)
132
+ net-ssh (>= 2.6.5)
133
+ net-ssh-multi (1.2.1)
134
+ net-ssh (>= 2.6.5)
135
+ net-ssh-gateway (>= 1.2.0)
136
+ notiffany (0.0.6)
137
+ nenv (~> 0.1)
138
+ shellany (~> 0.0)
139
+ ohai (8.3.0)
140
+ ffi (~> 1.9)
141
+ ffi-yajl (>= 1.1, < 3.0)
142
+ ipaddress
143
+ mime-types (~> 2.0)
144
+ mixlib-cli
145
+ mixlib-config (~> 2.0)
146
+ mixlib-log
147
+ mixlib-shellout (~> 2.0)
148
+ rake (~> 10.1)
149
+ systemu (~> 2.6.4)
150
+ wmi-lite (~> 1.0)
151
+ paint (1.0.0)
152
+ parser (2.2.2.2)
153
+ ast (>= 1.1, < 3.0)
154
+ plist (3.1.0)
155
+ powerpack (0.1.1)
156
+ pry (0.10.1)
157
+ coderay (~> 1.1.0)
158
+ method_source (~> 0.8.1)
159
+ slop (~> 3.4)
160
+ rack (1.6.1)
161
+ rainbow (2.0.0)
162
+ rake (10.4.2)
163
+ rb-fsevent (0.9.4)
164
+ rb-inotify (0.9.5)
165
+ ffi (>= 0.5.0)
166
+ rdoc (4.2.0)
167
+ json (~> 1.4)
168
+ rspec (3.2.0)
169
+ rspec-core (~> 3.2.0)
170
+ rspec-expectations (~> 3.2.0)
171
+ rspec-mocks (~> 3.2.0)
172
+ rspec-core (3.2.3)
173
+ rspec-support (~> 3.2.0)
174
+ rspec-expectations (3.2.1)
175
+ diff-lcs (>= 1.2.0, < 2.0)
176
+ rspec-support (~> 3.2.0)
177
+ rspec-its (1.2.0)
178
+ rspec-core (>= 3.0.0)
179
+ rspec-expectations (>= 3.0.0)
180
+ rspec-mocks (3.2.1)
181
+ diff-lcs (>= 1.2.0, < 2.0)
182
+ rspec-support (~> 3.2.0)
183
+ rspec-support (3.2.2)
184
+ rspec_junit_formatter (0.2.2)
185
+ builder (< 4)
186
+ rspec-core (>= 2, < 4, != 2.12.0)
187
+ rubocop (0.31.0)
188
+ astrolabe (~> 1.3)
189
+ parser (>= 2.2.2.1, < 3.0)
190
+ powerpack (~> 0.1)
191
+ rainbow (>= 1.99.1, < 3.0)
192
+ ruby-progressbar (~> 1.4)
193
+ ruby-progressbar (1.7.5)
194
+ semverse (1.2.1)
195
+ serverspec (2.15.0)
196
+ multi_json
197
+ rspec (~> 3.0)
198
+ rspec-its
199
+ specinfra (~> 2.31)
200
+ shellany (0.0.1)
201
+ simplecov (0.10.0)
202
+ docile (~> 1.1.0)
203
+ json (~> 1.8)
204
+ simplecov-html (~> 0.10.0)
205
+ simplecov-console (0.2.0)
206
+ colorize
207
+ hirb
208
+ simplecov
209
+ simplecov-html (0.10.0)
210
+ slop (3.6.0)
211
+ solve (1.2.1)
212
+ dep_selector (~> 1.0)
213
+ semverse (~> 1.1)
214
+ specinfra (2.31.0)
215
+ net-scp
216
+ net-ssh
217
+ systemu (2.6.5)
218
+ thor (0.19.1)
219
+ timers (4.0.1)
220
+ hitimes
221
+ uuidtools (2.1.5)
222
+ wmi-lite (1.0.0)
223
+ yard (0.8.7.6)
224
+
225
+ PLATFORMS
226
+ ruby
227
+
228
+ DEPENDENCIES
229
+ chef-dk (~> 0.5)
230
+ chef-gen-flavors!
231
+ guard (~> 2.12)
232
+ guard-rake (~> 0.0)
233
+ guard-rspec (~> 4.2)
234
+ guard-rubocop (~> 1.2)
235
+ hoe (~> 3.13)
236
+ hoe-gemspec (~> 1.0)
237
+ rake (~> 10.3)
238
+ rdoc (~> 4.0)
239
+ rspec (~> 3.1)
240
+ simplecov (~> 0.9)
241
+ simplecov-console (~> 0.2)
242
+ yard (~> 0.8)
data/Guardfile ADDED
@@ -0,0 +1,15 @@
1
+ # prevent dropping into pry when nothing is happening
2
+ interactor :off
3
+
4
+ guard :rubocop, all_on_start: true, cli: ['-D'] do
5
+ watch(%r{.+\.rb$})
6
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
7
+ watch('Gemfile')
8
+ watch('Rakefile')
9
+ end
10
+
11
+ guard :rspec, all_on_start: true, cmd: 'bundle exec rspec' do
12
+ watch(%r{^spec/(.+)_spec\.rb$})
13
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
14
+ watch(%r{^spec/spec_helper.*\.rb$}) { 'spec' }
15
+ end
data/History.md ADDED
@@ -0,0 +1,10 @@
1
+ # Changelog for chef-gen-template
2
+
3
+ ## 0.3.0
4
+
5
+ * renamed from ChefDK::Template::Plugin to ChefGen::Flavors at Chef's request so as to not pollute the ChefDK namespace
6
+ * 0.2.0 exists only with the old name as a transitional to remind people that the name has changed
7
+
8
+ ## 0.1.0
9
+
10
+ * initial version
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ # THE APACHE LICENSE, v2
2
+
3
+ Copyright 2015 Nordstrom, Inc.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not
6
+ use this file except in compliance with the License. You may obtain a copy
7
+ of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14
+ License for the specific language governing permissions and limitations
15
+ under the License.
data/Manifest.txt ADDED
@@ -0,0 +1,46 @@
1
+ .rspec
2
+ .rubocop.yml
3
+ .travis.yml
4
+ Gemfile
5
+ Gemfile.lock
6
+ Guardfile
7
+ History.md
8
+ LICENSE
9
+ Manifest.txt
10
+ README.md
11
+ Rakefile
12
+ chef-gen-flavors.gemspec
13
+ lib/chef_gen/flavor.rb
14
+ lib/chef_gen/flavor_base.rb
15
+ lib/chef_gen/flavors.rb
16
+ lib/chef_gen/snippet/attributes.rb
17
+ lib/chef_gen/snippet/chef_spec.rb
18
+ lib/chef_gen/snippet/cookbook_base.rb
19
+ lib/chef_gen/snippet/example_file.rb
20
+ lib/chef_gen/snippet/example_template.rb
21
+ lib/chef_gen/snippet/recipes.rb
22
+ lib/chef_gen/snippet/resource_provider.rb
23
+ lib/chef_gen/snippet/standard_ignore.rb
24
+ lib/chef_gen/snippet/style_rubocop.rb
25
+ lib/chef_gen/snippet/test_kitchen.rb
26
+ lib/chef_gen/snippets.rb
27
+ spec/lib/chef_gen/flavor_base_spec.rb
28
+ spec/lib/chef_gen/flavors_spec.rb
29
+ spec/lib/chef_gen/snippet/attributes_spec.rb
30
+ spec/lib/chef_gen/snippet/chef_spec_spec.rb
31
+ spec/lib/chef_gen/snippet/cookbook_base_spec.rb
32
+ spec/lib/chef_gen/snippet/example_file_spec.rb
33
+ spec/lib/chef_gen/snippet/example_template_spec.rb
34
+ spec/lib/chef_gen/snippet/recipes_spec.rb
35
+ spec/lib/chef_gen/snippet/resource_provider_spec.rb
36
+ spec/lib/chef_gen/snippet/standard_ignore_spec.rb
37
+ spec/lib/chef_gen/snippet/style_rubocop_spec.rb
38
+ spec/lib/chef_gen/snippet/test_kitchen_spec.rb
39
+ spec/spec_helper.rb
40
+ spec/support/fixtures/code_generator/metadata.rb
41
+ spec/support/fixtures/code_generator/recipes/cookbook.rb
42
+ spec/support/fixtures/code_generator_2/metadata.rb
43
+ spec/support/fixtures/code_generator_2/recipes/cookbook.rb
44
+ spec/support/fixtures/lib/chef_gen/flavor/bar.rb
45
+ spec/support/fixtures/lib/chef_gen/flavor/baz.rb
46
+ spec/support/fixtures/lib/chef_gen/flavor/foo.rb
data/README.md ADDED
@@ -0,0 +1,311 @@
1
+ # chef-gen-flavors
2
+
3
+ * home :: https://github.com/Nordstrom/chef-gen-flavors
4
+ * license :: [Apache2](http://www.apache.org/licenses/LICENSE-2.0)
5
+ * gem version :: [![Gem Version](https://badge.fury.io/rb/chef-gen-flavors.png)](http://badge.fury.io/rb/chef-gen-flavors)
6
+ * build status :: [![Build Status](https://travis-ci.org/Nordstrom/chef-gen-flavors.png?branch=master)](https://travis-ci.org/Nordstrom/chef-gen-flavors)
7
+ * code climate :: [![Code Climate](https://codeclimate.com/github/Nordstrom/chef-gen-flavors/badges/gpa.svg)](https://codeclimate.com/github/Nordstrom/chef-gen-flavors)
8
+ * docs :: [![Inline docs](http://inch-ci.org/github/nordstrom/chef-gen-flavors.svg?branch=master)](http://inch-ci.org/github/nordstrom/chef-gen-flavors)
9
+
10
+ ## DESCRIPTION
11
+
12
+ chef-gen-flavors is a framework for creating custom templates for the
13
+ 'chef generate' command provided by ChefDK.
14
+
15
+ This gem simply provides a framework; templates are provided by separate
16
+ gems, which you can host privately for use within your organization or
17
+ publicly for the Chef community to use.
18
+
19
+ At present this is focused primarily on providing templates for generation of
20
+ cookbooks, as this is where most organization-specific customization takes place.
21
+ Support for the other artifacts that ChefDK can generate may work, but is not
22
+ the focus of early releases.
23
+
24
+ ## INSTALLATION
25
+
26
+ chef gem install chef-gen-flavors
27
+
28
+ You will also need to install at least one plugin, which may be distributed
29
+ via Rubygems (in which case you install using `chef gem`) or as source, in
30
+ which case you should refer to the installation documentation that comes with
31
+ the plugin.
32
+
33
+ ## PREREQUISITES
34
+
35
+ This gem requires that you have [ChefDK](https://downloads.chef.io/chef-dk/)
36
+ (at least version 0.3.6) installed. chef-dk is not a dependency of this gem
37
+ because chef-dk should always be installed using the omnibus packages
38
+ provided by Chef, not as a gem.
39
+
40
+ ## CONFIGURATION
41
+
42
+ In your `knife.rb` file, add this snippet:
43
+
44
+ unless chefdk.nil?
45
+ require 'chef_gen/template'
46
+ chefdk.generator_cookbook = ChefGen::Flavors.path
47
+ end
48
+
49
+ When you run `chef generate`, all available plugins will be loaded. If more
50
+ than one plugin is found, you will be prompted as to which you want to use:
51
+
52
+ $ chef generate cookbook my_app
53
+
54
+ If you set the environment variable `CHEFGEN_TEMPLATE` to the name of a
55
+ plugin, it will be chosen instead of presenting a prompt:
56
+
57
+ $ CHEFGEN_TEMPLATE=mytemplate chef generate cookbook my_app
58
+
59
+ ## USING THE BUILT-IN CHEFDK TEMPLATE
60
+
61
+ By default, this gem does not offer the built-in ChefDK template as an
62
+ option. By setting the environment variable CHEFDK_FLAVOR, the
63
+ option `builtin` will be offered.
64
+
65
+ ## TERMINOLOGY
66
+
67
+ (because everything in the Chef ecosystem has to have foodie names)
68
+
69
+ * Flavor - a type of template. Provided by a plugin in the namespace `ChefGen::Flavor::`. Flavors can be distributed as ruby gems inside or outside of your organization.
70
+ * Snippet - a small piece of a code_generator cookbook that flavors can compose together to avoid repeating themselves. Nominally provided by a module in the namespace `ChefGen::Snippet::`, but can be defined in any module. chef-gen-flavors comes with several common snippets, but you can create your own and package them as standalone gems or as part of a flavor gem
71
+
72
+ ## FLAVORS
73
+
74
+ This gem uses [little-plugger](https://rubygems.org/gems/little-plugger) to
75
+ make adding template flavors easy. Each flavor is defined by a plugin named
76
+ using [little-pluggers's
77
+ rules](https://github.com/TwP/little-plugger/blob/little-plugger-1.1.2/lib/little-plugger.rb#L13-25).
78
+
79
+ The plugin must define a class inside the naming hierarchy
80
+ `ChefGen::Flavor::`. The class name should be the filename converted to
81
+ CamelCase (e.g. `foo_bar.rb` = `FooBar`)
82
+
83
+ The name of the module must not be in all caps, as little-plugger ignores
84
+ these (assuming that they are constants).
85
+
86
+ Plugins must also define a class method named `description`, which is used
87
+ both to find the path to the file that defines the plugin and in the prompt
88
+ displayed when more than one plugin is available.
89
+
90
+ You do not have to `require` your plugin; little-plugger searches all
91
+ installed gems for files matching the globspec.
92
+
93
+ ## EXAMPLE FLAVOR STRUCTURE
94
+
95
+ This example defines a flavor named `Example`. It can only generate
96
+ cookbooks, as its code_generator cookbook contains no other recipes.
97
+
98
+ A functional copy of this plugin is available on rubygems as
99
+ `chef-gen-flavor-example`.
100
+
101
+ The directory structure of a plugin looks like this:
102
+
103
+ chef-gen-flavor-example
104
+ ├── code_generator
105
+ │   ├── files
106
+ │   │   └── default
107
+ │   ├── metadata.rb
108
+ │   ├── recipes
109
+ │   │   └── cookbook.rb
110
+ │   └── templates
111
+ │   └── default
112
+ └── lib
113
+ └── chef_gen
114
+ └── flavor
115
+ └── example.rb
116
+
117
+ ## ALTERNATE code_generator PATHS
118
+
119
+ By default, the code_generator cookbook is assumed to live in a directory
120
+ named `code_generator` four levels higher than the path of the file
121
+ definining the plugin.
122
+
123
+ To specify that the code_generator cookbook lives elsewhere, define a class
124
+ method named `code_generator_path` which takes one argument (the path to the
125
+ plugin class) and returns the path to the code_generator cookbook. If the
126
+ `Example` plugin wanted to place the code_generator cookbook in a directory
127
+ named `template` instead of `code_generator`, it would define an instance
128
+ method like this:
129
+
130
+ module ChefGen
131
+ module Flavor
132
+ class Example
133
+ class << self
134
+ def description
135
+ 'example cookbook template'
136
+ end
137
+
138
+ def code_generator_path(classfile)
139
+ File.expand_path(
140
+ File.join(
141
+ classfile,
142
+ '..', '..', '..', '..',
143
+ 'template'
144
+ )
145
+ )
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ For compatibility with all platforms supported by ChefDK, plugins should use
153
+ the methods in the `File` class to construct relative paths rather than
154
+ assuming what the path separator should be.
155
+
156
+ ## FLAVOR BASE CLASS
157
+
158
+ Inside of your plugin's code_generator cookbook, you can do anything that
159
+ chef-solo can do. If you aren't familiar with the mechanics of the default
160
+ generators that comes with chef-dk, you should study [those
161
+ recipes](https://github.com/chef/chef-dk/tree/0.5.1/lib/chef-dk/skeletons/code_generator)
162
+ first before attempting to create your own.
163
+
164
+ To make the job of authoring a custom template easier, this gem comes with a
165
+ base class that plugins can inherit from. This provides some useful
166
+ features:
167
+
168
+ * helpers to create directories and render files and templates using simple name translation
169
+ * the ability to create and use snippets that set up commonly used functionality (i.e. ChefSpec or Test Kitchen)
170
+ * the ability to prevent files from being overwritten when a template is being applied overtop an existing cookbook
171
+
172
+ To use the base class, make it a dependency of your gem and inherit from it:
173
+
174
+ require 'chef_gen/flavor_base'
175
+
176
+ module ChefGen
177
+ module Flavor
178
+ class Amazing < FlavorBase
179
+ end
180
+ end
181
+ end
182
+
183
+ Then in one of your generator recipes like `recipes/cookbook.rb`, create
184
+ an instance of your plugin, passing the recipe into which resources will
185
+ be injected:
186
+
187
+ template = ChefGen::Flavor::Amazing.new(self)
188
+
189
+ The plugin has several helper methods you can use:
190
+
191
+ * `target_path` returns the full path to the target directory
192
+ * `directories` is a `Array` of directories to create
193
+ * `files` is an `Array` of files to create
194
+ * `files_if_missing` is an `Array` of files to create which should not be overwritten if they exist
195
+ * `templates` is an `Array` of templates to render
196
+ * `templates_if_missing` is an `Array` of templates to render which should not be overwritten if they exist
197
+ * `chefignore_files` is an `Array` of glob patterns to write to the `chefignore` file. If this array is empty, the file is not created automatically (but templates can take this on themselves)
198
+ * `gitignore_files` is an `Array` of glob patterns to write to the `.gitignore` file. If this array is empty, the file is not created automatically (but templates can take this on themselves)
199
+ * `fail_on_clobber` is a boolean accessor which causes generation to fail if any files in the `files` or `templates` arrays already exist. Defaults to true, but can be set to false by adding `-a clobber` to the `chef generate` command line
200
+ * `report_actions` is a boolean accessor which causes the generator to report all of the actions it took
201
+ * `next_steps` is a message to be displayed to the user as the last thing the generator does
202
+
203
+ The distinction between files that are overwritten and those that are
204
+ created only if they do not exist allows for updating a cookbook to an
205
+ organization-wide policy while still allowing for per-cookbook
206
+ customization.
207
+
208
+ For example, if your cookbook template has a standard Rakefile and you wish
209
+ to add a target to it, you can do so if Rakefile is in the `files` array.
210
+ When the generator is used on top of an existing cookbook, the Rakefile will
211
+ be rewritten. Custom rake tasks can be placed in `.rake` files in the
212
+ directory `lib/tasks`, which will not be overwritten.
213
+
214
+ Once the template object has been set up to your satisfaction, call the
215
+ `#generate` method, which creates the Chef resources to generate your
216
+ target.
217
+
218
+ The list of files and templates take the path to the rendered file (e.g.
219
+ `spec/spec_helper.rb`). The source for the file or template will be
220
+ transformed by replacing foreward slashes and dots with underscores.
221
+ Additionally, templates have `.erb` appended to the source.
222
+
223
+ This code:
224
+
225
+ template = ChefGen::Flavor::Amazing.new
226
+ template.files << 'spec/spec_helper.rb'
227
+ template.templates << '.rubocop.yml'
228
+ template.generate
229
+
230
+ is equivalent to manually creating these resources:
231
+
232
+ file "#{cookbook_dir}/spec/spec_helper.rb" do
233
+ source 'spec_spec_helper_rb'
234
+ end
235
+
236
+ template "#{cookbook_dir}/.rubocop.yml" do
237
+ source '_rubocop_yml.erb'
238
+ end
239
+
240
+ ### TEMPLATE SNIPPETS
241
+
242
+ Many templates will use common patterns, such as providing a README.md and
243
+ CHANGELOG.md, providing the files necessary to create a ChefSpec unit
244
+ testing suite, or the files necessary to create a Test Kitchen integration
245
+ testing suite.
246
+
247
+ Rather than have every template author create these, this gem ships with a
248
+ number of snippets, which can be included in your plugin class like so:
249
+
250
+ require 'chef_gen/flavor'
251
+ require 'chef_gen/snippets'
252
+
253
+ module ChefGen
254
+ module Flavor
255
+ class Amazing < FlavorBase
256
+ include ChefGen::Snippet::ChefSpec
257
+ end
258
+ end
259
+ end
260
+
261
+ The snippets that ship with this gem are:
262
+
263
+ * `CookbookBase` - sets up the basic files any cookbook needs (README, CHANGELOG, etc.)
264
+ * `StyleRubocop` - sets up the files for style checking with Rubocop
265
+ * `ChefSpec` - sets up the files for basic ChefSpec unit testing
266
+ * `TestKitchen` - sets up the files for basic Test Kitchen integration testing
267
+ * `Recipes` - creates recipes/default.rb
268
+ * `Attributes` - creates attributes/default.rb
269
+ * `ExampleFile` - creates files/default/example.conf
270
+ * `ExampleTemplate` - creates templates/default/example.conf.erb
271
+ * `ResourceProvider` - sets up a sample LWRP resource and provider
272
+
273
+ You can also create your own snippet. A snippet is simply a module that
274
+ provides some number of public methods prefixed with `snippet\_`. Any such
275
+ methods will be called, passing the recipe object as the only parameter when
276
+ `#generate` is called. For example, a simplified ChefSpec snippet might look
277
+ like this:
278
+
279
+ module ChefGen
280
+ module Snippet
281
+ module ChefSpec
282
+ def snippet_chefspec(recipe)
283
+ @directories << 'spec'
284
+ @directories << File.join('spec', '/recipes')
285
+ @files << '.rspec'
286
+ @files << File.join('spec', 'spec_helper.rb')
287
+ @files << File.join('spec', 'recipes', 'default_spec.rb')
288
+ end
289
+ end
290
+ end
291
+ end
292
+
293
+ ## AUTHOR
294
+
295
+ James FitzGibbon - james.i.fitzgibbon@nordstrom.com - Nordstrom, Inc.
296
+
297
+ ## LICENSE
298
+
299
+ Copyright 2015 Nordstrom, Inc.
300
+
301
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not
302
+ use this file except in compliance with the License. You may obtain a copy
303
+ of the License at
304
+
305
+ http://www.apache.org/licenses/LICENSE-2.0
306
+
307
+ Unless required by applicable law or agreed to in writing, software
308
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
309
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
310
+ License for the specific language governing permissions and limitations
311
+ under the License.