Packages
github_issues
0.4.39
0.4.71
0.4.70
0.4.69
0.4.68
0.4.66
0.4.65
0.4.64
0.4.63
0.4.62
0.4.61
0.4.60
0.4.59
0.4.58
0.4.56
0.4.55
0.4.54
0.4.53
0.4.52
0.4.51
0.4.50
0.4.48
0.4.47
0.4.46
0.4.45
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.0
0.2.5
0.2.3
0.2.2
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.4
0.1.2
0.1.1
0.1.0
Writes GitHub Issues to "stdio" in a table with borders and colors.
Current section
Files
Jump to
Current section
Files
lib/github/issues.ex
# ┌───────────────────────────────────────────────────────────┐
# │ Inspired by the book "Programming Elixir" by Dave Thomas. │
# └───────────────────────────────────────────────────────────┘
defmodule GitHub.Issues do
@moduledoc """
Fetches a list of issues from a GitHub project.
"""
use PersistConfig
alias __MODULE__.{CLI, Log}
@url_template get_env(:url_template)
@type issue :: map
@doc """
Fetches issues from a GitHub `project` of a given `user`.
Returns a tuple of either `{:ok, [issue]}` or `{:error, text}`.
## Parameters
- `user` - GitHub user
- `project` - GitHub project
- `url_template` - URL template (EEx string)
## Examples
iex> alias GitHub.Issues
iex> {:ok, issues} = Issues.fetch("opendrops", "passport")
iex> Enum.all?(issues, &is_map/1) and length(issues) > 0
true
"""
@spec fetch(CLI.user(), CLI.project(), String.t()) ::
{:ok, [issue]} | {:error, String.t()}
def fetch(user, project, url_template \\ @url_template) do
url = url(user, project, url_template)
:ok = Log.info(:fetching, {user, project, url, __ENV__})
case HTTPoison.get(url) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, :jsx.decode(body, [:return_maps])}
{:ok, %HTTPoison.Response{status_code: code}} ->
{:error, status(code)}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, error(reason)}
end
end
## Private functions
@spec status(pos_integer) :: String.t()
defp status(301), do: "status code 301 ⇒ Moved Permanently"
defp status(302), do: "status code 302 ⇒ Found"
defp status(403), do: "status code 403 ⇒ Forbidden"
defp status(404), do: "status code 404 ⇒ Not Found"
defp status(code), do: "status code #{code}"
@spec error(term) :: String.t()
defp error(reason), do: "reason => #{inspect(reason)}"
# @doc """
# Returns a URL based on `user`, `project` and `url_template`.
# ## Parameters
# - `user` - user
# - `project` - project
# - `url_template` - URL template (EEx string)
# ## Examples
# iex> alias GitHub.Issues
# iex> url_template = "api.github.com/repos/<%=user%>/<%=project%>/issues"
# iex> Issues.url("opendrops", "passport", url_template)
# "api.github.com/repos/opendrops/passport/issues"
# iex> alias GitHub.Issues
# iex> url_template = "elixir-lang.org/<%=project%>/<%=user%>/wow"
# iex> Issues.url("José", "Elixir", url_template)
# "elixir-lang.org/Elixir/José/wow"
# iex> alias GitHub.Issues
# iex> url_template = "elixir-lang.org/<project>/<user>/wow"
# iex> Issues.url("José", "Elixir", url_template)
# "elixir-lang.org/<project>/<user>/wow"
# """
@spec url(CLI.user(), CLI.project(), String.t()) :: String.t()
defp url(user, project, url_template) do
EEx.eval_string(url_template, user: user, project: project)
end
end