Refactored fetchers namespace as fetcher (singular)

Clarifies this namespace is for a single entity (and associated objects).

Milestone: patch
This commit is contained in:
Brooke Kuhlmann
2026-08-04 16:05:18 -06:00
parent 24d8672f41
commit 05f85c4093
12 changed files with 50 additions and 51 deletions
+1 -1
View File
@@ -40,7 +40,7 @@ Metrics/MethodLength:
- config/initializers/universal_logger_patch.rb
Metrics/ParameterLists:
Exclude:
- app/aspects/extensions/fetchers/request.rb
- app/aspects/extensions/fetcher/request.rb
- app/aspects/screens/placeholder.rb
Naming/VariableNumber:
AllowedPatterns:
+2 -3
View File
@@ -69,7 +69,7 @@ detectors:
- Terminus::Aspects::Errors::Problem#enum
- Terminus::Aspects::Extensions::Cloner#build_attributes
- Terminus::Aspects::Extensions::Exchanges::Refresher#fetch
- Terminus::Aspects::Extensions::Fetchers::Client#maybe_alter_mime_type
- Terminus::Aspects::Extensions::Fetcher::Client#maybe_alter_mime_type
- Terminus::Aspects::Extensions::Importers::Remote::Extractor#build
- Terminus::Aspects::Extensions::Importers::Remote::Transformers::Kind#process
- Terminus::Aspects::Extensions::Renderers::Image#render_multiple
@@ -107,8 +107,7 @@ detectors:
- Terminus::Actions::Extensions::Poll::Show#fetch
- Terminus::Aspects::Croner#call
- Terminus::Aspects::Extensions::Exchanges::RequestBuilder#render
- Terminus::Aspects::Extensions::Fetchers::Client#parse
- Terminus::Aspects::Extensions::Fetchers::Client#process
- Terminus::Aspects::Extensions::Fetcher::Client#parse
- Terminus::Aspects::Extensions::Importers::Remote::Transformer#process
- Terminus::Aspects::Extensions::Parser#from_json
- Terminus::Aspects::Firmware::Downloader#get
@@ -10,12 +10,12 @@ module Terminus
# Updates an exchange based on multiple responses.
class Refresher
include Deps[
"aspects.extensions.fetchers.client",
"aspects.extensions.fetcher.client",
"aspects.extensions.exchanges.request_builder",
extension_repository: "repositories.extension",
exchange_repository: "repositories.extension_exchange"
]
include Initable[request: Fetchers::Request]
include Initable[request: Fetcher::Request]
include Dry::Monads[:result]
def call exchange
@@ -9,7 +9,7 @@ module Terminus
# Builds fully rendereed requests.
class RequestBuilder
include Deps["aspects.extensions.contextualizer", renderer: "liquid.basic"]
include Initable[request: Fetchers::Request]
include Initable[request: Fetcher::Request]
def call exchange, extension
context = contextualizer.call extension
@@ -6,8 +6,8 @@ require "initable"
module Terminus
module Aspects
module Extensions
module Fetchers
# A client for processing HTTP requests.
module Fetcher
# A specialized client for processing HTTP requests.
class Client
include Deps[:http]
include Initable[source: Extensions::Source, special_header: "Accept", response: Response]
@@ -5,7 +5,7 @@ require "core"
module Terminus
module Aspects
module Extensions
module Fetchers
module Fetcher
# Captures HTTP request details.
Request = Data.define :headers, :verb, :uri, :body do
def initialize uri:, headers: Core::EMPTY_HASH, verb: "get", body: Core::EMPTY_HASH
@@ -5,8 +5,8 @@ require "core"
module Terminus
module Aspects
module Extensions
module Fetchers
# Captures the HTTP response details.
module Fetcher
# Captures HTTP response details.
Response = Data.define :data, :errors do
def initialize data: {}, errors: {}
super
@@ -5,7 +5,7 @@ require "hanami_helper"
RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
subject(:refresher) { described_class.new client: }
let(:client) { instance_double Terminus::Aspects::Extensions::Fetchers::Client }
let(:client) { instance_double Terminus::Aspects::Extensions::Fetcher::Client }
describe "#call" do
let(:exchange) { Factory[:extension_exchange] }
@@ -13,7 +13,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
it "answers success with data and no errors" do
allow(client).to receive(:call).and_return(
Success(
Terminus::Aspects::Extensions::Fetchers::Response[data: "test"]
Terminus::Aspects::Extensions::Fetcher::Response[data: "test"]
)
)
@@ -25,7 +25,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
it "answers success with errors only" do
allow(client).to receive(:call).and_return(
Failure(
Terminus::Aspects::Extensions::Fetchers::Response[errors: "Danger!"]
Terminus::Aspects::Extensions::Fetcher::Response[errors: "Danger!"]
)
)
@@ -43,7 +43,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
exchange = Factory[:extension_exchange, data: {"source_1" => "initial"}]
allow(client).to receive(:call).and_return(
Failure(Terminus::Aspects::Extensions::Fetchers::Response[errors: "Danger!"])
Failure(Terminus::Aspects::Extensions::Fetcher::Response[errors: "Danger!"])
)
expect(refresher.call(exchange)).to match(
@@ -60,8 +60,8 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
exchange = Factory[:extension_exchange, template: "https://one.io\nhttps://two.io"]
allow(client).to receive(:call).and_return(
Failure(Terminus::Aspects::Extensions::Fetchers::Response[errors: "Danger!"]),
Success(Terminus::Aspects::Extensions::Fetchers::Response[data: "pass"])
Failure(Terminus::Aspects::Extensions::Fetcher::Response[errors: "Danger!"]),
Success(Terminus::Aspects::Extensions::Fetcher::Response[data: "pass"])
)
expect(refresher.call(exchange)).to match(
@@ -89,7 +89,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::Refresher, :db do
it "answers an exchange" do
allow(client).to receive(:call).and_return(
Success(Terminus::Aspects::Extensions::Fetchers::Response[data: "test"])
Success(Terminus::Aspects::Extensions::Fetcher::Response[data: "test"])
)
expect(refresher.call(exchange)).to match(
@@ -22,7 +22,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::RequestBuilder do
exchange = Factory.structs[:extension_exchange]
expect(builder.call(exchange, extension)).to contain_exactly(
Terminus::Aspects::Extensions::Fetchers::Request[uri: exchange.template]
Terminus::Aspects::Extensions::Fetcher::Request[uri: exchange.template]
)
end
@@ -30,7 +30,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::RequestBuilder do
exchange = Factory.structs[:extension_exchange, headers: nil, body: nil]
expect(builder.call(exchange, extension)).to contain_exactly(
Terminus::Aspects::Extensions::Fetchers::Request[uri: exchange.template]
Terminus::Aspects::Extensions::Fetcher::Request[uri: exchange.template]
)
end
@@ -55,7 +55,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::RequestBuilder do
exchange = Factory.structs[:extension_exchange, body:]
expect(builder.call(exchange, extension)).to contain_exactly(
Terminus::Aspects::Extensions::Fetchers::Request[uri: exchange.template, body:]
Terminus::Aspects::Extensions::Fetcher::Request[uri: exchange.template, body:]
)
end
@@ -69,7 +69,7 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::RequestBuilder do
]
expect(builder.call(exchange, extension)).to contain_exactly(
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {"content_type" => "application/json"},
verb: "post",
uri: "https://test.io/1",
@@ -90,13 +90,13 @@ RSpec.describe Terminus::Aspects::Extensions::Exchanges::RequestBuilder do
expect(builder.call(exchange, extension)).to eq(
[
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {"content_type" => "application/json"},
verb: "post",
uri: "https://test.io/1",
body: {"sort" => "desc"}
],
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {"content_type" => "application/json"},
verb: "post",
uri: "https://test.io/2",
@@ -3,7 +3,7 @@
require "hanami_helper"
require "http"
RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
RSpec.describe Terminus::Aspects::Extensions::Fetcher::Client do
subject(:client) { described_class.new http: }
let(:http) { class_double HTTP }
@@ -12,7 +12,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
describe "#call" do
let :input do
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {"Accept" => "application/json"},
uri: "https://ghibliapi.vercel.app/films"
]
@@ -35,7 +35,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
it "answers success" do
expect(client.call(input)).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: [
{
"title" => "Castle in the Sky",
@@ -70,7 +70,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/ld+json"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {
"@context" => "https://json-ld.org/contexts/person.jsonld",
"@id" => "http://dbpedia.org/resource/John_Lennon",
@@ -110,7 +110,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/geo+json"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {
"@context" => [
"https://geojson.org/geojson-ld/geojson-context.jsonld",
@@ -148,7 +148,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
)
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: [
{
"title" => "Castle in the Sky",
@@ -179,7 +179,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/+json"})
expect(result).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -203,7 +203,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
it "answers success" do
result = client.call input.with(headers: {content_type: "image/png"})
expect(result).to be_success(Terminus::Aspects::Extensions::Fetchers::Response.new)
expect(result).to be_success(Terminus::Aspects::Extensions::Fetcher::Response.new)
end
end
@@ -226,7 +226,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "text/csv"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: [
{
"title" => "Castle in the Sky",
@@ -258,7 +258,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "text/plain"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: %w[one two three]
]
)
@@ -284,7 +284,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "text/xml"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {"catalog" => "Empty"}
]
)
@@ -310,7 +310,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/xml"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {"catalog" => "Empty"}
]
)
@@ -336,7 +336,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/rss+xml"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {"catalog" => "Empty"}
]
)
@@ -362,7 +362,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "application/atom+xml"})
expect(result).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {"catalog" => "Empty"}
]
)
@@ -371,7 +371,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
context "with POST body" do
let :input do
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {content_type: "application/json"},
verb: :post,
uri: "https://test.io",
@@ -395,7 +395,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
it "answers success" do
expect(client.call(input)).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
data: {"name" => "test"}
]
)
@@ -404,7 +404,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
context "with POST but without body" do
let :input do
Terminus::Aspects::Extensions::Fetchers::Request[
Terminus::Aspects::Extensions::Fetcher::Request[
headers: {content_type: "application/json"},
verb: :post,
uri: "https://test.io"
@@ -427,7 +427,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
it "answers success" do
expect(client.call(input)).to be_success(
Terminus::Aspects::Extensions::Fetchers::Response[data: "{}"]
Terminus::Aspects::Extensions::Fetcher::Response[data: "{}"]
)
end
end
@@ -446,7 +446,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
result = client.call input.with(headers: {content_type: "text/html"})
expect(result).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -470,7 +470,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
it "answers failure" do
expect(client.call(input)).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: 404,
@@ -489,7 +489,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
allow(http).to receive(:headers).and_raise HTTP::RequestError, "Danger!"
expect(client.call(input)).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -508,7 +508,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
allow(http).to receive(:headers).and_raise HTTP::ConnectionError, "Danger!"
expect(client.call(input)).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -527,7 +527,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
allow(http).to receive(:headers).and_raise HTTP::TimeoutError, "Danger!"
expect(client.call(input)).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -546,7 +546,7 @@ RSpec.describe Terminus::Aspects::Extensions::Fetchers::Client do
allow(http).to receive(:headers).and_raise OpenSSL::SSL::SSLError, "Danger!"
expect(client.call(input)).to be_failure(
Terminus::Aspects::Extensions::Fetchers::Response[
Terminus::Aspects::Extensions::Fetcher::Response[
errors: {
uri: "https://ghibliapi.vercel.app/films",
code: nil,
@@ -2,7 +2,7 @@
require "hanami_helper"
RSpec.describe Terminus::Aspects::Extensions::Fetchers::Request do
RSpec.describe Terminus::Aspects::Extensions::Fetcher::Request do
subject(:input) { described_class.new uri: "https://test.io" }
describe "#initialize" do
@@ -2,7 +2,7 @@
require "hanami_helper"
RSpec.describe Terminus::Aspects::Extensions::Fetchers::Response do
RSpec.describe Terminus::Aspects::Extensions::Fetcher::Response do
subject(:response) { described_class.new }
describe "#initialize" do