chefspec 4.1.1 → 4.2.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +10 -0
- data/README.md +8 -5
- data/examples/custom_matcher/libraries/matcher.rb +1 -1
- data/features/inherits.feature +1 -0
- data/gemfiles/{chef-12.0.0.alpha.gemfile → chef-12.0.0.rc.gemfile} +1 -1
- data/lib/chefspec.rb +1 -0
- data/lib/chefspec/chef_backwards_compat.rb +79 -0
- data/lib/chefspec/deprecations.rb +1 -0
- data/lib/chefspec/extensions/chef/lwrp_base.rb +0 -59
- data/lib/chefspec/rspec.rb +1 -0
- data/lib/chefspec/server_runner.rb +12 -2
- data/lib/chefspec/solo_runner.rb +16 -0
- data/lib/chefspec/version.rb +1 -1
- data/spec/unit/deprecations_spec.rb +1 -0
- data/spec/unit/extensions/lwrp_base_spec.rb +2 -3
- data/spec/unit/solo_runner_spec.rb +2 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68b2b322b2293fa631345ed68a61262d0f46d943
|
4
|
+
data.tar.gz: 99a905d8ea24d4c6d20f554c8bc0f42d5f60f14f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07409059ef229f4eb9e2e7f9fe3d4f1d9db2b9e859f0864fbc29df6ed89fddf1e60788e9d7808aae2c853d6ed52163be242ecb99b55ff410327a958b95310883
|
7
|
+
data.tar.gz: 7153ec068c65759290deadf4183d3a57693b092a531118ce4b3f1294f2fa4b2d056202ff2fa4f3c83397db7fc9bb5d2fb92c1a4f5b02fc502d612500c39a8c37
|
data/.travis.yml
CHANGED
@@ -21,11 +21,10 @@ bundler_args: --jobs 7
|
|
21
21
|
gemfile:
|
22
22
|
- gemfiles/chef-11.14.0.gemfile
|
23
23
|
- gemfiles/chef-11.16.0.gemfile
|
24
|
-
- gemfiles/chef-12.0.0.
|
24
|
+
- gemfiles/chef-12.0.0.rc.gemfile
|
25
25
|
- gemfiles/chef-master.gemfile
|
26
26
|
|
27
27
|
matrix:
|
28
28
|
fast_finish: true
|
29
29
|
allow_failures:
|
30
|
-
- gemfile: gemfiles/chef-12.0.0.alpha.gemfile
|
31
30
|
- gemfile: gemfiles/chef-master.gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
CHANGELOG for ChefSpec
|
2
2
|
======================
|
3
3
|
|
4
|
+
## 4.2.0.beta.1 (November 5, 2014)
|
5
|
+
Bugfixes:
|
6
|
+
- Updated README grep examples
|
7
|
+
- Fix various typographical errors
|
8
|
+
- Improved error message when using a deprecated resource matcher
|
9
|
+
|
10
|
+
Improvements:
|
11
|
+
- Add support for Chef 12
|
12
|
+
- Added support for environments in Chef Solo
|
13
|
+
|
4
14
|
## 4.1.1 (October 13, 2014)
|
5
15
|
Bugfixes:
|
6
16
|
- Fix total fail on my part with deprecations and add test coverage
|
data/README.md
CHANGED
@@ -81,6 +81,9 @@ RSpec.configure do |config|
|
|
81
81
|
# Specify the path for Chef Solo to find roles (default: [ascending search])
|
82
82
|
config.role_path = '/var/roles'
|
83
83
|
|
84
|
+
# Specify the path for Chef Solo to find environments (default: [ascending search])
|
85
|
+
config.environment_path = '/var/environments'
|
86
|
+
|
84
87
|
# Specify the Chef log_level (default: :warn)
|
85
88
|
config.log_level = :debug
|
86
89
|
|
@@ -437,18 +440,18 @@ Given a recipe with shell guard:
|
|
437
440
|
|
438
441
|
```ruby
|
439
442
|
template '/tmp/foo.txt' do
|
440
|
-
not_if 'grep /tmp/foo.txt
|
443
|
+
not_if 'grep text /tmp/foo.txt'
|
441
444
|
end
|
442
445
|
```
|
443
446
|
|
444
447
|
ChefSpec will raise an error like:
|
445
448
|
|
446
449
|
```text
|
447
|
-
Real commands are disabled. Unregistered command: `grep /tmp/foo.txt
|
450
|
+
Real commands are disabled. Unregistered command: `grep text /tmp/foo.txt`
|
448
451
|
|
449
452
|
You can stub this command with:
|
450
453
|
|
451
|
-
stub_command("grep /tmp/foo.txt
|
454
|
+
stub_command("grep text /tmp/foo.txt").and_return(true)
|
452
455
|
|
453
456
|
============================================================
|
454
457
|
```
|
@@ -460,7 +463,7 @@ describe 'example::default' do
|
|
460
463
|
let(:chef_run) { ChefSpec::SoloRunner.new }
|
461
464
|
|
462
465
|
before do
|
463
|
-
stub_command("grep /tmp/foo.txt
|
466
|
+
stub_command("grep text /tmp/foo.txt").and_return(true)
|
464
467
|
end
|
465
468
|
end
|
466
469
|
```
|
@@ -470,7 +473,7 @@ describe 'example::default' do
|
|
470
473
|
let(:chef_run) { ChefSpec::SoloRunner.new }
|
471
474
|
|
472
475
|
before do
|
473
|
-
stub_command("grep /tmp/foo.txt
|
476
|
+
stub_command("grep text /tmp/foo.txt") { rand(50)%2 == 0 }
|
474
477
|
end
|
475
478
|
end
|
476
479
|
```
|
@@ -6,7 +6,7 @@ if defined?(ChefSpec)
|
|
6
6
|
# documentation indicating how to use the custom matcher.
|
7
7
|
#
|
8
8
|
# @example This is an example
|
9
|
-
# expect(chef_run.to install_custom_matcher_thing('foo')
|
9
|
+
# expect(chef_run).to install_custom_matcher_thing('foo')
|
10
10
|
#
|
11
11
|
# @param [String] resource_name
|
12
12
|
# the resource name
|
data/features/inherits.feature
CHANGED
data/lib/chefspec.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
#
|
2
|
+
# This file contains the backwards compatible hacks required to make ChefSpec
|
3
|
+
# work with the previous version of Chef. ChefSpec only promises to be backwards
|
4
|
+
# compatible with the last major release of Chef, but it may work with earlier
|
5
|
+
# versions.
|
6
|
+
#
|
7
|
+
# The hacks are kept in this file so as to avoid a bunch of branching logic
|
8
|
+
# throughout the codebase. It also makes dropping backwards compatability much
|
9
|
+
# easier without the risk of breaking things.
|
10
|
+
#
|
11
|
+
# This file must be loaded AFTER the rest of ChefSpec has been initialized!
|
12
|
+
#
|
13
|
+
|
14
|
+
module ChefSpec
|
15
|
+
class ServerRunner
|
16
|
+
#
|
17
|
+
# The method airty for the Chef::CookbookUploader used to accept a list of
|
18
|
+
# cookbook paths. This restores that behavior.
|
19
|
+
#
|
20
|
+
def cookbook_uploader_for(loader)
|
21
|
+
Chef::CookbookUploader.new(loader.cookbooks, loader.cookbook_paths)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module RemoveExistingLWRP
|
26
|
+
def self.extended(klass)
|
27
|
+
class << klass
|
28
|
+
alias_method :build_from_file_without_removal, :build_from_file
|
29
|
+
alias_method :build_from_file, :build_from_file_with_removal
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Override Chef provider to remove any existing LWRPs to suppress constant
|
35
|
+
# re-definition warnings.
|
36
|
+
#
|
37
|
+
# @param [String] cookbook_name
|
38
|
+
# the name of the cookbook
|
39
|
+
# @param [String] filename
|
40
|
+
# file to load as a LWRP
|
41
|
+
# @param [Chef::RunContext] run_context
|
42
|
+
# context of a Chef Run
|
43
|
+
#
|
44
|
+
# @return [Chef::Provider]
|
45
|
+
#
|
46
|
+
def build_from_file_with_removal(cookbook_name, filename, run_context)
|
47
|
+
provider_name = filename_to_qualified_string(cookbook_name, filename)
|
48
|
+
class_name = convert_to_class_name(provider_name)
|
49
|
+
|
50
|
+
remove_existing_lwrp(class_name)
|
51
|
+
build_from_file_without_removal(cookbook_name, filename, run_context)
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Remove any existing Chef provider or resource with the specified name.
|
56
|
+
#
|
57
|
+
# @param [String] class_name
|
58
|
+
# The class name. Must be a valid constant name.
|
59
|
+
#
|
60
|
+
def remove_existing_lwrp(class_name)
|
61
|
+
[self, superclass].each do |resource_holder|
|
62
|
+
look_in_parents = false
|
63
|
+
if resource_holder.const_defined?(class_name, look_in_parents)
|
64
|
+
old_class = resource_holder.send(:remove_const, class_name)
|
65
|
+
|
66
|
+
if resource_holder.respond_to?(:resource_classes)
|
67
|
+
resource_holder.resource_classes.delete(old_class)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# Only remove existing LWRPs for older versions of Chef. Newer versions of
|
77
|
+
# Chef do not break things as much...
|
78
|
+
Chef::Provider::LWRPBase.extend(ChefSpec::RemoveExistingLWRP)
|
79
|
+
Chef::Resource::LWRPBase.extend(ChefSpec::RemoveExistingLWRP)
|
@@ -20,6 +20,7 @@ module ChefSpec
|
|
20
20
|
# use {ChefSpec.define_runner_method} instead.
|
21
21
|
def self.define_runner_method(resource_name)
|
22
22
|
deprecated "`ChefSpec::Runner.define_runner_method' is deprecated. " \
|
23
|
+
"It is being used in the #{resource_name} resource matcher." \
|
23
24
|
"Please use `ChefSpec.define_matcher' instead."
|
24
25
|
|
25
26
|
ChefSpec.define_matcher(resource_name)
|
@@ -1,59 +1,7 @@
|
|
1
1
|
# Override Chef LWRP creation to remove existing class to avoid redefinition warnings.
|
2
2
|
class Chef
|
3
|
-
module RemoveExistingLWRP
|
4
|
-
def self.extended(klass)
|
5
|
-
class << klass
|
6
|
-
alias_method :build_from_file_without_removal, :build_from_file
|
7
|
-
alias_method :build_from_file, :build_from_file_with_removal
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
#
|
12
|
-
# Override Opscode provider to remove any existing LWRPs to suppress
|
13
|
-
# constant re-definition warnings.
|
14
|
-
#
|
15
|
-
# @param [String] cookbook_name
|
16
|
-
# the name of the cookbook
|
17
|
-
# @param [String] filename
|
18
|
-
# file to load as a LWRP
|
19
|
-
# @param [Chef::RunContext] run_context
|
20
|
-
# context of a Chef Run
|
21
|
-
#
|
22
|
-
# @return [Chef::Provider]
|
23
|
-
#
|
24
|
-
def build_from_file_with_removal(cookbook_name, filename, run_context)
|
25
|
-
provider_name = filename_to_qualified_string(cookbook_name, filename)
|
26
|
-
class_name = convert_to_class_name(provider_name)
|
27
|
-
|
28
|
-
remove_existing_lwrp(class_name)
|
29
|
-
build_from_file_without_removal(cookbook_name, filename, run_context)
|
30
|
-
end
|
31
|
-
|
32
|
-
#
|
33
|
-
# Remove any existing Chef provider or resource with the specified name.
|
34
|
-
#
|
35
|
-
# @param [String] class_name
|
36
|
-
# The class name. Must be a valid constant name.
|
37
|
-
#
|
38
|
-
def remove_existing_lwrp(class_name)
|
39
|
-
[self, superclass].each do |resource_holder|
|
40
|
-
look_in_parents = false
|
41
|
-
if resource_holder.const_defined?(class_name, look_in_parents)
|
42
|
-
old_class = resource_holder.send(:remove_const, class_name)
|
43
|
-
|
44
|
-
if resource_holder.respond_to?(:resource_classes)
|
45
|
-
resource_holder.resource_classes.delete(old_class)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
3
|
class Provider
|
53
|
-
# Chef provider for a resource
|
54
4
|
class LWRPBase < Provider
|
55
|
-
extend RemoveExistingLWRP
|
56
|
-
|
57
5
|
module InlineResources
|
58
6
|
module ClassMethods
|
59
7
|
#
|
@@ -72,11 +20,4 @@ class Chef
|
|
72
20
|
end
|
73
21
|
end
|
74
22
|
end
|
75
|
-
|
76
|
-
class Resource
|
77
|
-
# Chef provider for a resource
|
78
|
-
class LWRPBase < Resource
|
79
|
-
extend RemoveExistingLWRP
|
80
|
-
end
|
81
|
-
end
|
82
23
|
end
|
data/lib/chefspec/rspec.rb
CHANGED
@@ -38,9 +38,19 @@ module ChefSpec
|
|
38
38
|
def upload_cookbooks!
|
39
39
|
loader = Chef::CookbookLoader.new(Chef::Config[:cookbook_path])
|
40
40
|
loader.load_cookbooks
|
41
|
+
cookbook_uploader_for(loader).upload_cookbooks
|
42
|
+
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
+
#
|
45
|
+
# The uploader for the cookbooks.
|
46
|
+
#
|
47
|
+
# @param [Chef::CookbookLoader] loader
|
48
|
+
# the Chef cookbook loader
|
49
|
+
#
|
50
|
+
# @return [Chef::CookbookUploader]
|
51
|
+
#
|
52
|
+
def cookbook_uploader_for(loader)
|
53
|
+
Chef::CookbookUploader.new(loader.cookbooks)
|
44
54
|
end
|
45
55
|
|
46
56
|
# @see (SoloRunner#converge)
|
data/lib/chefspec/solo_runner.rb
CHANGED
@@ -77,6 +77,7 @@ module ChefSpec
|
|
77
77
|
Chef::Config[:role_path] = Array(@options[:role_path])
|
78
78
|
Chef::Config[:force_logger] = true
|
79
79
|
Chef::Config[:solo] = true
|
80
|
+
Chef::Config[:environment_path] = @options[:environment_path]
|
80
81
|
|
81
82
|
yield node if block_given?
|
82
83
|
end
|
@@ -301,6 +302,7 @@ module ChefSpec
|
|
301
302
|
{
|
302
303
|
cookbook_path: config.cookbook_path || calling_cookbook_path(caller),
|
303
304
|
role_path: config.role_path || default_role_path,
|
305
|
+
environment_path: config.environment_path || default_environment_path,
|
304
306
|
log_level: config.log_level,
|
305
307
|
path: config.path,
|
306
308
|
platform: config.platform,
|
@@ -340,6 +342,20 @@ module ChefSpec
|
|
340
342
|
nil
|
341
343
|
end
|
342
344
|
|
345
|
+
#
|
346
|
+
# The inferred path to environments.
|
347
|
+
#
|
348
|
+
# @return [String, nil]
|
349
|
+
#
|
350
|
+
def default_environment_path
|
351
|
+
Pathname.new(Dir.pwd).ascend do |path|
|
352
|
+
possible = File.join(path, 'environments')
|
353
|
+
return possible if File.exist?(possible)
|
354
|
+
end
|
355
|
+
|
356
|
+
nil
|
357
|
+
end
|
358
|
+
|
343
359
|
#
|
344
360
|
# The +Chef::Client+ for this runner.
|
345
361
|
#
|
data/lib/chefspec/version.rb
CHANGED
@@ -16,6 +16,7 @@ describe ChefSpec::Runner do
|
|
16
16
|
it 'prints a deprecation' do
|
17
17
|
expect(ChefSpec::Runner).to receive(:deprecated)
|
18
18
|
.with("`ChefSpec::Runner.define_runner_method' is deprecated. "\
|
19
|
+
"It is being used in the my_custom_resource resource matcher." \
|
19
20
|
"Please use `ChefSpec.define_matcher' instead.")
|
20
21
|
ChefSpec::Runner.define_runner_method(:my_custom_resource)
|
21
22
|
end
|
@@ -104,6 +104,7 @@ describe ChefSpec::SoloRunner do
|
|
104
104
|
context 'RSpec global configuration' do
|
105
105
|
before do
|
106
106
|
allow(RSpec.configuration).to receive(:cookbook_path).and_return('./path')
|
107
|
+
allow(RSpec.configuration).to receive(:environment_path).and_return('./env-path')
|
107
108
|
allow(RSpec.configuration).to receive(:log_level).and_return(:fatal)
|
108
109
|
allow(RSpec.configuration).to receive(:path).and_return('ohai.json')
|
109
110
|
allow(RSpec.configuration).to receive(:platform).and_return('ubuntu')
|
@@ -113,6 +114,7 @@ describe ChefSpec::SoloRunner do
|
|
113
114
|
it 'uses the RSpec values' do
|
114
115
|
options = described_class.new.options
|
115
116
|
expect(options[:cookbook_path]).to eq('./path')
|
117
|
+
expect(options[:environment_path]).to eq('./env-path')
|
116
118
|
expect(options[:log_level]).to eq(:fatal)
|
117
119
|
expect(options[:path]).to eq('ohai.json')
|
118
120
|
expect(options[:platform]).to eq('ubuntu')
|
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: 4.
|
4
|
+
version: 4.2.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Crump
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chef
|
@@ -606,7 +606,7 @@ files:
|
|
606
606
|
- features/yum_package.feature
|
607
607
|
- gemfiles/chef-11.14.0.gemfile
|
608
608
|
- gemfiles/chef-11.16.0.gemfile
|
609
|
-
- gemfiles/chef-12.0.0.
|
609
|
+
- gemfiles/chef-12.0.0.rc.gemfile
|
610
610
|
- gemfiles/chef-master.gemfile
|
611
611
|
- lib/chefspec.rb
|
612
612
|
- lib/chefspec/api.rb
|
@@ -662,6 +662,7 @@ files:
|
|
662
662
|
- lib/chefspec/api/yum_package.rb
|
663
663
|
- lib/chefspec/berkshelf.rb
|
664
664
|
- lib/chefspec/cacher.rb
|
665
|
+
- lib/chefspec/chef_backwards_compat.rb
|
665
666
|
- lib/chefspec/coverage.rb
|
666
667
|
- lib/chefspec/coverage/filters.rb
|
667
668
|
- lib/chefspec/deprecations.rb
|
@@ -755,12 +756,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
755
756
|
version: '1.9'
|
756
757
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
757
758
|
requirements:
|
758
|
-
- - "
|
759
|
+
- - ">"
|
759
760
|
- !ruby/object:Gem::Version
|
760
|
-
version:
|
761
|
+
version: 1.3.1
|
761
762
|
requirements: []
|
762
763
|
rubyforge_project:
|
763
|
-
rubygems_version: 2.
|
764
|
+
rubygems_version: 2.2.2
|
764
765
|
signing_key:
|
765
766
|
specification_version: 4
|
766
767
|
summary: Write RSpec examples and generate coverage reports for Chef recipes!
|