chefspec 0.0.2 → 0.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.
@@ -1,4 +1,5 @@
1
1
  require 'chef'
2
+ require 'rspec'
2
3
  require 'chefspec/chef_runner'
3
4
  require 'chefspec/matchers/execute'
4
5
  require 'chefspec/matchers/file'
@@ -13,7 +13,7 @@ module ChefSpec
13
13
  @step_into = []
14
14
  @resources = []
15
15
 
16
- attr_reader :resources
16
+ attr_accessor :resources
17
17
  attr_reader :node
18
18
 
19
19
  # Instantiate a new runner to run examples with.
@@ -21,44 +21,58 @@ module ChefSpec
21
21
  # @param [string] cookbook_path The path to the chef cookbook(s) to be tested
22
22
  def initialize(cookbook_path=default_cookbook_path)
23
23
  the_runner = self
24
+ @resources = []
24
25
 
25
26
  Chef::Resource.class_eval do
26
27
  alias :old_run_action :run_action
27
28
 
28
- @@runner = the_runner
29
+ if self.class.method_defined?(:class_variable_set)
30
+ class_variable_set :@@runner, the_runner
31
+ else
32
+ @@runner = the_runner
33
+ end
29
34
 
30
35
  def run_action(action)
31
- @@runner.resources << self
36
+ Chef::Log.info("Processing #{self} action #{action} (#{defined_at})") if self.respond_to? :defined_at
37
+ if self.class.method_defined?(:class_variable_get)
38
+ self.class_variable_get(:@@runner).resources << self
39
+ else
40
+ @@runner.resources << self
41
+ end
32
42
  end
33
43
  end
34
44
 
35
45
  Chef::Config[:solo] = true
36
46
  Chef::Config[:cookbook_path] = cookbook_path
37
- Chef::Log.verbose = true
47
+ Chef::Log.verbose = true if Chef::Log.respond_to?(:verbose)
38
48
  Chef::Log.level(:debug)
39
49
  @client = Chef::Client.new
40
50
  @client.run_ohai
41
51
  @node = @client.build_node
42
52
  end
43
53
 
44
- # Infer the default cookbook path from the location of the calling spec.
45
- #
46
- # @return [String] The path to the cookbooks directory
47
- def default_cookbook_path
48
- File.join(caller(2).first.split(':').slice(0..-3).to_s, "..", "..", "..")
49
- end
50
-
51
54
  # Run the specified recipes, but without actually converging the node.
52
55
  #
53
56
  # @param [array] recipe_names The names of the recipes to execute
54
57
  def converge(*recipe_names)
55
58
  recipe_names.each do |recipe_name|
56
- @client.node.run_list << recipe_name
59
+ @node.run_list << recipe_name
60
+ end
61
+
62
+ @client.instance_eval do
63
+ if defined?(@expanded_run_list_with_versions) # 0.10.x
64
+ @run_list_expansion = @node.expand!('disk')
65
+ @expanded_run_list_with_versions = @run_list_expansion.recipes.with_version_constraints_strings
66
+ end
57
67
  end
58
68
 
59
69
  @resources = []
60
- run_context = Chef::RunContext.new(@client.node, Chef::CookbookCollection.new(Chef::CookbookLoader.new))
61
70
 
71
+ if @client.respond_to?(:setup_run_context) # 0.10.x
72
+ run_context = @client.setup_run_context
73
+ else
74
+ run_context = Chef::RunContext.new(@client.node, Chef::CookbookCollection.new(Chef::CookbookLoader.new)) # 0.9.x
75
+ end
62
76
  runner = Chef::Runner.new(run_context)
63
77
  runner.converge
64
78
  end
@@ -81,6 +95,13 @@ module ChefSpec
81
95
 
82
96
  private
83
97
 
98
+ # Infer the default cookbook path from the location of the calling spec.
99
+ #
100
+ # @return [String] The path to the cookbooks directory
101
+ def default_cookbook_path
102
+ Pathname.new(File.join(caller(2).first.split(':').slice(0..-3).first, "..", "..", "..")).cleanpath
103
+ end
104
+
84
105
  # Find the resource with the declared type and name
85
106
  #
86
107
  # @param [String] type The type of resource - e.g. 'file' or 'directory'
@@ -7,10 +7,8 @@ module ChefSpec
7
7
 
8
8
  RSpec::Matchers.define :be_owned_by do |user, group|
9
9
  match do |file|
10
- file.owner == user and file.group == group
10
+ file.nil? ? false : file.owner == user and file.group == group
11
11
  end
12
12
  end
13
13
  end
14
- end
15
-
16
-
14
+ end
@@ -7,8 +7,8 @@ module ChefSpec
7
7
 
8
8
  RSpec::Matchers.define :install_package_at_version do |package_name, version|
9
9
  match do |chef_run|
10
- chef_run.resources.any? do |resource|
11
- resource_type(resource) == 'package' and resource.package_name == package_name and resource.action.to_s == 'install' and resource.version == version
10
+ chef_run.resources.any? do |resource|
11
+ resource_type(resource) == 'package' and resource.package_name == package_name and resource.action.include? :install and resource.version == version
12
12
  end
13
13
  end
14
14
  end
@@ -3,7 +3,7 @@
3
3
  # @param [String] resource A Chef Resource
4
4
  # @return [String] The resource type
5
5
  def resource_type(resource)
6
- resource.class.name.split("::").last.downcase
6
+ resource.resource_name.to_s
7
7
  end
8
8
 
9
9
  # Define simple RSpec matchers for the product of resource types and actions
@@ -1,7 +1,7 @@
1
1
  # Ruby stdlib Hash class
2
2
  class Hash
3
3
 
4
- # Monkey-patch to stdlib Hash to give us auto-vivifying hashes like Chef.
4
+ # Monkey-patch to stdlib Hash to give us Mash style lookup
5
5
  # @param [Symbol] method_id The method name
6
6
  def method_missing(method_id)
7
7
  key = method_id.id2name
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrew Crump
@@ -15,15 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-31 00:00:00 Z
18
+ date: 2011-08-09 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: chef
22
- prerelease: false
23
21
  version_requirements: &id001 !ruby/object:Gem::Requirement
24
22
  none: false
25
23
  requirements:
26
- - - "="
24
+ - - ">="
27
25
  - !ruby/object:Gem::Version
28
26
  hash: 35
29
27
  segments:
@@ -31,11 +29,18 @@ dependencies:
31
29
  - 9
32
30
  - 12
33
31
  version: 0.9.12
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ hash: 31
35
+ segments:
36
+ - 0
37
+ - 10
38
+ version: "0.10"
39
+ name: chef
34
40
  type: :runtime
41
+ prerelease: false
35
42
  requirement: *id001
36
43
  - !ruby/object:Gem::Dependency
37
- name: rspec
38
- prerelease: false
39
44
  version_requirements: &id002 !ruby/object:Gem::Requirement
40
45
  none: false
41
46
  requirements:
@@ -47,7 +52,9 @@ dependencies:
47
52
  - 6
48
53
  - 0
49
54
  version: 2.6.0
55
+ name: rspec
50
56
  type: :runtime
57
+ prerelease: false
51
58
  requirement: *id002
52
59
  description: Write RSpec examples for Opscode Chef recipes
53
60
  email:
@@ -99,6 +106,6 @@ rubyforge_project:
99
106
  rubygems_version: 1.8.6
100
107
  signing_key:
101
108
  specification_version: 3
102
- summary: chefspec-0.0.2
109
+ summary: chefspec-0.1.0
103
110
  test_files: []
104
111