diff --git a/lib/aura/model/hex_package.ex b/lib/aura/model/hex_package.ex index aff222b..ce242ad 100644 --- a/lib/aura/model/hex_package.ex +++ b/lib/aura/model/hex_package.ex @@ -33,6 +33,7 @@ defmodule Aura.Model.HexPackage do struct(HexPackage, fields) end + defp serialize(_k, nil), do: nil defp serialize(:meta, v), do: PackageMeta.build(v) defp serialize(:downloads, v), do: DownloadStats.build(v) diff --git a/lib/aura/model/hex_package_owner.ex b/lib/aura/model/hex_package_owner.ex new file mode 100644 index 0000000..bc39b0a --- /dev/null +++ b/lib/aura/model/hex_package_owner.ex @@ -0,0 +1,33 @@ +defmodule Aura.Model.HexPackageOwner do + @moduledoc false + + import Aura.Model.Common + + alias Aura.Model.HexPackageOwner + + defstruct [ + :email, + :full_name, + :handles, + :inserted_at, + :level, + :updated_at, + :url, + :username + ] + + def build(m) when is_map(m) do + m + |> prepare() + |> Enum.map(fn {k, v} -> {k, serialize(k, v)} end) + |> then(&Kernel.struct(HexPackageOwner, &1)) + end + + defp serialize(_k, nil), do: nil + + defp serialize(:handles, v), do: v |> prepare() |> Map.new() + + defp serialize(:level, v), do: String.to_atom(v) + + defp serialize(_k, v), do: v +end diff --git a/lib/aura/model/hex_release.ex b/lib/aura/model/hex_release.ex index 4c9de8e..ffdf376 100644 --- a/lib/aura/model/hex_release.ex +++ b/lib/aura/model/hex_release.ex @@ -3,6 +3,8 @@ defmodule Aura.Model.HexRelease do import Aura.Model.Common + alias Aura.Model.HexRelease + defstruct [ :checksum, :configs, @@ -22,12 +24,10 @@ defmodule Aura.Model.HexRelease do ] def build(m) when is_map(m) do - fields = - m - |> prepare() - |> Map.new(fn {k, v} -> {k, serialize(k, v)} end) - - struct(Aura.Model.HexRelease, fields) + m + |> prepare() + |> Map.new(fn {k, v} -> {k, serialize(k, v)} end) + |> then(&Kernel.struct(HexRelease, &1)) end defp serialize(_k, nil), do: nil diff --git a/lib/aura/model/hex_repo.ex b/lib/aura/model/hex_repo.ex index be41f51..b1a4343 100644 --- a/lib/aura/model/hex_repo.ex +++ b/lib/aura/model/hex_repo.ex @@ -15,8 +15,8 @@ defmodule Aura.Model.HexRepo do ] def build(m) when is_map(m) do - fields = prepare(m) - - struct(HexRepo, fields) + m + |> prepare() + |> then(&Kernel.struct(HexRepo, &1)) end end diff --git a/lib/aura/packages.ex b/lib/aura/packages.ex index b97357c..78e88fe 100644 --- a/lib/aura/packages.ex +++ b/lib/aura/packages.ex @@ -2,12 +2,19 @@ defmodule Aura.Packages do @moduledoc false alias Aura.Model.HexPackage + alias Aura.Model.HexPackageOwner alias Aura.Requester def list_packages(opts \\ []) do stream_paginate("/packages", opts) end + def list_package_owners(name) do + with {:ok, %{body: body}} <- Requester.get("/packages/#{name}/owners") do + {:ok, Enum.map(body, &HexPackageOwner.build/1)} + end + end + def get_package(name) do with {:ok, %{body: body}} <- Requester.get("/packages/#{name}") do {:ok, HexPackage.build(body)} diff --git a/mix.lock b/mix.lock index 83b7525..ad9d3fd 100644 --- a/mix.lock +++ b/mix.lock @@ -5,7 +5,7 @@ "date_time_parser": {:hex, :date_time_parser, "1.2.0", "3d5a816b91967f51e0f94dcb16a34b2cb780f22cd48931779e81d72f7d3eadb1", [:mix], [{:kday, "~> 1.0", [hex: :kday, repo: "hexpm", optional: false]}], "hexpm", "0cf09ada9f42c0b3bfba02dc0ea2e4b4d2f543d9d2bf99b831a29e6b4a4160e5"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, - "ex_doc": {:hex, :ex_doc, "0.38.1", "bae0a0bd5b5925b1caef4987e3470902d072d03347114ffe03a55dbe206dd4c2", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "754636236d191b895e1e4de2ebb504c057fe1995fdfdd92e9d75c4b05633008b"}, + "ex_doc": {:hex, :ex_doc, "0.38.2", "504d25eef296b4dec3b8e33e810bc8b5344d565998cd83914ffe1b8503737c02", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "732f2d972e42c116a70802f9898c51b54916e542cc50968ac6980512ec90f42b"}, "ex_hash_ring": {:hex, :ex_hash_ring, "6.0.4", "bef9d2d796afbbe25ab5b5a7ed746e06b99c76604f558113c273466d52fa6d6b", [:mix], [], "hexpm", "89adabf31f7d3dfaa36802ce598ce918e9b5b33bae8909ac1a4d052e1e567d18"}, "ex_license": {:hex, :ex_license, "0.1.1", "bbdaba704f861894da3ae80e4399984379f19de1cca4ecf7d799616c832b8821", [:mix], [], "hexpm", "dd95aaaba0c9c6f0e9be2db3e9fac0bf69784557e04f700f94e90629f5e24e1d"}, "ex_machina": {:hex, :ex_machina, "2.8.0", "a0e847b5712065055ec3255840e2c78ef9366634d62390839d4880483be38abe", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "79fe1a9c64c0c1c1fab6c4fa5d871682cb90de5885320c187d117004627a7729"}, diff --git a/test/aura/packages_test.exs b/test/aura/packages_test.exs index 3934919..dfe3ac8 100644 --- a/test/aura/packages_test.exs +++ b/test/aura/packages_test.exs @@ -37,9 +37,29 @@ defmodule Aura.PackagesTest do end) end + test "list_package_owners" do + packages = Enum.take(Packages.list_packages(), 100) + refute Enum.empty?(packages) + + Enum.each(packages, fn package -> + {:ok, owners} = Packages.list_package_owners(package.name) + refute Enum.empty?(owners) + + Enum.each(owners, fn owner -> + assert owner.username + assert owner.level + assert owner.url + end) + end) + end + test "get_package" do - [package | _] = Enum.take(Packages.list_packages(), 1) - assert {:ok, retrieved} = Packages.get_package(package.name) - assert package == retrieved + packages = Enum.take(Packages.list_packages(), 100) + refute Enum.empty?(packages) + + Enum.each(packages, fn package -> + assert {:ok, retrieved} = Packages.get_package(package.name) + assert package == retrieved + end) end end diff --git a/test/support/factories/hex_package_owner_factory.ex b/test/support/factories/hex_package_owner_factory.ex new file mode 100644 index 0000000..7ca88f4 --- /dev/null +++ b/test/support/factories/hex_package_owner_factory.ex @@ -0,0 +1,26 @@ +defmodule Aura.Factory.HexPackageOwnerFactory do + @moduledoc false + + defmacro __using__(_opts) do + quote do + def hex_package_owner_factory(attrs) do + # :handles, + # ] + + inserted_at = Faker.DateTime.backward(40) + + %Aura.Model.HexPackageOwner{ + email: Faker.Internet.email(), + full_name: Faker.Person.name(), + inserted_at: inserted_at, + level: Enum.random([:maintainer, :full]), + updated_at: Faker.DateTime.between(inserted_at, DateTime.now!("Etc/UTC")), + url: Faker.Internet.url(), + username: Faker.Internet.user_name() + } + |> merge_attributes(attrs) + |> evaluate_lazy_attributes() + end + end + end +end