chefspec 1.0.0 → 1.1.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.
@@ -0,0 +1,198 @@
1
+ if defined?(Chef::Formatters::Base)
2
+ class Chef
3
+ module Formatters
4
+ # A specific formatter for Chef 11. This base for this formatter was
5
+ # taken from Chef::Formatters:Min and all the output was then removed.
6
+ #
7
+ # @author Seth Vargo <sethvargo@gmail.com>
8
+ class ChefSpec < Formatters::Base
9
+ cli_name(:chefspec)
10
+
11
+ attr_reader :updated_resources
12
+ attr_reader :updates_by_resource
13
+
14
+ def initialize(out, err)
15
+ super
16
+ @updated_resources = []
17
+ @updates_by_resource = Hash.new {|h, k| h[k] = []}
18
+ end
19
+
20
+ # Called at the very start of a Chef Run
21
+ def run_start(version)
22
+ puts "Starting Chef Client, version #{version}"
23
+ end
24
+
25
+ # Called at the end of the Chef run.
26
+ def run_completed(node)
27
+ end
28
+
29
+ # called at the end of a failed run
30
+ def run_failed(exception)
31
+ puts "chef client failed. #{@updated_resources.size} resources updated"
32
+ end
33
+
34
+ # Called right after ohai runs.
35
+ def ohai_completed(node)
36
+ end
37
+
38
+ # Already have a client key, assuming this node has registered.
39
+ def skipping_registration(node_name, config)
40
+ end
41
+
42
+ # About to attempt to register as +node_name+
43
+ def registration_start(node_name, config)
44
+ end
45
+
46
+ def registration_completed
47
+ end
48
+
49
+ # Failed to register this client with the server.
50
+ def registration_failed(node_name, exception, config)
51
+ super
52
+ end
53
+
54
+ def node_load_start(node_name, config)
55
+ end
56
+
57
+ # Failed to load node data from the server
58
+ def node_load_failed(node_name, exception, config)
59
+ end
60
+
61
+ # Default and override attrs from roles have been computed, but not yet applied.
62
+ # Normal attrs from JSON have been added to the node.
63
+ def node_load_completed(node, expanded_run_list, config)
64
+ end
65
+
66
+ # Called before the cookbook collection is fetched from the server.
67
+ def cookbook_resolution_start(expanded_run_list)
68
+ end
69
+
70
+ # Called when there is an error getting the cookbook collection from the
71
+ # server.
72
+ def cookbook_resolution_failed(expanded_run_list, exception)
73
+ end
74
+
75
+ # Called when the cookbook collection is returned from the server.
76
+ def cookbook_resolution_complete(cookbook_collection)
77
+ end
78
+
79
+ # Called before unneeded cookbooks are removed
80
+ #--
81
+ # TODO: Should be called in CookbookVersion.sync_cookbooks
82
+ def cookbook_clean_start
83
+ end
84
+
85
+ # Called after the file at +path+ is removed. It may be removed if the
86
+ # cookbook containing it was removed from the run list, or if the file was
87
+ # removed from the cookbook.
88
+ def removed_cookbook_file(path)
89
+ end
90
+
91
+ # Called when cookbook cleaning is finished.
92
+ def cookbook_clean_complete
93
+ end
94
+
95
+ # Called before cookbook sync starts
96
+ def cookbook_sync_start(cookbook_count)
97
+ end
98
+
99
+ # Called when cookbook +cookbook_name+ has been sync'd
100
+ def synchronized_cookbook(cookbook_name)
101
+ end
102
+
103
+ # Called when an individual file in a cookbook has been updated
104
+ def updated_cookbook_file(cookbook_name, path)
105
+ end
106
+
107
+ # Called after all cookbooks have been sync'd.
108
+ def cookbook_sync_complete
109
+ end
110
+
111
+ # Called when cookbook loading starts.
112
+ def library_load_start(file_count)
113
+ end
114
+
115
+ # Called after a file in a cookbook is loaded.
116
+ def file_loaded(path)
117
+ end
118
+
119
+ def file_load_failed(path, exception)
120
+ super
121
+ end
122
+
123
+ # Called when recipes have been loaded.
124
+ def recipe_load_complete
125
+ end
126
+
127
+ # Called before convergence starts
128
+ def converge_start(run_context)
129
+ end
130
+
131
+ # Called when the converge phase is finished.
132
+ def converge_complete
133
+ end
134
+
135
+ # Called before action is executed on a resource.
136
+ def resource_action_start(resource, action, notification_type=nil, notifier=nil)
137
+ end
138
+
139
+ # Called when a resource fails, but will retry.
140
+ def resource_failed_retriable(resource, action, retry_count, exception)
141
+ end
142
+
143
+ # Called when a resource fails and will not be retried.
144
+ def resource_failed(resource, action, exception)
145
+ end
146
+
147
+ # Called when a resource action has been skipped b/c of a conditional
148
+ def resource_skipped(resource, action, conditional)
149
+ end
150
+
151
+ # Called after #load_current_resource has run.
152
+ def resource_current_state_loaded(resource, action, current_resource)
153
+ end
154
+
155
+ # Called when a resource has no converge actions, e.g., it was already correct.
156
+ def resource_up_to_date(resource, action)
157
+ end
158
+
159
+ ## TODO: callback for assertion failures
160
+
161
+ ## TODO: callback for assertion fallback in why run
162
+
163
+ # Called when a change has been made to a resource. May be called multiple
164
+ # times per resource, e.g., a file may have its content updated, and then
165
+ # its permissions updated.
166
+ def resource_update_applied(resource, action, update)
167
+ @updates_by_resource[resource.name] << Array(update)[0]
168
+ end
169
+
170
+ # Called after a resource has been completely converged.
171
+ def resource_updated(resource, action)
172
+ updated_resources << resource
173
+ end
174
+
175
+ # Called before handlers run
176
+ def handlers_start(handler_count)
177
+ end
178
+
179
+ # Called after an individual handler has run
180
+ def handler_executed(handler)
181
+ end
182
+
183
+ # Called after all handlers have executed
184
+ def handlers_completed
185
+ end
186
+
187
+ # An uncategorized message. This supports the case that a user needs to
188
+ # pass output that doesn't fit into one of the callbacks above. Note that
189
+ # there's no semantic information about the content or importance of the
190
+ # message. That means that if you're using this too often, you should add a
191
+ # callback for it.
192
+ def msg(message)
193
+ end
194
+
195
+ end
196
+ end
197
+ end
198
+ end
@@ -1,4 +1,5 @@
1
1
  require 'chef'
2
+ require 'chef/formatters/chefspec'
2
3
  require 'chefspec/chef_runner'
3
4
  require 'chefspec/version'
4
5
 
@@ -26,6 +26,7 @@ module ChefSpec
26
26
  # @option options [Symbol] :log_level The log level to use (default is :warn)
27
27
  # @option options [String] :platform The platform to load Ohai attributes from (must be present in fauxhai)
28
28
  # @option options [String] :version The version of the platform to load Ohai attributes from (must be present in fauxhai)
29
+ # @option options [String] :ohai_data_path Path of a json file that will be passed to fauxhai as :path option
29
30
  # @yield [node] Configuration block for Chef::Node
30
31
  def initialize(options={})
31
32
  defaults = {:cookbook_path => default_cookbook_path, :log_level => :warn, :dry_run => false, :step_into => []}
@@ -72,9 +73,15 @@ module ChefSpec
72
73
 
73
74
  Chef::Config[:solo] = true
74
75
  Chef::Config[:cache_type] = "Memory"
76
+ Chef::Config[:cache_options] = { :path => File.join(File.expand_path('~'), '.chef', 'checksums') }
75
77
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest) }
76
78
  Chef::Config[:cookbook_path] = @options[:cookbook_path]
77
79
  Chef::Config[:client_key] = nil
80
+
81
+ # As of Chef 11, Chef uses custom formatters which munge the RSpec output.
82
+ # This uses a custom formatter which basically tells Chef to shut up.
83
+ Chef::Config.add_formatter('chefspec') if Chef::Config.respond_to?(:add_formatter)
84
+
78
85
  Chef::Log.verbose = true if Chef::Log.respond_to?(:verbose)
79
86
  Chef::Log.level(@options[:log_level])
80
87
  @client = Chef::Client.new
@@ -133,7 +140,16 @@ module ChefSpec
133
140
  return "chef_run: #{@node.run_list.to_s}" unless @node.run_list.empty?
134
141
  'chef_run'
135
142
  end
136
-
143
+
144
+ # Find the resource with the declared type and name
145
+ #
146
+ # @param [String] type The type of resource - e.g. 'file' or 'directory'
147
+ # @param [String] name The resource name
148
+ # @return [Chef::Resource] The matching resource, or Nil
149
+ def find_resource(type, name)
150
+ resources.find{|resource| resource_type(resource) == type and resource.name == name}
151
+ end
152
+
137
153
  private
138
154
 
139
155
  # Populate basic OHAI attributes required to get recipes working. This is a minimal set - if your recipe example
@@ -144,7 +160,12 @@ module ChefSpec
144
160
  #
145
161
  # @param [Ohai::System] ohai The ohai instance to set fake attributes on
146
162
  def fake_ohai(ohai)
147
- ::Fauxhai::Mocker.new(:platform => @options[:platform], :version => @options[:version]).data.each_pair do |attribute, value|
163
+ data = if @options.has_key?(:ohai_data_path)
164
+ Fauxhai::Mocker.new(:path => @options[:ohai_data_path]).data
165
+ else
166
+ Fauxhai::Mocker.new(:platform => @options[:platform], :version => @options[:version]).data
167
+ end
168
+ data.each_pair do |attribute, value|
148
169
  ohai[attribute] = value
149
170
  end
150
171
  end
@@ -156,14 +177,6 @@ module ChefSpec
156
177
  Pathname.new(File.join(caller(2).first.split(':').slice(0..-3).join(':'), '..', '..', '..')).cleanpath.to_s
157
178
  end
158
179
 
159
- # Find the resource with the declared type and name
160
- #
161
- # @param [String] type The type of resource - e.g. 'file' or 'directory'
162
- # @param [String] name The resource name
163
- # @return [Chef::Resource] The matching resource, or Nil
164
- def find_resource(type, name)
165
- resources.find{|resource| resource_type(resource) == type and resource.name == name}
166
- end
167
180
  end
168
181
 
169
182
  end
@@ -1,4 +1,4 @@
1
1
  module ChefSpec
2
2
  # The gem version
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chefspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
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-04-22 00:00:00.000000000 Z
12
+ date: 2013-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -48,17 +48,23 @@ dependencies:
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - ~>
51
+ - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '0.1'
53
+ version: 0.1.1
54
+ - - <
55
+ - !ruby/object:Gem::Version
56
+ version: '2.0'
54
57
  type: :runtime
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  none: false
58
61
  requirements:
59
- - - ~>
62
+ - - ! '>='
60
63
  - !ruby/object:Gem::Version
61
- version: '0.1'
64
+ version: 0.1.1
65
+ - - <
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
62
68
  - !ruby/object:Gem::Dependency
63
69
  name: minitest-chef-handler
64
70
  requirement: !ruby/object:Gem::Requirement
@@ -193,6 +199,7 @@ executables: []
193
199
  extensions: []
194
200
  extra_rdoc_files: []
195
201
  files:
202
+ - lib/chef/formatters/chefspec.rb
196
203
  - lib/chef/knife/cookbook_create_specs.rb
197
204
  - lib/chefspec/chef_runner.rb
198
205
  - lib/chefspec/matchers/cron.rb
@@ -232,7 +239,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
239
  version: '0'
233
240
  segments:
234
241
  - 0
235
- hash: -3276455735612635198
242
+ hash: -3143489054534407734
236
243
  required_rubygems_version: !ruby/object:Gem::Requirement
237
244
  none: false
238
245
  requirements:
@@ -241,12 +248,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
248
  version: '0'
242
249
  segments:
243
250
  - 0
244
- hash: -3276455735612635198
251
+ hash: -3143489054534407734
245
252
  requirements: []
246
253
  rubyforge_project:
247
254
  rubygems_version: 1.8.23
248
255
  signing_key:
249
256
  specification_version: 3
250
- summary: chefspec-1.0.0
257
+ summary: chefspec-1.1.0
251
258
  test_files: []
252
259
  has_rdoc: