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



108
109
110
111
112
113
114
115
# File 'lib/chef/provider/package/easy_install.rb', line 108

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



54
55
56
57
# File 'lib/chef/provider/package/easy_install.rb', line 54

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
51
52
# 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_binary_path} -c \"import #{name}\"", :returns=>[0,1]).stderr
    if output.include? "ImportError"
      # then check to see if its on the path
      output = shell_out!("#{python_binary_path} -c \"import sys; print sys.path\"", :returns=>[0,1]).stdout
      if output.downcase.include? "#{name.downcase}"
        check = true
      end
    else
      check = true
    end
  rescue
    # it's probably not installed
  end

  check
end

#install_package(name, version) ⇒ Object



117
118
119
# File 'lib/chef/provider/package/easy_install.rb', line 117

def install_package(name, version)
  run_command(:command => "#{easy_install_binary_path}#{expand_options(@new_resource.options)} \"#{name}==#{version}\"")
end

#load_current_resourceObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/chef/provider/package/easy_install.rb', line 69

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(module_name)
    begin
      output = shell_out!("#{python_binary_path} -c \"import #{module_name}; print #{module_name}.__version__\"").stdout
      package_version = output.strip
    rescue
      output = shell_out!("#{python_binary_path} -c \"import sys; print sys.path\"", :returns=>[0,1]).stdout

      output_array = output.gsub(/[\[\]]/,'').split(/\s*,\s*/)
      package_path = ""

      output_array.each do |entry|
        if entry.downcase.include?(@new_resource.package_name)
          package_path = entry
        end
      end

      package_path[/\S\S(.*)\/(.*)-(.*)-py(.*).egg\S/]
      package_version = $3
    end
  end

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

  @current_resource
end

#module_nameObject



64
65
66
67
# File 'lib/chef/provider/package/easy_install.rb', line 64

def module_name
  m = @new_resource.module_name
  m ? m : @new_resource.name
end

#purge_package(name, version) ⇒ Object



129
130
131
# File 'lib/chef/provider/package/easy_install.rb', line 129

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

#python_binary_pathObject



59
60
61
62
# File 'lib/chef/provider/package/easy_install.rb', line 59

def python_binary_path
  path = @new_resource.python_binary
  path ? path : 'python'
end

#remove_package(name, version) ⇒ Object



125
126
127
# File 'lib/chef/provider/package/easy_install.rb', line 125

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

#upgrade_package(name, version) ⇒ Object



121
122
123
# File 'lib/chef/provider/package/easy_install.rb', line 121

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