From 3b2ebd5669698110b0dd887f27987b0ccb04d885 Mon Sep 17 00:00:00 2001 From: Nicolas Rodriguez Date: Mon, 2 Mar 2026 03:27:11 +0100 Subject: [PATCH 1/3] Move dev dependencies to Gemfile --- Gemfile | 7 +++++++ grape_logging.gemspec | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 38f11f1..ff8baf9 100644 --- a/Gemfile +++ b/Gemfile @@ -2,3 +2,10 @@ source 'https://rubygems.org' # Specify your gem's dependencies in grape_logging.gemspec gemspec + +gem 'rake', '~> 13.3' +gem 'rspec', '~> 3.5' + +# This is pinned to an exact version otherwise we can't know which rules +# are in play at any given time in different environments. +gem 'rubocop', '1.77.0' diff --git a/grape_logging.gemspec b/grape_logging.gemspec index 455251f..cc37233 100644 --- a/grape_logging.gemspec +++ b/grape_logging.gemspec @@ -22,11 +22,4 @@ Gem::Specification.new do |spec| spec.add_dependency 'grape', '>= 2.4.0' spec.add_dependency 'rack' - - spec.add_development_dependency 'rake', '~> 13.3' - spec.add_development_dependency 'rspec', '~> 3.5' - - # This is pinned to an exact version otherwise we can't know which rules - # are in play at any given time in different environments. - spec.add_development_dependency 'rubocop', '1.77.0' end From df56d571b7a0406751766deaf8f413eb5866d432 Mon Sep 17 00:00:00 2001 From: Nicolas Rodriguez Date: Mon, 2 Mar 2026 03:32:41 +0100 Subject: [PATCH 2/3] Use zeitwerk to load gem --- grape_logging.gemspec | 1 + lib/grape_logging.rb | 29 ++- lib/grape_logging/formatters/rails.rb | 2 - .../loggers/filter_parameters.rb | 2 +- .../middleware/request_logger.rb | 2 - .../reporters/active_support_reporter.rb | 16 +- .../reporters/logger_reporter.rb | 20 +- lib/grape_logging/util/parameter_filter.rb | 188 +++++++++--------- 8 files changed, 130 insertions(+), 130 deletions(-) diff --git a/grape_logging.gemspec b/grape_logging.gemspec index cc37233..cf66d5e 100644 --- a/grape_logging.gemspec +++ b/grape_logging.gemspec @@ -22,4 +22,5 @@ Gem::Specification.new do |spec| spec.add_dependency 'grape', '>= 2.4.0' spec.add_dependency 'rack' + spec.add_dependency 'zeitwerk' end diff --git a/lib/grape_logging.rb b/lib/grape_logging.rb index aa0c457..1770788 100644 --- a/lib/grape_logging.rb +++ b/lib/grape_logging.rb @@ -1,17 +1,12 @@ -require 'grape_logging/multi_io' -require 'grape_logging/version' -require 'grape_logging/formatters/default' -require 'grape_logging/formatters/json' -require 'grape_logging/formatters/lograge' -require 'grape_logging/formatters/logstash' -require 'grape_logging/formatters/rails' -require 'grape_logging/loggers/base' -require 'grape_logging/loggers/response' -require 'grape_logging/loggers/filter_parameters' -require 'grape_logging/loggers/client_env' -require 'grape_logging/loggers/request_headers' -require 'grape_logging/reporters/active_support_reporter' -require 'grape_logging/reporters/logger_reporter' -require 'grape_logging/timings' -require 'grape_logging/middleware/request_logger' -require 'grape_logging/util/parameter_filter' +require 'grape' +require 'rack/utils' +require 'zeitwerk' + +# load zeitwerk +Zeitwerk::Loader.for_gem.tap do |loader| + loader.inflector.inflect 'multi_io' => 'MultiIO' + loader.setup +end + +module GrapeLogging +end diff --git a/lib/grape_logging/formatters/rails.rb b/lib/grape_logging/formatters/rails.rb index fdcaab8..2305feb 100644 --- a/lib/grape_logging/formatters/rails.rb +++ b/lib/grape_logging/formatters/rails.rb @@ -1,5 +1,3 @@ -require 'rack/utils' - module GrapeLogging module Formatters class Rails diff --git a/lib/grape_logging/loggers/filter_parameters.rb b/lib/grape_logging/loggers/filter_parameters.rb index c5f0870..cfa6860 100644 --- a/lib/grape_logging/loggers/filter_parameters.rb +++ b/lib/grape_logging/loggers/filter_parameters.rb @@ -16,7 +16,7 @@ module GrapeLogging private def parameter_filter - @parameter_filter ||= ParameterFilter.new(@replacement, @filter_parameters) + @parameter_filter ||= GrapeLogging::Util::ParameterFilter.new(@replacement, @filter_parameters) end def safe_parameters(request) diff --git a/lib/grape_logging/middleware/request_logger.rb b/lib/grape_logging/middleware/request_logger.rb index 9c8a351..7d61b91 100644 --- a/lib/grape_logging/middleware/request_logger.rb +++ b/lib/grape_logging/middleware/request_logger.rb @@ -1,5 +1,3 @@ -require 'grape' - module GrapeLogging module Middleware class RequestLogger < Grape::Middleware::Base diff --git a/lib/grape_logging/reporters/active_support_reporter.rb b/lib/grape_logging/reporters/active_support_reporter.rb index e48ce3e..cd548b0 100644 --- a/lib/grape_logging/reporters/active_support_reporter.rb +++ b/lib/grape_logging/reporters/active_support_reporter.rb @@ -1,11 +1,13 @@ -module Reporters - class ActiveSupportReporter - def initialize(instrumentation_key) - @instrumentation_key = instrumentation_key - end +module GrapeLogging + module Reporters + class ActiveSupportReporter + def initialize(instrumentation_key) + @instrumentation_key = instrumentation_key + end - def perform(params) - ActiveSupport::Notifications.instrument @instrumentation_key, params + def perform(params) + ActiveSupport::Notifications.instrument @instrumentation_key, params + end end end end diff --git a/lib/grape_logging/reporters/logger_reporter.rb b/lib/grape_logging/reporters/logger_reporter.rb index 422aa92..97da2c2 100644 --- a/lib/grape_logging/reporters/logger_reporter.rb +++ b/lib/grape_logging/reporters/logger_reporter.rb @@ -1,13 +1,15 @@ -module Reporters - class LoggerReporter - def initialize(logger, formatter, log_level) - @logger = logger.clone || Logger.new(STDOUT) - @log_level = log_level || :info - @logger.formatter = formatter || @logger.formatter || GrapeLogging::Formatters::Default.new if @logger.respond_to?(:formatter=) - end +module GrapeLogging + module Reporters + class LoggerReporter + def initialize(logger, formatter, log_level) + @logger = logger.clone || Logger.new(STDOUT) + @log_level = log_level || :info + @logger.formatter = formatter || @logger.formatter || GrapeLogging::Formatters::Default.new if @logger.respond_to?(:formatter=) + end - def perform(params) - @logger.send(@log_level, params) + def perform(params) + @logger.send(@log_level, params) + end end end end diff --git a/lib/grape_logging/util/parameter_filter.rb b/lib/grape_logging/util/parameter_filter.rb index 9d009ee..6dbea7a 100644 --- a/lib/grape_logging/util/parameter_filter.rb +++ b/lib/grape_logging/util/parameter_filter.rb @@ -1,101 +1,105 @@ -if defined?(Rails.application) - if Gem::Version.new(Rails.version) < Gem::Version.new('6.0.0') - class ParameterFilter < ActionDispatch::Http::ParameterFilter - def initialize(_replacement, filter_parameters) - super(filter_parameters) - end - end - else - require 'active_support/parameter_filter' - - class ParameterFilter < ActiveSupport::ParameterFilter - def initialize(_replacement, filter_parameters) - super(filter_parameters) - end - end - end -else - # - # lifted from https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/parameter_filter.rb - # we could depend on Rails specifically, but that would us way to hefty! - # - class ParameterFilter - def initialize(replacement, filters = []) - @replacement = replacement - @filters = filters - end - - def filter(params) - compiled_filter.call(params) - end - - private - - def compiled_filter - @compiled_filter ||= CompiledFilter.compile(@replacement, @filters) - end - - class CompiledFilter # :nodoc: - def self.compile(replacement, filters) - return ->(params) { params.dup } if filters.empty? - - strings = [] - regexps = [] - blocks = [] - - filters.each do |item| - case item - when Proc - blocks << item - when Regexp - regexps << item - else - strings << Regexp.escape(item.to_s) +module GrapeLogging + module Util + if defined?(Rails.application) + if Gem::Version.new(Rails.version) < Gem::Version.new('6.0.0') + class ParameterFilter < ActionDispatch::Http::ParameterFilter + def initialize(_replacement, filter_parameters) + super(filter_parameters) end end + else + require 'active_support/parameter_filter' - deep_regexps, regexps = regexps.partition { |r| r.to_s.include?('\\.'.freeze) } - deep_strings, strings = strings.partition { |s| s.include?('\\.'.freeze) } - - regexps << Regexp.new(strings.join('|'.freeze), true) unless strings.empty? - deep_regexps << Regexp.new(deep_strings.join('|'.freeze), true) unless deep_strings.empty? - - new replacement, regexps, deep_regexps, blocks - end - - attr_reader :regexps, :deep_regexps, :blocks - - def initialize(replacement, regexps, deep_regexps, blocks) - @replacement = replacement - @regexps = regexps - @deep_regexps = deep_regexps.any? ? deep_regexps : nil - @blocks = blocks - end - - def call(original_params, parents = []) - filtered_params = {} - - original_params.each do |key, value| - parents.push(key) if deep_regexps - if regexps.any? { |r| key =~ r } - value = @replacement - elsif deep_regexps && (joined = parents.join('.')) && deep_regexps.any? { |r| joined =~ r } - value = @replacement - elsif value.is_a?(Hash) - value = call(value, parents) - elsif value.is_a?(Array) - value = value.map { |v| v.is_a?(Hash) ? call(v, parents) : v } - elsif blocks.any? - key = key.dup if key.duplicable? - value = value.dup if value.duplicable? - blocks.each { |b| b.call(key, value) } + class ParameterFilter < ActiveSupport::ParameterFilter + def initialize(_replacement, filter_parameters) + super(filter_parameters) end - parents.pop if deep_regexps - - filtered_params[key] = value + end + end + else + # + # lifted from https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/parameter_filter.rb + # we could depend on Rails specifically, but that would us way to hefty! + # + class ParameterFilter + def initialize(replacement, filters = []) + @replacement = replacement + @filters = filters end - filtered_params + def filter(params) + compiled_filter.call(params) + end + + private + + def compiled_filter + @compiled_filter ||= CompiledFilter.compile(@replacement, @filters) + end + + class CompiledFilter # :nodoc: + def self.compile(replacement, filters) + return ->(params) { params.dup } if filters.empty? + + strings = [] + regexps = [] + blocks = [] + + filters.each do |item| + case item + when Proc + blocks << item + when Regexp + regexps << item + else + strings << Regexp.escape(item.to_s) + end + end + + deep_regexps, regexps = regexps.partition { |r| r.to_s.include?('\\.'.freeze) } + deep_strings, strings = strings.partition { |s| s.include?('\\.'.freeze) } + + regexps << Regexp.new(strings.join('|'.freeze), true) unless strings.empty? + deep_regexps << Regexp.new(deep_strings.join('|'.freeze), true) unless deep_strings.empty? + + new replacement, regexps, deep_regexps, blocks + end + + attr_reader :regexps, :deep_regexps, :blocks + + def initialize(replacement, regexps, deep_regexps, blocks) + @replacement = replacement + @regexps = regexps + @deep_regexps = deep_regexps.any? ? deep_regexps : nil + @blocks = blocks + end + + def call(original_params, parents = []) + filtered_params = {} + + original_params.each do |key, value| + parents.push(key) if deep_regexps + if regexps.any? { |r| key =~ r } + value = @replacement + elsif deep_regexps && (joined = parents.join('.')) && deep_regexps.any? { |r| joined =~ r } + value = @replacement + elsif value.is_a?(Hash) + value = call(value, parents) + elsif value.is_a?(Array) + value = value.map { |v| v.is_a?(Hash) ? call(v, parents) : v } + elsif blocks.any? + key = key.dup if key.duplicable? + value = value.dup if value.duplicable? + blocks.each { |b| b.call(key, value) } + end + parents.pop if deep_regexps + + filtered_params[key] = value + end + + filtered_params + end + end end end end From 073a88614bd21ae1fbf46cc2eebb7bc036e92db9 Mon Sep 17 00:00:00 2001 From: Nicolas Rodriguez Date: Thu, 5 Mar 2026 18:27:36 +0100 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b111963..54b116b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,10 @@ ## [3.0.1] - Unreleased ### Changed or Fixed or Added -- Your contribution here. + +### Changed +- Move dev dependencies to Gemfile +- Use zeitwerk to load gem [3.0.1]: https://github.com/aserafin/grape_logging/compare/v3.0.0...master