@@ -41,6 +41,8 @@ def action_install
4141 notifying_block do
4242 install_python
4343 install_pip
44+ install_setuptools
45+ install_virtualenv
4446 end
4547 end
4648
@@ -91,19 +93,51 @@ def uninstall_python
9193 #
9294 # @return [void]
9395 def install_pip
94- return unless options [ :pip_version ]
96+ pip_version_or_url = options [ :pip_version ]
97+ return unless pip_version_or_url
9598 # If there is a : in the version, use it as a URL.
96- pip_version = options [ :pip_version ]
97- is_url = pip_version . is_a? ( String ) && pip_version . include? ( ':' )
99+ if pip_version_or_url . is_a? ( String ) && pip_version_or_url . include? ( ':' )
100+ pip_version = nil
101+ pip_url = pip_version_or_url
102+ else
103+ pip_version = pip_version_or_url
104+ pip_url = nil
105+ end
106+ Chef ::Log . debug ( "[#{ new_resource } ] Installing pip #{ pip_version || 'latest' } " )
107+ # Install or bootstrap pip.
98108 python_runtime_pip new_resource . name do
99109 parent new_resource
100110 # If the version is `true`, don't pass it at all.
101- version pip_version if ! is_url && pip_version . is_a? ( String )
102- get_pip_url pip_version if is_url
111+ version pip_version if pip_version . is_a? ( String )
112+ get_pip_url pip_url if pip_url
103113 end
104114 end
105115
106116 def install_setuptools
117+ # Captured because #options conflicts with Chef::Resource::Package#options.
118+ setuptools_version = options [ :setuptools_version ]
119+ return unless setuptools_version
120+ Chef ::Log . debug ( "[#{ new_resource } ] Installing setuptools #{ setuptools_version == true ? 'latest' : setuptools_version } " )
121+ # Install setuptools via pip.
122+ python_package 'setuptools' do
123+ parent_python new_resource
124+ version setuptools_version if setuptools_version . is_a? ( String )
125+ end
126+ end
127+
128+ def install_virtualenv
129+ # Captured because #options conflicts with Chef::Resource::Package#options.
130+ virtualenv_version = options [ :virtualenv_version ]
131+ return unless virtualenv_version
132+ # Check if the venv module exists.
133+ cmd = shell_out ( [ python_binary , '-m' , 'venv' , '-h' ] )
134+ return unless cmd . error?
135+ Chef ::Log . debug ( "[#{ new_resource } ] Installing virtualenv #{ virtualenv_version == true ? 'latest' : virtualenv_version } " )
136+ # Install virtualenv via pip.
137+ python_package 'virtualenv' do
138+ parent_python new_resource
139+ version virtualenv_version if virtualenv_version . is_a? ( String )
140+ end
107141 end
108142
109143 end
0 commit comments