Skip to content

Commit

Permalink
Strict type logger formats
Browse files Browse the repository at this point in the history
  • Loading branch information
markhallen committed Feb 5, 2025
1 parent 3508888 commit f4ce410
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 9 deletions.
28 changes: 19 additions & 9 deletions updater/lib/dependabot/logger/formats.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# typed: true
# typed: strong
# frozen_string_literal: true

require "logger"
Expand All @@ -10,19 +10,31 @@ module Logger
TIME_FORMAT = "%Y/%m/%d %H:%M:%S"

class BasicFormatter < ::Logger::Formatter
extend T::Sig

sig do
params(severity: String, _datetime: T.nilable(Time), _progname: T.nilable(String), msg: T.nilable(String))
.returns(String)
end
def call(severity, _datetime, _progname, msg)
"#{Time.now.strftime(TIME_FORMAT)} #{severity} #{msg2str(msg)}\n"
end
end

class JobFormatter < ::Logger::Formatter
extend T::Sig
CLI_ID = "cli"
UNKNOWN_ID = "unknown_id"

sig { params(job_id: T.nilable(String)).void }
def initialize(job_id)
@job_id = job_id
end

sig do
params(severity: String, _datetime: T.nilable(Time), _progname: T.nilable(String), msg: T.nilable(String))
.returns(String)
end
def call(severity, _datetime, _progname, msg)
[
Time.now.strftime(TIME_FORMAT),
Expand All @@ -34,15 +46,13 @@ def call(severity, _datetime, _progname, msg)

private

sig { returns(T.nilable(String)) }
def job_prefix
return @job_prefix if defined? @job_prefix
# The dependabot/cli tool uses a placeholder value since it does not
# have an actual Job ID issued by the service.
#
# Let's just omit the prefix if this is the case.
return @job_prefix = nil if @job_id == CLI_ID

@job_prefix = "<job_#{@job_id || UNKNOWN_ID}>"
@job_prefix ||= T.let(begin
return nil if @job_id == CLI_ID

"<job_#{@job_id || UNKNOWN_ID}>"
end, T.nilable(String))
end
end
end
Expand Down
23 changes: 23 additions & 0 deletions updater/spec/dependabot/logger/basic_formatter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# typed: true
# frozen_string_literal: true

require "spec_helper"
require "dependabot/logger/formats"

RSpec.describe Dependabot::Logger::BasicFormatter do
describe "#call" do
it "returns a formatted log line" do
formatter = described_class.new
log_line = formatter.call("INFO", Time.now, "progname", "msg")

expect(log_line).to match(%r{\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} INFO msg\n})
end

it "returns a formatted log line with only a severity" do
formatter = described_class.new
log_line = formatter.call("ERROR", nil, nil, nil)

expect(log_line).to match(%r{\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} ERROR nil\n})
end
end
end
50 changes: 50 additions & 0 deletions updater/spec/dependabot/logger/job_formatter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# typed: true
# frozen_string_literal: true

require "spec_helper"
require "dependabot/logger/formats"

RSpec.describe Dependabot::Logger::JobFormatter do
describe "#new" do
it "returns a formatter when provided a job_id" do
formatter = described_class.new("job_id")
expect(formatter).to be_a(described_class)
end

it "returns a formatter when provided a nil job_id" do
formatter = described_class.new(nil)
expect(formatter).to be_a(described_class)
end
end

describe "#call" do
let(:job_id) { "job_id" }
let(:formatter) { described_class.new(job_id) }

it "returns a formatted log line with a job_id" do
log_line = formatter.call("INFO", Time.now, "progname", "msg")

expect(log_line).to match(%r{\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} INFO <job_job_id> msg\n})
end

it "returns a formatted log line with a nil job_id" do
formatter = described_class.new(nil)
log_line = formatter.call("INFO", Time.now, "progname", "msg")

expect(log_line).to match(%r{\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} INFO <job_unknown_id> msg\n})
end

it "returns a formatted log line with only a severity" do
log_line = formatter.call("ERROR", nil, nil, nil)

expect(log_line).to match(%r{\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} ERROR <job_job_id> nil\n})
end

it "returns a formatted log line when using the CLI" do
formatter = described_class.new("cli")
log_line = formatter.call("ERROR", nil, nil, nil)

expect(log_line).to match(%r{\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} ERROR nil\n})
end
end
end

0 comments on commit f4ce410

Please sign in to comment.