diff --git a/lib/puppet/provider/package/pip.rb b/lib/puppet/provider/package/pip.rb index 7325cd6a6f6..07be06b36c5 100644 --- a/lib/puppet/provider/package/pip.rb +++ b/lib/puppet/provider/package/pip.rb @@ -99,9 +99,12 @@ def self.instances(target_command = nil) # Parse lines of output from `pip freeze`, which are structured as: # _package_==_version_ or _package_===_version_ + # or _package_ @ someURL@_version_ def self.parse(line) if line.chomp =~ /^([^=]+)===?([^=]+)$/ {:ensure => $2, :name => $1, :provider => name} + elsif line.chomp =~ /^([^@]+) @ [^@]+@(.+)$/ + { :ensure => Regexp.last_match(2), :name => Regexp.last_match(1), :provider => name } end end diff --git a/spec/unit/provider/package/pip_spec.rb b/spec/unit/provider/package/pip_spec.rb index c16c4953cac..6113c60d1e2 100644 --- a/spec/unit/provider/package/pip_spec.rb +++ b/spec/unit/provider/package/pip_spec.rb @@ -38,6 +38,14 @@ }) end + it "should correctly parse URL format" do + expect(described_class.parse("real_package @ git+https://github.com/example/test.git@6b4e203b66c1de7345984882e2b13bf87c700095")).to eq({ + :ensure => "6b4e203b66c1de7345984882e2b13bf87c700095", + :name => "real_package", + :provider => :pip, + }) + end + it "should return nil on invalid input" do expect(described_class.parse("foo")).to eq(nil) end