inspec-core 4.3.2 → 4.6.3

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.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -21
  3. data/etc/deprecations.json +10 -0
  4. data/etc/plugin_filters.json +8 -0
  5. data/lib/bundles/inspec-compliance/api.rb +1 -1
  6. data/lib/bundles/inspec-compliance/configuration.rb +1 -1
  7. data/lib/bundles/inspec-compliance/http.rb +1 -1
  8. data/lib/bundles/inspec-compliance/support.rb +1 -1
  9. data/lib/bundles/inspec-compliance/target.rb +1 -1
  10. data/lib/bundles/inspec-supermarket.rb +3 -7
  11. data/lib/bundles/inspec-supermarket/api.rb +10 -13
  12. data/lib/bundles/inspec-supermarket/cli.rb +12 -15
  13. data/lib/bundles/inspec-supermarket/target.rb +7 -11
  14. data/lib/fetchers/git.rb +14 -15
  15. data/lib/fetchers/local.rb +6 -10
  16. data/lib/fetchers/mock.rb +3 -5
  17. data/lib/fetchers/url.rb +42 -44
  18. data/lib/inspec.rb +23 -24
  19. data/lib/inspec/archive/tar.rb +2 -6
  20. data/lib/inspec/archive/zip.rb +3 -7
  21. data/lib/inspec/backend.rb +8 -9
  22. data/lib/inspec/base_cli.rb +64 -65
  23. data/lib/inspec/cached_fetcher.rb +2 -3
  24. data/lib/inspec/cli.rb +136 -97
  25. data/lib/inspec/config.rb +71 -61
  26. data/lib/inspec/control_eval_context.rb +22 -18
  27. data/lib/inspec/dependencies/cache.rb +2 -3
  28. data/lib/inspec/dependencies/dependency_set.rb +2 -3
  29. data/lib/inspec/dependencies/lockfile.rb +8 -9
  30. data/lib/inspec/dependencies/requirement.rb +7 -8
  31. data/lib/inspec/dependencies/resolver.rb +5 -7
  32. data/lib/inspec/describe.rb +2 -6
  33. data/lib/inspec/dist.rb +20 -0
  34. data/lib/inspec/dsl.rb +4 -7
  35. data/lib/inspec/dsl_shared.rb +1 -2
  36. data/lib/inspec/env_printer.rb +11 -12
  37. data/lib/inspec/errors.rb +0 -4
  38. data/lib/inspec/exceptions.rb +0 -1
  39. data/lib/inspec/expect.rb +5 -8
  40. data/lib/inspec/fetcher.rb +7 -10
  41. data/lib/inspec/file_provider.rb +24 -24
  42. data/lib/inspec/formatters.rb +3 -3
  43. data/lib/inspec/formatters/base.rb +8 -8
  44. data/lib/inspec/globals.rb +2 -2
  45. data/lib/inspec/impact.rb +5 -7
  46. data/lib/inspec/input_registry.rb +84 -33
  47. data/lib/inspec/library_eval_context.rb +3 -6
  48. data/lib/inspec/log.rb +1 -5
  49. data/lib/inspec/metadata.rb +17 -16
  50. data/lib/inspec/method_source.rb +5 -9
  51. data/lib/inspec/objects.rb +10 -12
  52. data/lib/inspec/objects/control.rb +7 -9
  53. data/lib/inspec/objects/describe.rb +9 -11
  54. data/lib/inspec/objects/each_loop.rb +1 -3
  55. data/lib/inspec/objects/input.rb +24 -26
  56. data/lib/inspec/objects/list.rb +4 -6
  57. data/lib/inspec/objects/or_test.rb +2 -4
  58. data/lib/inspec/objects/ruby_helper.rb +3 -5
  59. data/lib/inspec/objects/tag.rb +0 -2
  60. data/lib/inspec/objects/test.rb +9 -11
  61. data/lib/inspec/objects/value.rb +3 -5
  62. data/lib/inspec/plugin/v1.rb +2 -2
  63. data/lib/inspec/plugin/v1/plugin_types/cli.rb +1 -5
  64. data/lib/inspec/plugin/v1/plugin_types/fetcher.rb +2 -5
  65. data/lib/inspec/plugin/v1/plugin_types/resource.rb +4 -6
  66. data/lib/inspec/plugin/v1/plugin_types/secret.rb +1 -5
  67. data/lib/inspec/plugin/v1/plugin_types/source_reader.rb +1 -5
  68. data/lib/inspec/plugin/v1/plugins.rb +15 -19
  69. data/lib/inspec/plugin/v1/registry.rb +0 -4
  70. data/lib/inspec/plugin/v2.rb +8 -8
  71. data/lib/inspec/plugin/v2/activator.rb +1 -1
  72. data/lib/inspec/plugin/v2/config_file.rb +6 -6
  73. data/lib/inspec/plugin/v2/filter.rb +13 -13
  74. data/lib/inspec/plugin/v2/installer.rb +36 -24
  75. data/lib/inspec/plugin/v2/loader.rb +28 -28
  76. data/lib/inspec/plugin/v2/plugin_base.rb +15 -2
  77. data/lib/inspec/plugin/v2/plugin_types/cli.rb +5 -5
  78. data/lib/inspec/plugin/v2/plugin_types/input.rb +34 -0
  79. data/lib/inspec/plugin/v2/plugin_types/mock.rb +1 -1
  80. data/lib/inspec/plugin/v2/registry.rb +7 -7
  81. data/lib/inspec/polyfill.rb +0 -3
  82. data/lib/inspec/profile.rb +55 -63
  83. data/lib/inspec/profile_context.rb +27 -30
  84. data/lib/inspec/profile_vendor.rb +6 -9
  85. data/lib/inspec/reporters.rb +24 -24
  86. data/lib/inspec/reporters/automate.rb +17 -19
  87. data/lib/inspec/reporters/base.rb +1 -1
  88. data/lib/inspec/reporters/cli.rb +88 -91
  89. data/lib/inspec/reporters/json.rb +2 -4
  90. data/lib/inspec/reporters/json_automate.rb +1 -3
  91. data/lib/inspec/reporters/json_min.rb +1 -3
  92. data/lib/inspec/reporters/junit.rb +26 -28
  93. data/lib/inspec/reporters/yaml.rb +1 -3
  94. data/lib/inspec/require_loader.rb +0 -4
  95. data/lib/inspec/resource.rb +4 -125
  96. data/lib/inspec/resources.rb +121 -0
  97. data/lib/{resources → inspec/resources}/aide_conf.rb +24 -25
  98. data/lib/{resources → inspec/resources}/apache.rb +13 -14
  99. data/lib/{resources → inspec/resources}/apache_conf.rb +16 -17
  100. data/lib/{resources → inspec/resources}/apt.rb +17 -17
  101. data/lib/{resources → inspec/resources}/audit_policy.rb +7 -6
  102. data/lib/{resources → inspec/resources}/auditd.rb +62 -64
  103. data/lib/{resources → inspec/resources}/auditd_conf.rb +7 -8
  104. data/lib/{resources → inspec/resources}/bash.rb +6 -8
  105. data/lib/{resources → inspec/resources}/bond.rb +15 -14
  106. data/lib/{resources → inspec/resources}/bridge.rb +8 -8
  107. data/lib/{resources → inspec/resources}/chocolatey_package.rb +10 -8
  108. data/lib/{resources → inspec/resources}/command.rb +11 -10
  109. data/lib/{resources → inspec/resources}/cpan.rb +12 -12
  110. data/lib/{resources → inspec/resources}/cran.rb +9 -9
  111. data/lib/{resources → inspec/resources}/crontab.rb +47 -48
  112. data/lib/{resources → inspec/resources}/csv.rb +5 -5
  113. data/lib/{resources → inspec/resources}/dh_params.rb +5 -7
  114. data/lib/{resources → inspec/resources}/directory.rb +5 -7
  115. data/lib/{resources → inspec/resources}/docker.rb +63 -63
  116. data/lib/{resources → inspec/resources}/docker_container.rb +6 -6
  117. data/lib/{resources → inspec/resources}/docker_image.rb +9 -9
  118. data/lib/{resources → inspec/resources}/docker_object.rb +8 -13
  119. data/lib/{resources → inspec/resources}/docker_plugin.rb +6 -6
  120. data/lib/{resources → inspec/resources}/docker_service.rb +7 -7
  121. data/lib/{resources → inspec/resources}/elasticsearch.rb +40 -42
  122. data/lib/{resources → inspec/resources}/etc_fstab.rb +23 -24
  123. data/lib/{resources → inspec/resources}/etc_group.rb +26 -27
  124. data/lib/{resources → inspec/resources}/etc_hosts.rb +11 -13
  125. data/lib/{resources → inspec/resources}/etc_hosts_allow_deny.rb +25 -27
  126. data/lib/{resources → inspec/resources}/file.rb +80 -79
  127. data/lib/{resources → inspec/resources}/filesystem.rb +20 -15
  128. data/lib/{resources → inspec/resources}/firewalld.rb +26 -26
  129. data/lib/{resources → inspec/resources}/gem.rb +12 -12
  130. data/lib/{resources → inspec/resources}/groups.rb +28 -27
  131. data/lib/{resources → inspec/resources}/grub_conf.rb +46 -48
  132. data/lib/{resources → inspec/resources}/host.rb +31 -29
  133. data/lib/{resources → inspec/resources}/http.rb +24 -24
  134. data/lib/{resources → inspec/resources}/iis_app.rb +6 -7
  135. data/lib/{resources → inspec/resources}/iis_app_pool.rb +21 -19
  136. data/lib/{resources → inspec/resources}/iis_site.rb +17 -15
  137. data/lib/{resources → inspec/resources}/inetd_conf.rb +9 -10
  138. data/lib/{resources → inspec/resources}/ini.rb +7 -8
  139. data/lib/{resources → inspec/resources}/interface.rb +30 -30
  140. data/lib/{resources → inspec/resources}/iptables.rb +8 -8
  141. data/lib/{resources → inspec/resources}/json.rb +8 -10
  142. data/lib/{resources → inspec/resources}/kernel_module.rb +15 -15
  143. data/lib/{resources → inspec/resources}/kernel_parameter.rb +8 -8
  144. data/lib/{resources → inspec/resources}/key_rsa.rb +8 -10
  145. data/lib/{resources → inspec/resources}/ksh.rb +6 -8
  146. data/lib/{resources → inspec/resources}/limits_conf.rb +8 -9
  147. data/lib/{resources/login_def.rb → inspec/resources/login_defs.rb} +9 -10
  148. data/lib/{resources → inspec/resources}/mount.rb +6 -8
  149. data/lib/{resources → inspec/resources}/mssql_session.rb +16 -18
  150. data/lib/inspec/resources/mysql.rb +81 -0
  151. data/lib/{resources → inspec/resources}/mysql_conf.rb +13 -14
  152. data/lib/{resources → inspec/resources}/mysql_session.rb +16 -16
  153. data/lib/{resources → inspec/resources}/nginx.rb +16 -17
  154. data/lib/{resources → inspec/resources}/nginx_conf.rb +26 -27
  155. data/lib/{resources → inspec/resources}/npm.rb +9 -10
  156. data/lib/{resources → inspec/resources}/ntp_conf.rb +9 -10
  157. data/lib/{resources → inspec/resources}/oneget.rb +8 -8
  158. data/lib/{resources → inspec/resources}/oracledb_session.rb +33 -34
  159. data/lib/{resources → inspec/resources}/os.rb +6 -8
  160. data/lib/{resources → inspec/resources}/os_env.rb +11 -12
  161. data/lib/{resources → inspec/resources}/package.rb +66 -65
  162. data/lib/{resources → inspec/resources}/packages.rb +13 -13
  163. data/lib/{resources → inspec/resources}/parse_config.rb +8 -8
  164. data/lib/{resources → inspec/resources}/passwd.rb +18 -19
  165. data/lib/{resources → inspec/resources}/pip.rb +19 -19
  166. data/lib/{resources → inspec/resources}/platform.rb +9 -11
  167. data/lib/{resources → inspec/resources}/port.rb +134 -136
  168. data/lib/{resources → inspec/resources}/postgres.rb +40 -32
  169. data/lib/{resources → inspec/resources}/postgres_conf.rb +17 -17
  170. data/lib/{resources → inspec/resources}/postgres_hba_conf.rb +21 -23
  171. data/lib/{resources → inspec/resources}/postgres_ident_conf.rb +12 -14
  172. data/lib/{resources → inspec/resources}/postgres_session.rb +8 -9
  173. data/lib/{resources → inspec/resources}/powershell.rb +17 -13
  174. data/lib/{resources → inspec/resources}/processes.rb +29 -29
  175. data/lib/{resources/rabbitmq_conf.rb → inspec/resources/rabbitmq_config.rb} +10 -11
  176. data/lib/{resources → inspec/resources}/registry_key.rb +14 -14
  177. data/lib/inspec/resources/script.rb +1 -0
  178. data/lib/{resources → inspec/resources}/security_identifier.rb +11 -10
  179. data/lib/{resources → inspec/resources}/security_policy.rb +59 -58
  180. data/lib/{resources → inspec/resources}/service.rb +74 -75
  181. data/lib/{resources → inspec/resources}/shadow.rb +44 -45
  182. data/lib/{resources/ssh_conf.rb → inspec/resources/ssh_config.rb} +16 -17
  183. data/lib/{resources → inspec/resources}/ssl.rb +28 -29
  184. data/lib/inspec/resources/sys_info.rb +30 -0
  185. data/lib/{resources → inspec/resources}/toml.rb +5 -7
  186. data/lib/{resources → inspec/resources}/users.rb +65 -65
  187. data/lib/{resources → inspec/resources}/vbscript.rb +8 -9
  188. data/lib/{resources → inspec/resources}/virtualization.rb +60 -62
  189. data/lib/{resources → inspec/resources}/windows_feature.rb +9 -9
  190. data/lib/{resources → inspec/resources}/windows_hotfix.rb +5 -5
  191. data/lib/{resources → inspec/resources}/windows_task.rb +16 -15
  192. data/lib/{resources → inspec/resources}/wmi.rb +7 -8
  193. data/lib/{resources → inspec/resources}/x509_certificate.rb +9 -11
  194. data/lib/{resources/xinetd.rb → inspec/resources/xinetd_conf.rb} +27 -29
  195. data/lib/{resources → inspec/resources}/xml.rb +7 -7
  196. data/lib/{resources → inspec/resources}/yaml.rb +5 -6
  197. data/lib/{resources → inspec/resources}/yum.rb +10 -10
  198. data/lib/{resources → inspec/resources}/zfs_dataset.rb +6 -6
  199. data/lib/{resources → inspec/resources}/zfs_pool.rb +4 -4
  200. data/lib/inspec/rspec_extensions.rb +24 -8
  201. data/lib/inspec/rule.rb +14 -15
  202. data/lib/inspec/runner.rb +28 -28
  203. data/lib/inspec/runner_mock.rb +1 -5
  204. data/lib/inspec/runner_rspec.rb +18 -20
  205. data/lib/inspec/runtime_profile.rb +2 -5
  206. data/lib/inspec/schema.rb +142 -143
  207. data/lib/inspec/secrets.rb +3 -7
  208. data/lib/inspec/secrets/yaml.rb +3 -5
  209. data/lib/inspec/shell.rb +11 -15
  210. data/lib/inspec/shell_detector.rb +6 -7
  211. data/lib/inspec/source_reader.rb +4 -8
  212. data/lib/inspec/ui.rb +33 -39
  213. data/lib/inspec/ui_table_helper.rb +12 -0
  214. data/lib/{utils → inspec/utils}/command_wrapper.rb +4 -8
  215. data/lib/{utils → inspec/utils}/convert.rb +0 -4
  216. data/lib/{utils → inspec/utils}/database_helpers.rb +4 -8
  217. data/lib/inspec/utils/deprecation.rb +6 -0
  218. data/lib/{utils → inspec/utils}/deprecation/config_file.rb +19 -19
  219. data/lib/{utils → inspec/utils}/deprecation/deprecator.rb +12 -12
  220. data/lib/{utils → inspec/utils}/deprecation/errors.rb +1 -1
  221. data/lib/{utils → inspec/utils}/deprecation/global_method.rb +2 -2
  222. data/lib/{utils → inspec/utils}/enumerable_delegation.rb +0 -2
  223. data/lib/{utils → inspec/utils}/erlang_parser.rb +61 -65
  224. data/lib/{utils → inspec/utils}/file_reader.rb +1 -2
  225. data/lib/{utils → inspec/utils}/filter.rb +30 -33
  226. data/lib/{utils → inspec/utils}/filter_array.rb +0 -2
  227. data/lib/{utils → inspec/utils}/find_files.rb +9 -12
  228. data/lib/{utils → inspec/utils}/hash.rb +1 -5
  229. data/lib/inspec/utils/json_log.rb +15 -0
  230. data/lib/inspec/utils/latest_version.rb +13 -0
  231. data/lib/{utils → inspec/utils}/modulator.rb +0 -3
  232. data/lib/{utils → inspec/utils}/nginx_parser.rb +31 -35
  233. data/lib/{utils → inspec/utils}/object_traversal.rb +0 -3
  234. data/lib/{utils → inspec/utils}/parser.rb +45 -45
  235. data/lib/{utils → inspec/utils}/pkey_reader.rb +4 -2
  236. data/lib/{utils → inspec/utils}/simpleconfig.rb +8 -10
  237. data/lib/{utils → inspec/utils}/spdx.rb +1 -4
  238. data/lib/{utils → inspec/utils}/spdx.txt +0 -0
  239. data/lib/inspec/utils/telemetry.rb +3 -3
  240. data/lib/inspec/utils/telemetry/collector.rb +30 -9
  241. data/lib/inspec/utils/telemetry/data_series.rb +3 -1
  242. data/lib/inspec/utils/telemetry/global_methods.rb +1 -1
  243. data/lib/inspec/version.rb +1 -1
  244. data/lib/matchers/matchers.rb +22 -25
  245. data/lib/plugins/inspec-artifact/lib/inspec-artifact.rb +1 -1
  246. data/lib/plugins/inspec-artifact/lib/inspec-artifact/base.rb +52 -45
  247. data/lib/plugins/inspec-artifact/lib/inspec-artifact/cli.rb +18 -16
  248. data/lib/plugins/inspec-compliance/lib/inspec-compliance.rb +1 -1
  249. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +73 -73
  250. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api/login.rb +66 -62
  251. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +59 -57
  252. data/lib/plugins/inspec-compliance/lib/inspec-compliance/configuration.rb +11 -11
  253. data/lib/plugins/inspec-compliance/lib/inspec-compliance/http.rb +20 -22
  254. data/lib/plugins/inspec-compliance/lib/inspec-compliance/support.rb +2 -4
  255. data/lib/plugins/inspec-compliance/lib/inspec-compliance/target.rb +30 -27
  256. data/lib/plugins/inspec-habitat/Berksfile +2 -2
  257. data/lib/plugins/inspec-habitat/lib/inspec-habitat.rb +1 -1
  258. data/lib/plugins/inspec-habitat/lib/inspec-habitat/cli.rb +15 -13
  259. data/lib/plugins/inspec-habitat/lib/inspec-habitat/profile.rb +64 -63
  260. data/lib/plugins/inspec-habitat/templates/habitat/hooks/run.erb +3 -3
  261. data/lib/plugins/inspec-habitat/templates/habitat/plan.sh.erb +11 -11
  262. data/lib/plugins/inspec-init/lib/inspec-init.rb +1 -1
  263. data/lib/plugins/inspec-init/lib/inspec-init/cli.rb +6 -8
  264. data/lib/plugins/inspec-init/lib/inspec-init/cli_plugin.rb +72 -74
  265. data/lib/plugins/inspec-init/lib/inspec-init/cli_profile.rb +9 -11
  266. data/lib/plugins/inspec-init/lib/inspec-init/renderer.rb +4 -4
  267. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/Gemfile +0 -1
  268. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/inspec-plugin-template.gemspec +0 -2
  269. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template.rb +0 -2
  270. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/cli_command.rb +0 -2
  271. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/plugin.rb +0 -2
  272. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/version.rb +0 -2
  273. data/lib/plugins/inspec-init/templates/profiles/os/controls/example.rb +6 -7
  274. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli.rb +1 -2
  275. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +72 -70
  276. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/plugin.rb +1 -1
  277. data/lib/plugins/shared/core_plugin_test_helper.rb +43 -38
  278. data/lib/source_readers/flat.rb +6 -10
  279. data/lib/source_readers/inspec.rb +8 -12
  280. metadata +139 -140
  281. data/lib/resources/mysql.rb +0 -82
  282. data/lib/resources/sys_info.rb +0 -28
  283. data/lib/utils/deprecation.rb +0 -6
  284. data/lib/utils/json_log.rb +0 -18
  285. data/lib/utils/latest_version.rb +0 -22
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gemspec
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  # As plugins are usually packaged and distributed as a RubyGem,
4
2
  # we have to provide a .gemspec file, which controls the gembuild
5
3
  # and publish process. This is a fairly generic gemspec.
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  # This file is known as the "entry point."
4
2
  # This is the file InSpec will try to load if it
5
3
  # thinks your plugin is installed.
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'inspec/resource'
4
2
 
5
3
  module InspecPlugins::<%= module_name %>
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  # Plugin Definition file
4
2
  # The purpose of this file is to declare to InSpec what plugin_types (capabilities)
5
3
  # are included in this plugin, and provide hooks that will load them as needed.
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  # This file simply makes it easier for CI engines to update
4
2
  # the version stamp, and provide a clean way for the gemspec
5
3
  # to learn the current version.
@@ -1,19 +1,18 @@
1
- # encoding: utf-8
2
1
  # copyright: 2018, The Authors
3
2
 
4
- title 'sample section'
3
+ title "sample section"
5
4
 
6
5
  # you can also use plain tests
7
- describe file('/tmp') do
6
+ describe file("/tmp") do
8
7
  it { should be_directory }
9
8
  end
10
9
 
11
10
  # you add controls here
12
- control 'tmp-1.0' do # A unique ID for this control
11
+ control "tmp-1.0" do # A unique ID for this control
13
12
  impact 0.7 # The criticality, if this control fails.
14
- title 'Create /tmp directory' # A human-readable title
15
- desc 'An optional description...'
16
- describe file('/tmp') do # The actual test
13
+ title "Create /tmp directory" # A human-readable title
14
+ desc "An optional description..."
15
+ describe file("/tmp") do # The actual test
17
16
  it { should be_directory }
18
17
  end
19
18
  end
@@ -1,4 +1,3 @@
1
-
2
1
  # Because this is a core plugin, we place the plugin definition here in the entry point.
3
2
  # This is needed because under core testing, the entry point may be reloaded multiple times,
4
3
  # and we need plugin registration to properly occur each time.
@@ -10,7 +9,7 @@ module InspecPlugins
10
9
  plugin_name :'inspec-plugin-manager-cli'
11
10
 
12
11
  cli_command :plugin do
13
- require_relative 'inspec-plugin-manager-cli/cli_command'
12
+ require_relative "inspec-plugin-manager-cli/cli_command"
14
13
  InspecPlugins::PluginManager::CliCommand
15
14
  end
16
15
  end
@@ -1,33 +1,35 @@
1
- require 'term/ansicolor'
2
- require 'pathname'
3
- require 'inspec/plugin/v2'
4
- require 'inspec/plugin/v2/installer'
1
+ require "term/ansicolor"
2
+ require "pathname"
3
+ require "inspec/plugin/v2"
4
+ require "inspec/plugin/v2/installer"
5
+ require "inspec/dist"
5
6
 
6
7
  module InspecPlugins
7
8
  module PluginManager
8
9
  class CliCommand < Inspec.plugin(2, :cli_command)
9
10
  include Term::ANSIColor
11
+ include Inspec::Dist
10
12
 
11
- subcommand_desc 'plugin SUBCOMMAND', 'Manage InSpec and Train plugins'
13
+ subcommand_desc "plugin SUBCOMMAND", "Manage #{PRODUCT_NAME} and Train plugins"
12
14
 
13
15
  #==================================================================#
14
16
  # inspec plugin list
15
17
  #==================================================================#
16
18
 
17
- desc 'list [options]', 'Lists user-installed InSpec plugins.'
18
- option :all, desc: 'Include plugins shipped with InSpec as well.', type: :boolean, aliases: [:a]
19
+ desc "list [options]", "Lists user-installed #{PRODUCT_NAME} plugins."
20
+ option :all, desc: "Include plugins shipped with #{PRODUCT_NAME} as well.", type: :boolean, aliases: [:a]
19
21
  def list
20
22
  plugin_statuses = Inspec::Plugin::V2::Registry.instance.plugin_statuses
21
23
  plugin_statuses.reject! { |s| [:core, :bundle].include?(s.installation_type) } unless options[:all]
22
24
 
23
25
  # TODO: ui object support
24
26
  puts
25
- puts(bold { format(' %-30s%-10s%-8s%-6s', 'Plugin Name', 'Version', 'Via', 'ApiVer') })
26
- puts '-' * 55
27
+ puts(bold { format(" %-30s%-10s%-8s%-6s", "Plugin Name", "Version", "Via", "ApiVer") })
28
+ puts "-" * 55
27
29
  plugin_statuses.sort_by(&:name).each do |status|
28
- puts(format(' %-30s%-10s%-8s%-6s', status.name, make_pretty_version(status), status.installation_type, status.api_generation.to_s))
30
+ puts(format(" %-30s%-10s%-8s%-6s", status.name, make_pretty_version(status), status.installation_type, status.api_generation.to_s))
29
31
  end
30
- puts '-' * 55
32
+ puts "-" * 55
31
33
  puts(" #{plugin_statuses.count} plugin(s) total")
32
34
  puts
33
35
  end
@@ -36,15 +38,15 @@ module InspecPlugins
36
38
  # inspec plugin search
37
39
  #==================================================================#
38
40
 
39
- desc 'search [options] PATTERN', 'Searches rubygems.org for plugins.'
41
+ desc "search [options] PATTERN", "Searches rubygems.org for plugins."
40
42
  long_desc <<~EOLD
41
- Searches rubygems.org for InSpec plugins. Exits 0 on a search hit, 1 on user error,
43
+ Searches rubygems.org for #{PRODUCT_NAME} plugins. Exits 0 on a search hit, 1 on user error,
42
44
  2 on a search miss. PATTERN is a simple string; a wildcard will be added as
43
45
  a suffix, unless -e is used.
44
46
  EOLD
45
- option :all, desc: 'List all available versions, not just the latest one.', type: :boolean, aliases: [:a]
46
- option :exact, desc: 'Assume PATTERN is exact; do not add a wildcard to the end', type: :boolean, aliases: [:e]
47
- option :'include-test-fixture', type: :boolean, desc: 'Internal use', hide: true
47
+ option :all, desc: "List all available versions, not just the latest one.", type: :boolean, aliases: [:a]
48
+ option :exact, desc: "Assume PATTERN is exact; do not add a wildcard to the end", type: :boolean, aliases: [:e]
49
+ option :'include-test-fixture', type: :boolean, desc: "Internal use", hide: true
48
50
  # Justification for disabling ABC: currently at 33.51/33
49
51
  def search(search_term) # rubocop: disable Metrics/AbcSize
50
52
  search_results = installer.search(search_term, exact: options[:exact])
@@ -53,20 +55,20 @@ module InspecPlugins
53
55
  # for testing. We want to hide those from users, so unless we know we're in
54
56
  # test mode, remove them.
55
57
  unless options[:'include-test-fixture']
56
- search_results.delete('inspec-test-fixture')
57
- search_results.delete('train-test-fixture')
58
+ search_results.delete("inspec-test-fixture")
59
+ search_results.delete("train-test-fixture")
58
60
  end
59
61
 
60
62
  # TODO: ui object support
61
63
  puts
62
- puts(bold { format(' %-30s%-50s', 'Plugin Name', 'Versions Available') })
63
- puts '-' * 55
64
+ puts(bold { format(" %-30s%-50s", "Plugin Name", "Versions Available") })
65
+ puts "-" * 55
64
66
  search_results.keys.sort.each do |plugin_name|
65
67
  versions = options[:all] ? search_results[plugin_name] : [search_results[plugin_name].first]
66
- versions = '(' + versions.join(', ') + ')'
67
- puts(format(' %-30s%-50s', plugin_name, versions))
68
+ versions = "(" + versions.join(", ") + ")"
69
+ puts(format(" %-30s%-50s", plugin_name, versions))
68
70
  end
69
- puts '-' * 55
71
+ puts "-" * 55
70
72
  puts(" #{search_results.count} plugin(s) found")
71
73
  puts
72
74
 
@@ -79,7 +81,7 @@ module InspecPlugins
79
81
  #==================================================================#
80
82
  # inspec plugin install
81
83
  #==================================================================#
82
- desc 'install [-v VERSION] PLUGIN', 'Installs a plugin from rubygems.org, a gemfile, or a path to local source.'
84
+ desc "install [-v VERSION] PLUGIN", "Installs a plugin from rubygems.org, a gemfile, or a path to local source."
83
85
  long_desc <<~EOLD
84
86
  PLUGIN may be the name of a gem on rubygems.org that begins with inspec- or train-.
85
87
  PLUGIN may also be the path to a local gemfile, which will then be installed like
@@ -88,7 +90,7 @@ module InspecPlugins
88
90
  for local plugin development). Exit codes are 0 on success, 2 if the plugin is
89
91
  already installed, and 1 if any other error occurs.
90
92
  EOLD
91
- option :version, desc: 'When installing from rubygems.org, specifies a specific version to install.', aliases: [:v]
93
+ option :version, desc: "When installing from rubygems.org, specifies a specific version to install.", aliases: [:v]
92
94
  def install(plugin_id_arg)
93
95
  if plugin_id_arg =~ /\.gem$/ # Does it end in .gem?
94
96
  install_from_gemfile(plugin_id_arg)
@@ -102,7 +104,7 @@ module InspecPlugins
102
104
  #--------------------------
103
105
  # update
104
106
  #--------------------------
105
- desc 'update PLUGIN', 'Updates a plugin to the latest from from rubygems.org'
107
+ desc "update PLUGIN", "Updates a plugin to the latest from from rubygems.org"
106
108
  long_desc <<~EOLD
107
109
  PLUGIN may be the name of a gem on rubygems.org that begins with inspec- or train-.
108
110
  Exit codes are 0 on success, 2 if the plugin is already up to date, and 1 if any
@@ -110,14 +112,14 @@ module InspecPlugins
110
112
  EOLD
111
113
  def update(plugin_name)
112
114
  pre_update_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
113
- old_version = pre_update_versions.join(', ')
115
+ old_version = pre_update_versions.join(", ")
114
116
 
115
117
  update_preflight_check(plugin_name, pre_update_versions)
116
118
 
117
119
  begin
118
120
  installer.update(plugin_name)
119
121
  rescue Inspec::Plugin::V2::UpdateError => ex
120
- puts(red { 'Update error: ' } + ex.message + ' - update failed')
122
+ puts(red { "Update error: " } + ex.message + " - update failed")
121
123
  exit 1
122
124
  end
123
125
  post_update_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
@@ -129,7 +131,7 @@ module InspecPlugins
129
131
  #--------------------------
130
132
  # uninstall
131
133
  #--------------------------
132
- desc 'uninstall PLUGIN_NAME', 'Uninstalls a gem- or path- based plugin'
134
+ desc "uninstall PLUGIN_NAME", "Uninstalls a gem- or path- based plugin"
133
135
  long_desc <<~EOLD
134
136
  Removes a plugin from the users configuration.
135
137
  In the case of a gem plugin (by far the most common), the plugin gem is removed, along
@@ -142,19 +144,19 @@ module InspecPlugins
142
144
  def uninstall(plugin_name)
143
145
  status = Inspec::Plugin::V2::Registry.instance[plugin_name.to_sym]
144
146
  unless status
145
- puts(red { 'No such plugin installed: ' } + "#{plugin_name} is not installed - uninstall failed")
147
+ puts(red { "No such plugin installed: " } + "#{plugin_name} is not installed - uninstall failed")
146
148
 
147
149
  exit 1
148
150
  end
149
151
  installer = Inspec::Plugin::V2::Installer.instance
150
152
 
151
153
  pre_uninstall_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
152
- old_version = pre_uninstall_versions.join(', ')
154
+ old_version = pre_uninstall_versions.join(", ")
153
155
 
154
156
  installer.uninstall(plugin_name)
155
157
 
156
158
  if status.installation_type == :path
157
- puts(bold { plugin_name } + ' path-based plugin install has been uninstalled')
159
+ puts(bold { plugin_name } + " path-based plugin install has been uninstalled")
158
160
  else
159
161
  puts(bold { plugin_name } + " plugin, version #{old_version}, has been uninstalled")
160
162
  end
@@ -170,14 +172,14 @@ module InspecPlugins
170
172
 
171
173
  def install_from_gemfile(gem_file)
172
174
  unless File.exist? gem_file
173
- puts(red { 'No such plugin gem file ' } + gem_file + ' - installation failed.')
175
+ puts(red { "No such plugin gem file " } + gem_file + " - installation failed.")
174
176
  exit 1
175
177
  end
176
178
 
177
- plugin_name_parts = File.basename(gem_file, '.gem').split('-')
179
+ plugin_name_parts = File.basename(gem_file, ".gem").split("-")
178
180
  version = plugin_name_parts.pop
179
- plugin_name = plugin_name_parts.join('-')
180
- check_plugin_name(plugin_name, 'installation')
181
+ plugin_name = plugin_name_parts.join("-")
182
+ check_plugin_name(plugin_name, "installation")
181
183
 
182
184
  installer.install(plugin_name, gem_file: gem_file)
183
185
 
@@ -187,22 +189,22 @@ module InspecPlugins
187
189
 
188
190
  def install_from_path(path)
189
191
  unless File.exist? path
190
- puts(red { 'No such source code path ' } + path + ' - installation failed.')
192
+ puts(red { "No such source code path " } + path + " - installation failed.")
191
193
  exit 1
192
194
  end
193
195
 
194
- plugin_name = File.basename(path, '.rb')
196
+ plugin_name = File.basename(path, ".rb")
195
197
 
196
198
  # While installer.install does some rudimentary checking,
197
199
  # this file has good UI access, so we promise to validate the
198
200
  # input a lot and hand the installer a sure-thing.
199
201
 
200
202
  # Name OK?
201
- check_plugin_name(plugin_name, 'installation')
203
+ check_plugin_name(plugin_name, "installation")
202
204
 
203
205
  # Already installed?
204
206
  if registry.known_plugin?(plugin_name.to_sym)
205
- puts(red { 'Plugin already installed' } + " - #{plugin_name} - Use 'inspec plugin list' to see previously installed plugin - installation failed.")
207
+ puts(red { "Plugin already installed" } + " - #{plugin_name} - Use '#{EXEC_NAME} plugin list' to see previously installed plugin - installation failed.")
206
208
  exit 2
207
209
  end
208
210
 
@@ -215,7 +217,7 @@ module InspecPlugins
215
217
  # OK, install it!
216
218
  installer.install(plugin_name, path: entry_point)
217
219
 
218
- puts(bold { plugin_name } + ' plugin installed via source path reference, resolved to entry point ' + entry_point)
220
+ puts(bold { plugin_name } + " plugin installed via source path reference, resolved to entry point " + entry_point)
219
221
  exit 0
220
222
  end
221
223
 
@@ -232,14 +234,14 @@ module InspecPlugins
232
234
  parts = [
233
235
  given.parent.parent.basename,
234
236
  given.parent.basename,
235
- given.basename('.rb'),
237
+ given.basename(".rb"),
236
238
  given.extname,
237
239
  ].map(&:to_s)
238
240
 
239
241
  # Case 1: Simplest case: it was a full entry point, as presented.
240
242
  # /home/you/projects/inspec-something/lib/inspec-something.rb
241
243
  # parts index: ^0^ ^1^ ^2^ ^3^
242
- if parts[0] =~ name_regex && parts[1] == 'lib' && parts[2] == parts[0] && parts[3] == '.rb'
244
+ if parts[0] =~ name_regex && parts[1] == "lib" && parts[2] == parts[0] && parts[3] == ".rb"
243
245
  return given.to_s
244
246
  end
245
247
 
@@ -247,37 +249,37 @@ module InspecPlugins
247
249
  # or left the extansion off. Those are the same to us.
248
250
  # /home/you/projects/inspec-something/lib/inspec-something
249
251
  # parts index: ^0^ ^1^ ^2^ (3 is empty)
250
- if parts[0] =~ name_regex && parts[1] == 'lib' && parts[2] == parts[0] && parts[3].empty?
251
- return given.to_s + '.rb'
252
+ if parts[0] =~ name_regex && parts[1] == "lib" && parts[2] == parts[0] && parts[3].empty?
253
+ return given.to_s + ".rb"
252
254
  end
253
255
 
254
256
  # Case 3: Maybe they were refering to a path that is inside a gem installation, or an exploded gem?
255
257
  # In that case, we'll have a version on the plugin name in part 0
256
258
  # /home/you/.gems/2.4.0/gems/inspec-something-3.45.1/lib/inspec-something.rb
257
259
  # parts index: ^0^ ^1^ ^2^ ^3^
258
- if parts[0] =~ versioned_regex && parts[1] == 'lib' && parts[0].start_with?(parts[2]) && parts[3] == '.rb'
260
+ if parts[0] =~ versioned_regex && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3] == ".rb"
259
261
  return given.to_s
260
262
  end
261
263
 
262
264
  # Case 4: Like case 3, but missing the .rb
263
265
  # /home/you/.gems/2.4.0/gems/inspec-something-3.45.1/lib/inspec-something
264
266
  # parts index: ^0^ ^1^ ^2^ ^3^ (empty)
265
- if parts[0] =~ versioned_regex && parts[1] == 'lib' && parts[0].start_with?(parts[2]) && parts[3].empty?
266
- return given.to_s + '.rb'
267
+ if parts[0] =~ versioned_regex && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3].empty?
268
+ return given.to_s + ".rb"
267
269
  end
268
270
 
269
271
  # Case 5: Easy to recognize, but harder to handle: they referred to the project root.
270
272
  # /home/you/projects/inspec-something
271
273
  # parts index: ^0^ ^1^ ^2^ (3 is empty)
272
274
  # 0 and 1 are not meaningful to us, but we hope to find a parts[2]/lib/inspec-something.rb.
273
- entry_point_guess = File.join(given.to_s, 'lib', parts[2] + '.rb')
275
+ entry_point_guess = File.join(given.to_s, "lib", parts[2] + ".rb")
274
276
  if parts[2] =~ name_regex && File.exist?(entry_point_guess)
275
277
  return entry_point_guess
276
278
  end
277
279
 
278
280
  # Well, if we got here, parts[2] matches an inspec/train prefix, but we have no idea about anything.
279
281
  # Give up.
280
- puts(red { 'Unrecognizable plugin structure' } + " - #{parts[2]} - When installing from a path, please provide the path of the entry point file - installation failed.")
282
+ puts(red { "Unrecognizable plugin structure" } + " - #{parts[2]} - When installing from a path, please provide the path of the entry point file - installation failed.")
281
283
  exit 1
282
284
  end
283
285
 
@@ -286,23 +288,23 @@ module InspecPlugins
286
288
  begin
287
289
  require entry_point
288
290
  rescue LoadError => ex
289
- puts(red { 'Plugin contains errors' } + " - #{plugin_name} - Encountered errors while trying to test load the plugin entry point, resolved to #{entry_point} - installation failed")
291
+ puts(red { "Plugin contains errors" } + " - #{plugin_name} - Encountered errors while trying to test load the plugin entry point, resolved to #{entry_point} - installation failed")
290
292
  puts ex.message
291
293
  exit 1
292
294
  end
293
295
 
294
296
  # OK, the wheels didn't fall off. But is it a plugin?
295
- if plugin_name.to_s.start_with?('train')
297
+ if plugin_name.to_s.start_with?("train")
296
298
  # Train internal names do not include the prix in their registry entries
297
299
  # And the registry is keyed on Strings
298
- registry_key = plugin_name.to_s.sub(/^train-/, '')
300
+ registry_key = plugin_name.to_s.sub(/^train-/, "")
299
301
  unless Train::Plugins.registry.key?(registry_key)
300
- puts(red { 'Does not appear to be a plugin' } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to Train. Ensure something inherits from 'Train.plugin(1)' - installation failed.")
302
+ puts(red { "Does not appear to be a plugin" } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to Train. Ensure something inherits from 'Train.plugin(1)' - installation failed.")
301
303
  exit 1
302
304
  end
303
305
  else
304
306
  unless registry.known_plugin?(plugin_name.to_sym)
305
- puts(red { 'Does not appear to be a plugin' } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to InSpec. Ensure something inherits from 'Inspec.plugin(2)' - installation failed.")
307
+ puts(red { "Does not appear to be a plugin" } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to InSpec. Ensure something inherits from 'Inspec.plugin(2)' - installation failed.")
306
308
  exit 1
307
309
  end
308
310
  end
@@ -311,7 +313,7 @@ module InspecPlugins
311
313
  def install_from_remote_gem(plugin_name)
312
314
  requested_version = options[:version]
313
315
 
314
- check_plugin_name(plugin_name, 'installation')
316
+ check_plugin_name(plugin_name, "installation")
315
317
 
316
318
  # Version pre-flighting
317
319
  pre_installed_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
@@ -346,12 +348,12 @@ module InspecPlugins
346
348
  they_explicitly_asked_for_a_version = !options[:version].nil?
347
349
  what_we_would_install_is_already_installed = pre_installed_versions.include?(requested_version)
348
350
  if what_we_would_install_is_already_installed && they_explicitly_asked_for_a_version
349
- puts(red { 'Plugin already installed at requested version' } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
351
+ puts(red { "Plugin already installed at requested version" } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
350
352
  elsif what_we_would_install_is_already_installed && !they_explicitly_asked_for_a_version
351
- puts(red { 'Plugin already installed at latest version' } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
353
+ puts(red { "Plugin already installed at latest version" } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
352
354
  else
353
355
  # There are existing versions installed, but none of them are what was requested
354
- puts(red { 'Update required' } + " - plugin #{plugin_name}, requested #{requested_version}, have #{pre_installed_versions.join(', ')}; use `inspec plugin update` - refusing to install.")
356
+ puts(red { "Update required" } + " - plugin #{plugin_name}, requested #{requested_version}, have #{pre_installed_versions.join(', ')}; use `inspec plugin update` - refusing to install.")
355
357
  end
356
358
 
357
359
  exit 2
@@ -361,20 +363,20 @@ module InspecPlugins
361
363
  def install_attempt_install(plugin_name) # rubocop: disable Metrics/AbcSize
362
364
  installer.install(plugin_name, version: options[:version])
363
365
  rescue Inspec::Plugin::V2::PluginExcludedError => ex
364
- puts(red { 'Plugin on Exclusion List' } + " - #{plugin_name} is listed as an incompatible gem - refusing to install.")
366
+ puts(red { "Plugin on Exclusion List" } + " - #{plugin_name} is listed as an incompatible gem - refusing to install.")
365
367
  puts "Rationale: #{ex.details.rationale}"
366
- puts 'Exclusion list location: ' + File.join(Inspec.src_root, 'etc', 'plugin_filters.json')
367
- puts 'If you disagree with this determination, please accept our apologies for the misunderstanding, and open an issue at https://github.com/inspec/inspec/issues/new'
368
+ puts "Exclusion list location: " + File.join(Inspec.src_root, "etc", "plugin_filters.json")
369
+ puts "If you disagree with this determination, please accept our apologies for the misunderstanding, and open an issue at https://github.com/inspec/inspec/issues/new"
368
370
  exit 2
369
371
  rescue Inspec::Plugin::V2::InstallError
370
372
  raise if Inspec::Log.level == :debug
371
373
  results = installer.search(plugin_name, exact: true)
372
374
  if results.empty?
373
- puts(red { 'No such plugin gem ' } + plugin_name + ' could be found on rubygems.org - installation failed.')
375
+ puts(red { "No such plugin gem " } + plugin_name + " could be found on rubygems.org - installation failed.")
374
376
  elsif options[:version] && !results[plugin_name].include?(options[:version])
375
- puts(red { 'No such version' } + ' - ' + plugin_name + " exists, but no such version #{options[:version]} found on rubygems.org - installation failed.")
377
+ puts(red { "No such version" } + " - " + plugin_name + " exists, but no such version #{options[:version]} found on rubygems.org - installation failed.")
376
378
  else
377
- puts(red { 'Unknown error occured ' } + ' - installation failed.')
379
+ puts(red { "Unknown error occured " } + " - installation failed.")
378
380
  end
379
381
  exit 1
380
382
  end
@@ -387,10 +389,10 @@ module InspecPlugins
387
389
  # Check for path install
388
390
  status = Inspec::Plugin::V2::Registry.instance[plugin_name.to_sym]
389
391
  if !status
390
- puts(red { 'No such plugin installed: ' } + "#{plugin_name} - update failed")
392
+ puts(red { "No such plugin installed: " } + "#{plugin_name} - update failed")
391
393
  exit 1
392
394
  elsif status.installation_type == :path
393
- puts(red { 'Cannot update path-based install: ' } + "#{plugin_name} is installed via path reference; use `inspec plugin uninstall` to remove - refusing to update")
395
+ puts(red { "Cannot update path-based install: " } + "#{plugin_name} is installed via path reference; use `inspec plugin uninstall` to remove - refusing to update")
394
396
  exit 2
395
397
  end
396
398
  end
@@ -400,7 +402,7 @@ module InspecPlugins
400
402
  latest_version = latest_version[plugin_name]&.last
401
403
 
402
404
  if pre_update_versions.include?(latest_version)
403
- puts(red { 'Already installed at latest version: ' } + "#{plugin_name} is at #{latest_version}, which the latest - refusing to update")
405
+ puts(red { "Already installed at latest version: " } + "#{plugin_name} is at #{latest_version}, which the latest - refusing to update")
404
406
  exit 2
405
407
  end
406
408
  end
@@ -418,7 +420,7 @@ module InspecPlugins
418
420
 
419
421
  def check_plugin_name(plugin_name, action)
420
422
  unless plugin_name =~ /^(inspec|train)-/
421
- puts(red { 'Invalid plugin name' } + " - #{plugin_name} - All inspec plugins must begin with either 'inspec-' or 'train-' - #{action} failed.")
423
+ puts(red { "Invalid plugin name" } + " - #{plugin_name} - All inspec plugins must begin with either 'inspec-' or 'train-' - #{action} failed.")
422
424
  exit 1
423
425
  end
424
426
  end
@@ -435,7 +437,7 @@ module InspecPlugins
435
437
  .sort_by(&:version)
436
438
  .last.version
437
439
  when :path
438
- 'src'
440
+ "src"
439
441
  end
440
442
  end
441
443
  end