From d07756e5af2472d7e4070869e031785ad326b9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Garc=C3=ADa=20Cota?= Date: Sat, 14 Jan 2012 02:08:34 +0100 Subject: [PATCH] added pessimistic upgrade operator --- semver.lua | 4 ++++ spec/semver_spec.lua | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/semver.lua b/semver.lua index 6c7e4ca..5641102 100644 --- a/semver.lua +++ b/semver.lua @@ -35,6 +35,10 @@ function mt:__lt(other) self.minor < other.minor or self.patch < other.patch end +function mt:__pow(other) + return self.major == other.major and + self.minor <= other.minor +end function mt:__tostring() return ("%d.%d.%d"):format(self.major, self.minor, self.patch) end diff --git a/spec/semver_spec.lua b/spec/semver_spec.lua index 966540d..c70d628 100644 --- a/spec/semver_spec.lua +++ b/spec/semver_spec.lua @@ -127,4 +127,31 @@ context('semver', function() assert_equal(v'2.0.0', v'1.2.3':nextMajor()) end) end) + + + -- This works like the "pessimisstic operator" in Rubygems. + -- if a and b are versions, a ^ b means "b is backwards-compatible with a" + -- in other words, "it's safe to upgrade from a to b" + describe("^", function() + test("true for self", function() + assert_true(v(1,2,3) ^ v(1,2,3)) + end) + test("different major versions mean it's always unsafe", function() + assert_false(v(2,0,0) ^ v(3,0,0)) + assert_false(v(2,0,0) ^ v(1,0,0)) + end) + + test("patch versions are always compatible", function() + assert_true(v(1,2,3) ^ v(1,2,0)) + assert_true(v(1,2,3) ^ v(1,2,5)) + end) + + test("it's safe to upgrade to a newer minor version", function() + assert_true(v(1,2,0) ^ v(1,5,0)) + end) + test("it's unsafe to downgrade to an earlier minor version", function() + assert_false(v(1,5,0) ^ v(1,2,0)) + end) + end) + end)