Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ jobs:
strategy:
fail-fast: false
matrix:
ruby: ['3.1', '3.2', '3.3']
gemfile: ['Gemfile', 'Gemfile.oldgems', 'Gemfile.sentry']
ruby: ['3.2', '3.3', '3.4']
gemfile: ['Gemfile', 'Gemfile.sentry']
runs-on: ubuntu-latest
env:
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
Expand All @@ -33,4 +33,8 @@ jobs:
run: bundle exec rubocop
- name: Run specs
run: bundle exec rspec spec/

- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: lithictech/appydays
13 changes: 7 additions & 6 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
require:
plugins:
- rubocop-performance
- rubocop-rake
- rubocop-sequel

AllCops:
TargetRubyVersion: 3.1
TargetRubyVersion: 3.2
NewCops: enable
SuggestExtensions: false

Gemspec/DevelopmentDependencies:
Enabled: false

Layout/ParameterAlignment:
EnforcedStyle: with_fixed_indentation
Layout/CaseIndentation:
Expand Down Expand Up @@ -68,15 +71,13 @@ Lint/UselessAssignment:
# https://rubocop.readthedocs.io/en/latest/cops_naming/
Naming/AccessorMethodName:
Enabled: false
Naming/PredicateName:
Naming/PredicatePrefix:
Exclude:
- 'spec/**/*'
- 'lib/appydays/spec_helpers.rb'
Naming/MethodParameterName:
Enabled: false

Sequel/ColumnDefault:
Enabled: false
Sequel/ConcurrentIndex:
Enabled: false

Expand All @@ -96,7 +97,7 @@ Style/Documentation:
Style/FormatString:
EnforcedStyle: percent
Style/NumericPredicate:
IgnoredMethods: ['where']
AllowedMethods: ['where']
Style/RedundantReturn:
Enabled: false
Style/RedundantSelf:
Expand Down
6 changes: 0 additions & 6 deletions Gemfile.oldgems

This file was deleted.

8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,9 +220,9 @@ end

```rb
require 'appydays/loggable/sidekiq_job_logger'
Sidekiq.logger = Appydays::Loggable::SidekiqJobLogger.logger
Sidekiq.configure_server do |config|
config.options[:job_logger] = Appydays::Loggable::SidekiqJobLogger::JobLogger
config.logger = Appydays::Loggable::SidekiqJobLogger.logger # Or whatever Loggable logger you like
config[:job_logger] = Appydays::Loggable::SidekiqJobLogger::JobLogger
# We do NOT want the unstructured default error handler
config.error_handlers.replace([Appydays::Loggable::SidekiqJobLogger::JobLogger.method(:error_handler)])
config.death_handlers << Appydays::Loggable::SidekiqJobLogger::JobLogger.method(:death_handler)
Expand All @@ -244,9 +244,9 @@ class AppJobLogger < Appydays::Loggable::SidekiqJobLogger
end
end

Sidekiq.logger = AppJobLogger.logger
Sidekiq.configure_server do |config|
config.options[:job_logger] = AppJobLogger::JobLogger
config.logger = AppJobLogger.logger
config[:job_logger] = AppJobLogger
# We do NOT want the unstructured default error handler
config.error_handlers.replace([AppJobLogger::JobLogger.method(:error_handler)])
config.death_handlers << AppJobLogger::JobLogger.method(:death_handler)
Expand Down
16 changes: 8 additions & 8 deletions appydays.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,26 @@ Gem::Specification.new do |s|
s.author = "Lithic Tech"
s.homepage = "https://github.com/lithictech/appydays"
s.licenses = "MIT"
s.required_ruby_version = ">= 3.1.0"
s.required_ruby_version = ">= 3.2.0"
s.description = <<~DESC
appydays provides support for env-based configuration, and common structured logging capabilities
DESC
s.files = Dir["lib/**/*.rb"]
s.add_dependency("dotenv", "~> 2.7")
s.add_dependency("dotenv", "~> 3.1")
s.add_dependency("semantic_logger", "~> 4.6")
s.add_development_dependency("httparty", "~> 0.20")
s.add_development_dependency("monetize", "~> 1.0")
s.add_development_dependency("money", "~> 6.0")
s.add_development_dependency("rack", "~> 2.2")
s.add_development_dependency("rack", "~> 3.1")
s.add_development_dependency("rspec", "~> 3.10")
s.add_development_dependency("rspec-core", "~> 3.10")
s.add_development_dependency("rspec-json_expectations", "~> 2.2")
s.add_development_dependency("rubocop", "~> 1.31.1")
s.add_development_dependency("rubocop-performance", "~> 1.14.2")
s.add_development_dependency("rubocop-rake", "~> 0.6.0")
s.add_development_dependency("rubocop-sequel", "~> 0.3.4")
s.add_development_dependency("rubocop", "~> 1.77.0")
s.add_development_dependency("rubocop-performance", "~> 1.25.0")
s.add_development_dependency("rubocop-rake", "~> 0.7.1")
s.add_development_dependency("rubocop-sequel", "~> 0.4.1")
s.add_development_dependency("sequel", "~> 5.0")
s.add_development_dependency("sidekiq", "~> 6.0")
s.add_development_dependency("sidekiq", "~> 8.0")
s.add_development_dependency("simplecov", "~> 0.22")
s.add_development_dependency("webmock", "~> 3.1")
s.metadata["rubygems_mfa_required"] = "true"
Expand Down
12 changes: 6 additions & 6 deletions lib/appydays/configurable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def setting(name, default, key: nil, convert: nil, side_effect: nil)
@target.define_singleton_method(name) do
self.class_variable_get("@@#{name}")
end
@target.define_singleton_method("#{name}=".to_sym) do |v|
@target.define_singleton_method(:"#{name}=") do |v|
installer._set_value(name, v, side_effect)
end

Expand Down Expand Up @@ -136,10 +136,10 @@ def after_configured(&block)
def _converter(default, converter)
return converter if converter

return ->(v) { v.to_s } if default.nil? || default.is_a?(String)
return ->(v) { v.to_i } if default.is_a?(Integer)
return ->(v) { v.to_f } if default.is_a?(Float)
return ->(v) { v.to_sym } if default.is_a?(Symbol)
return lambda(&:to_s) if default.nil? || default.is_a?(String)
return lambda(&:to_i) if default.is_a?(Integer)
return lambda(&:to_f) if default.is_a?(Float)
return lambda(&:to_sym) if default.is_a?(Symbol)
return ->(v) { v.casecmp("true").zero? } if [TrueClass, FalseClass].include?(default.class)
raise TypeError, "Uncoercable type %p" % [default.class]
end
Expand All @@ -161,7 +161,7 @@ def _run_after_configured
def _reset(overrides)
@settings.each do |k, v|
real_v = overrides.fetch(k, v)
@target.send("#{k}=".to_sym, real_v)
@target.send(:"#{k}=", real_v)
end
self._run_after_configured
end
Expand Down
2 changes: 1 addition & 1 deletion lib/appydays/dotenviable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def self.load(rack_env: nil, default_rack_env: "development", env: ENV)
".env",
]
orig_env = nil
if env.object_id != ENV.object_id
unless env.equal?(ENV)
orig_env = ENV.to_h
ENV.replace(env)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/appydays/loggable/request_logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def call(env)
status, header, body = SemanticLogger.named_tagged(request_id:) do
@app.call(env)
end
header = Rack::Utils::HeaderHash.new(header)
header = Rack::Headers[header]
body = Rack::BodyProxy.new(body) { self.log_finished(env, began_at, status, header) }
[status, header, body]
rescue StandardError => e
Expand Down
19 changes: 6 additions & 13 deletions lib/appydays/loggable/sidekiq_job_logger.rb
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
# frozen_string_literal: true

require "sidekiq"
require "sidekiq/version"
require "sidekiq/component"
require "sidekiq/job_logger"
require "sidekiq/version"

require "appydays/loggable"
require "appydays/configurable"

class Appydays::Loggable::SidekiqJobLogger < Sidekiq::JobLogger
include Appydays::Configurable
include Appydays::Loggable
begin
require "sidekiq/util"
include Sidekiq::Util
rescue LoadError
require "sidekiq/component"
include Sidekiq::Component
end

Sidekiq.logger = self.logger
include Sidekiq::Component

# Level to log 'job_done' messages at.
# Defaults to +:info+.
Expand Down Expand Up @@ -47,9 +40,9 @@ def call(item, _queue, &)
yield
duration = self.elapsed(start)
log_method = if duration >= self.slow_job_seconds
(self.log_level_slow_job || :warn)
self.log_level_slow_job || :warn
else
(self.log_level_job_done || :info)
self.log_level_job_done || :info
end
self.logger.send(log_method, "job_done", duration: duration * 1000, **extra_tags, **self.class.job_tags)
rescue StandardError
Expand Down Expand Up @@ -80,7 +73,7 @@ def self.set_job_tags(tags)

def self.job_tags = Thread.current[:appydays_sidekiq_job_logger_job_tags] || {}

def self.error_handler(ex, ctx)
def self.error_handler(ex, ctx, _config)
# ctx looks like:
# {
# :context=>"Job raised exception",
Expand Down
2 changes: 1 addition & 1 deletion lib/appydays/loggable/spec_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def self.included(context)
# Appydays::Loggable.ensure_stderr_appender

context.around(:each) do |example|
override_level = (example.metadata[:log] || example.metadata[:logging])
override_level = example.metadata[:log] || example.metadata[:logging]
if override_level
orig_level = SemanticLogger.default_level
SemanticLogger.default_level = override_level
Expand Down
20 changes: 20 additions & 0 deletions spec/appydays/loggable/httparty_formatter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# frozen_string_literal: true

require "appydays/loggable/httparty_formatter"

RSpec.describe "HTTParty formatter" do
it "logs structured request information" do
logger = SemanticLogger["http_spec_logging_test"]
stub_request(:post, "https://foo/bar").to_return(status: 200, body: "")
logs = capture_logs_from(logger, formatter: :json) do
HTTParty.post("https://foo/bar", body: {x: 1}, logger:, log_format: :appydays)
end
expect(logs).to contain_exactly(
include_json(
"message" => "httparty_request",
"level" => "info",
"context" => include("http_method" => "POST"),
),
)
end
end
Loading