aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew
diff options
context:
space:
mode:
authorJack Nagel2015-04-02 20:22:12 -0400
committerJack Nagel2015-04-02 20:22:12 -0400
commit175a15dae4c78564680a633b73e9fb6159ee31e3 (patch)
tree433a9ab3c9581816173ea1d735c23e1375411d17 /Library/Homebrew
parent6d3d9e0af12000c12f216a74118605f44b054ede (diff)
downloadhomebrew-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.rb35
-rw-r--r--Library/Homebrew/test/test_pkg_version.rb27
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