Skip to content

Commit bcb7cff

Browse files
committed
Add Version.compare/2
1 parent 8023c29 commit bcb7cff

File tree

4 files changed

+49
-6
lines changed

4 files changed

+49
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
* Enhancements
44
* [Mix] Do not fail if a Mix dependency relies on an outdated Elixir version
5+
* [Version] Add `Version.compare/2`
56

67
* Bug fixes
78
* [Atom] Inspect `:...` and `:foo@bar` without quoting

lib/elixir/lib/version.ex

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,22 @@ defmodule Version do
225225
Version.Schema[major: major, minor: minor, patch: patch, pre: pre, source: source]
226226
end
227227

228+
@spec compare(String.t | Schema.t, String.t | Schema.t) :: :gt | :eq | :lt
229+
def compare(vsn1, vsn2) do
230+
{ major1, minor1, patch1, pre1 } = to_matchable(vsn1)
231+
{ major2, minor2, patch2, pre2 } = to_matchable(vsn2)
232+
233+
cond do
234+
{ major1, minor1, patch1 } > { major2, minor2, patch2 } -> :gt
235+
{ major1, minor1, patch1 } < { major2, minor2, patch2 } -> :lt
236+
pre1 == [] and pre2 != [] -> :gt
237+
pre1 != [] and pre2 == [] -> :lt
238+
pre1 > pre2 -> :gt
239+
pre1 < pre2 -> :lt
240+
true -> :eq
241+
end
242+
end
243+
228244
defmodule Parser.DSL do
229245
@moduledoc false
230246

lib/elixir/test/elixir/version_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,32 @@ defmodule VersionTest do
55
alias Version.Parser, as: P
66
alias Version, as: V
77

8+
test "compare" do
9+
assert :gt == V.compare("1.0.1", "1.0.0")
10+
assert :gt == V.compare("1.1.0", "1.0.1")
11+
assert :gt == V.compare("2.1.1", "1.2.2")
12+
assert :gt == V.compare("1.0.0", "1.0.0-dev")
13+
assert :gt == V.compare("1.2.3-dev", "0.1.2")
14+
assert :gt == V.compare("1.0.0-a.b", "1.0.0-a")
15+
assert :gt == V.compare("1.0.0-b", "1.0.0-a.b")
16+
assert :gt == V.compare("1.0.0-a", "1.0.0-0")
17+
assert :gt == V.compare("1.0.0-a.b", "1.0.0-a.a")
18+
19+
assert :lt == V.compare("1.0.0", "1.0.1")
20+
assert :lt == V.compare("1.0.1", "1.1.0")
21+
assert :lt == V.compare("1.2.2", "2.1.1")
22+
assert :lt == V.compare("1.0.0-dev", "1.0.0")
23+
assert :lt == V.compare("0.1.2", "1.2.3-dev")
24+
assert :lt == V.compare("1.0.0-a", "1.0.0-a.b")
25+
assert :lt == V.compare("1.0.0-a.b", "1.0.0-b")
26+
assert :lt == V.compare("1.0.0-0", "1.0.0-a")
27+
assert :lt == V.compare("1.0.0-a.a", "1.0.0-a.b")
28+
29+
assert :eq == V.compare("1.0.0", "1.0.0")
30+
assert :eq == V.compare("1.0.0-dev", "1.0.0-dev")
31+
assert :eq == V.compare("1.0.0-a", "1.0.0-a")
32+
end
33+
834
test "lexes specifications properly" do
935
assert P.lexer("== != > >= < <= ~>", []) == [:'==', :'!=', :'>', :'>=', :'<', :'<=', :'~>']
1036
assert P.lexer("2.3", []) == [:'==', "2.3"]
@@ -66,6 +92,9 @@ defmodule VersionTest do
6692
assert V.match?("1.2.3-alpha.beta.sigma", "> 1.2.3-alpha.beta")
6793
refute V.match?("1.2.3-alpha.10", "< 1.2.3-alpha.1")
6894
refute V.match?("0.10.2-dev", "> 0.10.2")
95+
96+
refute V.match?("1.0.0-dev", "> 1.0.0")
97+
refute V.match?("0.1.2", "> 1.2.3-dev")
6998
end
7099

71100
test :>= do
@@ -83,6 +112,9 @@ defmodule VersionTest do
83112
refute V.match?("2.3", "< 2.3")
84113

85114
assert V.match?("0.10.2-dev", "< 0.10.2")
115+
116+
refute V.match?("1.0.0", "< 1.0.0-dev")
117+
refute V.match?("1.2.3-dev", "< 0.1.2")
86118
end
87119

88120
test :<= do

lib/mix/test/mix/tasks/app.start_test.exs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ defmodule Mix.Tasks.App.StartTest do
3333
assert System.version == Mix.Deps.Lock.elixir_vsn
3434
assert File.stat!("_build/shared/lib/sample/.compile.lock").mtime > { { 2010, 1, 1 }, { 0, 0, 0 } }
3535
end
36-
after
37-
Mix.Project.pop
3836
end
3937

4038
test "compiles and starts the project" do
@@ -53,8 +51,6 @@ defmodule Mix.Tasks.App.StartTest do
5351
Mix.Tasks.App.Start.run []
5452
assert List.keyfind(:application.loaded_applications, :app_start_sample, 0)
5553
end
56-
after
57-
Mix.Project.pop
5854
end
5955

6056
test "validates the Elixir version requirement" do
@@ -69,7 +65,6 @@ defmodule Mix.Tasks.App.StartTest do
6965
end
7066
after
7167
purge [A, B, C]
72-
Mix.Project.pop
7368
end
7469

7570
test "does not validate the Elixir version requirement when disabled" do
@@ -80,6 +75,5 @@ defmodule Mix.Tasks.App.StartTest do
8075
end
8176
after
8277
purge [A, B, C]
83-
Mix.Project.pop
8478
end
8579
end

0 commit comments

Comments
 (0)