Class: Inspec::Plugin::V2::Installer
- Inherits:
- 
      Object
      
        - Object
- Inspec::Plugin::V2::Installer
 
- Extended by:
- Forwardable
- Includes:
- Singleton
- Defined in:
- lib/inspec/plugin/v2/installer.rb
Overview
Handles all actions modifying the user’s plugin set:
- 
Modifying the plugins.json file 
- 
Installing, updating, and removing gem-based plugins 
Loading plugins is handled by Loader. Listing plugins is handled by Loader. Searching for plugins is handled by ???
Defined Under Namespace
Classes: InstalledVendorSet
Instance Attribute Summary collapse
- 
  
    
      #conf_file  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute conf_file. 
- 
  
    
      #loader  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute loader. 
- 
  
    
      #registry  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute registry. 
Instance Method Summary collapse
- 
  
    
      #__reset  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Testing API. 
- #__reset_loader ⇒ Object
- 
  
    
      #initialize  ⇒ Installer 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of Installer. 
- 
  
    
      #install(plugin_name, opts = {})  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Installs a plugin. 
- #plugin_installed?(name) ⇒ Boolean
- #plugin_version_installed?(name, version) ⇒ Boolean
- 
  
    
      #search(plugin_query, opts = {})  ⇒ Hash of Arrays 
    
    
  
  
  
  
  
  
  
  
  
    Search rubygems.org for a plugin gem. 
- 
  
    
      #uninstall(plugin_name, opts = {})  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Uninstalls (removes) a plugin. 
- 
  
    
      #update(plugin_name, opts = {})  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Updates a plugin. 
Constructor Details
Instance Attribute Details
#conf_file ⇒ Object (readonly)
Returns the value of attribute conf_file.
| 28 29 30 | # File 'lib/inspec/plugin/v2/installer.rb', line 28 def conf_file @conf_file end | 
#loader ⇒ Object (readonly)
Returns the value of attribute loader.
| 28 29 30 | # File 'lib/inspec/plugin/v2/installer.rb', line 28 def loader @loader end | 
#registry ⇒ Object (readonly)
Returns the value of attribute registry.
| 28 29 30 | # File 'lib/inspec/plugin/v2/installer.rb', line 28 def registry @registry end | 
Instance Method Details
#__reset ⇒ Object
Testing API. Performs a hard reset on the installer and registry, and reloads the loader. Not for public use. TODO: bad timing coupling in tests
| 151 152 153 | # File 'lib/inspec/plugin/v2/installer.rb', line 151 def __reset registry.__reset end | 
#__reset_loader ⇒ Object
| 155 156 157 | # File 'lib/inspec/plugin/v2/installer.rb', line 155 def __reset_loader @loader = Loader.new end | 
#install(plugin_name, opts = {}) ⇒ Object
Installs a plugin. Defaults to assuming the plugin provided is a gem, and will try to install from whatever gemsources ‘rubygems` thinks it should use. If it’s a gem, installs it and its dependencies to the ‘gem_path`. The gem is not activated. If it’s a path, leaves it in place. Finally, updates the plugins.json file with the new information. No attempt is made to load the plugin.
| 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # File 'lib/inspec/plugin/v2/installer.rb', line 59 def install(plugin_name, opts = {}) # TODO: - check plugins.json for validity before trying anything that needs to modify it. validate_installation_opts(plugin_name, opts) if opts[:path] install_from_path(plugin_name, opts) elsif opts[:gem_file] install_from_gem_file(plugin_name, opts) else install_from_remote_gems(plugin_name, opts) end update_plugin_config_file(plugin_name, opts.merge({ action: :install })) end | 
#plugin_installed?(name) ⇒ Boolean
| 39 40 41 | # File 'lib/inspec/plugin/v2/installer.rb', line 39 def plugin_installed?(name) list_installed_plugin_gems.detect { |spec| spec.name == name } end | 
#plugin_version_installed?(name, version) ⇒ Boolean
| 43 44 45 | # File 'lib/inspec/plugin/v2/installer.rb', line 43 def plugin_version_installed?(name, version) list_installed_plugin_gems.detect { |spec| spec.name == name && spec.version == Gem::Version.new(version) } end | 
#search(plugin_query, opts = {}) ⇒ Hash of Arrays
Search rubygems.org for a plugin gem.
| 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | # File 'lib/inspec/plugin/v2/installer.rb', line 123 def search(plugin_query, opts = {}) # rubocop: disable Metrics/AbcSize validate_search_opts(plugin_query, opts) fetcher = Gem::SpecFetcher.fetcher matched_tuples = [] if opts[:exact] matched_tuples = fetcher.detect(opts[:scope]) { |tuple| tuple.name == plugin_query } else regex = Regexp.new('^' + plugin_query + '.*') matched_tuples = fetcher.detect(opts[:scope]) do |tuple| tuple.name =~ regex && !Inspec::Plugin::V2::PluginFilter.exclude?(tuple.name) end end # sort tuples matched_tuples.sort! { |a, b| b.first.version <=> a.first.version } gem_info = {} matched_tuples.each do |tuple| gem_info[tuple.first.name] ||= [] gem_info[tuple.first.name] << tuple.first.version.to_s end gem_info end | 
#uninstall(plugin_name, opts = {}) ⇒ Object
Uninstalls (removes) a plugin. Refers to plugin.json to determine if it was a gem-based or path-based install. If it’s a gem, uninstalls it, and all other unused plugins. If it’s a path, removes the reference from the plugins.json, but does not tamper with the plugin source tree. Either way, the plugins.json file is updated with the new information.
| 103 104 105 106 107 108 109 110 111 112 113 114 | # File 'lib/inspec/plugin/v2/installer.rb', line 103 def uninstall(plugin_name, opts = {}) # TODO: - check plugins.json for validity before trying anything that needs to modify it. validate_uninstall_opts(plugin_name, opts) if registry.path_based_plugin?(plugin_name) uninstall_via_path(plugin_name, opts) else uninstall_via_gem(plugin_name, opts) end update_plugin_config_file(plugin_name, opts.merge({ action: :uninstall })) end | 
#update(plugin_name, opts = {}) ⇒ Object
Updates a plugin. Most options same as install, but will not handle path installs. If no :version is provided, updates to the latest. If a version is provided, the plugin becomes pinned at that specified version.
| 82 83 84 85 86 87 88 89 90 91 92 | # File 'lib/inspec/plugin/v2/installer.rb', line 82 def update(plugin_name, opts = {}) # TODO: - check plugins.json for validity before trying anything that needs to modify it. validate_update_opts(plugin_name, opts) opts[:update_mode] = true # TODO: Handle installing from a local file # TODO: Perform dependency checks to make sure the new solution is valid install_from_remote_gems(plugin_name, opts) update_plugin_config_file(plugin_name, opts.merge({ action: :update })) end |