chefspec 3.2.0 → 3.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64c17526a22a0b2f1c03ef6395767c019a276387
4
- data.tar.gz: 9ddf99c2b46eef203e696d11e93e987c319c4656
3
+ metadata.gz: feb37fa56e514030940a63b574f753750fd7e626
4
+ data.tar.gz: 46581585e0fcf5ab806dfe1dfc2f69d5f69fc3f3
5
5
  SHA512:
6
- metadata.gz: 20473fac4ba7dfb480ad4b1a2333c183fcd6c5b866929c68064551427495bf3cae055612b6e51fa339ecdacf686a67d5250c6738f12f83c3ae24822924e297ec
7
- data.tar.gz: bd9b5023822c558c6290686d17ee6362ae83e3b372f8310067dd1e1151d48a189c6e7dba15ac8e5ef6ea51fb33ed1ea145c0ef02962805fdc1d9569bff2ac0ee
6
+ metadata.gz: 763646749b05eda88a493d55181a7ee2586298eeeb092ad33f222ff50ab7c6839351ab9d0c5da5254374b0a223c08cc07efc48565b063afd09bfd57d9b782930
7
+ data.tar.gz: 8034fd1aa4818e79f8cbc6e549a2d4d60dd0cbc734e1877bf0d3a19f2a690144594f0faa5ca64f3845cb9bce58817051139351ec624e18341b356268866732cd
data/.gitignore CHANGED
@@ -4,7 +4,7 @@
4
4
  *.html
5
5
  *.rbc
6
6
  *.swp
7
- coverage
7
+ ^coverage
8
8
  doc
9
9
  tmp
10
10
  Gemfile.lock
@@ -1,6 +1,16 @@
1
1
  CHANGELOG for ChefSpec
2
2
  ======================
3
3
 
4
+ ## 3.3.0 (March 9, 2014)
5
+ Bugfixes:
6
+ - Update documentation for setting `automatic` attributes
7
+ - Update documentation for stubbing data_bags
8
+ - Use a non-internal RSpec variable name for expecting exceptions
9
+ - Fix the airity of the `stub_node` method
10
+
11
+ Improvements:
12
+ - Better filtering protocols for resource coverage
13
+
4
14
  ## 3.2.0 (January 31, 2014)
5
15
  Bugfixes:
6
16
  - Fix coverage calculation when there are no resources in the collection
data/README.md CHANGED
@@ -304,6 +304,19 @@ describe 'example::default' do
304
304
  end
305
305
  ```
306
306
 
307
+ ### Automatic attributes
308
+ ChefSpec provides mocked automatic Ohai data using [fauxhai](https://github.com/customink/fauxhai). To mock out `automatic` attributes, you must use the `automatic` key:
309
+
310
+ ```ruby
311
+ describe 'example::default' do
312
+ let(:chef_run) do
313
+ ChefSpec::Runner.new do |node|
314
+ node.automatic['memory']['total'] = '512kB'
315
+ end.converge(described_recipe)
316
+ end
317
+ end
318
+ ```
319
+
307
320
  The `node` that is returned is actually a [`Chef::Node`](http://docs.opscode.com/essentials_node_object.html) object.
308
321
 
309
322
  To set an attribute within a specific test, set the attribute in the `it` block and then **(re-)converge the node**:
@@ -321,7 +334,6 @@ describe 'example::default' do
321
334
  end
322
335
  ```
323
336
 
324
-
325
337
  Using Chef Zero
326
338
  ---------------
327
339
  By default, ChefSpec runs in Chef Solo mode. As of ChefSpec v3.1.0, you can ask ChefSpec to create an in-memory Chef Server during testing using [ChefZero](https://github.com/jkeiser/chef-zero). This is especially helpful if you need to support searching or data bags.
@@ -374,13 +386,13 @@ You may also be interested in the `stub_node` macro, which will create a new `Ch
374
386
 
375
387
  ```ruby
376
388
  www = stub_node(platform: 'ubuntu', version: '12.04') do |node|
377
- node['fqdn'] = 'www1.example.com'
389
+ node.set['attribute'] = 'value'
378
390
  end
379
391
 
380
392
  # `www` is now a local Chef::Node object you can use in your test. To push this
381
393
  # node to the server, call `create_node`:
382
394
 
383
- ChefSpec::Server.create_node('www', www)
395
+ ChefSpec::Server.create_node(www)
384
396
  ```
385
397
 
386
398
  Create a role:
@@ -459,7 +471,7 @@ Real data_bags are disabled. Unregistered data_bag: data_bag(:users)
459
471
 
460
472
  You can stub this data_bag with:
461
473
 
462
- stub_data_bag("users").and_return({})
474
+ stub_data_bag("users").and_return([])
463
475
 
464
476
  ============================================================
465
477
  ```
@@ -481,10 +493,7 @@ describe 'example::default' do
481
493
  let(:chef_run) { ChefSpec::Runner.new }
482
494
 
483
495
  before do
484
- stub_data_bag('users').and_return([
485
- { id: 'svargo' },
486
- { id: 'francis' }
487
- ])
496
+ stub_data_bag('users').and_return(['svargo', 'francis'])
488
497
 
489
498
  stub_data_bag_item('users', 'svargo').and_return({ ... })
490
499
  stub_data_bag_item('users', 'francis') { (ruby code) }
@@ -541,14 +550,15 @@ end
541
550
 
542
551
  Reporting
543
552
  ---------
544
- ChefSpec attempts to generate a report of resources read over resources tested. Please note, this feature is currently in beta phases and may not be 100% accurate. That being said, it's currently the only code coverage tool available for Chef recipes.
553
+ ChefSpec can generate a report of resources read over resources tested. Please note, this feature is currently in beta phases and may not be 100% accurate. That being said, it is currently the only code coverage tool available for Chef recipes.
545
554
 
546
- To generate the coverage report, add the following to the **very end** of your `spec_helper.rb`:
555
+ To generate the coverage report, add the following to your `spec_helper.rb` before you require any "Chef" code:
547
556
 
548
557
  ```ruby
549
- # Existing things...
558
+ require 'chefspec'
559
+ ChefSpec::Coverage.start!
550
560
 
551
- at_exit { ChefSpec::Coverage.report! }
561
+ # Existing spec_helper contents...
552
562
  ```
553
563
 
554
564
  By default, that method will output helpful information to standard out:
@@ -562,21 +572,73 @@ ChefSpec Coverage report generated at '.coverage/results.json':
562
572
 
563
573
  Untouched Resources:
564
574
 
565
- package[git]: bacon/recipes/default.rb:2
566
- package[build-essential]: bacon/recipes/default.rb:3
567
- package[apache2]: bacon/recipes/default.rb:4
568
- package[libvrt]: bacon/recipes/default.rb:5
569
- package[core]: bacon/recipes/default.rb:6
575
+ package[git] bacon/recipes/default.rb:2
576
+ package[build-essential] bacon/recipes/default.rb:3
577
+ package[apache2] bacon/recipes/default.rb:4
578
+ package[libvrt] bacon/recipes/default.rb:5
579
+ package[core] bacon/recipes/default.rb:6
570
580
  ```
571
581
 
572
582
  It also outputs a machine-parsable JSON file at `.coverage/results.json`. This file can be read by your CI server to determine changes in code coverage. We recommend adding the `.coverage` directory to your `.gitignore` to avoid committing it to git.
573
583
 
574
584
  You can configure both the announcing behavior and JSON file. Please see the YARD documentation for more information.
575
585
 
576
- If you want to restrict coverage reporting only against certain cookbook directories, you can do it using filters. For example, to include only the site-cookbooks directory for coverage reporting, add the following line in your ```spec/spec_helper.rb```
586
+ By default, ChefSpec will test all cookbooks that are loaded as part of the Chef Client run. If you have a cookbook with many dependencies, this may be less than desireable. To restrict coverage reporting against certain cookbooks, `ChefSpec::Coverage` yields a block:
577
587
 
578
588
  ```ruby
579
- ChefSpec::Coverage.filters << File.expand_path('../../site-cookbooks', __FILE__)
589
+ ChefSpec::Coverage.start! do
590
+ add_filter 'vendor/cookbooks'
591
+ end
592
+ ```
593
+
594
+ The `add_filter` method accepts a variety of objects. For example:
595
+
596
+ ```ruby
597
+ ChefSpec::Coverage.start! do
598
+ # Strings are interpreted as file paths, with a forward anchor
599
+ add_filter 'vendor/cookbooks'
600
+
601
+ # Regular expressions must be escaped, but provide a nicer API for negative
602
+ # back tracking
603
+ add_filter /cookbooks\/(?!omnibus)/
604
+
605
+ # Custom block filters yield a {Chef::Resource} object - if the block
606
+ # evaluates to true, it will be filtered
607
+ add_filter do |resource|
608
+ # Bob's cookbook's are completely untested! Ignore them until he gets his
609
+ # shit together.
610
+ resource.source_file =~ /cookbooks\/bob-(.+)/
611
+ end
612
+ end
613
+ ```
614
+
615
+ For more complex scenarios, you can create a custom `Filter` object that inherits from `ChefSpec::Coverage::Filter` and implements the `matches?` method.
616
+
617
+ ```ruby
618
+ class CustomFilter < ChefSpec::Coverage::Filter
619
+ def initialize(arg1, arg2, &block)
620
+ # Create a custom initialization method, do some magic, etc.
621
+ end
622
+
623
+ def matches?(resource)
624
+ # Custom matching logic in here - anything that evaluates to "true" will be
625
+ # filtered.
626
+ end
627
+ end
628
+
629
+ ChefSpec::Converage.start! do
630
+ add_filter CustomFilter.new('foo', :bar)
631
+ end
632
+ ```
633
+
634
+ If you are using ChefSpec's Berkshelf plugin, a filter is automatically created for you. If you would like to ignore that filter, you can `clear` all the filters before defining your own:
635
+
636
+ ```ruby
637
+ ChefSpec::Coverage.start! do
638
+ filters.clear
639
+
640
+ # Add your custom filters now
641
+ end
580
642
  ```
581
643
 
582
644
 
@@ -13,14 +13,14 @@ describe 'stub_data_bag::default' do
13
13
 
14
14
  context 'as a String' do
15
15
  it 'does not raise an exception' do
16
- stub_data_bag('users').and_return([ { id: 'svargo' } ])
16
+ stub_data_bag('users').and_return(['svargo'])
17
17
  expect { chef_run }.to_not raise_error
18
18
  end
19
19
  end
20
20
 
21
21
  context 'as a Symbol' do
22
22
  it 'does not raise an exception' do
23
- stub_data_bag(:users).and_return([ { id: 'svargo' } ])
23
+ stub_data_bag(:users).and_return(['svargo'])
24
24
  expect { chef_run }.to_not raise_error
25
25
  end
26
26
  end
@@ -21,15 +21,20 @@ module ChefSpec
21
21
  # Setup and install the necessary dependencies in the temporary directory.
22
22
  #
23
23
  def setup!
24
+ berksfile = ::Berkshelf::Berksfile.from_file('Berksfile')
25
+
24
26
  ::Berkshelf.ui.mute do
25
27
  if ::Berkshelf::Berksfile.method_defined?(:vendor)
26
28
  FileUtils.rm_rf(@tmpdir) # Berkshelf 3.0 requires the directory to not exist
27
- ::Berkshelf::Berksfile.from_file('Berksfile').vendor(@tmpdir)
29
+ berksfile.vendor(@tmpdir)
28
30
  else
29
- ::Berkshelf::Berksfile.from_file('Berksfile').install(path: @tmpdir)
31
+ berksfile.install(path: @tmpdir)
30
32
  end
31
33
  end
32
34
 
35
+ filter = Coverage::BerkshelfFilter.new(berksfile)
36
+ Coverage.add_filter(filter)
37
+
33
38
  ::RSpec.configure { |config| config.cookbook_path = @tmpdir }
34
39
  end
35
40
 
@@ -1,21 +1,71 @@
1
+ require_relative 'coverage/filters'
2
+
1
3
  module ChefSpec
2
4
  class Coverage
3
-
4
- attr_accessor :filters
5
+ EXIT_FAILURE = 1
6
+ EXIT_SUCCESS = 0
5
7
 
6
8
  class << self
7
- extend Forwardable
8
- def_delegators :instance, :add, :cover!, :report!, :filters
9
+ def method_added(name)
10
+ # Only delegate public methods
11
+ if method_defined?(name)
12
+ instance_eval <<-EOH, __FILE__, __LINE__ + 1
13
+ def #{name}(*args, &block)
14
+ instance.public_send(:#{name}, *args, &block)
15
+ end
16
+ EOH
17
+ end
18
+ end
9
19
  end
10
20
 
11
21
  include Singleton
12
22
 
23
+ attr_reader :filters
24
+
13
25
  #
14
26
  # Create a new coverage object singleton.
15
27
  #
16
28
  def initialize
17
29
  @collection = {}
18
- @filters = []
30
+ @filters = {}
31
+ end
32
+
33
+ #
34
+ # Start the coverage reporting analysis. This method also adds the the
35
+ # +at_exit+ handler for printing the coverage report.
36
+ #
37
+ def start!(*args, &block)
38
+ instance_eval(&block) if block
39
+ at_exit { ChefSpec::Coverage.report!(*args) }
40
+ end
41
+
42
+ #
43
+ # Add a filter to the converage analysis.
44
+ #
45
+ # @param [Filter, String, Regexp] filter
46
+ # the filter to add
47
+ # @param [Proc] block
48
+ # the block to use as a filter
49
+ #
50
+ # @return [true]
51
+ #
52
+ def add_filter(filter = nil, &block)
53
+ id = "#{filter.inspect}/#{block.inspect}".hash
54
+
55
+ @filters[id] = if filter.kind_of?(Filter)
56
+ filter
57
+ elsif filter.kind_of?(String)
58
+ StringFilter.new(filter)
59
+ elsif filter.kind_of?(Regexp)
60
+ RegexpFilter.new(filter)
61
+ elsif block
62
+ BlockFilter.new(block)
63
+ else
64
+ raise ArgumentError, 'Please specify either a string, ' \
65
+ 'filter, or block to filter source files with!'
66
+ end
67
+
68
+ true
19
69
  end
20
70
 
21
71
  #
@@ -26,7 +76,7 @@ module ChefSpec
26
76
  # @param [Chef::Resource] resource
27
77
  #
28
78
  def add(resource)
29
- if !exists?(resource) && filtered?(resource)
79
+ if !exists?(resource) && !filtered?(resource)
30
80
  @collection[resource.to_s] = ResourceWrapper.new(resource)
31
81
  end
32
82
  end
@@ -37,7 +87,7 @@ module ChefSpec
37
87
  # @param [Chef::Resource] resource
38
88
  #
39
89
  def cover!(resource)
40
- if filtered?(resource) && (wrapper = find(resource))
90
+ if wrapper = find(resource)
41
91
  wrapper.touch!
42
92
  end
43
93
  end
@@ -49,7 +99,7 @@ module ChefSpec
49
99
  # @param [Chef::Resource] resource
50
100
  #
51
101
  def filtered?(resource)
52
- filters.empty? || filters.any? { |f| resource.source_line =~/^#{f}/ }
102
+ filters.any? { |_, filter| filter.matches?(resource) }
53
103
  end
54
104
 
55
105
  #
@@ -58,11 +108,11 @@ module ChefSpec
58
108
  #
59
109
  # @example Generating a report
60
110
  #
61
- # at_exit { ChefSpec::Coverage.report! }
111
+ # ChefSpec::Coverage.report!
62
112
  #
63
113
  # @example Generating a custom report without announcing
64
114
  #
65
- # at_exit { ChefSpec::Coverage.report!('/custom/path', false) }
115
+ # ChefSpec::Coverage.report!('/custom/path', false)
66
116
  #
67
117
  #
68
118
  # @param [String] output
@@ -71,6 +121,16 @@ module ChefSpec
71
121
  # print the results to standard out
72
122
  #
73
123
  def report!(output = '.coverage/results.json', announce = true)
124
+ # Borrowed from simplecov#41
125
+ #
126
+ # If an exception is thrown that isn't a "SystemExit", we need to capture
127
+ # that error and re-raise.
128
+ if $!
129
+ exit_status = $!.is_a?(SystemExit) ? $!.status : EXIT_FAILURE
130
+ else
131
+ exit_status = EXIT_SUCCESS
132
+ end
133
+
74
134
  report = {}
75
135
 
76
136
  report[:total] = @collection.size
@@ -112,7 +172,7 @@ module ChefSpec
112
172
  .select { |_, resource| !resource[:touched] }
113
173
  .sort_by { |_, resource| [resource[:source][:file], resource[:source][:line]] }
114
174
  .map do |name, resource|
115
- " #{name} #{resource[:source][:file]}:#{resource[:source][:line]}"
175
+ " #{name.ljust(32)} #{resource[:source][:file]}:#{resource[:source][:line]}"
116
176
  end
117
177
  .flatten
118
178
  .join("\n")
@@ -120,6 +180,9 @@ module ChefSpec
120
180
 
121
181
  EOH
122
182
  end
183
+
184
+ # Ensure we exit correctly (#351)
185
+ exit(exit_status)
123
186
  end
124
187
 
125
188
  private
@@ -148,7 +211,7 @@ module ChefSpec
148
211
  file, line, *_ = @resource.source_line.split(':')
149
212
 
150
213
  {
151
- file: file,
214
+ file: shortname(file),
152
215
  line: line.to_i,
153
216
  }
154
217
  end
@@ -167,6 +230,18 @@ module ChefSpec
167
230
  def touched?
168
231
  !!@touched
169
232
  end
233
+
234
+ private
235
+
236
+ def shortname(file)
237
+ if file.include?(Dir.pwd)
238
+ file.split(Dir.pwd, 2).last
239
+ elsif file.include?('cookbooks')
240
+ file.split('cookbooks/', 2).last
241
+ else
242
+ file
243
+ end
244
+ end
170
245
  end
171
246
  end
172
247
  end
@@ -0,0 +1,61 @@
1
+ module ChefSpec
2
+ class Coverage
3
+ class Filter
4
+ def initialize(filter)
5
+ @filter = filter
6
+ end
7
+
8
+ def matches?
9
+
10
+ end
11
+ end
12
+
13
+ #
14
+ # @example Match resources based on a regular expression.
15
+ # add_filter /^test/
16
+ #
17
+ class RegexpFilter < Filter
18
+ def matches?(resource)
19
+ @filter =~ resource.source_line
20
+ end
21
+ end
22
+
23
+ #
24
+ # @example Match resources based on a regular expression.
25
+ # add_filter 'test/bar/zip'
26
+ #
27
+ class StringFilter < RegexpFilter
28
+ def initialize(filter)
29
+ super(Regexp.new("^#{filter}"))
30
+ end
31
+ end
32
+
33
+ #
34
+ # @example Match resources based on a custom block.
35
+ # # Ignore internal cookbooks
36
+ # add_filter do |resource|
37
+ # resource.name =~ /^acme-(.+)/
38
+ # end
39
+ #
40
+ class BlockFilter < Filter
41
+ def matches?(resource)
42
+ @filter.call(resource)
43
+ end
44
+ end
45
+
46
+ #
47
+ # @example Ignore dependent cookbooks (via Berkshelf)
48
+ # add_filter BerkshelfFilter.new(berksfile)
49
+ #
50
+ class BerkshelfFilter < Filter
51
+ def initialize(berksfile)
52
+ @berksfile = berksfile
53
+ @metadatas = berksfile.dependencies.select(&:metadata?).map(&:name)
54
+ end
55
+
56
+ def matches?(resource)
57
+ resource.source_line =~ /cookbooks\/(?!#{@metadatas.join('|')})/
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,9 +1,15 @@
1
+ require 'rspec/matchers/built_in/raise_error'
2
+
1
3
  class RSpec::Matchers::BuiltIn::RaiseError
2
4
  class << self
3
5
  attr_accessor :last_run
4
6
  end
5
7
 
6
- attr_reader :expected_error, :expected_message
8
+ attr_reader :expected_message
9
+
10
+ def last_error_for_chefspec
11
+ @expected_error
12
+ end
7
13
 
8
14
  alias_method :old_matches?, :matches?
9
15
  def matches?(*args)
@@ -28,8 +34,8 @@ module ChefSpec
28
34
  private
29
35
 
30
36
  def exception_matched?
31
- @formatter_exception == @matcher.expected_error ||
32
- @matcher.expected_error === @formatter_exception
37
+ @formatter_exception == @matcher.last_error_for_chefspec ||
38
+ @matcher.last_error_for_chefspec === @formatter_exception
33
39
  end
34
40
 
35
41
  def message_matched?
@@ -169,7 +169,10 @@ module ChefSpec
169
169
  #
170
170
  # @return [Chef::Node]
171
171
  #
172
- def stub_node(name = 'node.example', options = {}, &block)
172
+ def stub_node(*args, &block)
173
+ options = args.last.is_a?(Hash) ? args.pop : {}
174
+ name = args.first || 'node.example'
175
+
173
176
  fauxhai = Fauxhai.mock(options).data
174
177
  fauxhai = fauxhai.merge(options[:ohai] || {})
175
178
  fauxhai = Mash.new(fauxhai)
@@ -1,3 +1,3 @@
1
1
  module ChefSpec
2
- VERSION = '3.2.0'
2
+ VERSION = '3.3.0'
3
3
  end
@@ -14,7 +14,7 @@ describe ChefSpec::ExpectException do
14
14
  subject { described_class.new(RuntimeError) }
15
15
 
16
16
  it 'does not match' do
17
- last_error = double('last error', expected_error: ArgumentError)
17
+ last_error = double('last error', last_error_for_chefspec: ArgumentError)
18
18
  RSpec::Matchers::BuiltIn::RaiseError.stub(:last_run).and_return(last_error)
19
19
  expect(subject.expected?).to be_false
20
20
  end
@@ -24,7 +24,7 @@ describe ChefSpec::ExpectException do
24
24
  subject { described_class.new(RuntimeError) }
25
25
 
26
26
  it 'does not match' do
27
- last_error = double('last error', expected_error: RuntimeError)
27
+ last_error = double('last error', last_error_for_chefspec: RuntimeError)
28
28
  RSpec::Matchers::BuiltIn::RaiseError.stub(:last_run).and_return(last_error)
29
29
  expect(subject.expected?).to be_true
30
30
  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: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Crump
@@ -9,138 +9,138 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-01 00:00:00.000000000 Z
12
+ date: 2014-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '11.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '11.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: fauxhai
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '2.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '2.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '2.14'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '2.14'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: i18n
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: 0.6.9
63
- - - <
63
+ - - "<"
64
64
  - !ruby/object:Gem::Version
65
65
  version: 1.0.0
66
66
  type: :runtime
67
67
  prerelease: false
68
68
  version_requirements: !ruby/object:Gem::Requirement
69
69
  requirements:
70
- - - '>='
70
+ - - ">="
71
71
  - !ruby/object:Gem::Version
72
72
  version: 0.6.9
73
- - - <
73
+ - - "<"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 1.0.0
76
76
  - !ruby/object:Gem::Dependency
77
77
  name: chef-zero
78
78
  requirement: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.7'
83
83
  type: :development
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '1.7'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: rake
92
92
  requirement: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  type: :development
98
98
  prerelease: false
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: redcarpet
106
106
  requirement: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.0'
111
111
  type: :development
112
112
  prerelease: false
113
113
  version_requirements: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '3.0'
118
118
  - !ruby/object:Gem::Dependency
119
119
  name: yard
120
120
  requirement: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.8'
125
125
  type: :development
126
126
  prerelease: false
127
127
  version_requirements: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.8'
132
132
  - !ruby/object:Gem::Dependency
133
133
  name: aruba
134
134
  requirement: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.5'
139
139
  type: :development
140
140
  prerelease: false
141
141
  version_requirements: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0.5'
146
146
  description: ChefSpec is a unit testing and resource coverage (code coverage) framework
@@ -153,8 +153,8 @@ executables: []
153
153
  extensions: []
154
154
  extra_rdoc_files: []
155
155
  files:
156
- - .gitignore
157
- - .travis.yml
156
+ - ".gitignore"
157
+ - ".travis.yml"
158
158
  - CHANGELOG.md
159
159
  - CONTRIBUTING.md
160
160
  - Gemfile
@@ -693,6 +693,7 @@ files:
693
693
  - lib/chefspec/berkshelf.rb
694
694
  - lib/chefspec/cacher.rb
695
695
  - lib/chefspec/coverage.rb
696
+ - lib/chefspec/coverage/filters.rb
696
697
  - lib/chefspec/deprecations.rb
697
698
  - lib/chefspec/errors.rb
698
699
  - lib/chefspec/expect_exception.rb
@@ -767,17 +768,17 @@ require_paths:
767
768
  - lib
768
769
  required_ruby_version: !ruby/object:Gem::Requirement
769
770
  requirements:
770
- - - '>='
771
+ - - ">="
771
772
  - !ruby/object:Gem::Version
772
773
  version: '1.9'
773
774
  required_rubygems_version: !ruby/object:Gem::Requirement
774
775
  requirements:
775
- - - '>='
776
+ - - ">="
776
777
  - !ruby/object:Gem::Version
777
778
  version: '0'
778
779
  requirements: []
779
780
  rubyforge_project:
780
- rubygems_version: 2.2.1
781
+ rubygems_version: 2.2.2
781
782
  signing_key:
782
783
  specification_version: 4
783
784
  summary: Write RSpec examples and generate coverage reports for Chef recipes!