Skip to content

Commit b9e2197

Browse files
committed
Refactor Version.parse/1 to not use regexes (#6107)
1 parent 16ea29d commit b9e2197

File tree

1 file changed

+7
-16
lines changed

1 file changed

+7
-16
lines changed

lib/elixir/lib/version.ex

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,10 @@ defmodule Version do
238238
@spec parse(String.t) :: {:ok, t} | :error
239239
def parse(string) when is_binary(string) do
240240
case Version.Parser.parse_version(string) do
241-
{:ok, {major, minor, patch, pre}} ->
241+
{:ok, {major, minor, patch, pre, build_parts}} ->
242+
build = if build_parts == [], do: nil, else: Enum.join(build_parts, "")
242243
version = %Version{major: major, minor: minor, patch: patch,
243-
pre: pre, build: get_build(string)}
244+
pre: pre, build: build}
244245
{:ok, version}
245246
:error ->
246247
:error
@@ -312,23 +313,13 @@ defmodule Version do
312313

313314
defp to_matchable(string, allow_pre?) do
314315
case Version.Parser.parse_version(string) do
315-
{:ok, {major, minor, patch, pre}} ->
316+
{:ok, {major, minor, patch, pre, _build_parts}} ->
316317
{major, minor, patch, pre, allow_pre?}
317318
:error ->
318319
raise InvalidVersionError, message: string
319320
end
320321
end
321322

322-
defp get_build(string) do
323-
case Regex.run(~r/\+([^\s]+)$/, string) do
324-
nil ->
325-
nil
326-
327-
[_, build] ->
328-
build
329-
end
330-
end
331-
332323
defmodule Parser.DSL do
333324
@moduledoc false
334325

@@ -413,8 +404,8 @@ defmodule Version do
413404
{:ok, patch} <- maybe_patch(patch, approximate?),
414405
{:ok, pre_parts} <- optional_dot_separated(pre),
415406
{:ok, pre_parts} <- convert_parts_to_integer(pre_parts, []),
416-
{:ok, _build_parts} <- optional_dot_separated(build) do
417-
{:ok, {major, minor, patch, pre_parts}}
407+
{:ok, build_parts} <- optional_dot_separated(build) do
408+
{:ok, {major, minor, patch, pre_parts, build_parts}}
418409
else
419410
_other -> :error
420411
end
@@ -599,7 +590,7 @@ defmodule Version do
599590

600591
defp parse_condition(version, approximate? \\ false) do
601592
case parse_version(version, approximate?) do
602-
{:ok, version} -> version
593+
{:ok, {major, minor, patch, pre, _build}} -> {major, minor, patch, pre}
603594
:error -> throw :invalid_matchspec
604595
end
605596
end

0 commit comments

Comments
 (0)