Add support for custom version schemes

A version scheme is a class that inherits from Version and reimplements
Version#<=>. This will allow formulae to specify a custom comparison
method that will be used instead of the default, for cases where the
default is insufficient.
This commit is contained in:
Jack Nagel 2012-07-10 21:45:17 -05:00
parent 741a4168d0
commit 2ff6c40735
4 changed files with 50 additions and 5 deletions

View File

@ -52,10 +52,13 @@ class SoftwareSpec
end end
def version val=nil def version val=nil
if val.nil? @version ||= case val
@version ||= Version.parse(@url) when nil then Version.parse(@url)
else when Hash
@version = Version.new(val) key, value = val.shift
scheme = VersionSchemeDetector.new(value).detect
scheme.new(key)
else Version.new(val)
end end
end end

View File

@ -278,4 +278,11 @@ class FormulaTests < Test::Unit::TestCase
when :mountainlion then '8badf00d8badf00d8badf00d8badf00d8badf00d' when :mountainlion then '8badf00d8badf00d8badf00d8badf00d8badf00d'
end, f.bottle.checksum.hexdigest end, f.bottle.checksum.hexdigest
end end
def test_custom_version_scheme
f = CustomVersionSchemeTestBall.new
assert_version_equal '1.0', f.version
assert_instance_of CustomVersionScheme, f.version
end
end end

View File

@ -271,3 +271,17 @@ class RevisedBottleSpecTestBall < Formula
super "revisedbottlespectestball" super "revisedbottlespectestball"
end end
end end
class CustomVersionScheme < Version
end
class CustomVersionSchemeTestBall < Formula
homepage 'http://example.com'
url 'file:///foo.com/testball-0.1.tbz'
sha1 '482e737739d946b7c8cbaf127d9ee9c148b999f5'
version '1.0' => CustomVersionScheme
def initialize name=nil
super "customversionschemetestball"
end
end

View File

@ -126,3 +126,24 @@ class Version
return m.captures.first unless m.nil? return m.captures.first unless m.nil?
end end
end end
class VersionSchemeDetector
def initialize scheme
@scheme = scheme
end
def detect
if @scheme.is_a? Class and @scheme.ancestors.include? Version
@scheme
elsif @scheme.is_a? Symbol then detect_from_symbol
else
raise "Unknown version scheme #{@scheme} was requested."
end
end
private
def detect_from_symbol
raise "Unknown version scheme #{@scheme} was requested."
end
end