Class: Inspec::Plugin::V2::Loader
- Inherits:
- 
      Object
      
        - Object
- Inspec::Plugin::V2::Loader
 
- Defined in:
- lib/inspec/plugin/v2/loader.rb
Instance Attribute Summary collapse
- 
  
    
      #conf_file  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute conf_file. 
- 
  
    
      #options  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute options. 
- 
  
    
      #registry  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute registry. 
Class Method Summary collapse
- 
  
    
      .list_installed_plugin_gems  ⇒ Array[Gem::Specification] 
    
    
  
  
  
  
  
  
  
  
  
    Lists all plugin gems found in the plugin_gem_path. 
- 
  
    
      .list_managed_gems  ⇒ Array[Gem::Specification] 
    
    
  
  
  
  
  
  
  
  
  
    Lists all gems found in the plugin_gem_path. 
- .plugin_gem_path ⇒ Object
Instance Method Summary collapse
- #activate_mentioned_cli_plugins(cli_args = ARGV) ⇒ Object
- 
  
    
      #exit_on_load_error  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    This should possibly be in either lib/inspec/cli.rb or Registry. 
- 
  
    
      #initialize(options = {})  ⇒ Loader 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of Loader. 
- #list_installed_plugin_gems ⇒ Object
- #list_managed_gems ⇒ Object
- #load_all ⇒ Object
- #plugin_gem_path ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Loader
Returns a new instance of Loader.
| 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # File 'lib/inspec/plugin/v2/loader.rb', line 14 def initialize( = {}) @options = @registry = Inspec::Plugin::V2::Registry.instance unless [:omit_user_plugins] @conf_file = Inspec::Plugin::V2::ConfigFile.new read_conf_file_into_registry end # Old-style (v0, v1) co-distributed plugins were called 'bundles' # and were located in lib/bundles detect_bundled_plugins unless [:omit_bundles] # New-style (v2) co-distributed plugins are in lib/plugins, # and may be safely loaded detect_core_plugins unless [:omit_core_plugins] # Train plugins aren't InSpec plugins (they don't use our API) # but InSpec CLI manages them. So, we have to wrap them a bit. accommodate_train_plugins end | 
Instance Attribute Details
#conf_file ⇒ Object (readonly)
Returns the value of attribute conf_file.
| 12 13 14 | # File 'lib/inspec/plugin/v2/loader.rb', line 12 def conf_file @conf_file end | 
#options ⇒ Object (readonly)
Returns the value of attribute options.
| 12 13 14 | # File 'lib/inspec/plugin/v2/loader.rb', line 12 def @options end | 
#registry ⇒ Object (readonly)
Returns the value of attribute registry.
| 12 13 14 | # File 'lib/inspec/plugin/v2/loader.rb', line 12 def registry @registry end | 
Class Method Details
.list_installed_plugin_gems ⇒ Array[Gem::Specification]
Lists all plugin gems found in the plugin_gem_path. This is simply all gems that begin with train- or inspec-.
| 135 136 137 | # File 'lib/inspec/plugin/v2/loader.rb', line 135 def self.list_installed_plugin_gems list_managed_gems.select { |spec| spec.name.match(/^(inspec|train)-/) } end | 
.list_managed_gems ⇒ Array[Gem::Specification]
Lists all gems found in the plugin_gem_path.
| 124 125 126 | # File 'lib/inspec/plugin/v2/loader.rb', line 124 def self.list_managed_gems Dir.glob(File.join(plugin_gem_path, "specifications", "*.gemspec")).map { |p| Gem::Specification.load(p) } end | 
.plugin_gem_path ⇒ Object
| 115 116 117 118 119 120 | # File 'lib/inspec/plugin/v2/loader.rb', line 115 def self.plugin_gem_path require "rbconfig" ruby_abi_version = RbConfig::CONFIG["ruby_version"] # TODO: why are we installing under the api directory for plugins? File.join(Inspec.config_dir, "gems", ruby_abi_version) end | 
Instance Method Details
#activate_mentioned_cli_plugins(cli_args = ARGV) ⇒ Object
| 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | # File 'lib/inspec/plugin/v2/loader.rb', line 84 def activate_mentioned_cli_plugins(cli_args = ARGV) # Get a list of CLI plugin activation hooks registry.find_activators(plugin_type: :cli_command).each do |act| next if act.activated? # Decide whether to activate. Several conditions, so split them out for clarity. # Assume no, to start. Each condition may flip it true, which will short-circuit # all following ||= ops. activate_me = false # If the user invoked `inspec help`, `inspec --help`, or only `inspec` # then activate all CLI plugins so they can display their usage message. activate_me ||= ["help", "--help", nil].include?(cli_args.first) # If there is anything in the CLI args with the same name, activate it. # This is the expected usual activation for individual plugins. # `inspec dosomething` => activate the :dosomething hook activate_me ||= cli_args.include?(act.activator_name.to_s) # OK, activate. if activate_me act.activate act.implementation_class.register_with_thor end end end | 
#exit_on_load_error ⇒ Object
This should possibly be in either lib/inspec/cli.rb or Registry
| 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # File 'lib/inspec/plugin/v2/loader.rb', line 68 def exit_on_load_error if registry.any_load_failures? Inspec::Log.error "Errors were encountered while loading plugins..." registry.plugin_statuses.select(&:load_exception).each do |plugin_status| Inspec::Log.error "Plugin name: " + plugin_status.name.to_s Inspec::Log.error "Error: " + plugin_status.load_exception. if ARGV.include?("--debug") Inspec::Log.error "Exception: " + plugin_status.load_exception.class.name Inspec::Log.error "Trace: " + plugin_status.load_exception.backtrace.join("\n") end end Inspec::Log.error("Run again with --debug for a stacktrace.") unless ARGV.include?("--debug") exit 2 end end | 
#list_installed_plugin_gems ⇒ Object
| 139 140 141 | # File 'lib/inspec/plugin/v2/loader.rb', line 139 def list_installed_plugin_gems self.class.list_managed_gems end | 
#list_managed_gems ⇒ Object
| 128 129 130 | # File 'lib/inspec/plugin/v2/loader.rb', line 128 def list_managed_gems self.class.list_managed_gems end | 
#load_all ⇒ Object
| 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | # File 'lib/inspec/plugin/v2/loader.rb', line 35 def load_all # This fixes the gem paths on some bundles Gem.path << plugin_gem_path Gem.refresh # Be careful not to actually iterate directly over the registry here; # we want to allow "sidecar loading", in which case a plugin may add an entry to the registry. registry.plugin_names.dup.each do |plugin_name| plugin_details = registry[plugin_name] # We want to capture literally any possible exception here, since we are storing them. # rubocop: disable Lint/RescueException begin # We could use require, but under testing, we need to repeatedly reload the same # plugin. However, gems only work with require (rubygems dooes not overload `load`) if plugin_details.installation_type == :gem activate_managed_gems_for_plugin(plugin_name) require plugin_details.entry_point else load_path = plugin_details.entry_point load_path += ".rb" unless plugin_details.entry_point.end_with?(".rb") load load_path end plugin_details.loaded = true annotate_status_after_loading(plugin_name) rescue ::Exception => ex plugin_details.load_exception = ex Inspec::Log.error "Could not load plugin #{plugin_name}: #{ex.}" end # rubocop: enable Lint/RescueException end end | 
#plugin_gem_path ⇒ Object
| 111 112 113 | # File 'lib/inspec/plugin/v2/loader.rb', line 111 def plugin_gem_path self.class.plugin_gem_path end |