chefspec 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
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!