GitHubActions.Versions (GitHubActions v0.3.5)
View SourceFunctions to select and filter lists and tables of versions.
The list of versions can have the following two forms.
- A simple list:
["1", "2.0", "2.1", "3", "3.1", "3.1.1"]
- A table as list of keyword lists with compatible versions:
[ [a: ["1.0.0"], b: ["1.0", "1.1", "1.2"]], [a: ["2.0.0"], b: ["1.2", "2.0"]] ]
Summary
Functions
Returns the compatible versions between versions1
and versions2
.
Returns true
if the given version1
is compatible to version2
.
Returns the versions of key
that are compatible_to with to
.
Expands the given versions
.
Filters the list of versions
by the given requirement
.
Returns the versions from the config.
Returns all versions for key
from a list of compatible versions.
Returns the incompatible versions between versions1
and versions2
.
Returns true if versions1
has an intersection with versions2
.
Returns the latest version from the configured versions list.
Returns the latest version from the configured versions
table by the given
key
or from the given versions
list.
Returns the latest version from a versions
table by the given key
.
Returns the latest major versions from the configured versions list.
Returns the latest major versions from the configured versions
table by the
given key
or from the given versions
list.
Returns the latest major versions from a versions
table by the given key
.
Returns the latest minor versions from the configured versions list.
Returns the latest minor versions from the configured versions
table by the
given key
or from the given versions
list.
Returns the latest minor versions from a versions
table by the given key
.
Returns the versions matrix for the given requirements.
Returns true if versions
contains the given version
.
Minimizes the given versions table.
Sorts the given versions
.
Removes all duplicated versions.
Types
@type key() :: atom()
@type versions() :: versions_list() | versions_table()
@type versions_list() :: [GitHubActions.Version.version()]
@type versions_table() :: [keyword(GitHubActions.Version.version())]
Functions
Returns the compatible versions between versions1
and versions2
.
Examples
iex> versions = Versions.compatible(
...> elixir: ["1.9.4", "1.10.4", "1.11.4", "1.12.3"],
...> otp: ["21.3", "22.3", "23.3", "24.0"]
...> )
iex> for [{k1, v1}, {k2, v2}] <- versions do
...> [{k1, to_string(v1)}, {k2, to_string(v2)}]
...> end
[
[elixir: "1.9.4", otp: "21.3"],
[elixir: "1.9.4", otp: "22.3"],
[elixir: "1.10.4", otp: "21.3"],
[elixir: "1.10.4", otp: "22.3"],
[elixir: "1.10.4", otp: "23.3"],
[elixir: "1.11.4", otp: "21.3"],
[elixir: "1.11.4", otp: "22.3"],
[elixir: "1.11.4", otp: "23.3"],
[elixir: "1.11.4", otp: "24.0"],
[elixir: "1.12.3", otp: "22.3"],
[elixir: "1.12.3", otp: "23.3"],
[elixir: "1.12.3", otp: "24.0"]
]
@spec compatible?( versions(), [{key(), GitHubActions.Version.version()}] ) :: boolean()
Returns true
if the given version1
is compatible to version2
.
Examples
iex> Versions.compatible?(elixir: "1.12.3", otp: "24.0")
true
iex> Versions.compatible?(elixir: "1.6.0", otp: "24.0")
false
iex> versions = [
...> [a: ["1.0.0"], b: ["1.0", "1.1", "1.2"]],
...> [a: ["2.0.0"], b: ["1.2", "2.0"]]
...> ]
iex> Versions.compatible?(versions, a: "1", b: "1.2")
true
iex> Versions.compatible?(versions, a: "2", b: "1.2")
true
iex> Versions.compatible?(versions, a: "2", b: "1")
false
iex> Versions.compatible?([], a: "1", b: "2")
** (ArgumentError) compatible?/2 expected a table of versions as first argument, got: []
@spec compatible_to(versions(), key(), [{key(), GitHubActions.Version.version()}]) :: [ GitHubActions.Version.t() ]
Returns the versions of key
that are compatible_to with to
.
Examples
iex> otp = Versions.compatible_to(:otp, elixir: "1.6.6")
iex> Enum.map(otp, &to_string/1)
["19.0", "19.1", "19.2", "19.3", "20.0", "20.1", "20.2", "20.3", "21.0",
"21.1", "21.2", "21.3"]
iex> elixir = Versions.compatible_to(:elixir, otp: "20.3")
iex> Enum.map(elixir, &to_string/1)
["1.4.5", "1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.6.0", "1.6.1", "1.6.2",
"1.6.3", "1.6.4", "1.6.5", "1.6.6", "1.7.0", "1.7.1", "1.7.2", "1.7.3",
"1.7.4", "1.8.0", "1.8.1", "1.8.2", "1.9.0", "1.9.1", "1.9.2", "1.9.3",
"1.9.4"]
iex> :otp |> Versions.compatible_to(elixir: "1.10.0") |> Enum.count()
8
iex> :otp |> Versions.compatible_to(elixir: "1.10.0/4") |> Enum.count()
12
iex> :otp |> Versions.compatible_to(elixir: ["1.10.0/4", "1.11.0/4"]) |> Enum.count()
16
iex> Versions.compatible_to([], :otp, elixir: "1.6.6")
** (ArgumentError) compatible_to/3 expected a table of versions as first argument, got: []
Expands the given versions
.
Examples
iex> versions = Versions.expand(["1.0/2"])
iex> Enum.map(versions, &to_string/1)
["1.0", "1.1", "1.2"]
iex> versions = Versions.expand([
...> [a: ["1.0/2"], b: ["1.0.0/2"]],
...> [a: ["1.1.0/1"], b: ["2.0.0/2"]]
...> ])
iex> versions |> Enum.at(1) |> Keyword.get(:a) |> Enum.map(&to_string/1)
["1.1.0", "1.1.1"]
iex> versions |> Enum.at(1) |> Keyword.get(:b) |> Enum.map(&to_string/1)
["2.0.0", "2.0.1", "2.0.2"]
iex> Versions.expand([:a])
** (ArgumentError) expand/1 expected a list of versions, or table of versions got: [:a]
@spec filter(versions_list(), String.t()) :: [GitHubActions.Version.t()]
Filters the list of versions
by the given requirement
.
Examples
iex> versions = ["1", "1.1.0/5", "1.2.0/1", "1.3", "2.0/1"]
iex> Versions.filter(versions, "~> 1.2")
[
%Version{major: 1, minor: 2, patch: 0},
%Version{major: 1, minor: 2, patch: 1},
%Version{major: 1, minor: 3}
]
iex> Versions.filter(versions, ">= 1.3.0")
[
%Version{major: 1, minor: 3},
%Version{major: 2, minor: 0},
%Version{major: 2, minor: 1}
]
iex> Versions.filter([:b, :a], "> 1.0.0")
** (ArgumentError) filter/2 expected a list of versions, got: [:b, :a]
iex> Versions.filter(["1", "2", "3"], "> 1")
** (Version.InvalidRequirementError) invalid requirement: "> 1"
@spec from_config() :: versions()
Returns the versions from the config.
@spec get(versions_table(), key()) :: [GitHubActions.Version.t()]
Returns all versions for key
from a list of compatible versions.
This function raises a GitHubActions.InvalidVersionError
for an invalid
version.
Examples
iex> versions = [
...> [a: ["1.0.0"], b: ["1.0", "1.1", "1.2"]],
...> [a: ["2.0.0"], b: ["1.2", "2.0"]]
...> ]
iex> versions = Versions.get(versions, :b)
iex> hd versions
%GitHubActions.Version{major: 1, minor: 0}
iex> Enum.map(versions, &to_string/1)
["1.0", "1.1", "1.2", "2.0"]
iex> Versions.get([a: "1"], :a)
** (ArgumentError) get/2 expected a table of versions, got: [a: "1"]
Returns the incompatible versions between versions1
and versions2
.
Examples
iex> versions = Versions.incompatible(
...> elixir: ["1.9.4", "1.10.4", "1.11.4", "1.12.3"],
...> otp: ["21.3", "22.3", "23.3", "24.0"]
...> )
iex> for [{k1, v1}, {k2, v2}] <- versions do
...> [{k1, to_string(v1)}, {k2, to_string(v2)}]
...> end
[
[elixir: "1.9.4", otp: "23.3"],
[elixir: "1.9.4", otp: "24.0"],
[elixir: "1.10.4", otp: "24.0"],
[elixir: "1.12.3", otp: "21.3"]
]
@spec intersection?(versions_list(), versions_list()) :: boolean()
Returns true if versions1
has an intersection with versions2
.
Examples
iex> Versions.intersection?(["1.0.0/5"], ["1.0.4/7"])
true
iex> Versions.intersection?(["1.0.0/5"], ["2.0.0/7"])
false
iex> Versions.intersection?(["1.0.0/5"], [:a])
** (ArgumentError) intersection?/2 expected two list of versions, got: ["1.0.0/5"], [:a]
@spec latest() :: GitHubActions.Version.t()
Returns the latest version from the configured versions list.
Examples
iex> Config.config(:versions, ["1.0.0/2", "1.1.0/3"])
iex> Versions.latest()
%GitHubActions.Version{major: 1, minor: 1, patch: 3}
@spec latest(versions() | key()) :: GitHubActions.Version.t()
Returns the latest version from the configured versions
table by the given
key
or from the given versions
list.
Examples
iex> Versions.latest(["1.0.0/2", "1.1.0/3"])
%GitHubActions.Version{major: 1, minor: 1, patch: 3}
iex> Config.config(:versions, [
...> [a: ["1.0.0/2", "1.1.0/3"], b: ["2.0/5"]],
...> [a: ["1.2.0/1", "1.3.0/4"], b: ["3.0/5"]]
...> ])
iex> Versions.latest(:a)
%GitHubActions.Version{major: 1, minor: 3, patch: 4}
iex> Versions.latest(["foo"])
** (GitHubActions.InvalidVersionError) invalid version: "foo"
iex> Versions.latest([a: "1"])
** (ArgumentError) latest/1 expected a list or table of versions or a key, got: [a: "1"]
iex> Versions.latest(:elixir)
%GitHubActions.Version{major: 1, minor: 18, patch: 4}
iex> Versions.latest(:otp)
%GitHubActions.Version{major: 27, minor: 3}
@spec latest(versions_table(), key()) :: GitHubActions.Version.t()
Returns the latest version from a versions
table by the given key
.
Examples
iex> Versions.latest([
...> [a: ["1.0.0/2"], b: ["1.0.0/3"]],
...> [a: ["1.1.0/3"], b: ["1.1.0/4"]]
...> ], :a)
%GitHubActions.Version{major: 1, minor: 1, patch: 3}
iex> Versions.latest([a: "1"], :a)
** (ArgumentError) latest/1 expected a table of versions, got: [a: "1"]
@spec latest_major() :: [GitHubActions.Version.t()]
Returns the latest major versions from the configured versions list.
Examples
iex> Config.config(:versions, ["1.0.0/2", "1.1.0/4", "2.0.0/3"])
iex> Versions.latest_major() |> Enum.map(&to_string/1)
["1.1.4", "2.0.3"]
@spec latest_major(versions_list() | key()) :: [GitHubActions.Version.t()]
Returns the latest major versions from the configured versions
table by the
given key
or from the given versions
list.
Examples
iex> major_versions = Versions.latest_major(["1.0.0/2", "1.1.0/3", "2.0.0/2"])
iex> Enum.map(major_versions, &to_string/1)
["1.1.3", "2.0.2"]
iex> Config.config(:versions, [
...> [a: ["1.0.0/2", "1.1.0/3"], b: ["2.0/5"]],
...> [a: ["2.2.0/1", "2.3.0/4"], b: ["3.0/5"]]
...> ])
iex> major_versions = Versions.latest_major(:a)
iex> Enum.map(major_versions, &to_string/1)
["1.1.3", "2.3.4"]
iex> Versions.latest_major(["foo"])
** (GitHubActions.InvalidVersionError) invalid version: "foo"
iex> Versions.latest_major([a: "1"])
** (ArgumentError) latest_major/1 expected a list or table of versions or a key, got: [a: "1"]
iex> Versions.latest_major(:elixir) |> Enum.map(&to_string/1)
["1.18.4"]
iex> Versions.latest_major(:otp) |> Enum.map(&to_string/1)
["17.5", "18.3", "19.3", "20.3", "21.3", "22.3", "23.3", "24.3", "25.3", "26.2", "27.3"]
@spec latest_major(versions_table(), key()) :: [GitHubActions.Version.t()]
Returns the latest major versions from a versions
table by the given key
.
Examples
iex> major_versions = Versions.latest_major([
...> [a: ["1.0.0/2"], b: ["1.0.0/3"]],
...> [a: ["2.0.0/3"], b: ["2.0.0/4"]]
...> ], :a)
iex> Enum.map(major_versions, &to_string/1)
["1.0.2", "2.0.3"]
iex> Versions.latest_major([a: "1"], :a)
** (ArgumentError) latest_major/1 expected a table of versions, got: [a: "1"]
@spec latest_minor() :: [GitHubActions.Version.t()]
Returns the latest minor versions from the configured versions list.
Examples
iex> Config.config(:versions, ["1.0.0/2", "1.1.0/4", "2.0.0/3"])
iex> Versions.latest_minor() |> Enum.map(&to_string/1)
["1.0.2", "1.1.4", "2.0.3"]
@spec latest_minor(versions_list() | key()) :: [GitHubActions.Version.t()]
Returns the latest minor versions from the configured versions
table by the
given key
or from the given versions
list.
Examples
iex> minor_versions = Versions.latest_minor(["1.0.0/2", "1.1.0/3"])
iex> Enum.map(minor_versions, &to_string/1)
["1.0.2", "1.1.3"]
iex> Config.config(:versions, [
...> [a: ["1.0.0/2", "1.1.0/3"], b: ["2.0/5"]],
...> [a: ["1.2.0/1", "1.3.0/4"], b: ["3.0/5"]]
...> ])
iex> minor_versions = Versions.latest_minor(:a)
iex> Enum.map(minor_versions, &to_string/1)
["1.0.2", "1.1.3", "1.2.1", "1.3.4"]
iex> Versions.latest_minor(["foo"])
** (GitHubActions.InvalidVersionError) invalid version: "foo"
iex> Versions.latest_minor([a: "1"])
** (ArgumentError) latest_minor/1 expected a list or table of versions or a key, got: [a: "1"]
iex> Versions.latest_minor(:elixir) |> Enum.map(&to_string/1)
["1.0.5", "1.1.1", "1.2.6", "1.3.4", "1.4.5", "1.5.3", "1.6.6", "1.7.4",
"1.8.2", "1.9.4", "1.10.4", "1.11.4", "1.12.3", "1.13.4", "1.14.5",
"1.15.8", "1.16.3", "1.17.3", "1.18.4"]
iex> Versions.latest_minor(:otp) |> Enum.map(&to_string/1)
["17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "18.0", "18.1", "18.2",
"18.3", "19.0", "19.1", "19.2", "19.3", "20.0", "20.1", "20.2", "20.3",
"21.0", "21.1", "21.2", "21.3", "22.0", "22.1", "22.2", "22.3", "23.0",
"23.1", "23.2", "23.3", "24.0", "24.1", "24.2", "24.3", "25.0", "25.1",
"25.2", "25.3", "26.0", "26.1", "26.2", "27.0", "27.1", "27.2", "27.3"
]
@spec latest_minor(versions_table(), key()) :: [GitHubActions.Version.t()]
Returns the latest minor versions from a versions
table by the given key
.
Examples
iex> minor_versions = Versions.latest_minor([
...> [a: ["1.0.0/2"], b: ["1.0.0/3"]],
...> [a: ["1.1.0/3"], b: ["1.1.0/4"]]
...> ], :a)
iex> Enum.map(minor_versions, &to_string/1)
["1.0.2", "1.1.3"]
iex> Versions.latest_minor([a: "1"], :a)
** (ArgumentError) latest_minor/1 expected a table of versions, got: [a: "1"]
Returns the versions matrix for the given requirements.
Options
:mode
- accepts:include
or:exclude
. Defaults to:exclude
.With
:exclude
a keyword list with all versions for the requirements and a table with the incompatible versions is returned. The table of incompatible versions can be found under the:exclude
key.With
:include
only the compatible versions are returned. The table of compatible versions can be found under the:include
key.
Examples
iex> matrix = Versions.matrix(elixir: ">= 1.12.0", otp: ">= 22.0.0")
iex> Enum.map(matrix[:elixir], &to_string/1)
["1.12.3", "1.13.4", "1.14.5", "1.15.8", "1.16.3", "1.17.3", "1.18.4"]
iex> Enum.map(matrix[:otp], &to_string/1)
["22.3", "23.3", "24.3", "25.3", "26.2", "27.3"]
iex> for [{k1, v1}, {k2, v2}] <- matrix[:exclude] do
...> [{k1, to_string(v1)}, {k2, to_string(v2)}]
...> end
[
[elixir: "1.12.3", otp: "25.3"],
[elixir: "1.12.3", otp: "26.2"],
[elixir: "1.12.3", otp: "27.3"],
[elixir: "1.13.4", otp: "26.2"],
[elixir: "1.13.4", otp: "27.3"],
[elixir: "1.14.5", otp: "22.3"],
[elixir: "1.14.5", otp: "27.3"],
[elixir: "1.15.8", otp: "22.3"],
[elixir: "1.15.8", otp: "23.3"],
[elixir: "1.15.8", otp: "27.3"],
[elixir: "1.16.3", otp: "22.3"],
[elixir: "1.16.3", otp: "23.3"],
[elixir: "1.16.3", otp: "27.3"],
[elixir: "1.17.3", otp: "22.3"],
[elixir: "1.17.3", otp: "23.3"],
[elixir: "1.17.3", otp: "24.3"],
[elixir: "1.18.4", otp: "22.3"],
[elixir: "1.18.4", otp: "23.3"],
[elixir: "1.18.4", otp: "24.3"]
]
iex> matrix = Versions.matrix(
...> elixir: ">= 1.15.0 and < 1.19.0",
...> otp: ">= 22.0.0",
...> mode: :include
...> )
iex> for [{k1, v1}, {k2, v2}] <- matrix[:include] do
...> [{k1, to_string(v1)}, {k2, to_string(v2)}]
...> end
[
[elixir: "1.15.8", otp: "24.3"],
[elixir: "1.15.8", otp: "25.3"],
[elixir: "1.15.8", otp: "26.2"],
[elixir: "1.16.3", otp: "24.3"],
[elixir: "1.16.3", otp: "25.3"],
[elixir: "1.16.3", otp: "26.2"],
[elixir: "1.17.3", otp: "25.3"],
[elixir: "1.17.3", otp: "26.2"],
[elixir: "1.17.3", otp: "27.3"],
[elixir: "1.18.4", otp: "25.3"],
[elixir: "1.18.4", otp: "26.2"],
[elixir: "1.18.4", otp: "27.3"]
]
iex> Versions.matrix([], elixir: ">= 1.9.0", otp: ">= 22.0.0")
** (ArgumentError) matrix/1 expected a table of versions as first argument, got: []
@spec member?(versions_list(), GitHubActions.Version.version()) :: boolean()
Returns true if versions
contains the given version
.
Examples
iex> versions = ["1.0.0", "1.1.0", "1.1.1"]
iex> Versions.member?(versions, "1.1")
true
iex> Versions.member?(versions, "1.0.1")
false
iex> Versions.member?([a: "1"], "1.0.0")
** (ArgumentError) member?/2 expected a list of versions, got: [a: "1"]
Minimizes the given versions table.
Returns the minimised table where each version of the table is present at least once in the result. This means that not all possible combinations are present in the result.
Examples
iex> versions = [
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 16, patch: 3},
...> otp: %GitHubActions.Version{major: 24, minor: 3}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 16, patch: 3},
...> otp: %GitHubActions.Version{major: 25, minor: 3}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 16, patch: 3},
...> otp: %GitHubActions.Version{major: 26, minor: 2}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 17, patch: 3},
...> otp: %GitHubActions.Version{major: 25, minor: 3}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 17, patch: 3},
...> otp: %GitHubActions.Version{major: 26, minor: 2}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 17, patch: 3},
...> otp: %GitHubActions.Version{major: 27, minor: 2}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
...> otp: %GitHubActions.Version{major: 25, minor: 3}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
...> otp: %GitHubActions.Version{major: 26, minor: 2}
...> ],
...> [
...> elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
...> otp: %GitHubActions.Version{major: 27, minor: 2}
...> ]
...> ]
iex> Versions.minimize(versions)
[
[
elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
otp: %GitHubActions.Version{major: 27, minor: 2}
],
[
elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
otp: %GitHubActions.Version{major: 26, minor: 2}
],
[
elixir: %GitHubActions.Version{major: 1, minor: 18, patch: 0},
otp: %GitHubActions.Version{major: 25, minor: 3}
],
[
elixir: %GitHubActions.Version{major: 1, minor: 17, patch: 3},
otp: %GitHubActions.Version{major: 25, minor: 3}
],
[
elixir: %GitHubActions.Version{major: 1, minor: 16, patch: 3},
otp: %GitHubActions.Version{major: 24, minor: 3}
]
]
@spec sort([GitHubActions.Version.version()]) :: [GitHubActions.Version.version()]
Sorts the given versions
.
Examples
iex> versions = ["1.1", "11.1", "1.0", "2.1", "2.0.1", "2.0.0"]
iex> versions = Versions.sort(versions)
iex> Enum.map(versions, &to_string/1)
["1.0", "1.1", "2.0.0", "2.0.1", "2.1", "11.1"]
iex> Versions.sort([a: ["1", "2"]])
** (ArgumentError) sort/2 expected a list or table of versions, got: [a: ["1", "2"]]
Removes all duplicated versions.
Examples
iex> versions = Versions.expand(["1.0.0/4", "1.0.2/5"])
iex> versions |> Versions.uniq() |> Enum.map(&to_string/1)
["1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5"]
iex> Versions.uniq([:a])
** (ArgumentError) uniq/1 expected a list or table of versions, got: [:a]