From 4a717d3ee7fabe53d5065cb3e90cf38588716655 Mon Sep 17 00:00:00 2001 From: Alexey Savin Date: Wed, 10 Jun 2026 16:16:23 +0200 Subject: [PATCH] Support day/hour/minute unit conversion in numeric settings --- lib/fino/settings/numeric.rb | 55 +++++++++++++++++++++++++----- spec/fino/settings/numeric_spec.rb | 46 +++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 8 deletions(-) diff --git a/lib/fino/settings/numeric.rb b/lib/fino/settings/numeric.rb index 1fac4a7..16bdc6a 100644 --- a/lib/fino/settings/numeric.rb +++ b/lib/fino/settings/numeric.rb @@ -47,17 +47,56 @@ def base_factor end end + class Minutes < Generic + include Time + + def initialize = super("Minutes", "min") + + def base_factor + 60 + end + end + + class Hours < Generic + include Time + + def initialize = super("Hours", "hour") + + def base_factor + 3600 + end + end + + class Days < Generic + include Time + + def initialize = super("Days", "day") + + def base_factor + 86_400 + end + end + + UNITS = { + "ms" => Milliseconds, + "milliseconds" => Milliseconds, + "sec" => Seconds, + "seconds" => Seconds, + "min" => Minutes, + "minutes" => Minutes, + "hour" => Hours, + "hours" => Hours, + "day" => Days, + "days" => Days + }.freeze + module_function def for(identifier) - case identifier.to_s - when "ms", "milliseconds" - Milliseconds.new - when "sec", "seconds" - Seconds.new - else - Generic.new(identifier.to_s.capitalize) - end + klass = UNITS[identifier.to_s] + return klass.new if klass + + Generic.new(identifier.to_s.capitalize) end end diff --git a/spec/fino/settings/numeric_spec.rb b/spec/fino/settings/numeric_spec.rb index f126f98..892b4b0 100644 --- a/spec/fino/settings/numeric_spec.rb +++ b/spec/fino/settings/numeric_spec.rb @@ -21,6 +21,30 @@ expect(described_class.for("seconds")).to be_a(described_class::Seconds) end + it "returns Minutes for 'min'" do + expect(described_class.for("min")).to be_a(described_class::Minutes) + end + + it "returns Minutes for 'minutes'" do + expect(described_class.for("minutes")).to be_a(described_class::Minutes) + end + + it "returns Hours for 'hour'" do + expect(described_class.for("hour")).to be_a(described_class::Hours) + end + + it "returns Hours for 'hours'" do + expect(described_class.for("hours")).to be_a(described_class::Hours) + end + + it "returns Days for 'day'" do + expect(described_class.for("day")).to be_a(described_class::Days) + end + + it "returns Days for 'days'" do + expect(described_class.for("days")).to be_a(described_class::Days) + end + it "returns Generic for unknown identifiers" do unit = described_class.for("requests") expect(unit).to be_a(described_class::Generic) @@ -40,6 +64,7 @@ setting :http_read_timeout, :integer, default: 200, unit: :ms setting :http_open_timeout, :integer, default: 1, unit: :sec setting :max_retries, :integer, default: 3 + setting :cleanup_interval, :integer, default: 30, unit: :day end section :rates do @@ -90,6 +115,27 @@ expect(setting.value(unit: :ms)).to eq(500.0) end end + + context "when converting days to seconds" do + it "converts correctly" do + setting = Fino.setting(:cleanup_interval, at: :integration) + expect(setting.value(unit: :sec)).to eq(2_592_000) + end + end + + context "when converting days to hours" do + it "converts correctly" do + setting = Fino.setting(:cleanup_interval, at: :integration) + expect(setting.value(unit: :hours)).to eq(720) + end + end + + context "when converting days to minutes" do + it "converts correctly" do + setting = Fino.setting(:cleanup_interval, at: :integration) + expect(setting.value(unit: :minutes)).to eq(43_200) + end + end end describe "error handling" do