test-kitchen 1.0.0.alpha.2 → 1.0.0.alpha.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 1.0.0.alpha.3 / 2013-04-05
2
+
3
+ ### Bug fixes
4
+
5
+ * Fix :require_chef_omnibus driver_config option to eliminate re-installation (@fnichol)
6
+ * Remove implicit Bundler dependency in `kitchen init`. (@fnichol)
7
+
8
+ ### New features
9
+
10
+ * Add --auto-init flag to `kitchen test` (default: false) (@fnichol)
11
+
12
+ ### Improvements
13
+
14
+ * Update base box URLs. (@fnichol)
15
+ * Extract .kitchen.yml to an ERB template & update box URLs. (@fnichol)
16
+ * Add more spec coverage. (@fnichol)
17
+
18
+
1
19
  ## 1.0.0.alpha.2 / 2013-03-28
2
20
 
3
21
  ### Bug fixes
@@ -49,4 +67,4 @@ The initial release.
49
67
  [@ChrisLundquist]: https://github.com/ChrisLundquist
50
68
  [@fnichol]: https://github.com/fnichol
51
69
  [@mattray]: https://github.com/mattray
52
- [@reset]: https://github.com/reset
70
+ [@reset]: https://github.com/reset
@@ -104,7 +104,6 @@ Feature: Add Test Kitchen support to an existing project
104
104
  """
105
105
  suites:
106
106
  - name: default
107
- run_list:
108
- - recipe[ntp]
107
+ run_list: ["recipe[ntp]"]
109
108
  attributes: {}
110
109
  """
data/lib/kitchen/cli.rb CHANGED
@@ -92,6 +92,8 @@ module Kitchen
92
92
  :desc => "Set the log level (debug, info, warn, error, fatal)"
93
93
  method_option :destroy, :aliases => "-d", :default => "passing",
94
94
  :desc => "Destroy strategy to use after testing (passing, always, never)."
95
+ method_option :auto_init, :type => :boolean, :default => false,
96
+ :desc => "Invoke init command if .kitchen.yml is missing"
95
97
  def test(*args)
96
98
  if ! %w{passing always never}.include?(options[:destroy])
97
99
  raise ArgumentError, "Destroy mode must be passing, always, or never."
@@ -100,6 +102,7 @@ module Kitchen
100
102
  update_config!
101
103
  banner "Starting Kitchen"
102
104
  elapsed = Benchmark.measure do
105
+ ensure_initialized
103
106
  destroy_mode = options[:destroy].to_sym
104
107
  @task = :test
105
108
  results = parse_subcommand(args.first)
@@ -311,6 +314,15 @@ module Kitchen
311
314
  exit 1
312
315
  end
313
316
 
317
+ def ensure_initialized
318
+ yaml = ENV['KITCHEN_YAML'] || '.kitchen.yml'
319
+
320
+ if options[:auto_init] && ! File.exists?(yaml)
321
+ banner "Invoking init as '#{yaml}' file is missing"
322
+ invoke "init"
323
+ end
324
+ end
325
+
314
326
  def pry_prompts
315
327
  [
316
328
  proc { |target_self, nest_level, pry|
data/lib/kitchen/color.rb CHANGED
@@ -18,7 +18,13 @@
18
18
 
19
19
  module Kitchen
20
20
 
21
+ # Utility methods to help ouput colorized text in a terminal. The
22
+ # implementation is a compressed mashup of code from the Thor and Foreman
23
+ # projects.
24
+ #
25
+ # @author Fletcher Nichol <fnichol@nichol.ca>
21
26
  module Color
27
+
22
28
  ANSI = {
23
29
  :reset => 0, :black => 30, :red => 31, :green => 32, :yellow => 33,
24
30
  :blue => 34, :magenta => 35, :cyan => 36, :white => 37,
@@ -32,12 +38,25 @@ module Kitchen
32
38
  bright_green bright_magenta bright_red bright_blue
33
39
  ).freeze
34
40
 
41
+ # Returns an ansi escaped string representing a color control sequence.
42
+ #
43
+ # @param name [Symbol] a valid color representation, taken from
44
+ # Kitchen::Color::ANSI
45
+ # @return [String] an ansi escaped string if the color is valid and an
46
+ # empty string otherwise
35
47
  def self.escape(name)
36
48
  return "" if name.nil?
37
49
  return "" unless ansi = ANSI[name]
38
50
  "\e[#{ansi}m"
39
51
  end
40
52
 
53
+ # Returns a colorized ansi escaped string with the given color.
54
+ #
55
+ # @param str [String] a string to colorize
56
+ # @param name [Symbol] a valid color representation, taken from
57
+ # Kitchen::Color::ANSI
58
+ # @return [String] an ansi escaped string if the color is valid and an
59
+ # unescaped string otherwise
41
60
  def self.colorize(str, name)
42
61
  color = escape(name)
43
62
  color.empty? ? str : "#{color}#{str}#{escape(:reset)}"
@@ -16,6 +16,8 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
+ require 'thor/util'
20
+
19
21
  module Kitchen
20
22
 
21
23
  module Driver
@@ -25,17 +27,18 @@ module Kitchen
25
27
  # @param plugin [String] a driver plugin type, which will be constantized
26
28
  # @return [Driver::Base] a driver instance
27
29
  # @raise [ClientError] if a driver instance could not be created
30
+ # @raise [UserError] if the driver's dependencies could not be met
28
31
  def self.for_plugin(plugin, config)
29
32
  first_load = require("kitchen/driver/#{plugin}")
30
33
 
31
- str_const = Util.to_camel_case(plugin)
34
+ str_const = Thor::Util.camel_case(plugin)
32
35
  klass = self.const_get(str_const)
33
36
  object = klass.new(config)
34
37
  object.verify_dependencies if first_load
35
38
  object
36
39
  rescue UserError
37
40
  raise
38
- rescue LoadError
41
+ rescue LoadError, NameError
39
42
  raise ClientError, "Could not require '#{plugin}' plugin from load path"
40
43
  end
41
44
  end
@@ -16,6 +16,8 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
+ require 'thor/util'
20
+
19
21
  module Kitchen
20
22
 
21
23
  module Driver
@@ -139,7 +141,7 @@ module Kitchen
139
141
  def run_command(cmd, options = {})
140
142
  base_options = {
141
143
  :use_sudo => config[:use_sudo],
142
- :log_subject => Util.to_snake_case(self.class.to_s)
144
+ :log_subject => Thor::Util.snake_case(self.class.to_s)
143
145
  }.merge(options)
144
146
  super(cmd, base_options)
145
147
  end
@@ -108,7 +108,7 @@ module Kitchen
108
108
  ssh(ssh_args, <<-INSTALL.gsub(/^ {10}/, ''))
109
109
  should_update_chef() {
110
110
  case "#{flag}" in
111
- $(chef-solo --v | awk "{print \$2}")) return 1 ;;
111
+ true|$(chef-solo -v | cut -d " " -f 2)) return 1 ;;
112
112
  latest|*) return 0 ;;
113
113
  esac
114
114
  }
@@ -44,7 +44,9 @@ module Kitchen
44
44
  D
45
45
 
46
46
  def init
47
- create_file ".kitchen.yml", default_yaml
47
+ self.class.source_root(Kitchen.source_root.join("templates", "plugin"))
48
+
49
+ create_kitchen_yaml
48
50
 
49
51
  rakedoc = <<-RAKE.gsub(/^ {10}/, '')
50
52
 
@@ -81,7 +83,7 @@ module Kitchen
81
83
 
82
84
  private
83
85
 
84
- def default_yaml
86
+ def create_kitchen_yaml
85
87
  cookbook_name = if File.exists?(File.expand_path('metadata.rb'))
86
88
  MetadataChopper.extract('metadata.rb').first
87
89
  else
@@ -90,34 +92,10 @@ module Kitchen
90
92
  run_list = cookbook_name ? "recipe[#{cookbook_name}]" : nil
91
93
  driver_plugin = Array(options[:driver]).first || 'dummy'
92
94
 
93
- { 'driver_plugin' => driver_plugin.sub(/^kitchen-/, ''),
94
- 'platforms' => platforms_hash,
95
- 'suites' => [
96
- { 'name' => 'default',
97
- 'run_list' => Array(run_list),
98
- 'attributes' => Hash.new
99
- },
100
- ]
101
- }.to_yaml
102
- end
103
-
104
- def platforms_hash
105
- url_base = "https://opscode-vm.s3.amazonaws.com/vagrant/boxes"
106
- platforms = [
107
- { :n => 'ubuntu', :vers => %w(12.04 10.04), :rl => "recipe[apt]" },
108
- { :n => 'centos', :vers => %w(6.3 5.8), :rl => "recipe[yum::epel]" },
109
- ]
110
- platforms = platforms.map do |p|
111
- p[:vers].map do |v|
112
- { 'name' => "#{p[:n]}-#{v}",
113
- 'driver_config' => {
114
- 'box' => "opscode-#{p[:n]}-#{v}",
115
- 'box_url' => "#{url_base}/opscode-#{p[:n]}-#{v}.box"
116
- },
117
- 'run_list' => Array(p[:rl])
118
- }
119
- end
120
- end.flatten
95
+ template("kitchen.yml.erb", ".kitchen.yml", {
96
+ :driver_plugin => driver_plugin.sub(/^kitchen-/, ''),
97
+ :run_list => Array(run_list)
98
+ })
121
99
  end
122
100
 
123
101
  def init_rakefile?
@@ -183,7 +161,7 @@ module Kitchen
183
161
  end
184
162
 
185
163
  def install_gem(driver_gem)
186
- Bundler.with_clean_env do
164
+ unbundlerize do
187
165
  run "gem install #{driver_gem}"
188
166
  end
189
167
  end
@@ -191,6 +169,14 @@ module Kitchen
191
169
  def not_in_file?(filename, regexp)
192
170
  IO.readlines(filename).grep(regexp).empty?
193
171
  end
172
+
173
+ def unbundlerize
174
+ keys = %w[BUNDLER_EDITOR BUNDLE_BIN_PATH BUNDLE_GEMFILE RUBYOPT]
175
+
176
+ keys.each { |key| ENV["__#{key}"] = ENV[key] ; ENV.delete(key) }
177
+ yield
178
+ keys.each { |key| ENV[key] = ENV.delete("__#{key}") }
179
+ end
194
180
  end
195
181
  end
196
182
  end
@@ -17,6 +17,7 @@
17
17
  # limitations under the License.
18
18
 
19
19
  require 'thor/group'
20
+ require 'thor/util'
20
21
 
21
22
  module Kitchen
22
23
 
@@ -42,8 +43,8 @@ module Kitchen
42
43
  @plugin_name = plugin_name
43
44
  @gem_name = "kitchen-#{plugin_name}"
44
45
  @gemspec = "#{gem_name}.gemspec"
45
- @klass_name = Util.to_camel_case(plugin_name)
46
- @constant = Util.to_snake_case(plugin_name).upcase
46
+ @klass_name = ::Thor::Util.camel_case(plugin_name)
47
+ @constant = ::Thor::Util.snake_case(plugin_name).upcase
47
48
  @license = options[:license]
48
49
  @author = %x{git config user.name}.chomp
49
50
  @email = %x{git config user.email}.chomp
data/lib/kitchen/util.rb CHANGED
@@ -20,26 +20,30 @@ module Kitchen
20
20
 
21
21
  # Stateless utility methods used in different contexts. Essentially a mini
22
22
  # PassiveSupport library.
23
+ #
24
+ # @author Fletcher Nichol <fnichol@nichol.ca>
23
25
  module Util
24
26
 
25
- def self.to_camel_case(str)
26
- str.split('_').map { |w| w.capitalize }.join
27
- end
28
-
29
- def self.to_snake_case(str)
30
- str.split('::').
31
- last.
32
- gsub(/([A-Z+])([A-Z][a-z])/, '\1_\2').
33
- gsub(/([a-z\d])([A-Z])/, '\1_\2').
34
- downcase
35
- end
36
-
27
+ # Returns the standard library Logger level constants for a given symbol
28
+ # representation.
29
+ #
30
+ # @param symbol [Symbol] symbol representation of a logger level (:debug,
31
+ # :info, :warn, :error, :fatal)
32
+ # @return [Integer] Logger::Severity constant value or nil if input is not
33
+ # valid
37
34
  def self.to_logger_level(symbol)
38
35
  return nil unless [:debug, :info, :warn, :error, :fatal].include?(symbol)
39
36
 
40
37
  Logger.const_get(symbol.to_s.upcase)
41
38
  end
42
39
 
40
+ # Returns the symbol represenation of a logging levels for a given
41
+ # standard library Logger::Severity constant.
42
+ #
43
+ # @param const [Integer] Logger::Severity constant value for a logging
44
+ # level (Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR,
45
+ # Logger::FATAL)
46
+ # @return [Symbol] symbol representation of the logging level
43
47
  def self.from_logger_level(const)
44
48
  case const
45
49
  when Logger::DEBUG then :debug
@@ -50,6 +54,13 @@ module Kitchen
50
54
  end
51
55
  end
52
56
 
57
+ # Returns a new Hash with all key values coerced to symbols. All keys
58
+ # within a Hash are coerced by calling #to_sym and hashes within arrays
59
+ # and other hashes are traversed.
60
+ #
61
+ # @param obj [Object] the hash to be processed. While intended for
62
+ # hashes, this method safely processes arbitrary objects
63
+ # @return [Object] a converted hash with all keys as symbols
53
64
  def self.symbolized_hash(obj)
54
65
  if obj.is_a?(Hash)
55
66
  obj.inject({}) { |h, (k, v)| h[k.to_sym] = symbolized_hash(v) ; h }
@@ -60,16 +71,27 @@ module Kitchen
60
71
  end
61
72
  end
62
73
 
74
+ # Returns a new Hash with all key values coerced to strings. All keys
75
+ # within a Hash are coerced by calling #to_s and hashes with arrays
76
+ # and other hashes are traversed.
77
+ #
78
+ # @param obj [Object] the hash to be processed. While intended for
79
+ # hashes, this method safely processes arbitrary objects
80
+ # @return [Object] a converted hash with all keys as strings
63
81
  def self.stringified_hash(obj)
64
82
  if obj.is_a?(Hash)
65
- obj.inject({}) { |h, (k, v)| h[k.to_s] = symbolized_hash(v) ; h }
83
+ obj.inject({}) { |h, (k, v)| h[k.to_s] = stringified_hash(v) ; h }
66
84
  elsif obj.is_a?(Array)
67
- obj.inject([]) { |a, v| a << symbolized_hash(v) ; a }
85
+ obj.inject([]) { |a, v| a << stringified_hash(v) ; a }
68
86
  else
69
87
  obj
70
88
  end
71
89
  end
72
90
 
91
+ # Returns a formatted string representing a duration in seconds.
92
+ #
93
+ # @param total [Integer] the total number of seconds
94
+ # @return [String] a formatted string of the form (XmYY.00s)
73
95
  def self.duration(total)
74
96
  minutes = (total / 60).to_i
75
97
  seconds = (total - (minutes * 60))
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Kitchen
20
20
 
21
- VERSION = "1.0.0.alpha.2"
21
+ VERSION = "1.0.0.alpha.3"
22
22
  end
@@ -0,0 +1,111 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative '../spec_helper'
20
+
21
+ require 'kitchen/errors'
22
+ require 'kitchen/logging'
23
+ require 'kitchen/shell_out'
24
+ require 'kitchen/driver'
25
+ require 'kitchen/driver/base'
26
+
27
+ module Kitchen
28
+
29
+ module Driver
30
+
31
+ class Coolbeans < Kitchen::Driver::Base
32
+ end
33
+
34
+ class ItDepends < Kitchen::Driver::Base
35
+
36
+ attr_reader :verify_call_count
37
+
38
+ def initialize(config = {})
39
+ @verify_call_count = 0
40
+ super
41
+ end
42
+
43
+ def verify_dependencies
44
+ @verify_call_count += 1
45
+ end
46
+ end
47
+
48
+ class UnstableDepends < Kitchen::Driver::Base
49
+
50
+ def verify_dependencies
51
+ raise UserError, "Oh noes, you don't have software!"
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ describe Kitchen::Driver do
58
+
59
+ describe ".for_plugin" do
60
+
61
+ before do
62
+ Kitchen::Driver.stubs(:require).returns(true)
63
+ end
64
+
65
+ it "returns a driver object of the correct class" do
66
+ driver = Kitchen::Driver.for_plugin('coolbeans', {})
67
+
68
+ driver.must_be_kind_of Kitchen::Driver::Coolbeans
69
+ end
70
+
71
+ it "returns a driver initialized with its config" do
72
+ driver = Kitchen::Driver.for_plugin('coolbeans', { :jelly => 'beans' })
73
+
74
+ driver[:jelly].must_equal 'beans'
75
+ end
76
+
77
+ it "calls #verify_dependencies on the driver object" do
78
+ driver = Kitchen::Driver.for_plugin('it_depends', {})
79
+
80
+ driver.verify_call_count.must_equal 1
81
+ end
82
+
83
+ it "calls #verify_dependencies once per driver require" do
84
+ Kitchen::Driver.stubs(:require).returns(true, false)
85
+ driver1 = Kitchen::Driver.for_plugin('it_depends', {})
86
+ driver1.verify_call_count.must_equal 1
87
+ driver2 = Kitchen::Driver.for_plugin('it_depends', {})
88
+
89
+ driver2.verify_call_count.must_equal 0
90
+ end
91
+
92
+ it "raises ClientError if the driver could not be required" do
93
+ Kitchen::Driver.stubs(:require).raises(LoadError)
94
+
95
+ proc { Kitchen::Driver.for_plugin('coolbeans', {}) }.
96
+ must_raise Kitchen::ClientError
97
+ end
98
+
99
+ it "raises ClientError if the driver's class constant could not be found" do
100
+ Kitchen::Driver.stubs(:require).returns(true) # pretend require worked
101
+
102
+ proc { Kitchen::Driver.for_plugin('nope', {}) }.
103
+ must_raise Kitchen::ClientError
104
+ end
105
+
106
+ it "raises UserError if #verify_dependencies fails" do
107
+ proc { Kitchen::Driver.for_plugin('unstable_depends', {}) }.
108
+ must_raise Kitchen::UserError
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,103 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative '../spec_helper'
20
+
21
+ require 'logger'
22
+
23
+ require 'kitchen/util'
24
+
25
+ describe Kitchen::Util do
26
+
27
+ describe '.to_logger_level' do
28
+
29
+ it "returns nil for invalid symbols" do
30
+ Kitchen::Util.to_logger_level(:nope).must_be_nil
31
+ end
32
+
33
+ %w{debug info warn error fatal}.each do |level|
34
+ it "returns Logger::#{level.upcase} for :#{level} input" do
35
+ Kitchen::Util.to_logger_level(level.to_sym).
36
+ must_equal Logger.const_get(level.upcase)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe ".from_logger_level" do
42
+
43
+ it "returns :fatal for invalid symbols" do
44
+ Kitchen::Util.from_logger_level("nope").must_equal :fatal
45
+ end
46
+
47
+ %w{debug info warn error fatal}.each do |level|
48
+ it "returns :#{level} for Logger::#{level.upcase} input" do
49
+ Kitchen::Util.from_logger_level(Logger.const_get(level.upcase)).
50
+ must_equal(level.to_sym)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe ".symbolized_hash" do
56
+
57
+ it "returns itself if not a hash" do
58
+ obj = Object.new
59
+ Kitchen::Util.symbolized_hash(obj).must_equal obj
60
+ end
61
+
62
+ it "preserves a symbolized hash" do
63
+ hash = { :one => [{ :two => "three" }] }
64
+ Kitchen::Util.symbolized_hash(hash).must_equal hash
65
+ end
66
+
67
+ it "converts string keys into symbols" do
68
+ Kitchen::Util.
69
+ symbolized_hash({ "one" => [{ "two" => :three, :four => "five" }] }).
70
+ must_equal({ :one => [{ :two => :three, :four => "five" }] })
71
+ end
72
+ end
73
+
74
+ describe ".stringified_hash" do
75
+
76
+ it "returns itself if not a hash" do
77
+ obj = Object.new
78
+ Kitchen::Util.stringified_hash(obj).must_equal obj
79
+ end
80
+
81
+ it "preserves a stringified hash" do
82
+ hash = { "one" => [{ "two" => "three" }] }
83
+ Kitchen::Util.stringified_hash(hash).must_equal hash
84
+ end
85
+
86
+ it "converts symbol keys into strings" do
87
+ Kitchen::Util.
88
+ stringified_hash({ :one => [{ :two => :three, "four" => "five" }] }).
89
+ must_equal({ "one" => [{ "two" => :three, "four" => "five" }] })
90
+ end
91
+ end
92
+
93
+ describe ".duration" do
94
+
95
+ it "formats seconds to 2 digits" do
96
+ Kitchen::Util.duration(60).must_equal "(1m0.00s)"
97
+ end
98
+
99
+ it "formats large values into minutes and seconds" do
100
+ Kitchen::Util.duration(48033).must_equal "(800m33.00s)"
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,26 @@
1
+ ---
2
+ driver_plugin: <%= config[:driver_plugin] %>
3
+
4
+ platforms:
5
+ - name: ubuntu-12.04
6
+ driver_config:
7
+ box: canonical-ubuntu-12.04
8
+ box_url: http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box
9
+ require_chef_omnibus: true
10
+ - name: ubuntu-10.04
11
+ driver_config:
12
+ box: opscode-ubuntu-10.04
13
+ box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-10.04_chef-11.2.0.box
14
+ - name: centos-6.3
15
+ driver_config:
16
+ box: opscode-centos-6.3
17
+ box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-6.3_chef-11.2.0.box
18
+ - name: centos-5.8
19
+ driver_config:
20
+ box: opscode-centos-5.8
21
+ box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-5.8_chef-11.2.0.box
22
+
23
+ suites:
24
+ - name: default
25
+ run_list: <%= config[:run_list].inspect %>
26
+ attributes: {}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-kitchen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.2
4
+ version: 1.0.0.alpha.3
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-29 00:00:00.000000000 Z
12
+ date: 2013-04-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: celluloid
@@ -372,13 +372,16 @@ files:
372
372
  - spec/kitchen/color_spec.rb
373
373
  - spec/kitchen/config_spec.rb
374
374
  - spec/kitchen/driver/dummy_spec.rb
375
+ - spec/kitchen/driver_spec.rb
375
376
  - spec/kitchen/instance_spec.rb
376
377
  - spec/kitchen/loader/yaml_spec.rb
377
378
  - spec/kitchen/platform_spec.rb
378
379
  - spec/kitchen/state_file_spec.rb
379
380
  - spec/kitchen/suite_spec.rb
381
+ - spec/kitchen/util_spec.rb
380
382
  - spec/spec_helper.rb
381
383
  - templates/plugin/driver.rb.erb
384
+ - templates/plugin/kitchen.yml.erb
382
385
  - templates/plugin/license_apachev2.erb
383
386
  - templates/plugin/license_gplv2.erb
384
387
  - templates/plugin/license_gplv3.erb
@@ -421,10 +424,12 @@ test_files:
421
424
  - spec/kitchen/color_spec.rb
422
425
  - spec/kitchen/config_spec.rb
423
426
  - spec/kitchen/driver/dummy_spec.rb
427
+ - spec/kitchen/driver_spec.rb
424
428
  - spec/kitchen/instance_spec.rb
425
429
  - spec/kitchen/loader/yaml_spec.rb
426
430
  - spec/kitchen/platform_spec.rb
427
431
  - spec/kitchen/state_file_spec.rb
428
432
  - spec/kitchen/suite_spec.rb
433
+ - spec/kitchen/util_spec.rb
429
434
  - spec/spec_helper.rb
430
435
  has_rdoc: