Class: Chef::Provider::Package::EasyInstall

Inherits:
Chef::Provider::Package show all
Includes:
Mixin::ShellOut
Defined in:
lib/chef/provider/package/easy_install.rb

Instance Attribute Summary

Attributes inherited from Chef::Provider

#current_resource, #new_resource, #run_context

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#shell_out, #shell_out!

Methods inherited from Chef::Provider::Package

#action_install, #action_purge, #action_remove, #action_upgrade, #expand_options, #get_preseed_file, #initialize, #preseed_package, #preseed_resource, #removing_package?

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #not_if, #only_if, #output_of_command, #run_command, #run_command_with_systems_locale

Methods included from Mixin::Command::Windows

#popen4

Methods included from Mixin::Command::Unix

#popen4

Methods inherited from Chef::Provider

#action_nothing, build_from_file, #cookbook_name, #initialize, #node, #resource_collection

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

#data_bag, #data_bag_item, #platform?, #search, #value_for_platform

Constructor Details

This class inherits a constructor from Chef::Provider::Package

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore

Instance Method Details

#candidate_versionObject



86
87
88
89
90
91
92
93
# File 'lib/chef/provider/package/easy_install.rb', line 86

def candidate_version
   return @candidate_version if @candidate_version

   # do a dry run to get the latest version
   result = shell_out!("#{easy_install_binary_path} -n #{@new_resource.package_name}", :returns=>[0,1])
   @candidate_version = result.stdout[/(.*)Best match: (.*) (.*)$/, 3]
   @candidate_version
end

#easy_install_binary_pathObject



52
53
54
55
# File 'lib/chef/provider/package/easy_install.rb', line 52

def easy_install_binary_path
  path = @new_resource.easy_install_binary
  path ? path : 'easy_install'
end

#install_check(name) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/chef/provider/package/easy_install.rb', line 32

def install_check(name)
  check = false

  begin
    # first check to see if we can import it
    output = shell_out!("python -c \"import #{name}\"").stderr
    unless output.include? "ImportError"
      check = true
    end
  rescue
    # then check to see if its on the path
    output = shell_out!("python -c \"import sys; print sys.path\"").stdout
    if output.downcase.include? "#{name.downcase}"
      check = true
    end
  end

  check
end

#install_package(name, version) ⇒ Object



95
96
97
# File 'lib/chef/provider/package/easy_install.rb', line 95

def install_package(name, version)
  run_command(:command => "#{easy_install_binary_path} \"#{name}==#{version}\"")
end

#load_current_resourceObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/chef/provider/package/easy_install.rb', line 57

def load_current_resource
  @current_resource = Chef::Resource::Package.new(@new_resource.name)
  @current_resource.package_name(@new_resource.package_name)
  @current_resource.version(nil)

  # get the currently installed version if installed
  package_version = nil
  if install_check(@new_resource.package_name)
    begin
      output = shell_out!("python -c \"import #{@new_resource.package_name}; print #{@new_resource.package_name}.__version__\"").stdout
      package_version = output.strip
    rescue
      output = shell_out!("python -c \"import #{@new_resource.package_name}; print #{@new_resource.package_name}.__path__\"").stdout
      output[/\S\S(.*)\/(.*)-(.*)-py(.*).egg\S/]
      package_version = $3
    end
  end

  if package_version == @new_resource.version
    Chef::Log.debug("#{@new_resource.package_name} at version #{@new_resource.version}")
  @current_resource.version(@new_resource.version)
  else
    Chef::Log.debug("#{@new_resource.package_name} at version #{package_version}")
    @current_resource.version(package_version)
  end

  @current_resource
end

#purge_package(name, version) ⇒ Object



107
108
109
# File 'lib/chef/provider/package/easy_install.rb', line 107

def purge_package(name, version)
  remove_package(name, version)
end

#remove_package(name, version) ⇒ Object



103
104
105
# File 'lib/chef/provider/package/easy_install.rb', line 103

def remove_package(name, version)
  run_command(:command => "#{easy_install_binary_path} -m #{name}")
end

#upgrade_package(name, version) ⇒ Object



99
100
101
# File 'lib/chef/provider/package/easy_install.rb', line 99

def upgrade_package(name, version)
  install_package(name, version)
end