Enable unaliased modules ex_slop check

This commit is contained in:
Claudio Ortolina
2026-04-22 20:36:13 +01:00
parent 5c1beede53
commit f7f38d580e
26 changed files with 226 additions and 193 deletions
+8 -6
View File
@@ -3,6 +3,8 @@ defmodule BraveSearch.API do
Interface to the Brave Search API.
"""
alias Req.Request
require Logger
@spec search_images(String.t(), keyword(), BraveSearch.Config.t()) ::
@@ -40,9 +42,9 @@ defmodule BraveSearch.API do
{:ok, binary()} | {:error, :download_failed}
def download_image(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)
|> Request.merge_options(config.req_options)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
|> get_request() do
{:ok, data} -> {:ok, data}
{:error, _reason} -> {:error, :download_failed}
@@ -56,10 +58,10 @@ defmodule BraveSearch.API do
user_agent: config.user_agent,
headers: %{"x-subscription-token" => config.api_key}
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :brave_search, cooldown: config.api_cooldown)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(log_error: &log_error/1)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
end
defp get_request(request) do
+8 -6
View File
@@ -3,6 +3,8 @@ defmodule Discogs.API do
Interface to the Discogs API.
"""
alias Req.Request
require Logger
@spec get_artist(integer() | String.t(), Discogs.Config.t()) :: {:ok, map()} | {:error, term()}
@@ -20,9 +22,9 @@ defmodule Discogs.API do
{:ok, binary()} | {:error, :cover_not_available}
def get_artist_image(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)
|> Request.merge_options(config.req_options)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
|> get_request() do
{:ok, data} -> {:ok, data}
{:error, _reason} -> {:error, :cover_not_available}
@@ -36,10 +38,10 @@ defmodule Discogs.API do
user_agent: config.user_agent,
auth: "Discogs token=#{config.personal_access_token}"
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :discogs, cooldown: config.api_cooldown)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(log_error: &log_error/1)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
end
defp get_request(request) do
+15 -14
View File
@@ -1,6 +1,7 @@
defmodule LastFm.API do
alias LastFm.API.{ErrorResponse, Signature}
alias LastFm.{Artist, Session, Track}
alias Req.Request
require Logger
@@ -22,8 +23,8 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_error: &parse_error/1)
|> Req.Request.append_response_steps(parse_session: &parse_session/1)
|> Request.append_response_steps(parse_error: &parse_error/1)
|> Request.append_response_steps(parse_session: &parse_session/1)
|> get_request()
end
@@ -70,7 +71,7 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_tracks: &parse_tracks/1)
|> Request.append_response_steps(parse_tracks: &parse_tracks/1)
|> get_request()
end
@@ -85,7 +86,7 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_tracks: &parse_artist/1)
|> Request.append_response_steps(parse_tracks: &parse_artist/1)
|> get_request()
end
@@ -101,7 +102,7 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_tracks: &parse_similar_artists/1)
|> Request.append_response_steps(parse_tracks: &parse_similar_artists/1)
|> get_request()
end
@@ -117,7 +118,7 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_tags: &parse_artist_tags/1)
|> Request.append_response_steps(parse_tags: &parse_artist_tags/1)
|> get_request()
end
@@ -134,7 +135,7 @@ defmodule LastFm.API do
config
|> new_request()
|> Req.merge(url: "/", params: params)
|> Req.Request.append_response_steps(parse_user_info: &parse_user_info/1)
|> Request.append_response_steps(parse_user_info: &parse_user_info/1)
|> get_request()
end
@@ -169,11 +170,11 @@ defmodule LastFm.API do
],
user_agent: config.user_agent
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :last_fm, cooldown: config.api_cooldown)
|> Req.Request.put_private(:api_key, config.api_key)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(parse_error: &parse_error/1)
|> Request.put_private(:api_key, config.api_key)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(parse_error: &parse_error/1)
end
defp get_request(request) do
@@ -204,7 +205,7 @@ defmodule LastFm.API do
defp log_attempt(request) do
url = URI.to_string(request.url)
api_key = Req.Request.get_private(request, :api_key)
api_key = Request.get_private(request, :api_key)
Logger.debug("Fetching data from #{sanitize_url(url, api_key)}")
request
end
@@ -221,11 +222,11 @@ defmodule LastFm.API do
Logger.error(fn ->
url = URI.to_string(request.url)
api_key = Req.Request.get_private(request, :api_key)
api_key = Request.get_private(request, :api_key)
"Failed to fetch data from #{sanitize_url(url, api_key)}, reason: #{message}."
end)
Req.Request.halt(request, Map.put(response, :body, error))
Request.halt(request, Map.put(response, :body, error))
_other ->
{request, response}
+27 -26
View File
@@ -37,6 +37,7 @@ defmodule Mix.Tasks.Scrobble.Audit do
import Ecto.Query
alias LastFm.Track
alias Mix.Shell.IO, as: ShellIO
alias MusicLibrary.{ListeningStats, Maintenance, Repo}
@impl Mix.Task
@@ -267,12 +268,12 @@ defmodule Mix.Tasks.Scrobble.Audit do
defp output_json(report) do
report
|> Jason.encode!(pretty: true)
|> Mix.Shell.IO.info()
|> ShellIO.info()
end
defp output_text(report, verbose) do
Mix.Shell.IO.info("\n=== Scrobbled Tracks Data Quality Audit ===\n")
Mix.Shell.IO.info("Total scrobbled tracks: #{report.total_tracks}\n")
ShellIO.info("\n=== Scrobbled Tracks Data Quality Audit ===\n")
ShellIO.info("Total scrobbled tracks: #{report.total_tracks}\n")
if Map.has_key?(report, :artist_issues) do
output_artist_issues(report.artist_issues, verbose)
@@ -286,71 +287,71 @@ defmodule Mix.Tasks.Scrobble.Audit do
end
defp output_artist_issues(artist_issues, verbose) do
Mix.Shell.IO.info("--- Artists with Missing MusicBrainz IDs ---")
Mix.Shell.IO.info("Unique artists: #{artist_issues.total_artists}")
Mix.Shell.IO.info("Affected tracks: #{artist_issues.total_tracks_affected}\n")
ShellIO.info("--- Artists with Missing MusicBrainz IDs ---")
ShellIO.info("Unique artists: #{artist_issues.total_artists}")
ShellIO.info("Affected tracks: #{artist_issues.total_tracks_affected}\n")
if artist_issues.total_artists > 0 do
Mix.Shell.IO.info("Top artists by track count:")
ShellIO.info("Top artists by track count:")
artist_issues.artists
|> Enum.take(10)
|> Enum.each(fn %{name: name, track_count: count} ->
Mix.Shell.IO.info("#{name} (#{count} tracks)")
ShellIO.info("#{name} (#{count} tracks)")
end)
Mix.Shell.IO.info("")
ShellIO.info("")
if verbose and Map.has_key?(artist_issues, :sample_tracks) do
Mix.Shell.IO.info("Sample tracks:")
ShellIO.info("Sample tracks:")
Enum.each(artist_issues.sample_tracks, fn %{artist: artist, sample_tracks: tracks} ->
Mix.Shell.IO.info("\n Artist: #{artist}")
ShellIO.info("\n Artist: #{artist}")
# credo:disable-for-next-line Credo.Check.Refactor.Nesting
Enum.each(tracks, fn track ->
Mix.Shell.IO.info(" - #{track.title} (from #{track.album})")
ShellIO.info(" - #{track.title} (from #{track.album})")
end)
end)
Mix.Shell.IO.info("")
ShellIO.info("")
end
end
end
defp output_album_issues(album_issues, verbose) do
Mix.Shell.IO.info("--- Albums with Missing MusicBrainz IDs ---")
Mix.Shell.IO.info("Unique albums: #{album_issues.total_albums}")
Mix.Shell.IO.info("Affected tracks: #{album_issues.total_tracks_affected}\n")
ShellIO.info("--- Albums with Missing MusicBrainz IDs ---")
ShellIO.info("Unique albums: #{album_issues.total_albums}")
ShellIO.info("Affected tracks: #{album_issues.total_tracks_affected}\n")
if album_issues.total_albums > 0 do
Mix.Shell.IO.info("Top albums by track count:")
ShellIO.info("Top albums by track count:")
album_issues.albums
|> Enum.take(10)
|> Enum.each(fn %{title: title, artist: artist, track_count: count} ->
Mix.Shell.IO.info("#{title} by #{artist} (#{count} tracks)")
ShellIO.info("#{title} by #{artist} (#{count} tracks)")
end)
Mix.Shell.IO.info("")
ShellIO.info("")
if verbose and Map.has_key?(album_issues, :sample_tracks) do
Mix.Shell.IO.info("Sample tracks:")
ShellIO.info("Sample tracks:")
Enum.each(album_issues.sample_tracks, fn %{
album: album,
artist: artist,
sample_tracks: tracks
} ->
Mix.Shell.IO.info("\n Album: #{album} by #{artist}")
ShellIO.info("\n Album: #{album} by #{artist}")
# credo:disable-for-next-line Credo.Check.Refactor.Nesting
Enum.each(tracks, fn track ->
Mix.Shell.IO.info(" - #{track.title}")
ShellIO.info(" - #{track.title}")
end)
end)
Mix.Shell.IO.info("")
ShellIO.info("")
end
end
end
@@ -360,10 +361,10 @@ defmodule Mix.Tasks.Scrobble.Audit do
(Map.get(report, :artist_issues, %{}) |> Map.get(:total_tracks_affected, 0)) +
(Map.get(report, :album_issues, %{}) |> Map.get(:total_tracks_affected, 0))
Mix.Shell.IO.info("--- Summary ---")
Mix.Shell.IO.info("Total tracks needing enrichment: #{total_issues}")
ShellIO.info("--- Summary ---")
ShellIO.info("Total tracks needing enrichment: #{total_issues}")
Mix.Shell.IO.info("""
ShellIO.info("""
To fix these issues:
1. Create scrobble rules for artists with missing MusicBrainz IDs:
+9 -8
View File
@@ -7,6 +7,7 @@ defmodule MusicBrainz.API do
"""
alias MusicBrainz.{Artist, ReleaseGroupSearchResult, ReleaseSearchResult}
alias Req.Request
require Logger
@@ -330,7 +331,7 @@ defmodule MusicBrainz.API do
query: "barcode:#{barcode} AND NOT format:digitalmedia"
]
)
|> Req.Request.append_response_steps(
|> Request.append_response_steps(
parse_release_search_results: &parse_release_search_results/1
)
|> get_request()
@@ -454,7 +455,7 @@ defmodule MusicBrainz.API do
url: "/release-group",
params: params
)
|> Req.Request.append_response_steps(
|> Request.append_response_steps(
parse_release_group_search_results: &parse_release_group_search_results/1
)
|> get_request()
@@ -471,7 +472,7 @@ defmodule MusicBrainz.API do
inc: "url-rels"
]
)
|> Req.Request.append_response_steps(parse_artist: &parse_artist/1)
|> Request.append_response_steps(parse_artist: &parse_artist/1)
|> get_request()
end
@@ -488,9 +489,9 @@ defmodule MusicBrainz.API 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)
|> Request.merge_options(config.req_options)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
|> get_request() do
{:ok, data} -> {:ok, data}
{:error, _reason} -> {:error, :cover_not_available}
@@ -503,9 +504,9 @@ defmodule MusicBrainz.API do
max_retries: 1,
user_agent: config.user_agent
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :music_brainz, cooldown: config.api_cooldown)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
end
defp get_request(request) do
+11 -10
View File
@@ -5,6 +5,7 @@ defmodule MusicLibrary.RecordSets do
import Ecto.Query, warn: false
alias Ecto.Changeset
alias MusicLibrary.RecordSets.{RecordSet, RecordSetItem}
alias MusicLibrary.Repo
@@ -64,7 +65,7 @@ defmodule MusicLibrary.RecordSets do
|> Repo.preload(items: :record)
end
@spec create_record_set(map()) :: {:ok, RecordSet.t()} | {:error, Ecto.Changeset.t()}
@spec create_record_set(map()) :: {:ok, RecordSet.t()} | {:error, Changeset.t()}
def create_record_set(attrs) do
%RecordSet{}
|> RecordSet.changeset(attrs)
@@ -76,7 +77,7 @@ defmodule MusicLibrary.RecordSets do
end
@spec update_record_set(RecordSet.t(), map()) ::
{:ok, RecordSet.t()} | {:error, Ecto.Changeset.t()}
{:ok, RecordSet.t()} | {:error, Changeset.t()}
def update_record_set(%RecordSet{} = record_set, attrs) do
record_set
|> RecordSet.changeset(attrs)
@@ -87,18 +88,18 @@ defmodule MusicLibrary.RecordSets do
end
end
@spec delete_record_set(RecordSet.t()) :: {:ok, RecordSet.t()} | {:error, Ecto.Changeset.t()}
@spec delete_record_set(RecordSet.t()) :: {:ok, RecordSet.t()} | {:error, Changeset.t()}
def delete_record_set(%RecordSet{} = record_set) do
Repo.delete(record_set)
end
@spec change_record_set(RecordSet.t(), map()) :: Ecto.Changeset.t()
@spec change_record_set(RecordSet.t(), map()) :: Changeset.t()
def change_record_set(%RecordSet{} = record_set, attrs \\ %{}) do
RecordSet.changeset(record_set, attrs)
end
@spec add_record_to_set(RecordSet.t(), String.t()) ::
{:ok, RecordSet.t()} | {:error, Ecto.Changeset.t()}
{:ok, RecordSet.t()} | {:error, Changeset.t()}
def add_record_to_set(%RecordSet{} = record_set, record_id) do
next_position =
from(i in RecordSetItem,
@@ -110,9 +111,9 @@ defmodule MusicLibrary.RecordSets do
%RecordSetItem{}
|> RecordSetItem.changeset(%{position: next_position})
|> Ecto.Changeset.put_change(:record_set_id, record_set.id)
|> Ecto.Changeset.put_change(:record_id, record_id)
|> Ecto.Changeset.unique_constraint([:record_set_id, :record_id])
|> Changeset.put_change(:record_set_id, record_set.id)
|> Changeset.put_change(:record_id, record_id)
|> Changeset.unique_constraint([:record_set_id, :record_id])
|> Repo.insert()
|> case do
{:ok, _item} -> {:ok, get_record_set!(record_set.id)}
@@ -182,11 +183,11 @@ defmodule MusicLibrary.RecordSets do
Repo.transaction(fn ->
item_a
|> Ecto.Changeset.change(position: item_b.position)
|> Changeset.change(position: item_b.position)
|> Repo.update!()
item_b
|> Ecto.Changeset.change(position: item_a.position)
|> Changeset.change(position: item_a.position)
|> Repo.update!()
end)
end
@@ -1,14 +1,15 @@
defmodule MusicLibrary.Worker.FetchArtistInfo do
use Oban.Worker, queue: :default, max_attempts: 3
alias MusicLibrary.Artists
alias MusicLibrary.Records.Similarity
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => artist_id}}) do
with {:ok, _artist_info} <- MusicLibrary.Artists.refresh_artist_info(artist_id),
{:ok, _artist_info} <- MusicLibrary.Artists.refresh_wikipedia_data(artist_id),
{:ok, _artist_info} <- MusicLibrary.Artists.refresh_image(artist_id),
{:ok, _artist_info} <- MusicLibrary.Artists.refresh_lastfm_data(artist_id) do
with {:ok, _artist_info} <- Artists.refresh_artist_info(artist_id),
{:ok, _artist_info} <- Artists.refresh_wikipedia_data(artist_id),
{:ok, _artist_info} <- Artists.refresh_image(artist_id),
{:ok, _artist_info} <- Artists.refresh_lastfm_data(artist_id) do
Similarity.regenerate_artist_embeddings(artist_id)
else
{:error, :no_english_wikipedia} -> {:cancel, :no_english_wikipedia}
@@ -1,12 +1,14 @@
defmodule MusicLibrary.Worker.RecordRefreshMusicBrainzData do
use Oban.Worker, queue: :music_brainz, max_attempts: 3
alias MusicLibrary.Records
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => record_id}}) do
record = MusicLibrary.Records.get_record!(record_id)
record = Records.get_record!(record_id)
with {:ok, updated_record} <- MusicLibrary.Records.refresh_musicbrainz_data(record) do
MusicLibrary.Records.notify_update(updated_record)
with {:ok, updated_record} <- Records.refresh_musicbrainz_data(record) do
Records.notify_update(updated_record)
end
end
end
+5 -3
View File
@@ -1,13 +1,15 @@
defmodule MusicLibrary.Worker.RefreshCover do
use Oban.Worker, queue: :heavy_writes, max_attempts: 3
alias MusicLibrary.Records
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => record_id}}) do
record = MusicLibrary.Records.get_record!(record_id)
record = Records.get_record!(record_id)
case MusicLibrary.Records.refresh_cover(record) do
case Records.refresh_cover(record) do
{:ok, updated_record} ->
MusicLibrary.Records.notify_update(updated_record)
Records.notify_update(updated_record)
{:error, :cover_not_available} ->
{:cancel, :cover_not_available}
+4 -3
View File
@@ -5,6 +5,7 @@ defmodule MusicLibraryWeb.Components.Chat do
alias MusicLibrary.Chats
alias MusicLibraryWeb.Markdown
alias Phoenix.LiveView
def open(id), do: Fluxon.open_dialog(id)
@@ -386,13 +387,13 @@ defmodule MusicLibraryWeb.Components.Chat do
Task.Supervisor.start_child(MusicLibrary.TaskSupervisor, fn ->
case chat_module.stream_response(stream_messages, chat_context, fn chunk ->
Phoenix.LiveView.send_update(parent_pid, __MODULE__,
LiveView.send_update(parent_pid, __MODULE__,
id: component_id,
chunk: chunk
)
end) do
:ok ->
Phoenix.LiveView.send_update(parent_pid, __MODULE__,
LiveView.send_update(parent_pid, __MODULE__,
id: component_id,
done: true
)
@@ -400,7 +401,7 @@ defmodule MusicLibraryWeb.Components.Chat do
{:error, reason} ->
Logger.error("Chat streaming error: #{reason}")
Phoenix.LiveView.send_update(parent_pid, __MODULE__,
LiveView.send_update(parent_pid, __MODULE__,
id: component_id,
error: gettext("Something went wrong. Please try again.")
)
+7 -5
View File
@@ -3,6 +3,8 @@ defmodule OpenAI.API do
Low-level HTTP client for the OpenAI API (chat completions, streaming responses, embeddings).
"""
alias Req.Request
require Logger
@spec gpt(OpenAI.Completion.t(), OpenAI.Config.t()) :: {:ok, map()} | {:error, term()}
@@ -52,9 +54,9 @@ defmodule OpenAI.API do
temperature: temperature
},
into: fn {:data, data}, {req, resp} ->
buffer = Req.Request.get_private(req, :sse_buffer, "")
buffer = Request.get_private(req, :sse_buffer, "")
{events, buffer} = ServerSentEvents.parse(buffer <> data)
req = Req.Request.put_private(req, :sse_buffer, buffer)
req = Request.put_private(req, :sse_buffer, buffer)
decode_events(events, cb, req, resp)
end
@@ -119,10 +121,10 @@ defmodule OpenAI.API do
base_url: "https://api.openai.com",
auth: {:bearer, config.api_key}
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :open_ai, cooldown: config.api_cooldown)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(log_error: &log_error/1)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
end
defp decode_responses_event(json, cb) do
+10 -8
View File
@@ -20,6 +20,8 @@ defmodule Req.RateLimiter do
Pass `:clock` in `attach/2` opts to override (useful in tests).
"""
alias Req.Request
@table __MODULE__
@default_clock Req.RateLimiter.SystemClock
@@ -44,25 +46,25 @@ defmodule Req.RateLimiter do
* `:clock` - module implementing `Req.RateLimiter.Clock` (default: `Req.RateLimiter.SystemClock`)
"""
@spec attach(Req.Request.t(), attach_opts()) :: Req.Request.t()
@spec attach(Request.t(), attach_opts()) :: Request.t()
def attach(request, opts) do
name = Keyword.fetch!(opts, :name)
cooldown = Keyword.fetch!(opts, :cooldown)
clock = Keyword.get(opts, :clock, @default_clock)
request
|> Req.Request.put_private(:rate_limiter_name, name)
|> Req.Request.put_private(:rate_limiter_cooldown, cooldown)
|> Req.Request.put_private(:rate_limiter_clock, clock)
|> Req.Request.prepend_request_steps(rate_limiter: &throttle/1)
|> Request.put_private(:rate_limiter_name, name)
|> Request.put_private(:rate_limiter_cooldown, cooldown)
|> Request.put_private(:rate_limiter_clock, clock)
|> Request.prepend_request_steps(rate_limiter: &throttle/1)
end
defp throttle(request) do
cooldown = Req.Request.get_private(request, :rate_limiter_cooldown)
cooldown = Request.get_private(request, :rate_limiter_cooldown)
if cooldown > 0 do
name = Req.Request.get_private(request, :rate_limiter_name)
clock = Req.Request.get_private(request, :rate_limiter_clock)
name = Request.get_private(request, :rate_limiter_name)
clock = Request.get_private(request, :rate_limiter_clock)
now = clock.now()
case :ets.lookup(@table, name) do
+5 -3
View File
@@ -3,6 +3,8 @@ defmodule Wikipedia.API do
Interface to the Wikidata and Wikipedia APIs.
"""
alias Req.Request
require Logger
@spec get_wikipedia_title(String.t(), Wikipedia.Config.t()) ::
@@ -75,10 +77,10 @@ defmodule Wikipedia.API do
max_retries: 1,
user_agent: config.user_agent
)
|> Req.Request.merge_options(config.req_options)
|> Request.merge_options(config.req_options)
|> Req.RateLimiter.attach(name: :wikipedia, cooldown: config.api_cooldown)
|> Req.Request.append_request_steps(log_attempt: &log_attempt/1)
|> Req.Request.append_response_steps(log_error: &log_error/1)
|> Request.append_request_steps(log_attempt: &log_attempt/1)
|> Request.append_response_steps(log_error: &log_error/1)
end
defp get_request(request) do