stove 3.0.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b2054d6ff1813a9e732d90f9758cee5f45b39a5b
4
- data.tar.gz: 680226a4dd39d13ceac6e78d8811e69206f7f3b4
3
+ metadata.gz: e4c8841bc73b292bcd565cff88b842bc1168fa29
4
+ data.tar.gz: 366832a1c8ce35fd2aede16c91e792c87a641895
5
5
  SHA512:
6
- metadata.gz: 3ea199748cab9c2d639c4c12acee0bf5e36334cfe7fcc77850ff60fed204798061901f0ec9fb70cbbeaaaf4d8d701da62b4a3e7ba29328a85d37e943370d0b67
7
- data.tar.gz: 42e80c8bae4b0166a71c5709bb9ebd4c1411de9fe58fcd09dc5600cdf65615c82607c76aa78b4cc710a4df949ded7dfe6b86bd9711360de3ef16ea6199462be2
6
+ metadata.gz: 5e07b0fa5c4d8e2578fa9b8cd9ee1a2204358268abdf036285286a28046819a7057f99ad32324ea823070b92fc95ba18b9245192f8a7c7fbbf27721ffa1db5a1
7
+ data.tar.gz: 2d79edc8e2780608752a9f9677b4af644bbc847b0df3623a2ebb6dae43f21f967fc50ebaffa910edd35e4d14f2d8558c7681666b6dea7e52696da1e02f94e8cb
data/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@ Stove CHANGELOG
2
2
  ===============
3
3
  This is the Changelog for the Stove gem.
4
4
 
5
+ v3.2.1 (2014-07-16)
6
+ -------------------
7
+ - Fix a critical bug where nested directories are flattened
8
+
9
+ v3.2.0 (2014-07-15)
10
+ -------------------
11
+ - Add the ability to "yank" (delete) a cookbook from the Supermarket
12
+ - Remove the `--category` flag (it is no longer honored)
13
+ - Fix a bug where the `resources/` folder was not uploaded
14
+ - Fix a bug when the cookbook name is not the same as the metdata name in the uploaded tarball
15
+
16
+ v3.1.0 (2014-07-10)
17
+ -------------------
18
+ - Use the generated tempfile directly (instead of writing to disk and creating File objects)
19
+ - Add a default version constraint ('>= 0.0.0')
20
+ - Only package Ruby files under `recipes/` and similar directories
21
+ - Dynamically generate the metadata.json in memory (save disk IO)
22
+ - Use Rubygem's TarWrtier instead of minitar (removed dependency)
23
+ - Bump version of Chef API to support tempfile IO objects
24
+
5
25
  v3.0.0 (2014-07-07)
6
26
  -------------------
7
27
  - Add support for signed git tags
@@ -1,7 +1,6 @@
1
1
  Feature: Community
2
2
  Background:
3
3
  * I have a cookbook named "bacon"
4
- * I am using the community server
5
4
 
6
5
  Scenario: When the username does not exist
7
6
  * the Stove config at "username" is unset
@@ -13,13 +12,30 @@ Feature: Community
13
12
  * I run `stove --no-git`
14
13
  * it should fail with "requires a private key"
15
14
 
16
- Scenario: When the category does not exist
17
- * I run `stove --no-git`
18
- * it should fail with "You did not specify a category"
19
-
20
15
  Scenario: With the default parameters
21
16
  * the community server has the cookbook:
22
- | bacon | 1.2.3 | Application |
17
+ | bacon | 1.2.3 |
23
18
  * I successfully run `stove --no-git`
24
19
  * the community server will have the cookbooks:
25
- | bacon | 0.0.0 | Application |
20
+ | bacon | 0.0.0 |
21
+
22
+ Scenario: Yanking a cookbook
23
+ * the community server has the cookbooks:
24
+ | bacon | 1.2.3 |
25
+ * I successfully run `stove yank -l debug`
26
+ * the community server will not have the cookbooks:
27
+ | bacon | 1.2.3 |
28
+ * the output should contain "Successfully yanked bacon!"
29
+
30
+ Scenario: Yanking a cookbook by name
31
+ * the community server has the cookbooks:
32
+ | eggs | 4.5.6 |
33
+ * I successfully run `stove yank eggs`
34
+ * the community server will not have the cookbooks:
35
+ | eggs | 4.5.6 |
36
+ * the output should not contain "Successfully yanked bacon!"
37
+ * the output should contain "Successfully yanked eggs!"
38
+
39
+ Scenario: Yanking a non-existent cookbook
40
+ * I run `stove yank ham`
41
+ * it should fail with "I could not find a cookbook named ham"
@@ -2,7 +2,7 @@ Feature: git Plugin
2
2
  Background:
3
3
  * I have a cookbook named "bacon"
4
4
  * the community server has the cookbooks:
5
- | bacon | 1.0.0 | Application |
5
+ | bacon | 1.0.0 |
6
6
 
7
7
  Scenario: When the directory is not a git repository
8
8
  * I run `stove`
@@ -1,31 +1,23 @@
1
- Given /^I am using the community server$/ do
2
- set_env('STOVE_ENDPOINT', CommunityZero::RSpec.url)
3
- set_env('STOVE_CLIENT', 'stove')
4
- set_env('STOVE_KEY', File.expand_path('../../support/stove.pem', __FILE__))
5
- end
6
-
7
1
  Given /^the community server has the cookbooks?:$/ do |table|
8
- table.raw.each do |name, version, category|
2
+ table.raw.each do |name, version|
9
3
  version ||= '0.0.0'
10
- category ||= 'Other'
11
4
 
12
5
  CommunityZero::RSpec.store.add(CommunityZero::Cookbook.new(
13
6
  name: name,
14
7
  version: version,
15
- category: category,
8
+ category: 'Other',
16
9
  ))
17
10
  end
18
11
  end
19
12
 
20
13
  Then /^the community server will( not)? have the cookbooks?:$/ do |negate, table|
21
- table.raw.each do |name, version, category|
14
+ table.raw.each do |name, version|
22
15
  cookbook = CommunityZero::RSpec.store.find(name, version)
23
16
 
24
17
  if negate
25
18
  expect(cookbook).to be_nil
26
19
  else
27
20
  expect(cookbook).to_not be_nil
28
- expect(cookbook.category).to eql(category) if category
29
21
  end
30
22
  end
31
23
  end
data/lib/stove/cli.rb CHANGED
@@ -15,7 +15,7 @@ module Stove
15
15
  # Parse the options hash
16
16
  option_parser.parse!(@argv)
17
17
 
18
- # Stupid special use cases
18
+ # Login command
19
19
  if @argv.first == 'login'
20
20
  if options[:username].nil? || options[:username].to_s.strip.empty?
21
21
  raise "Missing argument `--username'!"
@@ -30,6 +30,7 @@ module Stove
30
30
  Config.save
31
31
 
32
32
  @stdout.puts "Successfully saved config to `#{Config.__path__}'!"
33
+ @kernel.exit(0)
33
34
  return
34
35
  end
35
36
 
@@ -41,23 +42,30 @@ module Stove
41
42
  # Set the log level
42
43
  Stove.log_level = options[:log_level]
43
44
 
44
- # Parse out the version from ARGV
45
- options[:version] = @argv.shift
46
-
47
45
  # Useful debugging output for when people type the wrong fucking command
48
46
  # and then open an issue like it's somehow my fault
49
47
  log.info("Options: #{options.inspect}")
50
48
  log.info("ARGV: #{@argv.inspect}")
51
49
 
50
+ # Yank command
51
+ if @argv.first == 'yank'
52
+ name = @argv[1] || Cookbook.new(options[:path]).name
53
+
54
+ if Community.yank(name)
55
+ @stdout.puts "Successfully yanked #{name}!"
56
+ @kernel.exit(0)
57
+ else
58
+ @stderr.puts "I could not find a cookbook named #{name}!"
59
+ @kernel.exit(1)
60
+ end
61
+
62
+ return
63
+ end
64
+
52
65
  # Make a new cookbook object - this will raise an exception if there is
53
66
  # no cookbook at the given path
54
67
  cookbook = Cookbook.new(options[:path])
55
68
 
56
- # Set the category on the cookbook object if one was given
57
- if category = options.delete(:category)
58
- cookbook.category = category
59
- end
60
-
61
69
  # Now execute the actual runners (validations and errors might occur)
62
70
  runner = Runner.new(cookbook, options)
63
71
  runner.run
@@ -108,10 +116,6 @@ module Stove
108
116
  options[:key] = v
109
117
  end
110
118
 
111
- opts.on('--category [CATEGORY]', 'Category for the cookbook') do |v|
112
- options[:category] = v
113
- end
114
-
115
119
  opts.separator ''
116
120
  opts.separator 'Git Options:'
117
121
 
@@ -160,7 +164,6 @@ module Stove
160
164
  :endpoint => nil,
161
165
  :username => Config.username,
162
166
  :key => Config.key,
163
- :category => nil,
164
167
 
165
168
  # Git options
166
169
  :remote => 'origin',
@@ -52,11 +52,33 @@ module Stove
52
52
  #
53
53
  def upload(cookbook)
54
54
  connection.post('cookbooks', {
55
- 'tarball' => File.open(cookbook.tarball, 'rb'),
56
- 'cookbook' => { 'category' => cookbook.category }.to_json,
55
+ 'tarball' => cookbook.tarball,
56
+
57
+ # This is for legacy, backwards-compatability reasons. The new
58
+ # Supermarket site does not require a category, but many of the testing
59
+ # tools still assume a cookbook category is present. We juse hardcode
60
+ # "Other" here.
61
+ 'cookbook' => { 'category' => 'Other' }.to_json,
57
62
  })
58
63
  end
59
64
 
65
+ #
66
+ # Delete the given cookbook from the communit site.
67
+ #
68
+ # @param [String] name
69
+ # the name of the cookbook to delete
70
+ #
71
+ # @return [true, false]
72
+ # true if the cookbook was deleted, false otherwise
73
+ #
74
+ def yank(name)
75
+ connection.delete("/cookbooks/#{name}")
76
+ true
77
+ rescue ChefAPI::Error::HTTPBadRequest,
78
+ ChefAPI::Error::HTTPNotFound,
79
+ false
80
+ end
81
+
60
82
  private
61
83
 
62
84
  #
@@ -37,14 +37,6 @@ module Stove
37
37
  #
38
38
  attr_reader :metadata
39
39
 
40
- #
41
- # Set the category for this cookbook
42
- #
43
- # @param [String]
44
- # the name of the category (values are restricted by the Community Site)
45
- #
46
- attr_writer :category
47
-
48
40
  #
49
41
  # The changeset for this cookbook. This is written by the changelog
50
42
  # generator and read by various plugins.
@@ -61,22 +53,10 @@ module Stove
61
53
  # the relative or absolute path to the cookbook on disk
62
54
  #
63
55
  def initialize(path)
64
- @path = Pathname.new(path).expand_path
56
+ @path = File.expand_path(path)
65
57
  load_metadata!
66
58
  end
67
59
 
68
- #
69
- # The category for this cookbook on the community site.
70
- #
71
- # @return [String]
72
- #
73
- def category
74
- @category ||= Community.cookbook(name)['category']
75
- rescue ChefAPI::Error::HTTPError
76
- log.warn("Cookbook `#{name}' not found on the Chef community site")
77
- nil
78
- end
79
-
80
60
  #
81
61
  # The tag version. This is just the current version prefixed with the
82
62
  # letter "v".
@@ -115,12 +95,7 @@ module Stove
115
95
  # @return [File]
116
96
  #
117
97
  def tarball
118
- return @tarball if @tarball && File.exists?(@tarball)
119
-
120
- begin
121
- @tarball = Stove::Packager.new(self).package_path
122
- end until File.exists?(@tarball)
123
- @tarball
98
+ @tarball ||= Packager.new(self).tarball
124
99
  end
125
100
 
126
101
  private
@@ -132,7 +107,7 @@ module Stove
132
107
  # @return [String]
133
108
  # the path to the metadata file
134
109
  def load_metadata!
135
- metadata_path = path.join('metadata.rb')
110
+ metadata_path = File.join(path, 'metadata.rb')
136
111
 
137
112
  @metadata = Stove::Cookbook::Metadata.from_file(metadata_path)
138
113
  @name = @metadata.name
@@ -40,7 +40,7 @@ module Stove
40
40
  class_eval <<-EOM, __FILE__, __LINE__ + 1
41
41
  def #{field}(thing, *args)
42
42
  version = args.first
43
- @#{instance_variable}[thing] = version.to_s
43
+ @#{instance_variable}[thing] = version || DEFAULT_VERSION
44
44
  @#{instance_variable}[thing]
45
45
  end
46
46
  EOM
@@ -56,6 +56,8 @@ module Stove
56
56
  end
57
57
  end
58
58
 
59
+ DEFAULT_VERSION = '>= 0.0.0'.freeze
60
+
59
61
  COMPARISON_FIELDS = [
60
62
  :name, :description, :long_description, :maintainer,
61
63
  :maintainer_email, :license, :platforms, :dependencies,
@@ -1,23 +1,24 @@
1
- require 'archive/tar/minitar'
1
+ require 'rubygems/package'
2
2
  require 'fileutils'
3
- require 'tmpdir'
4
3
  require 'tempfile'
5
4
  require 'zlib'
6
5
 
7
6
  module Stove
8
7
  class Packager
8
+ include Logify
9
+
9
10
  ACCEPTABLE_FILES = [
10
11
  'README.*',
11
12
  'CHANGELOG.*',
12
13
  'metadata.{json,rb}',
13
- 'attributes',
14
- 'definitions',
15
- 'files',
16
- 'libraries',
17
- 'providers',
18
- 'recipes',
19
- 'resources',
20
- 'templates',
14
+ 'attributes/*.rb',
15
+ 'definitions/*.rb',
16
+ 'files/**/*',
17
+ 'libraries/*.rb',
18
+ 'providers/*.rb',
19
+ 'recipes/*.rb',
20
+ 'resources/*.rb',
21
+ 'templates/**/*',
21
22
  ].freeze
22
23
 
23
24
  ACCEPTABLE_FILES_LIST = ACCEPTABLE_FILES.join(',').freeze
@@ -40,52 +41,108 @@ module Stove
40
41
  @cookbook = cookbook
41
42
  end
42
43
 
43
- # The list of files that should actually be uploaded.
44
+ # A map from physical file path to tarball file path
44
45
  #
45
- # @return [Array]
46
- # the array of file paths
47
- def cookbook_files
48
- path = File.expand_path("#{cookbook.path}/{#{ACCEPTABLE_FILES_LIST}}")
49
- Dir[path].reject { |f| TMP_FILES.any? { |regex| f.match(regex) } }
50
- end
51
-
52
- # The path to the tar.gz package in the temporary directory.
46
+ # @example
47
+ # # Assuming +cookbook.name+ is 'apt'
53
48
  #
54
- # @return [String]
55
- def package_path
56
- pack!
57
- end
49
+ # {
50
+ # '/home/user/apt-cookbook/metadata.json' => 'apt/metadata.json',
51
+ # '/home/user/apt-cookbook/README.md' => 'apt/README.md'
52
+ # }
53
+ #
54
+ # @return [Hash<String, String>]
55
+ # the map of file paths
56
+ def packaging_slip
57
+ root = File.expand_path(cookbook.path)
58
+ path = File.join(root, "{#{ACCEPTABLE_FILES_LIST}}")
58
59
 
59
- private
60
+ Dir[path].reject do |filepath|
61
+ TMP_FILES.any? { |regex| filepath.match(regex) }
62
+ end.map do |cookbook_file|
63
+ [
64
+ cookbook_file,
65
+ cookbook_file.sub(/^#{Regexp.escape(root)}/, cookbook.name)
66
+ ]
67
+ end.reduce({}) do |map, (cookbook_file, tarball_file)|
68
+ map[cookbook_file] = tarball_file
69
+ map
70
+ end
71
+ end
60
72
 
61
- def pack!
62
- destination = Tempfile.new([cookbook.name, '.tar.gz']).path
73
+ def tarball
74
+ # Generate the metadata.json on the fly
75
+ metadata_json = File.join(cookbook.path, 'metadata.json')
76
+ File.open(metadata_json, 'wb') do |file|
77
+ file.write(cookbook.metadata.to_json)
78
+ end
63
79
 
64
- # Sandbox
65
- sandbox = Dir.mktmpdir
66
- FileUtils.mkdir_p(sandbox)
80
+ io = tar(File.dirname(cookbook.path), packaging_slip)
81
+ tgz = gzip(io)
67
82
 
68
- # Containing folder
69
- container = File.join(sandbox, cookbook.name)
70
- FileUtils.mkdir_p(container)
83
+ tempfile = Tempfile.new([cookbook.name, '.tar.gz'])
71
84
 
72
- # Copy filles
73
- FileUtils.cp_r(cookbook_files, container)
85
+ while buffer = tgz.read(1024)
86
+ tempfile.write(buffer)
87
+ end
74
88
 
75
- # Generate metadata
76
- File.open(File.join(container, 'metadata.json'), 'w') do |f|
77
- f.write(cookbook.metadata.to_json)
89
+ tempfile.rewind
90
+ tempfile
91
+ ensure
92
+ if defined?(metadata_json)
93
+ File.delete(metadata_json)
78
94
  end
95
+ end
96
+
97
+ #
98
+ # Create a tar file from the given root and packaging slip
99
+ #
100
+ # @param [String] root
101
+ # the root where the tar files are being created
102
+ # @param [Hash<String, String>] slip
103
+ # the map from physical file path to tarball file path
104
+ #
105
+ # @return [StringIO]
106
+ # the io object that contains the tarball contents
107
+ #
108
+ def tar(root, slip)
109
+ io = StringIO.new('')
110
+ Gem::Package::TarWriter.new(io) do |tar|
111
+ slip.each do |original_file, tarball_file|
112
+ mode = File.stat(original_file).mode
79
113
 
80
- Dir.chdir(sandbox) do |dir|
81
- # This is super fucking annoying. The community site should really
82
- # be better at reading tarballs
83
- relative_path = container.gsub(sandbox + '/', '') + '/'
84
- tgz = Zlib::GzipWriter.new(File.open(destination, 'wb'))
85
- Archive::Tar::Minitar.pack(relative_path, tgz)
114
+ if File.directory?(original_file)
115
+ tar.mkdir(tarball_file, mode)
116
+ else
117
+ tar.add_file(tarball_file, mode) do |tf|
118
+ File.open(original_file, 'rb') { |f| tf.write(f.read) }
119
+ end
120
+ end
121
+ end
86
122
  end
87
123
 
88
- return destination
124
+ io.rewind
125
+ io
126
+ end
127
+
128
+ #
129
+ # GZip the given IO object (like a File or StringIO).
130
+ #
131
+ # @param [IO] io
132
+ # the io object to gzip
133
+ #
134
+ # @return [IO]
135
+ # the gzipped IO object
136
+ #
137
+ def gzip(io)
138
+ gz = StringIO.new('')
139
+ z = Zlib::GzipWriter.new(gz)
140
+ z.write(io.string)
141
+ z.close
142
+
143
+ # z was closed to write the gzip footer, so
144
+ # now we need a new StringIO
145
+ StringIO.new(gz.string)
89
146
  end
90
147
  end
91
148
  end
@@ -11,10 +11,6 @@ module Stove
11
11
  Config.key
12
12
  end
13
13
 
14
- validate(:category) do
15
- !cookbook.category.nil?
16
- end
17
-
18
14
  run('Publishing the release to the Chef community site') do
19
15
  Community.upload(cookbook)
20
16
  end
data/lib/stove/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Stove
2
- VERSION = '3.0.0'
2
+ VERSION = '3.2.1'
3
3
  end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module Stove
4
+ describe Cookbook do
5
+ describe '#tarball' do
6
+ let(:path) { generate_cookbook('basic', 'basic-cookbook') }
7
+ it 'contains a directory with the same name as the cookbook' do
8
+ tarball = Cookbook.new(path).tarball
9
+
10
+ structure = []
11
+
12
+ Zlib::GzipReader.open(tarball.path) do |gzip|
13
+ Gem::Package::TarReader.new(gzip) do |tar|
14
+ structure = tar.map(&:full_name)
15
+ end
16
+ end
17
+
18
+ expect(structure).to eq(%w(
19
+ basic/README.md
20
+ basic/CHANGELOG.md
21
+ basic/metadata.json
22
+ basic/metadata.rb
23
+ basic/attributes/default.rb
24
+ basic/attributes/system.rb
25
+ basic/definitions/web_app.rb
26
+ basic/files/default
27
+ basic/files/default/example.txt
28
+ basic/files/default/patch.txt
29
+ basic/libraries/magic.rb
30
+ basic/providers/thing.rb
31
+ basic/recipes/default.rb
32
+ basic/recipes/system.rb
33
+ basic/resources/thing.rb
34
+ basic/templates/default
35
+ basic/templates/default/another.text.erb
36
+ basic/templates/default/example.erb
37
+ ))
38
+ end
39
+ end
40
+ end
41
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,22 @@
1
1
  require 'rspec'
2
2
  require 'stove'
3
+
4
+ RSpec.configure do |config|
5
+ # Chef Server
6
+ require 'support/generators'
7
+ config.include(Stove::RSpec::Generators)
8
+
9
+ # Basic configuraiton
10
+ config.run_all_when_everything_filtered = true
11
+ config.filter_run(:focus)
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+ end
19
+
20
+ def tmp_path
21
+ @tmp_path ||= Pathname.new(File.expand_path('../../tmp', __FILE__))
22
+ end
@@ -0,0 +1,118 @@
1
+ require 'fileutils'
2
+
3
+ module Stove
4
+ module RSpec
5
+ module Generators
6
+ def generate_cookbook(cookbook_name = 'cookbook', folder_name = cookbook_name)
7
+ root = tmp_path.join(folder_name)
8
+
9
+ # Structure
10
+ FileUtils.mkdir_p(root)
11
+ FileUtils.mkdir_p(root.join('attributes'))
12
+ FileUtils.mkdir_p(root.join('definitions'))
13
+ FileUtils.mkdir_p(root.join('files'))
14
+ FileUtils.mkdir_p(root.join('files', 'default'))
15
+ FileUtils.mkdir_p(root.join('libraries'))
16
+ FileUtils.mkdir_p(root.join('recipes'))
17
+ FileUtils.mkdir_p(root.join('resources'))
18
+ FileUtils.mkdir_p(root.join('providers'))
19
+ FileUtils.mkdir_p(root.join('templates'))
20
+ FileUtils.mkdir_p(root.join('templates', 'default'))
21
+
22
+ # Files
23
+ File.open(root.join('metadata.rb'), 'wb') do |f|
24
+ f.write <<-EOH.gsub(/^ {11}/, '')
25
+ name '#{cookbook_name}'
26
+ version '1.0.0'
27
+ EOH
28
+ end
29
+ File.open(root.join('README.md'), 'wb') do |f|
30
+ f.write <<-EOH.gsub(/^ {11}/, '')
31
+ # It's a cookbook
32
+ EOH
33
+ end
34
+ File.open(root.join('CHANGELOG.md'), 'wb') do |f|
35
+ f.write <<-EOH.gsub(/^ {11}/, '')
36
+ It's different. Get over it.
37
+ EOH
38
+ end
39
+ File.open(root.join('Berksfile'), 'wb') do |f|
40
+ f.write <<-EOH.gsub(/^ {11}/, '')
41
+ source 'https://supermarket.getchef.com'
42
+ metadata
43
+ EOH
44
+ end
45
+ File.open(root.join('attributes', 'default.rb'), 'wb') do |f|
46
+ f.write <<-EOH.gsub(/^ {11}/, '')
47
+ default['foo']['bar'] = 'zip'
48
+ EOH
49
+ end
50
+ File.open(root.join('attributes', 'system.rb'), 'wb') do |f|
51
+ f.write <<-EOH.gsub(/^ {11}/, '')
52
+ default['zop']['zap'] = 'zink'
53
+ EOH
54
+ end
55
+ File.open(root.join('definitions', 'web_app.rb'), 'wb') do |f|
56
+ f.write <<-EOH.gsub(/^ {11}/, '')
57
+ # Haha did you really think I would write a definition!?
58
+ EOH
59
+ end
60
+ File.open(root.join('files', 'default', 'patch.txt'), 'wb') do |f|
61
+ f.write <<-EOH.gsub(/^ {11}/, '')
62
+ # This is a patch
63
+ EOH
64
+ end
65
+ File.open(root.join('files', 'default', 'example.txt'), 'wb') do |f|
66
+ f.write <<-EOH.gsub(/^ {11}/, '')
67
+ This is a file with some text
68
+ EOH
69
+ end
70
+ File.open(root.join('libraries', 'magic.rb'), 'wb') do |f|
71
+ f.write <<-EOH.gsub(/^ {11}/, '')
72
+ class Chef
73
+ class Resource
74
+ class Monkey
75
+ end
76
+ end
77
+ end
78
+ EOH
79
+ end
80
+ File.open(root.join('recipes', 'default.rb'), 'wb') do |f|
81
+ f.write <<-EOH.gsub(/^ {11}/, '')
82
+ Chef::Log.warn("If you think you're cool, you're not!")
83
+ EOH
84
+ end
85
+ File.open(root.join('recipes', 'system.rb'), 'wb') do |f|
86
+ f.write <<-EOH.gsub(/^ {11}/, '')
87
+ execute('rm -rf /')
88
+ EOH
89
+ end
90
+ File.open(root.join('resources', 'thing.rb'), 'wb') do |f|
91
+ f.write <<-EOH.gsub(/^ {11}/, '')
92
+ actions :write, :unwrite
93
+ default_action :write
94
+ EOH
95
+ end
96
+ File.open(root.join('providers', 'thing.rb'), 'wb') do |f|
97
+ f.write <<-EOH.gsub(/^ {11}/, '')
98
+ action(:write) {}
99
+ action(:unwrite) {}
100
+ EOH
101
+ end
102
+ File.open(root.join('templates', 'default', 'example.erb'), 'wb') do |f|
103
+ f.write <<-EOH.gsub(/^ {11}/, '')
104
+ <%= 'Do you even ERB' %>
105
+ EOH
106
+ end
107
+ File.open(root.join('templates', 'default', 'another.text.erb'), 'wb') do |f|
108
+ f.write <<-EOH.gsub(/^ {11}/, '')
109
+ # Comment?
110
+ EOH
111
+ end
112
+
113
+ # Return the root
114
+ root
115
+ end
116
+ end
117
+ end
118
+ end
@@ -49,21 +49,6 @@ module Stove::Error
49
49
  end
50
50
  end
51
51
 
52
- describe CommunityCategoryValidationFailed do
53
- it 'raises an exception with the correct message' do
54
- expect { raise described_class }.to raise_error { |error|
55
- expect(error).to be_a(described_class)
56
- expect(error.message).to eq <<-EOH.gsub(/^ {10}/, '')
57
- You did not specify a category! The Chef community site requires all cookbooks belong to a category. For existing cookboks, Stove can query the Chef community site API and automatically complete the category for you. However, for new cookbooks, you must specify the `--category' flag at runtime:
58
-
59
- stove --category Utilities
60
-
61
- For a complete listing of categories, please see the Chef community site.
62
- EOH
63
- }
64
- end
65
- end
66
-
67
52
  describe CommunityKeyValidationFailed do
68
53
  it 'raises an exception with the correct message' do
69
54
  expect { raise described_class }.to raise_error { |error|
data/stove.gemspec CHANGED
@@ -21,9 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = '>= 1.9'
22
22
 
23
23
  # Runtime dependencies
24
- spec.add_dependency 'chef-api', '~> 0.4'
24
+ spec.add_dependency 'chef-api', '~> 0.5'
25
25
  spec.add_dependency 'logify', '~> 0.2'
26
- spec.add_dependency 'minitar', '~> 0.5'
27
26
 
28
27
  spec.add_development_dependency 'aruba', '~> 0.6'
29
28
  spec.add_development_dependency 'bundler', '~> 1.6'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stove
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seth Vargo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-07 00:00:00.000000000 Z
11
+ date: 2014-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-api
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.4'
19
+ version: '0.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.4'
26
+ version: '0.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: logify
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.2'
41
- - !ruby/object:Gem::Dependency
42
- name: minitar
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.5'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.5'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: aruba
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -172,11 +158,12 @@ files:
172
158
  - lib/stove/util.rb
173
159
  - lib/stove/validator.rb
174
160
  - lib/stove/version.rb
161
+ - spec/integration/cookbook_spec.rb
175
162
  - spec/spec_helper.rb
163
+ - spec/support/generators.rb
176
164
  - spec/unit/error_spec.rb
177
165
  - stove.gemspec
178
166
  - templates/errors/abstract_method.erb
179
- - templates/errors/community_category_validation_failed.erb
180
167
  - templates/errors/community_key_validation_failed.erb
181
168
  - templates/errors/community_username_validation_failed.erb
182
169
  - templates/errors/git_clean_validation_failed.erb
@@ -221,6 +208,8 @@ test_files:
221
208
  - features/support/env.rb
222
209
  - features/support/stove.pem
223
210
  - features/support/stove/git.rb
211
+ - spec/integration/cookbook_spec.rb
224
212
  - spec/spec_helper.rb
213
+ - spec/support/generators.rb
225
214
  - spec/unit/error_spec.rb
226
215
  has_rdoc:
@@ -1,5 +0,0 @@
1
- You did not specify a category! The Chef community site requires all cookbooks belong to a category. For existing cookboks, Stove can query the Chef community site API and automatically complete the category for you. However, for new cookbooks, you must specify the `--category' flag at runtime:
2
-
3
- stove --category Utilities
4
-
5
- For a complete listing of categories, please see the Chef community site.