diff --git a/lib/facter/pip_version.rb b/lib/facter/pip_version.rb index 808f1541..11db4d60 100644 --- a/lib/facter/pip_version.rb +++ b/lib/facter/pip_version.rb @@ -1,9 +1,26 @@ # Make pip version available as a fact +def get_pip_version(executable) + if Facter::Util::Resolution.which(executable) # rubocop:disable Style/GuardClause + results = Facter::Util::Resolution.exec("#{executable} --version 2>&1").match(%r{^pip (\d+\.\d+\.?\d*).*$}) + results[1] if results + end +end + Facter.add('pip_version') do setcode do - if Facter::Util::Resolution.which('pip') - Facter::Util::Resolution.exec('pip --version 2>&1').match(%r{^pip (\d+\.\d+\.?\d*).*$})[1] - end + get_pip_version 'pip' + end +end + +Facter.add('pip2_version') do + setcode do + get_pip_version 'pip2' + end +end + +Facter.add('pip3_version') do + setcode do + get_pip_version 'pip3' end end diff --git a/lib/facter/virtualenv_version.rb b/lib/facter/virtualenv_version.rb index 5cf2e019..dbaba059 100644 --- a/lib/facter/virtualenv_version.rb +++ b/lib/facter/virtualenv_version.rb @@ -3,7 +3,8 @@ Facter.add('virtualenv_version') do setcode do if Facter::Util::Resolution.which('virtualenv') - Facter::Util::Resolution.exec('virtualenv --version 2>&1').match(%r{(\d+\.\d+\.?\d*).*$})[1] + results = Facter::Util::Resolution.exec('virtualenv --version 2>&1').match(%r{(\d+\.\d+\.?\d*).*$}) + results[1] if results end end end diff --git a/spec/unit/facter/pip_version_spec.rb b/spec/unit/facter/pip_version_spec.rb index 7a7c6c92..0dd75ed1 100644 --- a/spec/unit/facter/pip_version_spec.rb +++ b/spec/unit/facter/pip_version_spec.rb @@ -11,6 +11,18 @@ EOS end + let(:pip2_version_output) do + <<-EOS +pip 9.0.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7) +EOS + end + + let(:pip3_version_output) do + <<-EOS +pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7) +EOS + end + describe 'pip_version' do context 'returns pip version when pip present' do it do @@ -27,4 +39,42 @@ end end end + + describe 'pip2_version' do + context 'returns pip2 version when pip2 present' do + it do + Facter::Util::Resolution.stubs(:exec) + Facter::Util::Resolution.expects(:which).with('pip2').returns(true) + Facter::Util::Resolution.expects(:exec).with('pip2 --version 2>&1').returns(pip2_version_output) + expect(Facter.value(:pip2_version)).to eq('9.0.1') + end + end + + context 'returns nil when pip2 not present' do + it do + Facter::Util::Resolution.stubs(:exec) + Facter::Util::Resolution.expects(:which).with('pip2').returns(false) + expect(Facter.value(:pip2_version)).to eq(nil) + end + end + end + + describe 'pip3_version' do + context 'returns pip3 version when pip3 present' do + it do + Facter::Util::Resolution.stubs(:exec) + Facter::Util::Resolution.expects(:which).with('pip3').returns(true) + Facter::Util::Resolution.expects(:exec).with('pip3 --version 2>&1').returns(pip3_version_output) + expect(Facter.value(:pip3_version)).to eq('18.1') + end + end + + context 'returns nil when pip3 not present' do + it do + Facter::Util::Resolution.stubs(:exec) + Facter::Util::Resolution.expects(:which).with('pip3').returns(false) + expect(Facter.value(:pip3_version)).to eq(nil) + end + end + end end