knife-skeleton 0.0.1
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.
- checksums.yaml +15 -0
- data/.gitignore +7 -0
- data/.rubocop.yml +18 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE +201 -0
- data/README.md +68 -0
- data/Rakefile +17 -0
- data/files/Berksfile +5 -0
- data/files/Gemfile +17 -0
- data/files/Strainerfile +6 -0
- data/files/gitignore +12 -0
- data/files/licenses/apachev2 +12 -0
- data/files/licenses/gplv2 +14 -0
- data/files/licenses/gplv3 +13 -0
- data/files/licenses/mit +19 -0
- data/files/rubocop.yml +29 -0
- data/files/travis.yml +7 -0
- data/knife_skeleton.gemspec +30 -0
- data/lib/chef/knife/skeleton_create.rb +346 -0
- data/lib/knife_skeleton/template.rb +24 -0
- data/lib/knife_skeleton/version.rb +6 -0
- data/spec/chef/knife/knife_skeleton_create_spec.rb +279 -0
- data/spec/knife_skeleton/template_spec.rb +15 -0
- data/spec/spec_helper.rb +10 -0
- data/templates/.kitchen.yml.erb +15 -0
- data/templates/CHANGELOG.md.erb +8 -0
- data/templates/CHANGELOG.rdoc.erb +8 -0
- data/templates/CHANGELOG.txt.erb +7 -0
- data/templates/README.md.erb +68 -0
- data/templates/README.rdoc.erb +67 -0
- data/templates/README.txt.erb +49 -0
- data/templates/metadata.rb.erb +9 -0
- data/templates/recipes/default.rb.erb +9 -0
- data/templates/spec/default_spec.rb.erb +12 -0
- data/templates/spec/spec_helper.rb.erb +9 -0
- data/templates/test/integration/default/serverspec/default_spec.rb.erb +8 -0
- data/templates/test/integration/default/serverspec/spec_helper.rb.erb +22 -0
- metadata +188 -0
data/files/rubocop.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
AllCops:
|
2
|
+
Include:
|
3
|
+
- metadata.rb
|
4
|
+
- '**/Gemfile'
|
5
|
+
- attributes/**/*
|
6
|
+
- definitions/**/*
|
7
|
+
- libraries/**/*
|
8
|
+
- providers/**/*
|
9
|
+
- recipes/**/*
|
10
|
+
- resources/**/*
|
11
|
+
- spec/**/*
|
12
|
+
- test/**/*
|
13
|
+
Exclude:
|
14
|
+
- cookbooks/**/*
|
15
|
+
- vendor/**/*
|
16
|
+
|
17
|
+
Encoding:
|
18
|
+
Exclude:
|
19
|
+
- metadata.rb
|
20
|
+
- Gemfile
|
21
|
+
|
22
|
+
NumericLiterals:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
LineLength:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
WordArray:
|
29
|
+
MinSize: 3
|
data/files/travis.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/knife_skeleton/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.authors = ['Pierre Rambaud']
|
6
|
+
s.email = ['pierre.rambaud@numergy.com']
|
7
|
+
s.description = <<-eos
|
8
|
+
Knife plugin to create skeleton with rubocop, chefspec, kitchen,
|
9
|
+
strainer, etc...
|
10
|
+
eos
|
11
|
+
s.summary = s.description
|
12
|
+
s.homepage = 'https://github.com/Numergy/knife-skeleton'
|
13
|
+
s.license = 'Apache 2.0'
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
16
|
+
s.executables = s.files.grep(/^bin\//).map { |f| File.basename(f) }
|
17
|
+
s.test_files = s.files.grep(/^(test|spec|features)\//)
|
18
|
+
s.name = 'knife-skeleton'
|
19
|
+
s.require_paths = ['lib']
|
20
|
+
s.version = KnifeSkeleton::VERSION
|
21
|
+
|
22
|
+
s.add_dependency 'chef', '~> 0.10'
|
23
|
+
s.add_dependency 'erubis', '~> 0.2'
|
24
|
+
|
25
|
+
s.add_development_dependency 'rake', '~> 10'
|
26
|
+
s.add_development_dependency 'rspec', '~> 2.14'
|
27
|
+
s.add_development_dependency 'rubocop', '~> 0.25'
|
28
|
+
s.add_development_dependency 'simplecov', '~> 0.9'
|
29
|
+
s.add_development_dependency 'fakefs', '~> 0.5'
|
30
|
+
end
|
@@ -0,0 +1,346 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'chef/knife'
|
3
|
+
require 'pathname'
|
4
|
+
require 'knife_skeleton/template'
|
5
|
+
|
6
|
+
module Knife
|
7
|
+
# Cookbook class
|
8
|
+
class SkeletonCreate < Chef::Knife
|
9
|
+
banner 'knife skeleton create COOKOOK (options)'
|
10
|
+
|
11
|
+
option :cookbook_path,
|
12
|
+
short: '-o PATH',
|
13
|
+
long: '--cookbook-path PATH',
|
14
|
+
description: <<-eos
|
15
|
+
The directory where the cookbook will be created
|
16
|
+
eos
|
17
|
+
|
18
|
+
option :readme_format,
|
19
|
+
short: '-r FORMAT',
|
20
|
+
long: '--readme-format FORMAT',
|
21
|
+
description: <<-eos
|
22
|
+
Format of the README file, supported formats are 'md', 'rdoc' and 'txt'
|
23
|
+
eos
|
24
|
+
|
25
|
+
option :cookbook_license,
|
26
|
+
short: '-I LICENSE',
|
27
|
+
long: '--license LICENSE',
|
28
|
+
description: <<-eos
|
29
|
+
License apachev2, gplv2, gplv3, mit or none
|
30
|
+
eos
|
31
|
+
|
32
|
+
option :cookbook_copyright,
|
33
|
+
short: '-C COPYRIGHT',
|
34
|
+
long: '--copyright COPYRIGHT',
|
35
|
+
description: <<-eos
|
36
|
+
Name of Copyright holder
|
37
|
+
eos
|
38
|
+
|
39
|
+
option :cookbook_email,
|
40
|
+
short: '-m EMAIL',
|
41
|
+
long: '--email EMAIL',
|
42
|
+
description: <<-eos
|
43
|
+
Email address of cookbook maintainer
|
44
|
+
eos
|
45
|
+
|
46
|
+
# Public: Knife skeleton create runner
|
47
|
+
#
|
48
|
+
# Returns void
|
49
|
+
def run
|
50
|
+
self.config = Chef::Config.merge!(config)
|
51
|
+
if @name_args.length < 1
|
52
|
+
show_usage
|
53
|
+
ui.fatal('You must specify a cookbook name')
|
54
|
+
exit 1
|
55
|
+
end
|
56
|
+
|
57
|
+
if parameter_empty?(config[:cookbook_path])
|
58
|
+
fail ArgumentError, <<-eos
|
59
|
+
Default cookbook_path is not specified in the
|
60
|
+
knife.rb config file, and a value to -o is
|
61
|
+
not provided. Nowhere to write the new cookbook to.
|
62
|
+
eos
|
63
|
+
end
|
64
|
+
|
65
|
+
params = {
|
66
|
+
cookbook_path: File.expand_path(Array(config[:cookbook_path]).first),
|
67
|
+
cookbook_name: @name_args.first,
|
68
|
+
copyright: cookbook_copyright,
|
69
|
+
email: cookbook_email,
|
70
|
+
license: cookbook_license,
|
71
|
+
license_name: cookbook_license_name,
|
72
|
+
readme_format: cookbook_readme_format
|
73
|
+
}
|
74
|
+
|
75
|
+
create_cookbook_directories(
|
76
|
+
params[:cookbook_path],
|
77
|
+
params[:cookbook_name]
|
78
|
+
)
|
79
|
+
create_cookbook_files(params[:cookbook_path], params[:cookbook_name])
|
80
|
+
create_cookbook_templates(params)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Public: Retrieve license name
|
84
|
+
#
|
85
|
+
# Examples:
|
86
|
+
#
|
87
|
+
# # With mit license
|
88
|
+
# cookbook_license_name
|
89
|
+
# # => 'MIT'
|
90
|
+
# # With apachev2 license
|
91
|
+
# cookbook_license_name
|
92
|
+
# # => 'Apache 2.0'
|
93
|
+
# # With gplv3 license
|
94
|
+
# cookbook_license_name
|
95
|
+
# # => 'GNU Public LIcense 3.0'
|
96
|
+
#
|
97
|
+
# Returns string
|
98
|
+
def cookbook_license_name
|
99
|
+
case cookbook_license
|
100
|
+
when 'apachev2'
|
101
|
+
'Apache 2.0'
|
102
|
+
when 'gplv2'
|
103
|
+
'GNU Public License 2.0'
|
104
|
+
when 'gplv3'
|
105
|
+
'GNU Public License 3.0'
|
106
|
+
when 'mit'
|
107
|
+
'MIT'
|
108
|
+
when 'none'
|
109
|
+
'All rights reserved'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
protected
|
114
|
+
|
115
|
+
# Protected: Create cookbook directories
|
116
|
+
#
|
117
|
+
# cookbook_path - Cookbook path
|
118
|
+
# cookbook_name - Cookbook name
|
119
|
+
#
|
120
|
+
# Examples:
|
121
|
+
#
|
122
|
+
# create_cookbook_directories('/tmp', 'my-cookbook')
|
123
|
+
#
|
124
|
+
# Returns void
|
125
|
+
def create_cookbook_directories(cookbook_path, cookbook_name)
|
126
|
+
ui.msg("** Create cookbook #{cookbook_name} into #{cookbook_path}")
|
127
|
+
|
128
|
+
%w(
|
129
|
+
definitions
|
130
|
+
libraries
|
131
|
+
providers
|
132
|
+
recipes
|
133
|
+
resources
|
134
|
+
spec
|
135
|
+
files/default
|
136
|
+
templates/default
|
137
|
+
test/integration/default/serverspec).each do |dir|
|
138
|
+
FileUtils.mkdir_p(
|
139
|
+
File.join(
|
140
|
+
cookbook_path,
|
141
|
+
cookbook_name,
|
142
|
+
dir
|
143
|
+
)
|
144
|
+
)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Protected: Create cookbook files from templates
|
149
|
+
#
|
150
|
+
# params - An Hash of parameters to use for binding template
|
151
|
+
#
|
152
|
+
# Examples:
|
153
|
+
#
|
154
|
+
# create_cookbook_templates({ cookbook_path: '/tmp', title: 'GoT' })
|
155
|
+
#
|
156
|
+
# Returns void
|
157
|
+
def create_cookbook_templates(params)
|
158
|
+
params[:license_content] = File.read(
|
159
|
+
File.join(
|
160
|
+
files_directory,
|
161
|
+
'licenses',
|
162
|
+
params[:license]
|
163
|
+
)
|
164
|
+
) if params[:license] != 'none'
|
165
|
+
|
166
|
+
params[:license_content] = '' unless params[:license] != 'none'
|
167
|
+
|
168
|
+
%W(
|
169
|
+
metadata.rb
|
170
|
+
CHANGELOG.#{params[:readme_format]}
|
171
|
+
README.#{params[:readme_format]}
|
172
|
+
.kitchen.yml
|
173
|
+
recipes/default.rb
|
174
|
+
spec/default_spec.rb
|
175
|
+
spec/spec_helper.rb
|
176
|
+
test/integration/default/serverspec/spec_helper.rb
|
177
|
+
test/integration/default/serverspec/default_spec.rb
|
178
|
+
).each do |file_name|
|
179
|
+
render_template(file_name, params)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Protected: Copy all files into the cookbook
|
184
|
+
#
|
185
|
+
# cookbook_path - Cookbook path
|
186
|
+
# cookbook_name - Cookbook name
|
187
|
+
#
|
188
|
+
# Examples:
|
189
|
+
#
|
190
|
+
# create_cookbook_files('/tmp', 'my-cookbook')
|
191
|
+
#
|
192
|
+
# Returns void
|
193
|
+
def create_cookbook_files(
|
194
|
+
cookbook_path,
|
195
|
+
cookbook_name
|
196
|
+
)
|
197
|
+
%w(
|
198
|
+
Berksfile
|
199
|
+
Gemfile
|
200
|
+
.gitignore
|
201
|
+
.rubocop.yml
|
202
|
+
.travis.yml
|
203
|
+
Strainerfile
|
204
|
+
).each do |file_name|
|
205
|
+
copy_file(cookbook_path, cookbook_name, file_name)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Protected: Copy files
|
210
|
+
#
|
211
|
+
# cookbook_path - Cookbook path
|
212
|
+
# cookbook_name - Cookbook name
|
213
|
+
# file_name - File name to used without erb extension
|
214
|
+
#
|
215
|
+
# Examples:
|
216
|
+
#
|
217
|
+
# copy_file('/tmp', '/cookbooks', 'my-cookbook', 'README.md')
|
218
|
+
#
|
219
|
+
# Returns void
|
220
|
+
def copy_file(cookbook_path, cookbook_name, file_name)
|
221
|
+
dst = File.join(
|
222
|
+
cookbook_path,
|
223
|
+
cookbook_name,
|
224
|
+
file_name
|
225
|
+
)
|
226
|
+
|
227
|
+
if File.exist?(dst)
|
228
|
+
ui.warn("'#{file_name}' already exists")
|
229
|
+
else
|
230
|
+
ui.msg("** Create '#{file_name}'")
|
231
|
+
FileUtils.cp(
|
232
|
+
File.join(
|
233
|
+
files_directory,
|
234
|
+
file_name.gsub(/^\./, '')
|
235
|
+
),
|
236
|
+
dst
|
237
|
+
)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
# Protected: Render template
|
242
|
+
#
|
243
|
+
# file_name - File name to used without erb extension
|
244
|
+
# params - Binding parameters
|
245
|
+
#
|
246
|
+
# Examples:
|
247
|
+
#
|
248
|
+
# render_template('/tmp', 'my-file.rb', { title: 'GoT' })
|
249
|
+
#
|
250
|
+
# Returns void
|
251
|
+
def render_template(file_name, params)
|
252
|
+
dst = File.join(
|
253
|
+
params[:cookbook_path],
|
254
|
+
params[:cookbook_name],
|
255
|
+
file_name
|
256
|
+
)
|
257
|
+
|
258
|
+
if File.exist?(dst)
|
259
|
+
ui.warn("'#{file_name}' already exists")
|
260
|
+
else
|
261
|
+
ui.msg("** Create '#{file_name}'")
|
262
|
+
File.open(
|
263
|
+
dst,
|
264
|
+
'w+'
|
265
|
+
) do |file|
|
266
|
+
file.write(
|
267
|
+
KnifeSkeleton::Template.render(
|
268
|
+
File.read(
|
269
|
+
File.join(
|
270
|
+
templates_directory,
|
271
|
+
file_name + '.erb'
|
272
|
+
)
|
273
|
+
),
|
274
|
+
params
|
275
|
+
)
|
276
|
+
)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Protected: Test if parameter is empty
|
282
|
+
#
|
283
|
+
# parameter - The tested parameter
|
284
|
+
#
|
285
|
+
# Examples:
|
286
|
+
#
|
287
|
+
# parameter_empty?('my string')
|
288
|
+
# # => false
|
289
|
+
# parameter_empty?('')
|
290
|
+
# # => true
|
291
|
+
#
|
292
|
+
# Returns string
|
293
|
+
def parameter_empty?(parameter)
|
294
|
+
parameter.nil? || parameter.empty?
|
295
|
+
end
|
296
|
+
|
297
|
+
# Protected: Get cookbook copyright
|
298
|
+
#
|
299
|
+
# Returns string
|
300
|
+
def cookbook_copyright
|
301
|
+
config[:cookbook_copyright] || 'YOUR_COMPANY_NAME'
|
302
|
+
end
|
303
|
+
|
304
|
+
# Protected: Get maintener email
|
305
|
+
#
|
306
|
+
# Returns string
|
307
|
+
def cookbook_email
|
308
|
+
config[:cookbook_email] || 'YOUR_EMAIL'
|
309
|
+
end
|
310
|
+
|
311
|
+
# Protected: Get license name
|
312
|
+
#
|
313
|
+
# Returns string
|
314
|
+
def cookbook_license
|
315
|
+
((config[:cookbook_license] != 'false') &&
|
316
|
+
config[:cookbook_license]) || 'none'
|
317
|
+
end
|
318
|
+
|
319
|
+
# Protected: Get readme format
|
320
|
+
#
|
321
|
+
# Returns string
|
322
|
+
def cookbook_readme_format
|
323
|
+
((config[:readme_format] != 'false') && config[:readme_format]) || 'md'
|
324
|
+
end
|
325
|
+
|
326
|
+
# Protected: Get files directory
|
327
|
+
#
|
328
|
+
# Returns string
|
329
|
+
def files_directory
|
330
|
+
File.expand_path(
|
331
|
+
'../../../../files',
|
332
|
+
Pathname.new(__FILE__).realpath
|
333
|
+
)
|
334
|
+
end
|
335
|
+
|
336
|
+
# Protected: Get templates directory
|
337
|
+
#
|
338
|
+
# Returns string
|
339
|
+
def templates_directory
|
340
|
+
File.expand_path(
|
341
|
+
'../../../../templates',
|
342
|
+
Pathname.new(__FILE__).realpath
|
343
|
+
)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'erubis'
|
3
|
+
|
4
|
+
module KnifeSkeleton
|
5
|
+
# Render template
|
6
|
+
class Template
|
7
|
+
# Static: Render template with Erubis
|
8
|
+
#
|
9
|
+
# template - Template string to used for rendering
|
10
|
+
# data - Data binding
|
11
|
+
#
|
12
|
+
# Examples:
|
13
|
+
#
|
14
|
+
# create_cookbook_directories('Hello <%= title %>', {title: 'GoT'})
|
15
|
+
# # => "Hello GoT"
|
16
|
+
#
|
17
|
+
# Returns string
|
18
|
+
def self.render(template, data)
|
19
|
+
eruby = Erubis::Eruby.new(template)
|
20
|
+
output = eruby.result(data)
|
21
|
+
output
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|