diff options
| author | Jack Nagel | 2015-04-02 20:22:12 -0400 |
|---|---|---|
| committer | Jack Nagel | 2015-04-02 20:22:12 -0400 |
| commit | 175a15dae4c78564680a633b73e9fb6159ee31e3 (patch) | |
| tree | 433a9ab3c9581816173ea1d735c23e1375411d17 /Library/Homebrew | |
| parent | 6d3d9e0af12000c12f216a74118605f44b054ede (diff) | |
| download | homebrew-175a15dae4c78564680a633b73e9fb6159ee31e3.tar.bz2 | |
Switch PkgVersion to use composition
Comparing PkgVersion and Version objects can produce nonsensical
results. For example, equality is not symmetric:
irb(main):002:0> PkgVersion.new("1.0", 0) == Version.new("1.0")
=> false
irb(main):003:0> Version.new("1.0") == PkgVersion.new("1.0", 0)
=> true
Rather than attempt to deal with subclass-superclass equality, let's use
composition and punt on the problem altogether.
Diffstat (limited to 'Library/Homebrew')
| -rw-r--r-- | Library/Homebrew/pkg_version.rb | 35 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_pkg_version.rb | 27 |
2 files changed, 36 insertions, 26 deletions
diff --git a/Library/Homebrew/pkg_version.rb b/Library/Homebrew/pkg_version.rb index 4e9e351ff..62072273a 100644 --- a/Library/Homebrew/pkg_version.rb +++ b/Library/Homebrew/pkg_version.rb @@ -1,36 +1,45 @@ -require 'version' +require "version" -class PkgVersion < Version - attr_reader :version, :revision +class PkgVersion + include Comparable RX = /\A(.+?)(?:_(\d+))?\z/ def self.parse(path) _, version, revision = *path.match(RX) - new(version, revision) + version = Version.new(version) + new(version, revision.to_i) end def initialize(version, revision) - super(version) + @version = version + @revision = version.head? ? 0 : revision + end - if head? - @revision = 0 - else - @revision = revision.to_i - end + def head? + version.head? end def to_s if revision > 0 "#{version}_#{revision}" else - version + version.to_s end end alias_method :to_str, :to_s def <=>(other) - return unless Version === other - super.nonzero? || revision <=> other.revision + return unless PkgVersion === other + (version <=> other.version).nonzero? || revision <=> other.revision end + alias_method :eql?, :== + + def hash + version.hash ^ revision.hash + end + + protected + + attr_reader :version, :revision end diff --git a/Library/Homebrew/test/test_pkg_version.rb b/Library/Homebrew/test/test_pkg_version.rb index a26a90c30..611c90ee6 100644 --- a/Library/Homebrew/test/test_pkg_version.rb +++ b/Library/Homebrew/test/test_pkg_version.rb @@ -7,13 +7,13 @@ class PkgVersionTests < Homebrew::TestCase end def test_parse - assert_equal PkgVersion.new("1.0", 1), PkgVersion.parse("1.0_1") - assert_equal PkgVersion.new("1.0", 1), PkgVersion.parse("1.0_1") - assert_equal PkgVersion.new("1.0", 0), PkgVersion.parse("1.0") - assert_equal PkgVersion.new("1.0", 0), PkgVersion.parse("1.0_0") - assert_equal PkgVersion.new("2.1.4", 0), PkgVersion.parse("2.1.4_0") - assert_equal PkgVersion.new("2.1.4_1", 0), PkgVersion.parse("2.1.4_1_0") - assert_equal PkgVersion.new("1.0.1e", 1), PkgVersion.parse("1.0.1e_1") + assert_equal PkgVersion.new(Version.new("1.0"), 1), PkgVersion.parse("1.0_1") + assert_equal PkgVersion.new(Version.new("1.0"), 1), PkgVersion.parse("1.0_1") + assert_equal PkgVersion.new(Version.new("1.0"), 0), PkgVersion.parse("1.0") + assert_equal PkgVersion.new(Version.new("1.0"), 0), PkgVersion.parse("1.0_0") + assert_equal PkgVersion.new(Version.new("2.1.4"), 0), PkgVersion.parse("2.1.4_0") + assert_equal PkgVersion.new(Version.new("2.1.4_1"), 0), PkgVersion.parse("2.1.4_1_0") + assert_equal PkgVersion.new(Version.new("1.0.1e"), 1), PkgVersion.parse("1.0.1e_1") end def test_comparison @@ -25,16 +25,17 @@ class PkgVersionTests < Homebrew::TestCase assert_operator v("HEAD"), :>, v("1.0") assert_operator v("1.0"), :<, v("HEAD") - v = PkgVersion.new("1.0", 0) + v = PkgVersion.new(Version.new("1.0"), 0) assert_nil v <=> Object.new assert_raises(ArgumentError) { v > Object.new } + assert_raises(ArgumentError) { v > Version.new("1.0") } end def test_to_s - assert_equal "1.0", PkgVersion.new("1.0", 0).to_s - assert_equal "1.0_1", PkgVersion.new("1.0", 1).to_s - assert_equal "1.0", PkgVersion.new("1.0", 0).to_s - assert_equal "1.0", PkgVersion.new("1.0", 0).to_s - assert_equal "HEAD", PkgVersion.new("HEAD", 1).to_s + assert_equal "1.0", PkgVersion.new(Version.new("1.0"), 0).to_s + assert_equal "1.0_1", PkgVersion.new(Version.new("1.0"), 1).to_s + assert_equal "1.0", PkgVersion.new(Version.new("1.0"), 0).to_s + assert_equal "1.0", PkgVersion.new(Version.new("1.0"), 0).to_s + assert_equal "HEAD", PkgVersion.new(Version.new("HEAD"), 1).to_s end end |
