version: support post versions

This commit is contained in:
Dustin Rodrigues 2020-10-04 14:43:32 -04:00
parent 15fca9661d
commit 34cf999f20
2 changed files with 38 additions and 4 deletions

View File

@ -170,6 +170,16 @@ describe Version do
expect(described_class.create("1.2.3-p34")).to be > described_class.create("1.2.3") expect(described_class.create("1.2.3-p34")).to be > described_class.create("1.2.3")
end end
specify "comparing post-level versions" do
expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3.post33")
expect(described_class.create("1.2.3.post34")).to be < described_class.create("1.2.3.post35")
expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3rc35")
expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3alpha35")
expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3beta35")
expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3")
end
specify "comparing unevenly-padded versions" do specify "comparing unevenly-padded versions" do
expect(described_class.create("2.1.0-p194")).to be < described_class.create("2.1-p195") expect(described_class.create("2.1.0-p194")).to be < described_class.create("2.1-p195")
expect(described_class.create("2.1-p195")).to be > described_class.create("2.1.0-p194") expect(described_class.create("2.1-p195")).to be > described_class.create("2.1.0-p194")

View File

@ -25,6 +25,7 @@ class Version
when /\A#{RCToken::PATTERN}\z/o then RCToken when /\A#{RCToken::PATTERN}\z/o then RCToken
when /\A#{PreToken::PATTERN}\z/o then PreToken when /\A#{PreToken::PATTERN}\z/o then PreToken
when /\A#{PatchToken::PATTERN}\z/o then PatchToken when /\A#{PatchToken::PATTERN}\z/o then PatchToken
when /\A#{PostToken::PATTERN}\z/o then PostToken
when /\A#{NumericToken::PATTERN}\z/o then NumericToken when /\A#{NumericToken::PATTERN}\z/o then NumericToken
when /\A#{StringToken::PATTERN}\z/o then StringToken when /\A#{StringToken::PATTERN}\z/o then StringToken
end.new(val) end.new(val)
@ -173,7 +174,7 @@ class Version
case other case other
when AlphaToken when AlphaToken
rev <=> other.rev rev <=> other.rev
when BetaToken, RCToken, PreToken, PatchToken when BetaToken, RCToken, PreToken, PatchToken, PostToken
-1 -1
else else
super super
@ -193,7 +194,7 @@ class Version
rev <=> other.rev rev <=> other.rev
when AlphaToken when AlphaToken
1 1
when PreToken, RCToken, PatchToken when PreToken, RCToken, PatchToken, PostToken
-1 -1
else else
super super
@ -213,7 +214,7 @@ class Version
rev <=> other.rev rev <=> other.rev
when AlphaToken, BetaToken when AlphaToken, BetaToken
1 1
when RCToken, PatchToken when RCToken, PatchToken, PostToken
-1 -1
else else
super super
@ -233,7 +234,7 @@ class Version
rev <=> other.rev rev <=> other.rev
when AlphaToken, BetaToken, PreToken when AlphaToken, BetaToken, PreToken
1 1
when PatchToken when PatchToken, PostToken
-1 -1
else else
super super
@ -259,12 +260,31 @@ class Version
end end
end end
# A token representing the part of a version designating it is a post release.
class PostToken < CompositeToken
PATTERN = /.post[0-9]+/i.freeze
def <=>(other)
return unless other = Token.from(other)
case other
when PostToken
rev <=> other.rev
when AlphaToken, BetaToken, RCToken, PreToken
1
else
super
end
end
end
SCAN_PATTERN = Regexp.union( SCAN_PATTERN = Regexp.union(
AlphaToken::PATTERN, AlphaToken::PATTERN,
BetaToken::PATTERN, BetaToken::PATTERN,
PreToken::PATTERN, PreToken::PATTERN,
RCToken::PATTERN, RCToken::PATTERN,
PatchToken::PATTERN, PatchToken::PATTERN,
PostToken::PATTERN,
NumericToken::PATTERN, NumericToken::PATTERN,
StringToken::PATTERN, StringToken::PATTERN,
).freeze ).freeze
@ -345,6 +365,10 @@ class Version
m = /-((?:\d+\.)*\d+)$/.match(stem) m = /-((?:\d+\.)*\d+)$/.match(stem)
return m.captures.first unless m.nil? return m.captures.first unless m.nil?
# e.g. foobar-4.5.1.post1
m = /-((?:\d+\.)*\d+(.post\d+)?)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar-4.5.1b # e.g. foobar-4.5.1b
m = /-((?:\d+\.)*\d+(?:[abc]|rc|RC)\d*)$/.match(stem) m = /-((?:\d+\.)*\d+(?:[abc]|rc|RC)\d*)$/.match(stem)
return m.captures.first unless m.nil? return m.captures.first unless m.nil?