class Inspec::Resources::PipPackage
Public Class Methods
new(package_name, pip_path = nil)
click to toggle source
# File lib/inspec/resources/pip.rb, line 26 def initialize(package_name, pip_path = nil) @package_name = package_name @pip_cmd = pip_path || default_pip_path return skip_resource "pip not found" if @pip_cmd.nil? end
Public Instance Methods
info()
click to toggle source
# File lib/inspec/resources/pip.rb, line 33 def info return @info if defined?(@info) @info = {} @info[:type] = "pip" return @info unless cmd_successful? params = SimpleConfig.new( cmd.stdout, assignment_regex: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, multiple_values: false ).params @info[:name] = params["Name"] @info[:version] = params["Version"] @info[:installed] = true @info end
installed?()
click to toggle source
# File lib/inspec/resources/pip.rb, line 51 def installed? info[:installed] == true end
to_s()
click to toggle source
# File lib/inspec/resources/pip.rb, line 59 def to_s "Pip Package #{@package_name}" end
version()
click to toggle source
# File lib/inspec/resources/pip.rb, line 55 def version info[:version] end
Private Instance Methods
cmd()
click to toggle source
# File lib/inspec/resources/pip.rb, line 65 def cmd @__cmd ||= inspec.command("#{@pip_cmd} show #{@package_name}") end
cmd_successful?()
click to toggle source
# File lib/inspec/resources/pip.rb, line 69 def cmd_successful? return true if cmd.exit_status == 0 if cmd.exit_status != 0 # If pip on windows is not the latest, it will create a stderr value along with stdout # Example: # stdout: "Name: Jinja2\r\nVersion: 2.10..." # stderr: "You are using pip version 9.0.1, however version 9.0.3 is available..." if inspec.os.windows? && !cmd.stdout.empty? return true end end false end
default_pip_path()
click to toggle source
Default path of python pip installation
@return [String] of python pip path
# File lib/inspec/resources/pip.rb, line 105 def default_pip_path return "pip" unless inspec.os.windows? # If python is not found, return with skip_resource return skip_resource "python not found" if windows_paths["Python"].nil? # Pip is not on the default path for Windows, therefore we do some logic # to find the binary on Windows begin # use pip if it on system path pipcmd = windows_paths["Pip"] # calculate path on windows if defined?(windows_paths["Python"]) && pipcmd.nil? return nil if windows_paths["Pip"].nil? pipdir = windows_paths["Python"].split("\\") # remove python.exe pipdir.pop pipcmd = pipdir.push("Scripts").push("pip.exe").join("/") end rescue JSON::ParserError => _e return nil end pipcmd end
windows_paths()
click to toggle source
Paths of Python and Pip on windows {“Pip” => nil, “Python” => “/path/to/python”}
@return [Hash] of windows_paths
# File lib/inspec/resources/pip.rb, line 89 def windows_paths return @__windows_paths if @__windows_paths cmd = inspec.command( 'New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Pip -Value (Invoke-Command -ScriptBlock {where.exe pip}) -PassThru | Add-Member -MemberType NoteProperty -Name Python -Value (Invoke-Command -ScriptBlock {where.exe python}) -PassThru | ConvertTo-Json' ) @__windows_paths = JSON.parse(cmd.stdout) end