inspec 1.45.13 → 1.46.2

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: 942384b7fafcd0d8318201eec37d4a08556d3080
4
- data.tar.gz: 8823e1de51315eec835891df623ea55f6dca3059
3
+ metadata.gz: 275cc93db905d4d442e1c7c897a197c0123e1671
4
+ data.tar.gz: '097b235e017ce4fdde8e890a12e4221de4fd7330'
5
5
  SHA512:
6
- metadata.gz: 8fa3b0ea4482dc3f5562610a64fb6b878e97c6ad6b614564f7f6a2742d66ead3620c770ec379347373ed5e0182557d4c80100d219cef7d77c70ff87cdaaa89e6
7
- data.tar.gz: 0c82db93fca88e51f51d936aaa792e124ba3826033963918e0bb8faca4b3a18bcaad3f64d3773db8ecfc62df22962e8c58ffa6055aad875e8563888c6a74322e
6
+ metadata.gz: c4424e307b2c5d474cb040e4fa023f98c9507c764edd84684cb286bf21c36a83395f5cd2d8a4f1f87d14a271e7b0a6d281eabe140065dcdd012f3780f3d390d1
7
+ data.tar.gz: 35a966232190612e93daac133334c5f7f2f5c705261d0155dc2758168c0f2b15865cfd52f47d635065a754f4b1f239216dd5c1574a4657024d0d92a008c6e0b4
data/CHANGELOG.md CHANGED
@@ -1,23 +1,37 @@
1
1
  # Change Log
2
2
  <!-- usage documentation: http://expeditor-docs.es.chef.io/configuration/changelog/ -->
3
- <!-- latest_release 1.45.13 -->
4
- ## [v1.45.13](https://github.com/chef/inspec/tree/v1.45.13) (2017-11-21)
3
+ <!-- latest_release 1.46.2 -->
4
+ ## [v1.46.2](https://github.com/chef/inspec/tree/v1.46.2) (2017-11-29)
5
5
 
6
- #### Merged Pull Requests
7
- - Bump train to 0.29.2 [#2327](https://github.com/chef/inspec/pull/2327) ([adamleff](https://github.com/adamleff))
6
+ #### Bug Fixes
7
+ - Allow skipping/failing resources in FilterTable [#2349](https://github.com/chef/inspec/pull/2349) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
8
8
  <!-- latest_release -->
9
9
 
10
- <!-- release_rollup since=1.45.9 -->
11
- ### Changes since 1.45.9 release
10
+ <!-- release_rollup since=1.45.13 -->
11
+ ### Changes since 1.45.13 release
12
12
 
13
- #### Merged Pull Requests
14
- - Bump train to 0.29.2 [#2327](https://github.com/chef/inspec/pull/2327) ([adamleff](https://github.com/adamleff)) <!-- 1.45.13 -->
15
- - Bump Rubocop to 0.49.1 [#2323](https://github.com/chef/inspec/pull/2323) ([adamleff](https://github.com/adamleff)) <!-- 1.45.12 -->
16
- - Remove bundler install during Appveyor tests [#2322](https://github.com/chef/inspec/pull/2322) ([adamleff](https://github.com/adamleff)) <!-- 1.45.11 -->
17
- - Remove debug message from unit test [#2313](https://github.com/chef/inspec/pull/2313) ([eramoto](https://github.com/eramoto)) <!-- 1.45.10 -->
13
+ #### Enhancements
14
+ - allow override of attribute identifier [#2347](https://github.com/chef/inspec/pull/2347) ([chris-rock](https://github.com/chris-rock)) <!-- 1.46.0 -->
15
+
16
+ #### Bug Fixes
17
+ - Allow skipping/failing resources in FilterTable [#2349](https://github.com/chef/inspec/pull/2349) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.46.2 -->
18
+ - wmi resource: properly escape quotes in WMI query [#2342](https://github.com/chef/inspec/pull/2342) ([TheLonelyGhost](https://github.com/TheLonelyGhost)) <!-- 1.46.1 -->
19
+ - file resource: fix NilClass error when using advanced windows permissions [#2344](https://github.com/chef/inspec/pull/2344) ([TheLonelyGhost](https://github.com/TheLonelyGhost)) <!-- 1.45.17 -->
20
+ - http resource: properly support HEAD request with remote worker [#2340](https://github.com/chef/inspec/pull/2340) ([adamleff](https://github.com/adamleff)) <!-- 1.45.16 -->
21
+ - grub_conf resource: correct grub path for RHEL-7-based OS [#2332](https://github.com/chef/inspec/pull/2332) ([atomic111](https://github.com/atomic111)) <!-- 1.45.15 -->
22
+ - json resource (et. al.): allow inspec check to succeed when using command [#2317](https://github.com/chef/inspec/pull/2317) ([adamleff](https://github.com/adamleff)) <!-- 1.45.14 -->
18
23
  <!-- release_rollup -->
19
24
 
20
25
  <!-- latest_stable_release -->
26
+ ## [v1.45.13](https://github.com/chef/inspec/tree/v1.45.13) (2017-11-21)
27
+
28
+ #### Merged Pull Requests
29
+ - Remove debug message from unit test [#2313](https://github.com/chef/inspec/pull/2313) ([eramoto](https://github.com/eramoto))
30
+ - Remove bundler install during Appveyor tests [#2322](https://github.com/chef/inspec/pull/2322) ([adamleff](https://github.com/adamleff))
31
+ - Bump Rubocop to 0.49.1 [#2323](https://github.com/chef/inspec/pull/2323) ([adamleff](https://github.com/adamleff))
32
+ - Bump train to 0.29.2 [#2327](https://github.com/chef/inspec/pull/2327) ([adamleff](https://github.com/adamleff))
33
+ <!-- latest_stable_release -->
34
+
21
35
  ## [v1.45.9](https://github.com/chef/inspec/tree/v1.45.9) (2017-11-16)
22
36
 
23
37
  #### Enhancements
@@ -36,7 +50,6 @@
36
50
  - Fix gid filtering for etc_group resource [#2297](https://github.com/chef/inspec/pull/2297) ([eramoto](https://github.com/eramoto))
37
51
  - Require Ruby 2.3 and later [#2293](https://github.com/chef/inspec/pull/2293) ([adamleff](https://github.com/adamleff))
38
52
  - Update Rubocop to TargetRubyVersion 2.3 [#2311](https://github.com/chef/inspec/pull/2311) ([adamleff](https://github.com/adamleff))
39
- <!-- latest_stable_release -->
40
53
 
41
54
  ## [v1.44.8](https://github.com/chef/inspec/tree/v1.44.8) (2017-11-09)
42
55
 
@@ -200,6 +200,20 @@ For example, for the following symlink:
200
200
 
201
201
  This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
202
202
 
203
+ ### be\_allowed
204
+
205
+ The `be_allowed` matcher tests if the file contains a certain permission set, such as `execute` or `write` in Unix and [`full-control` or `modify` in Windows](https://www.codeproject.com/Reference/871338/AccessControl-FileSystemRights-Permissions-Table).
206
+
207
+ it { should be_allowed('read') }
208
+
209
+ Just like with `be_executable` and other permissions, one can check for the permission with respect to the specific user or group.
210
+
211
+ it { should be_allowed('full-control', by_user: 'MyComputerName\Administrator') }
212
+
213
+ OR
214
+
215
+ it { should be_allowed('write', by: 'root') }
216
+
203
217
  ### be\_block\_device
204
218
 
205
219
  The `be_block_device` matcher tests if the file exists as a block device, such as `/dev/disk0` or `/dev/disk0s9`:
@@ -25,7 +25,6 @@ blacklisted:
25
25
  it { should_not be_disabled }
26
26
  it { should_not be_blacklisted }
27
27
  end
28
- end
29
28
 
30
29
  where
31
30
 
@@ -40,53 +39,53 @@ where
40
39
 
41
40
  The following examples show how to use this InSpec audit resource.
42
41
 
43
- ### Test a modules 'version'
42
+ ### Test a modules 'version'
44
43
 
45
- describe kernel_module('bridge') do
46
- it { should be_loaded }
47
- its(:version) { should cmp >= '2.2.2' }
48
- end
44
+ describe kernel_module('bridge') do
45
+ it { should be_loaded }
46
+ its(:version) { should cmp >= '2.2.2' }
47
+ end
49
48
 
50
- ### Test if a module is loaded, not disabled and not blacklisted
49
+ ### Test if a module is loaded, not disabled and not blacklisted
51
50
 
52
- describe kernel_module('video') do
53
- it { should be_loaded }
54
- it { should_not be_disabled }
55
- it { should_not be_blacklisted }
56
- end
51
+ describe kernel_module('video') do
52
+ it { should be_loaded }
53
+ it { should_not be_disabled }
54
+ it { should_not be_blacklisted }
55
+ end
57
56
 
58
- ### Check if a module is blacklisted
57
+ ### Check if a module is blacklisted
59
58
 
60
- describe kernel_module('floppy') do
61
- it { should be_blacklisted }
62
- end
59
+ describe kernel_module('floppy') do
60
+ it { should be_blacklisted }
61
+ end
63
62
 
64
- ### Ensure a module is *not* blacklisted and it is loaded
63
+ ### Ensure a module is *not* blacklisted and it is loaded
65
64
 
66
- describe kernel_module('video') do
67
- it { should_not be_blacklisted }
68
- it { should be_loaded }
69
- end
65
+ describe kernel_module('video') do
66
+ it { should_not be_blacklisted }
67
+ it { should be_loaded }
68
+ end
70
69
 
71
- ### Ensure a module is disabled via 'bin_false'
70
+ ### Ensure a module is disabled via 'bin_false'
72
71
 
73
- describe kernel_module('sstfb') do
74
- it { should_not be_loaded }
75
- it { should be_disabled }
76
- end
72
+ describe kernel_module('sstfb') do
73
+ it { should_not be_loaded }
74
+ it { should be_disabled }
75
+ end
77
76
 
78
- ### Ensure a module is 'blacklisted'/'disabled' via 'bin_true'
77
+ ### Ensure a module is 'blacklisted'/'disabled' via 'bin_true'
79
78
 
80
- describe kernel_module('nvidiafb') do
81
- it { should_not be_loaded }
82
- it { should be_blacklisted }
83
- end
79
+ describe kernel_module('nvidiafb') do
80
+ it { should_not be_loaded }
81
+ it { should be_blacklisted }
82
+ end
84
83
 
85
- ### Ensure a module is not loaded
84
+ ### Ensure a module is not loaded
86
85
 
87
- describe kernel_module('dhcp') do
88
- it { should_not be_loaded }
89
- end
86
+ describe kernel_module('dhcp') do
87
+ it { should_not be_loaded }
88
+ end
90
89
 
91
90
  <br>
92
91
 
@@ -7,7 +7,6 @@ group :test do
7
7
  gem 'bundler', '~> 1.5'
8
8
  gem 'minitest', '~> 5.5'
9
9
  gem 'rake', '~> 10'
10
- gem 'rubocop', '~> 0.33.0'
11
10
  gem 'simplecov', '~> 0.10'
12
11
  end
13
12
 
@@ -7,7 +7,6 @@ group :test do
7
7
  gem 'bundler', '~> 1.5'
8
8
  gem 'minitest', '~> 5.5'
9
9
  gem 'rake', '~> 10'
10
- gem 'rubocop', '~> 0.33.0'
11
10
  gem 'simplecov', '~> 0.10'
12
11
  end
13
12
 
@@ -7,7 +7,6 @@ group :test do
7
7
  gem 'bundler', '~> 1.5'
8
8
  gem 'minitest', '~> 5.5'
9
9
  gem 'rake', '~> 10'
10
- gem 'rubocop', '~> 0.33.0'
11
10
  gem 'simplecov', '~> 0.10'
12
11
  end
13
12
 
@@ -39,7 +39,7 @@ module Inspec
39
39
  end
40
40
 
41
41
  def ruby_var_identifier
42
- 'attr_' + @name.downcase.strip.gsub(/\s+/, '-').gsub(/[^\w-]/, '')
42
+ @opts[:identifier] || 'attr_' + @name.downcase.strip.gsub(/\s+/, '-').gsub(/[^\w-]/, '')
43
43
  end
44
44
 
45
45
  def to_hash
@@ -52,7 +52,7 @@ module Inspec
52
52
  def to_ruby
53
53
  res = ["#{ruby_var_identifier} = attribute('#{@name}',{"]
54
54
  res.push " title: '#{title}'," unless title.to_s.empty?
55
- res.push " default: '#{default}'," unless default.to_s.empty?
55
+ res.push " default: #{default.inspect}," unless default.to_s.empty?
56
56
  res.push " description: '#{description}'," unless description.to_s.empty?
57
57
  res.push '})'
58
58
  res.join("\n")
@@ -4,5 +4,5 @@
4
4
  # author: Christoph Hartmann
5
5
 
6
6
  module Inspec
7
- VERSION = '1.45.13'
7
+ VERSION = '1.46.2'
8
8
  end
data/lib/resources/csv.rb CHANGED
@@ -34,6 +34,8 @@ module Inspec::Resources
34
34
 
35
35
  # convert to hash
36
36
  csv.to_a.map(&:to_hash)
37
+ rescue => e
38
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse CSV: #{e.message}"
37
39
  end
38
40
 
39
41
  # override the value method from JsonConfig
@@ -45,8 +47,12 @@ module Inspec::Resources
45
47
  @params.map { |x| x[key.first.to_s] }.compact
46
48
  end
47
49
 
48
- def to_s
49
- "Csv #{@path}"
50
+ private
51
+
52
+ # used by JsonConfig to build up a full to_s method
53
+ # based on whether a file path, content, or command was supplied.
54
+ def resource_base_name
55
+ 'CSV'
50
56
  end
51
57
  end
52
58
  end
@@ -240,6 +240,8 @@ module Inspec::Resources
240
240
  names ||= translate_granular_perms(access_type)
241
241
  names ||= translate_uncommon_perms(access_type)
242
242
  raise 'Invalid access_type provided' unless names
243
+
244
+ names
243
245
  end
244
246
 
245
247
  def translate_common_perms(access_type)
@@ -50,7 +50,7 @@ class GrubConfig < Inspec.resource(1) # rubocop:disable Metrics/ClassLength
50
50
  @conf_path = path || '/etc/grub.conf'
51
51
  @version = 'legacy'
52
52
  else
53
- @conf_path = path || '/boot/grub/grub.cfg'
53
+ @conf_path = path || '/boot/grub2/grub.cfg'
54
54
  @defaults_path = '/etc/default/grub'
55
55
  @version = 'grub2'
56
56
  end
@@ -203,7 +203,17 @@ module Inspec::Resources
203
203
  end
204
204
 
205
205
  def curl_command # rubocop:disable Metrics/AbcSize
206
- cmd = ["curl -i -X #{http_method}"]
206
+ cmd = ['curl -i']
207
+
208
+ # Use curl's --head option when the method requested is HEAD. Otherwise,
209
+ # the user may experience a timeout when curl does not properly close
210
+ # the connection after the response is received.
211
+ if http_method.casecmp('HEAD') == 0
212
+ cmd << '--head'
213
+ else
214
+ cmd << "-X #{http_method}"
215
+ end
216
+
207
217
  cmd << "--connect-timeout #{open_timeout}"
208
218
  cmd << "--max-time #{open_timeout+read_timeout}"
209
219
  cmd << "--user \'#{username}:#{password}\'" unless username.nil? || password.nil?
data/lib/resources/ini.rb CHANGED
@@ -18,8 +18,12 @@ module Inspec::Resources
18
18
  SimpleConfig.new(content).params
19
19
  end
20
20
 
21
- def to_s
22
- "INI #{@path}"
21
+ private
22
+
23
+ # used by JsonConfig to build up a full to_s method
24
+ # based on whether a file path, content, or command was supplied.
25
+ def resource_base_name
26
+ 'INI'
23
27
  end
24
28
  end
25
29
  end
@@ -26,45 +26,11 @@ module Inspec::Resources
26
26
  include ObjectTraverser
27
27
 
28
28
  # make params readable
29
- attr_reader :params
29
+ attr_reader :params, :raw_content
30
30
 
31
31
  def initialize(opts)
32
- @opts = opts
33
- if opts.is_a?(Hash)
34
- if opts.key?(:content)
35
- @file_content = opts[:content]
36
- elsif opts.key?(:command)
37
- @command = inspec.command(opts[:command])
38
- @file_content = @command.stdout
39
- end
40
- else
41
- @path = opts
42
- @file = inspec.file(@opts)
43
- @file_content = @file.content
44
-
45
- # check if file is available
46
- if !@file.file?
47
- skip_resource "Can't find file \"#{@path}\""
48
- return @params = {}
49
- end
50
-
51
- # check if file is readable
52
- if @file_content.nil? && !@file.empty?
53
- skip_resource "Can't read file \"#{@path}\""
54
- return @params = {}
55
- end
56
- end
57
-
58
- @params = parse(@file_content)
59
- end
60
-
61
- def parse(content)
62
- require 'json'
63
- JSON.parse(content)
64
- end
65
-
66
- def value(key)
67
- extract_value(key, @params)
32
+ @raw_content = load_raw_content(opts)
33
+ @params = parse(@raw_content)
68
34
  end
69
35
 
70
36
  # Shorthand to retrieve a parameter name via `#its`.
@@ -79,12 +45,65 @@ module Inspec::Resources
79
45
  value(keys)
80
46
  end
81
47
 
48
+ def value(key)
49
+ # uses ObjectTraverser.extract_value to walk the hash looking for the key,
50
+ # which may be an Array of keys for a nested Hash.
51
+ extract_value(key, params)
52
+ end
53
+
82
54
  def to_s
83
- if @opts.is_a?(Hash) && @opts.key?(:content)
84
- 'Json content'
55
+ "#{resource_base_name} #{@resource_name_supplement || 'content'}"
56
+ end
57
+
58
+ private
59
+
60
+ def parse(content)
61
+ require 'json'
62
+ JSON.parse(content)
63
+ rescue => e
64
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse JSON: #{e.message}"
65
+ end
66
+
67
+ def load_raw_content(opts)
68
+ # if the opts isn't a hash, we assume it's a path to a file
69
+ unless opts.is_a?(Hash)
70
+ @resource_name_supplement = opts
71
+ return load_raw_from_file(opts)
72
+ end
73
+
74
+ if opts.key?(:command)
75
+ @resource_name_supplement = "from command: #{opts[:command]}"
76
+ load_raw_from_command(opts[:command])
77
+ elsif opts.key?(:content)
78
+ opts[:content]
85
79
  else
86
- "Json #{@path}"
80
+ raise Inspec::Exceptions::ResourceFailed, 'No JSON content; must specify a file, command, or raw JSON content'
87
81
  end
88
82
  end
83
+
84
+ def load_raw_from_file(path)
85
+ file = inspec.file(path)
86
+
87
+ # these are currently ResourceSkipped to maintain consistency with the resource
88
+ # pre-refactor (which used skip_resource). These should likely be changed to
89
+ # ResourceFailed during a major version bump.
90
+ raise Inspec::Exceptions::ResourceSkipped, "No such file: #{path}" unless file.file?
91
+ raise Inspec::Exceptions::ResourceSkipped, "File #{path} is empty or is not readable by current user" if file.content.nil? || file.content.empty?
92
+
93
+ file.content
94
+ end
95
+
96
+ def load_raw_from_command(command)
97
+ command_output = inspec.command(command).stdout
98
+ raise Inspec::Exceptions::ResourceSkipped, "No output from command: #{command}" if command_output.nil? || command_output.empty?
99
+
100
+ command_output
101
+ end
102
+
103
+ # for resources the subclass JsonConfig, this allows specification of the resource
104
+ # base name in each subclass so we can build a good to_s method
105
+ def resource_base_name
106
+ 'JSON'
107
+ end
89
108
  end
90
109
  end
@@ -17,10 +17,16 @@ module Inspec::Resources
17
17
 
18
18
  def parse(content)
19
19
  Tomlrb.parse(content)
20
+ rescue => e
21
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse TOML: #{e.message}"
20
22
  end
21
23
 
22
- def to_s
23
- "TOML #{@path}"
24
+ private
25
+
26
+ # used by JsonConfig to build up a full to_s method
27
+ # based on whether a file path, content, or command was supplied.
28
+ def resource_base_name
29
+ 'TOML'
24
30
  end
25
31
  end
26
32
  end
data/lib/resources/wmi.rb CHANGED
@@ -27,7 +27,7 @@ module Inspec::Resources
27
27
 
28
28
  def initialize(wmiclass = nil, opts = nil)
29
29
  # verify that this resource is only supported on Windows
30
- return skip_resource 'The `windows_feature` resource is not supported on your OS.' unless inspec.os.windows?
30
+ return skip_resource 'The `wmi` resource is not supported on your OS.' unless inspec.os.windows?
31
31
 
32
32
  @options = opts || {}
33
33
  # if wmiclass is not a hash, we have to handle deprecation behavior
@@ -67,7 +67,7 @@ module Inspec::Resources
67
67
 
68
68
  # convert to Get-WmiObject arguments
69
69
  params = ''
70
- args.each { |key, value| params += " -#{key} \"#{value}\"" }
70
+ args.each { |key, value| params += " -#{key} \"#{value.gsub('"', '`"')}\"" }
71
71
 
72
72
  # run wmi command and filter empty wmi
73
73
  script = <<-EOH
data/lib/resources/xml.rb CHANGED
@@ -14,14 +14,20 @@ module Inspec::Resources
14
14
  def parse(content)
15
15
  require 'rexml/document'
16
16
  REXML::Document.new(content)
17
+ rescue => e
18
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse XML: #{e.message}"
17
19
  end
18
20
 
19
21
  def value(key)
20
22
  REXML::XPath.each(@params, key.first.to_s).map(&:text)
21
23
  end
22
24
 
23
- def to_s
24
- "XML #{@path}"
25
+ private
26
+
27
+ # used by JsonConfig to build up a full to_s method
28
+ # based on whether a file path, content, or command was supplied.
29
+ def resource_base_name
30
+ 'XML'
25
31
  end
26
32
  end
27
33
  end
@@ -30,10 +30,16 @@ module Inspec::Resources
30
30
  # override file load and parse hash from yaml
31
31
  def parse(content)
32
32
  YAML.load(content)
33
+ rescue => e
34
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse YAML: #{e.message}"
33
35
  end
34
36
 
35
- def to_s
36
- "YAML #{@path}"
37
+ private
38
+
39
+ # used by JsonConfig to build up a full to_s method
40
+ # based on whether a file path, content, or command was supplied.
41
+ def resource_base_name
42
+ 'YAML'
37
43
  end
38
44
  end
39
45
  end
data/lib/utils/filter.rb CHANGED
@@ -6,6 +6,48 @@
6
6
  module FilterTable
7
7
  module Show; end
8
8
 
9
+ class ExceptionCatcher
10
+ def initialize(original_resource, original_exception)
11
+ @original_resource = original_resource
12
+ @original_exception = original_exception
13
+ end
14
+
15
+ # This method is called via the runner and signals RSpec to output a block
16
+ # showing why the resource was skipped. This prevents the resource from
17
+ # being added to the test collection and being evaluated.
18
+ def resource_skipped?
19
+ @original_exception.is_a?(Inspec::Exceptions::ResourceSkipped)
20
+ end
21
+
22
+ # This method is called via the runner and signals RSpec to output a block
23
+ # showing why the resource failed. This prevents the resource from
24
+ # being added to the test collection and being evaluated.
25
+ def resource_failed?
26
+ @original_exception.is_a?(Inspec::Exceptions::ResourceFailed)
27
+ end
28
+
29
+ def resource_exception_message
30
+ @original_exception.message
31
+ end
32
+
33
+ # Capture message chains and return `ExceptionCatcher` objects
34
+ def method_missing(*)
35
+ self
36
+ end
37
+
38
+ # RSpec will check the object returned to see if it responds to a method
39
+ # before calling it. We need to fake it out and tell it that it does. This
40
+ # allows it to skip past that check and fall through to #method_missing
41
+ def respond_to?(_method)
42
+ true
43
+ end
44
+
45
+ def to_s
46
+ @original_resource.to_s
47
+ end
48
+ alias inspect to_s
49
+ end
50
+
9
51
  class Trace
10
52
  def initialize
11
53
  @chain = []
@@ -140,7 +182,7 @@ module FilterTable
140
182
  @connectors = {}
141
183
  end
142
184
 
143
- def connect(resource, table_accessor)
185
+ def connect(resource, table_accessor) # rubocop:disable Metrics/AbcSize
144
186
  # create the table structure
145
187
  connectors = @connectors
146
188
  struct_fields = connectors.values.map(&:field_name)
@@ -170,12 +212,21 @@ module FilterTable
170
212
  end
171
213
  }
172
214
 
173
- # define all access methods with the parent resource
215
+ # Define all access methods with the parent resource
216
+ # These methods will be configured to return an `ExceptionCatcher` object
217
+ # that will always return the original exception, but only when called
218
+ # upon. This will allow method chains in `describe` statements to pass the
219
+ # `instance_eval` when loaded and only throw-and-catch the exception when
220
+ # the tests are run.
174
221
  accessors = @accessors + @connectors.keys
175
222
  accessors.each do |method_name|
176
223
  resource.send(:define_method, method_name.to_sym) do |*args, &block|
177
- filter = table.new(self, method(table_accessor).call, ' with')
178
- filter.method(method_name.to_sym).call(*args, &block)
224
+ begin
225
+ filter = table.new(self, method(table_accessor).call, ' with')
226
+ filter.method(method_name.to_sym).call(*args, &block)
227
+ rescue Inspec::Exceptions::ResourceFailed, Inspec::Exceptions::ResourceSkipped => e
228
+ FilterTable::ExceptionCatcher.new(resource, e)
229
+ end
179
230
  end
180
231
  end
181
232
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.45.13
4
+ version: 1.46.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-21 00:00:00.000000000 Z
11
+ date: 2017-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: train