defmodule Quotes do
@moduledoc """
Documentation for Quotes.
"""
@doc """
`parse_json` returns a list of maps containing quotes. <br />
The format returned is:
```elixir
[
%{
"author" => "Albert Einstein",
"text" => "Once we accept our limits, we go beyond them."
},
%{
"author" => "Peter Drucker",
"source" => "https://www.goodreads.com/quotes/784267",
"tags" => "time, management",
"text" => "Until we can manage time, we can manage nothing else."
}
%{...},
...
]
```
All quotes MUST have an `author` and `text` field. <br />
Some quotes have `tags` and `source`,
please help to expand/verify others. <br />
see: https://github.com/nelsonic/quotes#contributing
"""
def parse_json do
{:ok, cwd} = File.cwd
# we need this cd to locate the file in /deps
case cwd =~ "/quotes" do
true ->
File.read!("quotes.json") |> Jason.decode!()
# coveralls-ignore-start
false -> # temporarily cd into deps/quotes dir and read quotes.json file:
File.cd!("deps/quotes")
data = File.read!("quotes.json")
|> Jason.decode!()
# chnge back into the root directory
File.cd!("../..")
data # return the decoded (parsed) JSON data
# coveralls-ignore-stop
end
end
@doc """
`random` returns a random quote. <br />
e.g:
```elixir
%{
"author" => "Peter Drucker",
"source" => "https://www.goodreads.com/quotes/784267",
"tags" => "time, management",
"text" => "Until we can manage time, we can manage nothing else."
}
```
"""
def random do
parse_json()
|> Enum.random()
end
@doc """
`random_by_tag` returns a random quote for the chosen tag/keyword.
e.g:
```elixir
iex> Quotes.random_by_tag("time")
%{
"author" => "Leo Tolstoy",
"text" => "The two most powerful warriors are patience and time."
}
```
"""
def random_by_tag(tag) do
# IO.inspect(tag)
parse_json()
|> Enum.map(fn q ->
# IO.inspect(q)
if ( !is_nil(q["text"]) && q["text"] =~ tag )
|| ( !is_nil(q["tags"]) && q["tags"] =~ tag )
do
q
end
end)
|> Enum.filter(& !is_nil(&1))
|> Enum.random()
end
end