Remove mox in favour of built-in Req stubs

This commit is contained in:
Claudio Ortolina
2025-02-28 16:38:11 +00:00
parent 8aa283cb84
commit a218942110
16 changed files with 844 additions and 195 deletions
+8 -6
View File
@@ -1,9 +1,11 @@
defmodule MusicBrainz do
alias MusicBrainz.API
def search_release_group(query, opts \\ []) do
limit = Keyword.get(opts, :limit, 20)
offset = Keyword.get(opts, :offset, 0)
music_brainz_config().api.search_release_group(
API.search_release_group(
query,
[limit: limit, offset: offset],
music_brainz_config()
@@ -11,23 +13,23 @@ defmodule MusicBrainz do
end
def get_release_group(musicbrainz_id) do
music_brainz_config().api.get_release_group(musicbrainz_id, music_brainz_config())
API.get_release_group(musicbrainz_id, music_brainz_config())
end
def get_releases(musicbrainz_id, opts) do
music_brainz_config().api.get_releases(musicbrainz_id, opts, music_brainz_config())
API.get_releases(musicbrainz_id, opts, music_brainz_config())
end
def get_release(musicbrainz_id) do
music_brainz_config().api.get_release(musicbrainz_id, music_brainz_config())
API.get_release(musicbrainz_id, music_brainz_config())
end
def search_release_by_barcode(barcode) do
music_brainz_config().api.search_release_by_barcode(barcode, music_brainz_config())
API.search_release_by_barcode(barcode, music_brainz_config())
end
def get_cover_art(id_or_url) do
music_brainz_config().api.get_cover_art(id_or_url, music_brainz_config())
API.get_cover_art(id_or_url, music_brainz_config())
end
defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library)
@@ -1,4 +1,4 @@
defmodule MusicBrainz.APIImpl do
defmodule MusicBrainz.API do
@moduledoc """
The original data from Obsidian maps records to MusicBrainz release groups, so we can leverage the MusicBrainz API to:
@@ -6,8 +6,6 @@ defmodule MusicBrainz.APIImpl do
- Extend the metadata associated with existing records
"""
@behaviour MusicBrainz.APIBehaviour
require Logger
alias MusicBrainz.{ReleaseGroupSearchResult, ReleaseSearchResult}
@@ -208,7 +206,6 @@ defmodule MusicBrainz.APIImpl do
}
"""
@impl true
def get_release_group(id, config) do
config
|> new_request()
@@ -285,7 +282,6 @@ defmodule MusicBrainz.APIImpl do
"title": "Clark (Soundtrack From the Netflix Series)"
}
"""
@impl true
def get_release(id, config) do
config
|> new_request()
@@ -299,7 +295,6 @@ defmodule MusicBrainz.APIImpl do
|> get_request()
end
@impl true
def get_releases(release_group_id, opts, config) do
Keyword.validate!(opts, [:limit, :offset])
@@ -319,7 +314,6 @@ defmodule MusicBrainz.APIImpl do
|> get_request()
end
@impl true
def search_release_by_barcode(barcode, config) do
config
|> new_request()
@@ -436,7 +430,6 @@ defmodule MusicBrainz.APIImpl do
]
}
"""
@impl true
def search_release_group(query, opts, config) do
Keyword.validate!(opts, [:limit, :offset])
@@ -461,7 +454,6 @@ defmodule MusicBrainz.APIImpl do
@doc """
Uses the [cover art](https://musicbrainz.org/doc/Cover_Art_Archive/API) endpoint with the release group id to get the cover image.
"""
@impl true
def get_cover_art({:musicbrainz_id, musicbrainz_id}, config) do
url = "https://coverartarchive.org/release-group/#{musicbrainz_id}/front"
@@ -470,6 +462,7 @@ defmodule MusicBrainz.APIImpl do
def get_cover_art({:url, url}, config) do
case Req.new(url: url, max_retries: 1, user_agent: config.user_agent)
|> Req.Request.merge_options(config.req_options)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(log_error: &log_error/1)
|> get_request() do
@@ -484,6 +477,7 @@ defmodule MusicBrainz.APIImpl do
max_retries: 1,
user_agent: config.user_agent
)
|> Req.Request.merge_options(config.req_options)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
end
-20
View File
@@ -1,20 +0,0 @@
defmodule MusicBrainz.APIBehaviour do
@type musicbrainz_id :: String.t()
@type config :: MusicBrainz.Config.t()
@type limit :: pos_integer()
@type barcode :: String.t()
@callback get_release_group(musicbrainz_id, config) :: {:ok, map()} | {:error, String.t()}
@callback get_releases(musicbrainz_id, limit, config) :: {:ok, map()} | {:error, String.t()}
@callback get_release(musicbrainz_id, config) :: {:ok, map()} | {:error, String.t()}
@callback search_release_group(String.t(), Keyword.t(), config) ::
{:ok, [map()]} | {:error, String.t()}
@callback search_release_by_barcode(barcode, config) :: {:ok, [map()]} | {:error, String.t()}
@callback get_cover_art({:musicbrainz_id, musicbrainz_id()} | {:url, String.t()}, config) ::
{:ok, binary()} | {:error, String.t()}
end
+10 -9
View File
@@ -1,22 +1,23 @@
defmodule MusicBrainz.Config do
@type t :: %__MODULE__{
api: module(),
user_agent: String.t()
user_agent: String.t(),
req_options: Keyword.t()
}
@enforce_keys [:api, :user_agent]
defstruct api: MusicBrainz.APIImpl,
user_agent: "change me"
@enforce_keys [:user_agent]
defstruct user_agent: "change me",
req_options: []
@schema NimbleOptions.new!(
api: [
type: :atom,
required: true
],
user_agent: [
type: :string,
required: false,
default: "change me"
],
req_options: [
type: :keyword_list,
required: false,
default: []
]
)