diff --git a/lib/feed_reader/formats/atom.ex b/lib/feed_reader/formats/atom.ex index ec916cc..a936588 100644 --- a/lib/feed_reader/formats/atom.ex +++ b/lib/feed_reader/formats/atom.ex @@ -52,7 +52,7 @@ defmodule FeedReader.Formats.Atom do |> find_link() |> URL.resolve_root_relative([feed.html_url, feed.feed_url]) - author = get_in(raw, ["author", "name"]) |> text() + author = raw |> Map.get("author") |> author() date = text(raw["published"]) || text(raw["updated"]) @@ -84,6 +84,18 @@ defmodule FeedReader.Formats.Atom do defp content(value), do: text(value) + defp author(value) do + value + |> List.wrap() + |> Enum.map(&author_name/1) + |> Enum.reject(&is_nil/1) + |> Enum.join(", ") + |> blank_to_nil() + end + + defp author_name(%{"name" => name}), do: text(name) + defp author_name(value), do: text(value) + defp find_link(links) do case Enum.find(links, &((is_map(&1) and &1["href"]) && &1["rel"] in [nil, "alternate"])) do %{"href" => href} -> clean(href) diff --git a/test/feed_reader/atom_test.exs b/test/feed_reader/atom_test.exs index e4e4f32..278fc57 100644 --- a/test/feed_reader/atom_test.exs +++ b/test/feed_reader/atom_test.exs @@ -34,6 +34,15 @@ defmodule FeedReader.AtomTest do ) end + test "joins multiple author names in source order" do + raw = %{ + "title" => "Story", + "author" => [%{"name" => "Alice"}, %{"name" => "Bob"}] + } + + assert {:ok, %Item{author: "Alice, Bob"}} = Atom.normalize_item(raw, %Feed{}, []) + end + test "accounts for parser failures and closes empty feeds" do handler = Atom.handler() sink = fn event -> send(self(), event) end