berkshelf 0.4.0.rc1 → 0.4.0.rc2
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.
- data/bin/berks +6 -1
- data/features/cookbook_command.feature +39 -0
- data/features/step_definitions/cli_steps.rb +8 -0
- data/features/step_definitions/filesystem_steps.rb +120 -1
- data/features/support/env.rb +1 -1
- data/lib/berkshelf.rb +16 -4
- data/lib/berkshelf/base_generator.rb +20 -0
- data/lib/berkshelf/berksfile.rb +18 -10
- data/lib/berkshelf/cli.rb +36 -18
- data/lib/berkshelf/cookbook_generator.rb +112 -0
- data/lib/berkshelf/cookbook_source/git_location.rb +1 -0
- data/lib/berkshelf/dsl.rb +7 -1
- data/lib/berkshelf/generator_files/Gemfile.erb +12 -0
- data/lib/berkshelf/generator_files/README.md.erb +13 -0
- data/lib/berkshelf/generator_files/Thorfile.erb +11 -0
- data/lib/berkshelf/generator_files/Vagrantfile.erb +63 -0
- data/lib/berkshelf/generator_files/chefignore +1 -0
- data/lib/berkshelf/generator_files/default_recipe.erb +6 -0
- data/lib/berkshelf/generator_files/gitignore.erb +6 -0
- data/lib/berkshelf/generator_files/licenses/apachev2.erb +13 -0
- data/lib/berkshelf/generator_files/licenses/gplv2.erb +15 -0
- data/lib/berkshelf/generator_files/licenses/gplv3.erb +14 -0
- data/lib/berkshelf/generator_files/licenses/mit.erb +20 -0
- data/lib/berkshelf/generator_files/licenses/reserved.erb +3 -0
- data/lib/berkshelf/generator_files/metadata.rb.erb +12 -0
- data/lib/berkshelf/init_generator.rb +69 -12
- data/lib/berkshelf/version.rb +1 -1
- data/spec/unit/berkshelf/berksfile_spec.rb +20 -20
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +79 -0
- data/spec/unit/berkshelf/git_spec.rb +9 -9
- data/spec/unit/berkshelf/init_generator_spec.rb +107 -7
- metadata +20 -2
data/bin/berks
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
Feature: cookbook command
|
2
|
+
As a Cookbook author
|
3
|
+
I want a way to quickly generate a Cookbook skeleton that contains supporting Berkshelf files
|
4
|
+
So I can quickly and automatically generate a Cookbook containing Berkshelf supporting files or other common supporting files
|
5
|
+
|
6
|
+
Scenario: creating a new cookbook skeleton
|
7
|
+
When I run the cookbook command to create "sparkle_motion"
|
8
|
+
Then I should have a new cookbook skeleton "sparkle_motion"
|
9
|
+
And the exit status should be 0
|
10
|
+
|
11
|
+
Scenario: creating a new cookbook skeleton with Vagrant support
|
12
|
+
When I run the cookbook command to create "sparkle_motion" with options:
|
13
|
+
| --vagrant |
|
14
|
+
Then I should have a new cookbook skeleton "sparkle_motion" with Vagrant support
|
15
|
+
And the exit status should be 0
|
16
|
+
|
17
|
+
Scenario: creating a new cookbook skeleton with Git support
|
18
|
+
When I run the cookbook command to create "sparkle_motion" with options:
|
19
|
+
| --git |
|
20
|
+
Then I should have a new cookbook skeleton "sparkle_motion" with Git support
|
21
|
+
And the exit status should be 0
|
22
|
+
|
23
|
+
Scenario: creating a new cookbook skeleton with Foodcritic support
|
24
|
+
When I run the cookbook command to create "sparkle_motion" with options:
|
25
|
+
| --foodcritic |
|
26
|
+
Then I should have a new cookbook skeleton "sparkle_motion" with Foodcritic support
|
27
|
+
And the exit status should be 0
|
28
|
+
|
29
|
+
Scenario: creating a new cookbook skeleton with SCMVersion support
|
30
|
+
When I run the cookbook command to create "sparkle_motion" with options:
|
31
|
+
| --scmversion |
|
32
|
+
Then I should have a new cookbook skeleton "sparkle_motion" with SCMVersion support
|
33
|
+
And the exit status should be 0
|
34
|
+
|
35
|
+
Scenario: creating a new cookbook skeleton without Bundler support
|
36
|
+
When I run the cookbook command to create "sparkle_motion" with options:
|
37
|
+
| --no-bundler |
|
38
|
+
Then I should have a new cookbook skeleton "sparkle_motion" without Bundler support
|
39
|
+
And the exit status should be 0
|
@@ -54,6 +54,14 @@ When /^I run the upload command$/ do
|
|
54
54
|
run_simple(unescape("berks upload"), true)
|
55
55
|
end
|
56
56
|
|
57
|
+
When /^I run the cookbook command to create "(.*?)"$/ do |name|
|
58
|
+
run_simple(unescape("berks cookbook #{name}"))
|
59
|
+
end
|
60
|
+
|
61
|
+
When /^I run the cookbook command to create "(.*?)" with options:$/ do |name, options|
|
62
|
+
run_simple(unescape("berks cookbook #{name} #{options.raw.join(" ")}"))
|
63
|
+
end
|
64
|
+
|
57
65
|
Then /^the CLI should exit with the status code for error "(.*?)"$/ do |error_constant|
|
58
66
|
exit_status = Berkshelf.const_get(error_constant).status_code
|
59
67
|
assert_exit_status(exit_status)
|
@@ -32,7 +32,6 @@ Given /^the cookbook store contains a cookbook "(.*?)" "(.*?)" with dependencies
|
|
32
32
|
generate_cookbook(cookbook_store, name, version, dependencies: dependencies.raw)
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
35
|
Then /^the cookbook store should have the cookbooks:$/ do |cookbooks|
|
37
36
|
cookbooks.raw.each do |name, version|
|
38
37
|
cookbook_store.should have_structure {
|
@@ -65,10 +64,130 @@ Then /^the cookbook store should not have the cookbooks:$/ do |cookbooks|
|
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
67
|
+
Then /^I should have the cookbook "(.*?)"$/ do |name|
|
68
|
+
Pathname.new(current_dir).join(name).should be_cookbook
|
69
|
+
end
|
70
|
+
|
71
|
+
Then /^I should have a new cookbook skeleton "(.*?)"$/ do |name|
|
72
|
+
cb_path = Pathname.new(current_dir).join(name)
|
73
|
+
cb_path.should have_structure {
|
74
|
+
directory "attributes"
|
75
|
+
directory "definitions"
|
76
|
+
directory "files" do
|
77
|
+
directory "default"
|
78
|
+
end
|
79
|
+
directory "libraries"
|
80
|
+
directory "providers"
|
81
|
+
directory "recipes" do
|
82
|
+
file "default.rb"
|
83
|
+
end
|
84
|
+
directory "resources"
|
85
|
+
directory "templates" do
|
86
|
+
directory "default"
|
87
|
+
end
|
88
|
+
file "README.md"
|
89
|
+
file "metadata.rb"
|
90
|
+
file "Berksfile" do
|
91
|
+
contains "metadata"
|
92
|
+
end
|
93
|
+
file "chefignore"
|
94
|
+
file "Berksfile"
|
95
|
+
file "Gemfile" do
|
96
|
+
contains "gem 'berkshelf'"
|
97
|
+
end
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
Then /^I should have a new cookbook skeleton "(.*?)" with Vagrant support$/ do |name|
|
102
|
+
steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
|
103
|
+
|
104
|
+
cb_path = Pathname.new(current_dir).join(name)
|
105
|
+
cb_path.should have_structure {
|
106
|
+
file "Gemfile" do
|
107
|
+
contains "gem 'vagrant'"
|
108
|
+
end
|
109
|
+
file "Vagrantfile" do
|
110
|
+
contains "recipe[#{name}::default]"
|
111
|
+
end
|
112
|
+
directory "cookbooks" do
|
113
|
+
directory name
|
114
|
+
end
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
Then /^I should have a new cookbook skeleton "(.*?)" with Git support$/ do |name|
|
119
|
+
steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
|
120
|
+
|
121
|
+
cb_path = Pathname.new(current_dir).join(name)
|
122
|
+
cb_path.should have_structure {
|
123
|
+
file ".gitignore"
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
Then /^I should have a new cookbook skeleton "(.*?)" with Foodcritic support$/ do |name|
|
128
|
+
steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
|
129
|
+
|
130
|
+
cb_path = Pathname.new(current_dir).join(name)
|
131
|
+
cb_path.should have_structure {
|
132
|
+
file "Gemfile" do
|
133
|
+
contains "gem 'thor-foodcritic'"
|
134
|
+
end
|
135
|
+
file "Thorfile" do
|
136
|
+
contains "require 'thor/foodcritic'"
|
137
|
+
end
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
Then /^I should have a new cookbook skeleton "(.*?)" with SCMVersion support$/ do |name|
|
142
|
+
steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
|
143
|
+
|
144
|
+
cb_path = Pathname.new(current_dir).join(name)
|
145
|
+
cb_path.should have_structure {
|
146
|
+
file "Gemfile" do
|
147
|
+
contains "gem 'thor-scmversion'"
|
148
|
+
end
|
149
|
+
file "Thorfile" do
|
150
|
+
contains "require 'thor/scmversion'"
|
151
|
+
end
|
152
|
+
}
|
153
|
+
end
|
154
|
+
|
155
|
+
Then /^I should have a new cookbook skeleton "(.*?)" without Bundler support$/ do |name|
|
156
|
+
cb_path = Pathname.new(current_dir).join(name)
|
157
|
+
cb_path.should have_structure {
|
158
|
+
directory "attributes"
|
159
|
+
directory "definitions"
|
160
|
+
directory "files" do
|
161
|
+
directory "default"
|
162
|
+
end
|
163
|
+
directory "libraries"
|
164
|
+
directory "providers"
|
165
|
+
directory "recipes" do
|
166
|
+
file "default.rb"
|
167
|
+
end
|
168
|
+
directory "resources"
|
169
|
+
directory "templates" do
|
170
|
+
directory "default"
|
171
|
+
end
|
172
|
+
file "README.md"
|
173
|
+
file "metadata.rb"
|
174
|
+
file "Berksfile" do
|
175
|
+
contains "metadata"
|
176
|
+
end
|
177
|
+
file "chefignore"
|
178
|
+
file "Berksfile"
|
179
|
+
no_file "Gemfile"
|
180
|
+
}
|
181
|
+
end
|
182
|
+
|
68
183
|
Then /^the cookbook "(.*?)" should have the following files:$/ do |name, files|
|
69
184
|
check_file_presence(files.raw.map{|file_row| File.join(name, file_row[0])}, true)
|
70
185
|
end
|
71
186
|
|
187
|
+
Then /^the cookbook "(.*?)" should not have the following files:$/ do |name, files|
|
188
|
+
check_file_presence(files.raw.map{|file_row| File.join(name, file_row[0])}, false)
|
189
|
+
end
|
190
|
+
|
72
191
|
Then /^the file "(.*?)" in the cookbook "(.*?)" should contain:$/ do |file_name, cookbook_name, content|
|
73
192
|
Pathname.new(current_dir).join(cookbook_name).should have_structure {
|
74
193
|
file "Berksfile" do
|
data/features/support/env.rb
CHANGED
data/lib/berkshelf.rb
CHANGED
@@ -24,7 +24,9 @@ module Berkshelf
|
|
24
24
|
autoload :Git, 'berkshelf/git'
|
25
25
|
autoload :Berksfile, 'berkshelf/berksfile'
|
26
26
|
autoload :Lockfile, 'berkshelf/lockfile'
|
27
|
+
autoload :BaseGenerator, 'berkshelf/base_generator'
|
27
28
|
autoload :InitGenerator, 'berkshelf/init_generator'
|
29
|
+
autoload :CookbookGenerator, 'berkshelf/cookbook_generator'
|
28
30
|
autoload :CookbookSource, 'berkshelf/cookbook_source'
|
29
31
|
autoload :CookbookStore, 'berkshelf/cookbook_store'
|
30
32
|
autoload :CachedCookbook, 'berkshelf/cached_cookbook'
|
@@ -49,17 +51,27 @@ module Berkshelf
|
|
49
51
|
@ui ||= Chef::Knife::UI.new(null_stream, null_stream, STDIN, {})
|
50
52
|
end
|
51
53
|
|
52
|
-
# Returns the filepath to the location
|
53
|
-
#
|
54
|
-
#
|
54
|
+
# Returns the filepath to the location Berskhelf will use for
|
55
|
+
# storage; temp files will go here, Cookbooks will be downloaded
|
56
|
+
# to or uploaded from here. By default this is '~/.berkshelf' but
|
57
|
+
# can be overridden by specifying a value for the ENV variable
|
58
|
+
# 'BERKSHELF_PATH'.
|
55
59
|
#
|
56
60
|
# @return [String]
|
57
61
|
def berkshelf_path
|
58
62
|
ENV["BERKSHELF_PATH"] || DEFAULT_STORE_PATH
|
59
63
|
end
|
60
64
|
|
65
|
+
def tmp_dir
|
66
|
+
File.join(berkshelf_path, "tmp")
|
67
|
+
end
|
68
|
+
|
69
|
+
def cookbooks_dir
|
70
|
+
File.join(berkshelf_path, "cookbooks")
|
71
|
+
end
|
72
|
+
|
61
73
|
def cookbook_store
|
62
|
-
@cookbook_store ||= CookbookStore.new(
|
74
|
+
@cookbook_store ||= CookbookStore.new(cookbooks_dir)
|
63
75
|
end
|
64
76
|
|
65
77
|
def downloader
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'thor/group'
|
2
|
+
|
3
|
+
module Berkshelf
|
4
|
+
# @author Jamie Winsor <jamie@vialstudios.com>
|
5
|
+
class BaseGenerator < Thor::Group
|
6
|
+
class << self
|
7
|
+
def source_root
|
8
|
+
File.expand_path(File.join(File.dirname(__FILE__), "generator_files"))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
include Thor::Actions
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def target
|
17
|
+
@target ||= Pathname.new(File.expand_path(path))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/berkshelf/berksfile.rb
CHANGED
@@ -6,18 +6,12 @@ module Berkshelf
|
|
6
6
|
class << self
|
7
7
|
def from_file(file)
|
8
8
|
content = File.read(file)
|
9
|
-
|
9
|
+
object = new(file)
|
10
|
+
object.load(content)
|
10
11
|
rescue Errno::ENOENT => e
|
11
12
|
raise BerksfileNotFound, "No Berksfile or Berksfile.lock found at: #{file}"
|
12
13
|
end
|
13
14
|
|
14
|
-
def read(content)
|
15
|
-
object = new
|
16
|
-
object.instance_eval(content)
|
17
|
-
|
18
|
-
object
|
19
|
-
end
|
20
|
-
|
21
15
|
# @param [Array] sources
|
22
16
|
# an array of sources to filter
|
23
17
|
# @param [Array, Symbol] excluded
|
@@ -34,7 +28,10 @@ module Berkshelf
|
|
34
28
|
end
|
35
29
|
end
|
36
30
|
|
37
|
-
|
31
|
+
attr_reader :filepath
|
32
|
+
|
33
|
+
def initialize(path)
|
34
|
+
@filepath = path
|
38
35
|
@sources = Hash.new
|
39
36
|
end
|
40
37
|
|
@@ -190,7 +187,7 @@ module Berkshelf
|
|
190
187
|
if descendant_directory?(path, Dir.pwd)
|
191
188
|
actual_path = path
|
192
189
|
FileUtils.rm_rf(actual_path)
|
193
|
-
path =
|
190
|
+
path = File.join(Berkshelf.tmp_dir, "shims")
|
194
191
|
end
|
195
192
|
|
196
193
|
FileUtils.mkdir_p(path)
|
@@ -205,6 +202,17 @@ module Berkshelf
|
|
205
202
|
end
|
206
203
|
end
|
207
204
|
|
205
|
+
# Reload this instance of Berksfile with the given content. The content
|
206
|
+
# is a string that may contain terms from the included DSL.
|
207
|
+
#
|
208
|
+
# @param [String] content
|
209
|
+
#
|
210
|
+
# @return [Berksfile]
|
211
|
+
def load(content)
|
212
|
+
instance_eval(content)
|
213
|
+
self
|
214
|
+
end
|
215
|
+
|
208
216
|
private
|
209
217
|
|
210
218
|
def descendant_directory?(candidate, parent)
|
data/lib/berkshelf/cli.rb
CHANGED
@@ -10,9 +10,6 @@ module Berkshelf
|
|
10
10
|
::Berkshelf.ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
|
11
11
|
::Berkshelf.config_path = @options[:config]
|
12
12
|
@options = options.dup # unfreeze frozen options Hash from Thor
|
13
|
-
rescue BerkshelfError => e
|
14
|
-
Berkshelf.ui.fatal e
|
15
|
-
exit e.status_code
|
16
13
|
end
|
17
14
|
|
18
15
|
namespace "berkshelf"
|
@@ -21,6 +18,7 @@ module Berkshelf
|
|
21
18
|
map 'up' => :upload
|
22
19
|
map 'ud' => :update
|
23
20
|
map 'ver' => :version
|
21
|
+
map 'book' => :cookbook
|
24
22
|
|
25
23
|
class_option :config,
|
26
24
|
type: :string,
|
@@ -50,9 +48,6 @@ module Berkshelf
|
|
50
48
|
def install
|
51
49
|
berksfile = ::Berkshelf::Berksfile.from_file(options[:berksfile])
|
52
50
|
berksfile.install(options)
|
53
|
-
rescue BerkshelfError => e
|
54
|
-
Berkshelf.ui.fatal e
|
55
|
-
exit e.status_code
|
56
51
|
end
|
57
52
|
|
58
53
|
method_option :berksfile,
|
@@ -70,9 +65,6 @@ module Berkshelf
|
|
70
65
|
def update
|
71
66
|
Lockfile.remove!
|
72
67
|
invoke :install
|
73
|
-
rescue BerkshelfError => e
|
74
|
-
Berkshelf.ui.fatal e
|
75
|
-
exit e.status_code
|
76
68
|
end
|
77
69
|
|
78
70
|
method_option :berksfile,
|
@@ -99,25 +91,18 @@ module Berkshelf
|
|
99
91
|
Berkshelf.load_config
|
100
92
|
berksfile = ::Berkshelf::Berksfile.from_file(options[:berksfile])
|
101
93
|
berksfile.upload(Chef::Config[:chef_server_url], options)
|
102
|
-
rescue BerkshelfError => e
|
103
|
-
Berkshelf.ui.fatal e
|
104
|
-
exit e.status_code
|
105
94
|
end
|
106
95
|
|
107
|
-
desc "init [PATH]", "Prepare a local path to have
|
96
|
+
desc "init [PATH]", "Prepare a local path to have its Cookbook dependencies managed by Berkshelf."
|
108
97
|
def init(path = Dir.pwd)
|
109
98
|
if File.chef_cookbook?(path)
|
110
99
|
options[:chefignore] = true
|
111
100
|
options[:metadata_entry] = true
|
112
101
|
end
|
113
102
|
|
114
|
-
|
115
|
-
generator.invoke_all
|
103
|
+
::Berkshelf::InitGenerator.new([path], options).invoke_all
|
116
104
|
|
117
105
|
::Berkshelf.ui.info "Successfully initialized"
|
118
|
-
rescue BerkshelfError => e
|
119
|
-
Berkshelf.ui.fatal e
|
120
|
-
exit e.status_code
|
121
106
|
end
|
122
107
|
|
123
108
|
desc "version", "Display version and copyright information"
|
@@ -127,6 +112,39 @@ module Berkshelf
|
|
127
112
|
Berkshelf.ui.info license
|
128
113
|
end
|
129
114
|
|
115
|
+
method_option :vagrant,
|
116
|
+
type: :boolean,
|
117
|
+
desc: "Creates a Vagrantfile and dynamically change other generated files to support Vagrant"
|
118
|
+
method_option :git,
|
119
|
+
type: :boolean,
|
120
|
+
desc: "Creates additional git specific files if your project will be managed by git"
|
121
|
+
method_option :foodcritic,
|
122
|
+
type: :boolean,
|
123
|
+
desc: "Creates a Thorfile with Foodcritic support to lint test your cookbook"
|
124
|
+
method_option :scmversion,
|
125
|
+
type: :boolean,
|
126
|
+
desc: "Creates a Thorfile with SCMVersion support to manage versions for continuous integration"
|
127
|
+
method_option :no_bundler,
|
128
|
+
type: :boolean,
|
129
|
+
desc: "Skips generation of a Gemfile and other Bundler specific support"
|
130
|
+
method_option :license,
|
131
|
+
type: :string,
|
132
|
+
default: "reserved",
|
133
|
+
desc: "License for cookbook (apachev2, gplv2, gplv3, mit, reserved)",
|
134
|
+
aliases: "-L"
|
135
|
+
method_option :maintainer,
|
136
|
+
type: :string,
|
137
|
+
desc: "Name of cookbook maintainer",
|
138
|
+
aliases: "-m"
|
139
|
+
method_option :maintainer_email,
|
140
|
+
type: :string,
|
141
|
+
desc: "Email address of cookbook maintainer",
|
142
|
+
aliases: "-e"
|
143
|
+
desc "cookbook NAME", "Create a skeleton for a new cookbook"
|
144
|
+
def cookbook(name)
|
145
|
+
::Berkshelf::CookbookGenerator.new([name, File.join(Dir.pwd, name)], options).invoke_all
|
146
|
+
end
|
147
|
+
|
130
148
|
private
|
131
149
|
|
132
150
|
def version_header
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Berkshelf
|
2
|
+
# @author Jamie Winsor <jamie@vialstudios.com>
|
3
|
+
class CookbookGenerator < BaseGenerator
|
4
|
+
argument :name,
|
5
|
+
type: :string,
|
6
|
+
required: true
|
7
|
+
|
8
|
+
argument :path,
|
9
|
+
type: :string,
|
10
|
+
required: true
|
11
|
+
|
12
|
+
class_option :vagrant,
|
13
|
+
type: :boolean,
|
14
|
+
default: false
|
15
|
+
|
16
|
+
class_option :git,
|
17
|
+
type: :boolean,
|
18
|
+
default: false
|
19
|
+
|
20
|
+
class_option :foodcritic,
|
21
|
+
type: :boolean,
|
22
|
+
default: false
|
23
|
+
|
24
|
+
class_option :scmversion,
|
25
|
+
type: :boolean,
|
26
|
+
default: false
|
27
|
+
|
28
|
+
class_option :no_bundler,
|
29
|
+
type: :boolean,
|
30
|
+
default: false
|
31
|
+
|
32
|
+
class_option :license,
|
33
|
+
type: :string,
|
34
|
+
default: "reserved"
|
35
|
+
|
36
|
+
class_option :maintainer,
|
37
|
+
type: :string,
|
38
|
+
default: "YOUR_NAME"
|
39
|
+
|
40
|
+
class_option :maintainer_email,
|
41
|
+
type: :string,
|
42
|
+
default: "YOUR_EMAIL"
|
43
|
+
|
44
|
+
def generate
|
45
|
+
empty_directory target.join("files/default")
|
46
|
+
empty_directory target.join("templates/default")
|
47
|
+
empty_directory target.join("attributes")
|
48
|
+
empty_directory target.join("definitions")
|
49
|
+
empty_directory target.join("libraries")
|
50
|
+
empty_directory target.join("providers")
|
51
|
+
empty_directory target.join("recipes")
|
52
|
+
empty_directory target.join("resources")
|
53
|
+
|
54
|
+
template "default_recipe.erb", target.join("recipes/default.rb")
|
55
|
+
template "metadata.rb.erb", target.join("metadata.rb")
|
56
|
+
template license_file, target.join("LICENSE")
|
57
|
+
template "README.md.erb", target.join("README.md")
|
58
|
+
|
59
|
+
::Berkshelf::InitGenerator.new([target], options.merge(default_options)).invoke_all
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def commented(content)
|
65
|
+
content.split("\n").collect { |s| "# #{s}" }.join("\n")
|
66
|
+
end
|
67
|
+
|
68
|
+
def license_name
|
69
|
+
case options[:license]
|
70
|
+
when "apachev2"; "Apache 2.0"
|
71
|
+
when "gplv2"; "GNU Public License 2.0"
|
72
|
+
when "gplv3"; "GNU Public License 3.0"
|
73
|
+
when "mit"; "MIT"
|
74
|
+
when "reserved"; "All rights reserved"
|
75
|
+
else
|
76
|
+
raise Berkshelf::InternalError, "Unknown license: '#{options[:license]}'"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def license
|
81
|
+
ERB.new(File.read(File.join(self.class.source_root, license_file))).result(binding)
|
82
|
+
end
|
83
|
+
|
84
|
+
def license_file
|
85
|
+
case options[:license]
|
86
|
+
when "apachev2"; "licenses/apachev2.erb"
|
87
|
+
when "gplv2"; "licenses/gplv2.erb"
|
88
|
+
when "gplv3"; "licenses/gplv3.erb"
|
89
|
+
when "mit"; "licenses/mit.erb"
|
90
|
+
when "reserved"; "licenses/reserved.erb"
|
91
|
+
else
|
92
|
+
raise Berkshelf::InternalError, "Unknown license: '#{options[:license]}'"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def copyright_year
|
97
|
+
Time.now.year
|
98
|
+
end
|
99
|
+
|
100
|
+
def maintainer
|
101
|
+
options[:maintainer]
|
102
|
+
end
|
103
|
+
|
104
|
+
def maintainer_email
|
105
|
+
options[:maintainer_email]
|
106
|
+
end
|
107
|
+
|
108
|
+
def default_options
|
109
|
+
{ metadata_entry: true, chefignore: true, cookbook_name: name }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|