Skip to content

Commit f8deb99

Browse files
committed
Added body parser
1 parent 320e496 commit f8deb99

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
defmodule CodeCorps.GitHub.Event.PullRequest.BodyParser do
2+
@moduledoc ~S"""
3+
In charge of extracting ids from markdown content, paired to a predefined list
4+
of keywords.
5+
"""
6+
7+
@doc ~S"""
8+
Searchs for GitHub closing keyword format inside a content string. Returns all
9+
unique ids matched, as integers.
10+
"""
11+
@spec extract_closing_ids(String.t) :: list(integer)
12+
def extract_closing_ids(content) when is_binary(content) do
13+
~w(close closes closed fix fixes fixed resolve resolves resolved)
14+
|> matching_regex()
15+
|> Regex.scan(content) # [["closes #1", "closes", "1"], ["fixes #2", "fixes", "2"]]
16+
|> Enum.map(&List.last/1) # ["1", "2"]
17+
|> Enum.map(&String.to_integer/1) # [1, 2]
18+
|> Enum.uniq
19+
end
20+
21+
defp matching_regex(keywords) do
22+
matches = keywords |> Enum.join("|")
23+
~r/(?:(#{matches}))\s+#(\d+)/i
24+
end
25+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule CodeCorps.GitHub.Event.PullRequest.BodyParserTest do
2+
@moduledoc false
3+
4+
use ExUnit.Case, async: true
5+
6+
7+
alias CodeCorps.{
8+
GitHub.Event.PullRequest.BodyParser
9+
}
10+
11+
describe "extract_closing_ids/1" do
12+
test "correctly extracts ids using supported closing keywords" do
13+
content =
14+
"""
15+
close #2, closes #3 closed #4: fixed #5 fixes #6 fix #7.
16+
resolve #8 resolves #9 #resolved #10
17+
"""
18+
19+
assert content |> BodyParser.extract_closing_ids == 2..10 |> Enum.to_list
20+
end
21+
22+
test "only returns unique results" do
23+
content =
24+
"""
25+
close #2, closes #2 closed #3: fixed #4 fixes #5 fix #6.
26+
resolve #7 resolves #8 #resolved #8
27+
"""
28+
29+
assert content |> BodyParser.extract_closing_ids == 2..8 |> Enum.to_list
30+
end
31+
end
32+
end

0 commit comments

Comments
 (0)