version: extend token comparisons to strings, integers, and nil

This commit is contained in:
Seeker 2020-08-01 18:46:38 -07:00
parent df16e9f2de
commit ab18982a73

View File

@ -12,6 +12,33 @@ class Version
class Token class Token
include Comparable include Comparable
def self.create(val)
return NULL_TOKEN if val.nil?
return NULL_TOKEN if val.respond_to?(:null?) && val.null?
raise TypeError, "Token value must be a string; got a #{val.class} (#{val})" unless val.respond_to?(:to_str)
case val
when /\A#{AlphaToken::PATTERN}\z/o then AlphaToken
when /\A#{BetaToken::PATTERN}\z/o then BetaToken
when /\A#{RCToken::PATTERN}\z/o then RCToken
when /\A#{PreToken::PATTERN}\z/o then PreToken
when /\A#{PatchToken::PATTERN}\z/o then PatchToken
when /\A#{NumericToken::PATTERN}\z/o then NumericToken
when /\A#{StringToken::PATTERN}\z/o then StringToken
end.new(val)
end
def self.from(val)
case val
when Token then val
when String then Token.create(val)
when Integer then Token.create(val.to_s)
when nil then NULL_TOKEN
else NULL_TOKEN if val.respond_to?(:null?) && val.null?
end
end
attr_reader :value attr_reader :value
def initialize(value) def initialize(value)
@ -37,6 +64,8 @@ class Version
end end
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when NullToken when NullToken
0 0
@ -64,6 +93,8 @@ class Version
end end
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when StringToken when StringToken
value <=> other.value value <=> other.value
@ -81,6 +112,8 @@ class Version
end end
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when NumericToken when NumericToken
value <=> other.value value <=> other.value
@ -106,6 +139,8 @@ class Version
PATTERN = /alpha[0-9]*|a[0-9]+/i.freeze PATTERN = /alpha[0-9]*|a[0-9]+/i.freeze
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when AlphaToken when AlphaToken
rev <=> other.rev rev <=> other.rev
@ -121,6 +156,8 @@ class Version
PATTERN = /beta[0-9]*|b[0-9]+/i.freeze PATTERN = /beta[0-9]*|b[0-9]+/i.freeze
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when BetaToken when BetaToken
rev <=> other.rev rev <=> other.rev
@ -138,6 +175,8 @@ class Version
PATTERN = /pre[0-9]*/i.freeze PATTERN = /pre[0-9]*/i.freeze
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when PreToken when PreToken
rev <=> other.rev rev <=> other.rev
@ -155,6 +194,8 @@ class Version
PATTERN = /rc[0-9]*/i.freeze PATTERN = /rc[0-9]*/i.freeze
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when RCToken when RCToken
rev <=> other.rev rev <=> other.rev
@ -172,6 +213,8 @@ class Version
PATTERN = /p[0-9]*/i.freeze PATTERN = /p[0-9]*/i.freeze
def <=>(other) def <=>(other)
return unless other = Token.from(other)
case other case other
when PatchToken when PatchToken
rev <=> other.rev rev <=> other.rev
@ -465,17 +508,7 @@ class Version
end end
def tokenize def tokenize
version.scan(SCAN_PATTERN).map! do |token| version.scan(SCAN_PATTERN).map { |token| Token.create(token) }
case token
when /\A#{AlphaToken::PATTERN}\z/o then AlphaToken
when /\A#{BetaToken::PATTERN}\z/o then BetaToken
when /\A#{RCToken::PATTERN}\z/o then RCToken
when /\A#{PreToken::PATTERN}\z/o then PreToken
when /\A#{PatchToken::PATTERN}\z/o then PatchToken
when /\A#{NumericToken::PATTERN}\z/o then NumericToken
when /\A#{StringToken::PATTERN}\z/o then StringToken
end.new(token)
end
end end
end end