berkshelf 6.3.4 → 7.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +10 -0
  4. data/.travis.yml +6 -8
  5. data/CHANGELOG.md +7 -19
  6. data/Gemfile +10 -0
  7. data/Gemfile.lock +68 -103
  8. data/Thorfile +2 -2
  9. data/berkshelf.gemspec +6 -8
  10. data/features/commands/info.feature +50 -8
  11. data/features/commands/shelf/show.feature +10 -40
  12. data/features/commands/upload.feature +73 -0
  13. data/features/commands/vendor.feature +43 -0
  14. data/features/json_formatter.feature +1 -1
  15. data/features/step_definitions/chef_server_steps.rb +2 -2
  16. data/features/step_definitions/filesystem_steps.rb +16 -0
  17. data/features/support/env.rb +11 -10
  18. data/lib/berkshelf.rb +15 -20
  19. data/lib/berkshelf/berksfile.rb +57 -47
  20. data/lib/berkshelf/cached_cookbook.rb +120 -19
  21. data/lib/berkshelf/chef_config_compat.rb +50 -0
  22. data/lib/berkshelf/chef_repo_universe.rb +2 -2
  23. data/lib/berkshelf/cli.rb +3 -42
  24. data/lib/berkshelf/community_rest.rb +40 -61
  25. data/lib/berkshelf/config.rb +92 -118
  26. data/lib/berkshelf/cookbook_store.rb +3 -2
  27. data/lib/berkshelf/core_ext/file.rb +1 -1
  28. data/lib/berkshelf/dependency.rb +1 -10
  29. data/lib/berkshelf/downloader.rb +19 -7
  30. data/lib/berkshelf/errors.rb +3 -0
  31. data/lib/berkshelf/location.rb +1 -1
  32. data/lib/berkshelf/locations/base.rb +1 -1
  33. data/lib/berkshelf/lockfile.rb +17 -13
  34. data/lib/berkshelf/logger.rb +62 -1
  35. data/lib/berkshelf/packager.rb +1 -1
  36. data/lib/berkshelf/resolver.rb +1 -1
  37. data/lib/berkshelf/ridley_compat.rb +22 -3
  38. data/lib/berkshelf/uploader.rb +76 -48
  39. data/lib/berkshelf/version.rb +1 -1
  40. data/spec/fixtures/cookbook-path-uploader/apt-2.3.6/metadata.rb +2 -0
  41. data/spec/fixtures/cookbook-path-uploader/build-essential-1.4.2/metadata.rb +2 -0
  42. data/spec/fixtures/cookbook-path-uploader/jenkins-2.0.3/metadata.rb +5 -0
  43. data/spec/fixtures/cookbook-path-uploader/jenkins-config-0.1.0/metadata.rb +4 -0
  44. data/spec/fixtures/cookbook-path-uploader/runit-1.5.8/metadata.rb +5 -0
  45. data/spec/fixtures/cookbook-path-uploader/yum-3.0.6/metadata.rb +2 -0
  46. data/spec/fixtures/cookbook-path-uploader/yum-epel-0.2.0/metadata.rb +3 -0
  47. data/spec/spec_helper.rb +2 -2
  48. data/spec/support/chef_api.rb +4 -4
  49. data/spec/support/chef_server.rb +1 -1
  50. data/spec/support/matchers/file_system_matchers.rb +1 -3
  51. data/spec/support/path_helpers.rb +1 -1
  52. data/spec/unit/berkshelf/berksfile_spec.rb +3 -24
  53. data/spec/unit/berkshelf/cached_cookbook_spec.rb +13 -15
  54. data/spec/unit/berkshelf/community_rest_spec.rb +3 -12
  55. data/spec/unit/berkshelf/config_spec.rb +4 -4
  56. data/spec/unit/berkshelf/downloader_spec.rb +6 -11
  57. data/spec/unit/berkshelf/lockfile_spec.rb +10 -7
  58. data/spec/unit/berkshelf/source_spec.rb +1 -1
  59. data/spec/unit/berkshelf/ssl_policies_spec.rb +2 -5
  60. data/spec/unit/berkshelf/uploader_spec.rb +60 -10
  61. data/spec/unit/berkshelf/visualizer_spec.rb +2 -2
  62. metadata +49 -102
  63. data/features/commands/cookbook.feature +0 -35
  64. data/features/commands/init.feature +0 -27
  65. data/features/config.feature +0 -111
  66. data/lib/berkshelf/base_generator.rb +0 -42
  67. data/lib/berkshelf/cookbook_generator.rb +0 -133
  68. data/lib/berkshelf/init_generator.rb +0 -195
  69. data/lib/berkshelf/streaming_file_adapter.rb +0 -22
  70. data/spec/unit/berkshelf/cookbook_generator_spec.rb +0 -108
  71. data/spec/unit/berkshelf/init_generator_spec.rb +0 -265
@@ -1,42 +0,0 @@
1
- require "thor/group"
2
-
3
- module Berkshelf
4
- class BaseGenerator < Thor::Group
5
- class << self
6
- def source_root
7
- Berkshelf.root.join("generator_files")
8
- end
9
- end
10
-
11
- # A list of cookbook patterns accepted by generators inheriting from
12
- # this generator.
13
- #
14
- # @return [Array<String>]
15
- PATTERNS = %w{
16
- environment
17
- application
18
- library
19
- wrapper}.freeze
20
-
21
- shell = Berkshelf.ui
22
-
23
- argument :path,
24
- type: :string,
25
- required: true
26
-
27
- class_option :pattern,
28
- type: :string,
29
- default: "application",
30
- desc: "Modifies the generated skeleton based on the given pattern.",
31
- aliases: "-p",
32
- enum: BaseGenerator::PATTERNS
33
-
34
- include Thor::Actions
35
-
36
- private
37
-
38
- def target
39
- @target ||= Pathname.new(File.expand_path(path))
40
- end
41
- end
42
- end
@@ -1,133 +0,0 @@
1
- module Berkshelf
2
- class CookbookGenerator < BaseGenerator
3
- require_relative "config"
4
-
5
- LICENSE_MAP = {
6
- "apachev2" => "Apache 2.0",
7
- "gplv2" => "GNU Public License 2.0",
8
- "gplv3" => "GNU Public License 3.0",
9
- "mit" => "MIT",
10
- "reserved" => "All rights reserved",
11
- }.freeze
12
-
13
- (LICENSES = LICENSE_MAP.keys).freeze
14
-
15
- argument :name,
16
- type: :string,
17
- required: true
18
-
19
- class_option :skip_vagrant,
20
- type: :boolean,
21
- default: false
22
-
23
- class_option :skip_git,
24
- type: :boolean,
25
- default: false
26
-
27
- class_option :skip_test_kitchen,
28
- type: :boolean,
29
- default: false,
30
- desc: "Skip adding a testing environment to your cookbook"
31
-
32
- class_option :foodcritic,
33
- type: :boolean,
34
- default: false
35
-
36
- class_option :chef_minitest,
37
- type: :boolean,
38
- default: false
39
-
40
- class_option :scmversion,
41
- type: :boolean,
42
- default: false
43
-
44
- class_option :no_bundler,
45
- type: :boolean,
46
- default: false
47
-
48
- class_option :license,
49
- type: :string,
50
- default: Berkshelf.config.cookbook.license
51
-
52
- class_option :maintainer,
53
- type: :string,
54
- default: Berkshelf.config.cookbook.copyright
55
-
56
- class_option :maintainer_email,
57
- type: :string,
58
- default: Berkshelf.config.cookbook.email
59
-
60
- def generate
61
- case options[:pattern]
62
- when "library"
63
- empty_directory target.join("libraries")
64
- empty_directory target.join("providers")
65
- empty_directory target.join("resources")
66
- when "wrapper"
67
- empty_directory target.join("attributes")
68
- empty_directory target.join("recipes")
69
- template "default_recipe.erb", target.join("recipes/default.rb")
70
- when "environment", "application"
71
- empty_directory target.join("files/default")
72
- empty_directory target.join("templates/default")
73
- empty_directory target.join("attributes")
74
- empty_directory target.join("libraries")
75
- empty_directory target.join("providers")
76
- empty_directory target.join("recipes")
77
- empty_directory target.join("resources")
78
- template "default_recipe.erb", target.join("recipes/default.rb")
79
- end
80
-
81
- template "metadata.rb.erb", target.join("metadata.rb")
82
- template license_file, target.join("LICENSE")
83
- template "README.md.erb", target.join("README.md")
84
- template "CHANGELOG.md.erb", target.join("CHANGELOG.md")
85
-
86
- Berkshelf::InitGenerator.new([target], options.merge(default_options)).invoke_all
87
- end
88
-
89
- private
90
-
91
- def commented(content)
92
- content.split("\n").collect { |s| s == "" ? "#" : "# #{s}" }.join("\n")
93
- end
94
-
95
- def license_name
96
- LICENSE_MAP.fetch(options[:license]) do |license|
97
- raise Berkshelf::LicenseNotFound.new(license)
98
- end
99
- end
100
-
101
- def license
102
- ERB.new(File.read(File.join(self.class.source_root, license_file))).result(binding)
103
- end
104
-
105
- def license_file
106
- case options[:license]
107
- when "apachev2" then "licenses/apachev2.erb"
108
- when "gplv2" then "licenses/gplv2.erb"
109
- when "gplv3" then "licenses/gplv3.erb"
110
- when "mit" then "licenses/mit.erb"
111
- when "reserved" then "licenses/reserved.erb"
112
- else
113
- raise Berkshelf::LicenseNotFound.new(options[:license])
114
- end
115
- end
116
-
117
- def copyright_year
118
- Time.now.year
119
- end
120
-
121
- def maintainer
122
- options[:maintainer]
123
- end
124
-
125
- def maintainer_email
126
- options[:maintainer_email]
127
- end
128
-
129
- def default_options
130
- { metadata_entry: true, chefignore: true, cookbook_name: name }
131
- end
132
- end
133
- end
@@ -1,195 +0,0 @@
1
- begin
2
- require "kitchen/generator/init"
3
- rescue LoadError; end
4
-
5
- module Berkshelf
6
- class InitGenerator < BaseGenerator
7
- include Mixin::Git
8
-
9
- def initialize(*args)
10
- super(*args)
11
- if @options[:cookbook_name]
12
- @cookbook_name = @options[:cookbook_name]
13
- end
14
- end
15
-
16
- class_option :metadata_entry,
17
- type: :boolean,
18
- default: true
19
-
20
- class_option :chefignore,
21
- type: :boolean,
22
- default: true
23
-
24
- class_option :skip_vagrant,
25
- type: :boolean,
26
- default: false,
27
- desc: "Skips adding a Vagrantfile and adding supporting gems to the Gemfile"
28
-
29
- class_option :skip_git,
30
- type: :boolean,
31
- default: false,
32
- desc: "Skips adding a .gitignore and running git init in the cookbook directory"
33
-
34
- class_option :foodcritic,
35
- type: :boolean,
36
- default: false,
37
- desc: "Creates a Thorfile with Foodcritic support to lint test your cookbook"
38
-
39
- class_option :chef_minitest,
40
- type: :boolean,
41
- default: false
42
-
43
- class_option :scmversion,
44
- type: :boolean,
45
- default: false,
46
- desc: "Creates a Thorfile with SCMVersion support to manage versions for continuous integration"
47
-
48
- class_option :no_bundler,
49
- type: :boolean,
50
- default: false,
51
- desc: "Skips generation of a Gemfile and other Bundler specific support"
52
-
53
- class_option :cookbook_name,
54
- type: :string
55
-
56
- if defined?(Kitchen::Generator::Init)
57
- class_option :skip_test_kitchen,
58
- type: :boolean,
59
- default: false,
60
- desc: "Skip adding a testing environment to your cookbook"
61
- end
62
-
63
- def generate
64
- validate_cookbook
65
- validate_configuration
66
- check_option_support
67
-
68
- template "Berksfile.erb", target.join("Berksfile")
69
- template "Thorfile.erb", target.join("Thorfile")
70
-
71
- if options[:chefignore]
72
- copy_file "chefignore", target.join(Ridley::Chef::Chefignore::FILENAME)
73
- end
74
-
75
- unless options[:skip_git]
76
- template "gitignore.erb", target.join(".gitignore")
77
-
78
- unless File.exists?(target.join(".git"))
79
- inside target do
80
- git "init"
81
- end
82
- end
83
- end
84
-
85
- if options[:chef_minitest]
86
- empty_directory target.join("files/default/tests/minitest/support")
87
- template "default_test.rb.erb", target.join("files/default/tests/minitest/default_test.rb")
88
- template "helpers.rb.erb", target.join("files/default/tests/minitest/support/helpers.rb")
89
- end
90
-
91
- if options[:scmversion]
92
- create_file target.join("VERSION"), "0.1.0"
93
- end
94
-
95
- unless options[:no_bundler]
96
- template "Gemfile.erb", target.join("Gemfile")
97
- end
98
-
99
- if defined?(Kitchen::Generator::Init)
100
- unless options[:skip_test_kitchen]
101
- Kitchen::Generator::Init.new([], {}, destination_root: target).invoke_all
102
- end
103
- end
104
-
105
- unless options[:skip_vagrant]
106
- template "Vagrantfile.erb", target.join("Vagrantfile")
107
- end
108
- end
109
-
110
- private
111
-
112
- def berkshelf_config
113
- Berkshelf.config
114
- end
115
-
116
- # Read the cookbook name from the metadata.rb
117
- #
118
- # @return [String]
119
- # name of the cookbook
120
- def cookbook_name
121
- @cookbook_name ||= begin
122
- metadata = Ridley::Chef::Cookbook::Metadata.from_file(target.join("metadata.rb").to_s)
123
- metadata.name.empty? ? File.basename(target) : metadata.name
124
- rescue CookbookNotFound, IOError
125
- File.basename(target)
126
- end
127
- end
128
-
129
- # Assert the current working directory is a cookbook
130
- #
131
- # @raise [NotACookbook] if the current working directory is
132
- # not a cookbook
133
- #
134
- # @return [nil]
135
- def validate_cookbook
136
- path = File.expand_path(File.join(target, "metadata.rb"))
137
- unless File.exists?(path)
138
- raise Berkshelf::NotACookbook.new(path)
139
- end
140
- end
141
-
142
- # Assert valid configuration
143
- #
144
- # @raise [InvalidConfiguration] if the configuration is invalid
145
- #
146
- # @return [nil]
147
- def validate_configuration
148
- unless Berkshelf.config.valid?
149
- raise InvalidConfiguration.new(Berkshelf.config.errors)
150
- end
151
- end
152
-
153
- # Check for supporting gems for provided options
154
- #
155
- # @return [Boolean]
156
- def check_option_support
157
- assert_option_supported(:foodcritic) &&
158
- assert_option_supported(:scmversion, "thor-scmversion") &&
159
- assert_default_supported(:no_bundler, "bundler")
160
- end
161
-
162
- # Warn if the supporting gem for an option is not installed
163
- #
164
- # @return [Boolean]
165
- def assert_option_supported(option, gem_name = option.to_s)
166
- if options[option]
167
- begin
168
- Gem::Specification.find_by_name(gem_name)
169
- rescue Gem::LoadError
170
- Berkshelf.ui.warn "This cookbook was generated with --#{option}, however, #{gem_name} is not installed."
171
- Berkshelf.ui.warn "To make use of --#{option}: gem install #{gem_name}"
172
- return false
173
- end
174
- end
175
- true
176
- end
177
-
178
- # Warn if the supporting gem for a default is not installed
179
- #
180
- # @return [Boolean]
181
- def assert_default_supported(option, gem_name = option.to_s)
182
- unless options[option]
183
- begin
184
- Gem::Specification.find_by_name(gem_name)
185
- rescue Gem::LoadError
186
- Berkshelf.ui.warn "By default, this cookbook was generated to support #{gem_name}, however, #{gem_name} is not installed."
187
- Berkshelf.ui.warn "To skip support for #{gem_name}, use --#{option.to_s.tr('_', '-')}"
188
- Berkshelf.ui.warn "To install #{gem_name}: gem install #{gem_name}"
189
- return false
190
- end
191
- end
192
- true
193
- end
194
- end
195
- end
@@ -1,22 +0,0 @@
1
- require "faraday/adapter/net_http"
2
-
3
- module Berkshelf
4
- class StreamingFileAdapter < Faraday::Adapter::NetHttp
5
- def call(env)
6
- env[:streaming_file] = env[:request_headers].delete(:streaming_file) if env[:request_headers] && env[:request_headers][:streaming_file]
7
- super
8
- end
9
-
10
- def perform_request(http, env)
11
- if env[:streaming_file]
12
- http.request(create_request(env)) do |response|
13
- response.read_body do |chunk|
14
- env[:streaming_file].write(chunk) if response.code == "200"
15
- end
16
- end
17
- else
18
- super
19
- end
20
- end
21
- end
22
- end
@@ -1,108 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Berkshelf::CookbookGenerator do
4
- let(:name) { "sparkle_motion" }
5
- let(:license) { "reserved" }
6
- let(:maintainer) { "Berkshelf Core" }
7
- let(:maintainer_email) { "core@berkshelf.com" }
8
-
9
- let(:target) { tmp_path.join(name) }
10
- let(:kitchen_generator) { double("kitchen-generator", invoke_all: nil) }
11
-
12
- context "with default options" do
13
- before do
14
- if defined?(Kitchen::Generator::Init)
15
- expect(Kitchen::Generator::Init).to receive(:new).with(any_args()).and_return(kitchen_generator)
16
- end
17
- capture(:stdout) do
18
- Berkshelf::CookbookGenerator.new([target, name],
19
- license: license,
20
- maintainer: maintainer,
21
- maintainer_email: maintainer_email
22
- ).invoke_all
23
- end
24
- end
25
-
26
- it "generates a new cookbook" do
27
- expect(target).to have_structure {
28
- directory "attributes"
29
- directory "files" do
30
- directory "default"
31
- end
32
- directory "libraries"
33
- directory "providers"
34
- directory "recipes" do
35
- file "default.rb" do
36
- contains "# Cookbook Name:: sparkle_motion"
37
- contains "# Recipe:: default"
38
- contains "# Copyright (C) #{Time.now.year} Berkshelf Core"
39
- contains "# All rights reserved - Do Not Redistribute"
40
- end
41
- end
42
- directory "resources"
43
- directory "templates" do
44
- directory "default"
45
- end
46
- file "LICENSE" do
47
- contains "Copyright (C) #{Time.now.year} Berkshelf Core"
48
- contains "All rights reserved - Do Not Redistribute"
49
- end
50
- file "README.md" do
51
- contains "# sparkle_motion-cookbook"
52
- contains "### sparkle_motion::default"
53
- contains " <td><tt>['sparkle_motion']['bacon']</tt></td>"
54
- contains "Include `sparkle_motion` in your node's `run_list`:"
55
- contains ' "recipe[sparkle_motion::default]"'
56
- contains "Author:: Berkshelf Core (<core@berkshelf.com>)"
57
- end
58
- file "CHANGELOG.md" do
59
- contains "# 0.1.0"
60
- contains "Initial release of sparkle_motion"
61
- end
62
- file "metadata.rb" do
63
- contains "name 'sparkle_motion'"
64
- contains "maintainer 'Berkshelf Core'"
65
- contains "maintainer_email 'core@berkshelf.com'"
66
- contains "license 'All rights reserved'"
67
- contains "description 'Installs/Configures sparkle_motion'"
68
- end
69
- file "Berksfile" do
70
- contains 'source "https://supermarket.chef.io"'
71
- contains "metadata"
72
- end
73
- file "Gemfile"
74
- file "chefignore"
75
- }
76
- end
77
- end
78
-
79
- context "given a 'maintainer_email' option" do
80
- before do
81
- capture(:stdout) do
82
- if defined?(Kitchen::Generator::Init)
83
- expect(Kitchen::Generator::Init).to receive(:new).with(any_args()).and_return(kitchen_generator)
84
- end
85
- Berkshelf::CookbookGenerator.new([target, name], maintainer_email: "jamie@vialstudios.com").invoke_all
86
- end
87
- end
88
-
89
- it "generates a metadata.rb with the 'maintainer_email' value set" do
90
- email = email
91
- expect(target).to have_structure {
92
- file "metadata.rb" do
93
- contains "maintainer_email 'jamie@vialstudios.com'"
94
- end
95
- }
96
- end
97
- end
98
-
99
- context "given an invalid option for :license" do
100
- subject(:run) do
101
- capture(:stdout) { described_class.new([target, name], license: "not-there").invoke_all }
102
- end
103
-
104
- it "raises a LicenseNotFound error" do
105
- expect { run }.to raise_error(Berkshelf::LicenseNotFound)
106
- end
107
- end
108
- end