grape_logging 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +5 -5
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +7 -0
- data/README.md +2 -2
- data/grape_logging.gemspec +1 -7
- data/lib/grape_logging/formatters/rails.rb +0 -2
- data/lib/grape_logging/loggers/filter_parameters.rb +2 -2
- data/lib/grape_logging/middleware/request_logger.rb +14 -3
- data/lib/grape_logging/reporters/active_support_reporter.rb +9 -7
- data/lib/grape_logging/reporters/logger_reporter.rb +11 -9
- data/lib/grape_logging/util/parameter_filter.rb +87 -83
- data/lib/grape_logging/version.rb +1 -1
- data/lib/grape_logging.rb +12 -17
- metadata +8 -36
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 812a02e3c1b1f55003d060c5d31887be91cd73115cdb366c36c4e29c8e5507a0
|
|
4
|
+
data.tar.gz: 929dec60825b2aa8ec50c349506f383cd58a01d987bc8eb8b02990c225279e34
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3043a583d5b227f2fb474a1e036ad0f27589dafa1a11d428b0e93c3441e6cc6204001bfe26dbd6f925ea2fe2a6a681ff3e6c2853979e458f19c43ece1696e0ec
|
|
7
|
+
data.tar.gz: 9ea303723891185798f23494e53c542c73ceee318f4fa72c073277e263e72e1f1dac885729126eda13c3aee89893488d88b4173eff877b2ff30998d77c944435
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -9,26 +9,26 @@ jobs:
|
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
10
|
strategy:
|
|
11
11
|
matrix:
|
|
12
|
-
ruby-version: ["3.0", "3.1", "3.2", "3.3", "3.4"]
|
|
12
|
+
ruby-version: ["3.0", "3.1", "3.2", "3.3", "3.4", "4.0"]
|
|
13
13
|
steps:
|
|
14
14
|
- name: Checkout code
|
|
15
|
-
uses: actions/checkout@
|
|
15
|
+
uses: actions/checkout@v6
|
|
16
16
|
- uses: ruby/setup-ruby@v1
|
|
17
17
|
with:
|
|
18
18
|
ruby-version: ${{ matrix.ruby-version }}
|
|
19
19
|
bundler-cache: true
|
|
20
20
|
- name: Install dependencies
|
|
21
|
-
run: bundle install
|
|
21
|
+
run: bundle install --jobs 4 --retry 3
|
|
22
22
|
- name: Run tests
|
|
23
23
|
run: bundle exec rake spec
|
|
24
24
|
lint:
|
|
25
25
|
runs-on: ubuntu-latest
|
|
26
26
|
steps:
|
|
27
27
|
- name: Checkout code
|
|
28
|
-
uses: actions/checkout@
|
|
28
|
+
uses: actions/checkout@v6
|
|
29
29
|
- uses: ruby/setup-ruby@v1
|
|
30
30
|
with:
|
|
31
|
-
ruby-version: "
|
|
31
|
+
ruby-version: "4.0"
|
|
32
32
|
bundler-cache: true
|
|
33
33
|
- name: Install dependencies
|
|
34
34
|
run: bundle install
|
data/.rubocop.yml
CHANGED
|
@@ -2,9 +2,12 @@ inherit_from: .rubocop_todo.yml
|
|
|
2
2
|
|
|
3
3
|
AllCops:
|
|
4
4
|
NewCops: enable
|
|
5
|
+
TargetRubyVersion: 3.0
|
|
5
6
|
|
|
6
7
|
Metrics/BlockLength:
|
|
7
8
|
CountAsOne: [array, hash, heredoc, method_call]
|
|
9
|
+
Exclude:
|
|
10
|
+
- 'spec/**/*'
|
|
8
11
|
|
|
9
12
|
Metrics/ClassLength:
|
|
10
13
|
CountAsOne: [array, hash, heredoc, method_call]
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.0.1] - 2026-09-11
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- [#98](https://github.com/aserafin/grape_logging/pull/98) Adapt to new Grape::Exceptions::ErrorResponse throwable for Grape 3.3.0 support - [@leoarnold](https://github.com/leoarnold).
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- [#96](https://github.com/aserafin/grape_logging/pull/96) Move dev dependencies to Gemfile and use zeitwerk to load files - [@n-rodriguez](https://github.com/n-rodriguez).
|
|
10
|
+
|
|
11
|
+
[3.0.1]: https://github.com/aserafin/grape_logging/compare/v3.0.0...v3.0.1
|
|
12
|
+
|
|
3
13
|
## [3.0.0] - 2025-08-07
|
|
4
14
|
|
|
5
15
|
### Changed
|
data/Gemfile
CHANGED
|
@@ -2,3 +2,10 @@ source 'https://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in grape_logging.gemspec
|
|
4
4
|
gemspec
|
|
5
|
+
|
|
6
|
+
gem 'rake', '~> 13.3'
|
|
7
|
+
gem 'rspec', '~> 3.5'
|
|
8
|
+
|
|
9
|
+
# This is pinned to an exact version otherwise we can't know which rules
|
|
10
|
+
# are in play at any given time in different environments.
|
|
11
|
+
gem 'rubocop', '1.77.0'
|
data/README.md
CHANGED
|
@@ -209,8 +209,8 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
|
209
209
|
|
|
210
210
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
211
211
|
|
|
212
|
-
For maintainers releasing a new version, please see [
|
|
212
|
+
For maintainers releasing a new version, please see [RELEASING.md](RELEASING.md).
|
|
213
213
|
|
|
214
214
|
## Contributing
|
|
215
215
|
|
|
216
|
-
See [
|
|
216
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
data/grape_logging.gemspec
CHANGED
|
@@ -22,11 +22,5 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
|
|
23
23
|
spec.add_dependency 'grape', '>= 2.4.0'
|
|
24
24
|
spec.add_dependency 'rack'
|
|
25
|
-
|
|
26
|
-
spec.add_development_dependency 'rake', '~> 13.3'
|
|
27
|
-
spec.add_development_dependency 'rspec', '~> 3.5'
|
|
28
|
-
|
|
29
|
-
# This is pinned to an exact version otherwise we can't know which rules
|
|
30
|
-
# are in play at any given time in different environments.
|
|
31
|
-
spec.add_development_dependency 'rubocop', '1.77.0'
|
|
25
|
+
spec.add_dependency 'zeitwerk'
|
|
32
26
|
end
|
|
@@ -16,7 +16,7 @@ module GrapeLogging
|
|
|
16
16
|
private
|
|
17
17
|
|
|
18
18
|
def parameter_filter
|
|
19
|
-
@parameter_filter ||= ParameterFilter.new(@replacement, @filter_parameters)
|
|
19
|
+
@parameter_filter ||= GrapeLogging::Util::ParameterFilter.new(@replacement, @filter_parameters)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def safe_parameters(request)
|
|
@@ -31,7 +31,7 @@ module GrapeLogging
|
|
|
31
31
|
def clean_parameters(parameters)
|
|
32
32
|
original_encoding_map = build_encoding_map(parameters)
|
|
33
33
|
params = transform_key_encoding(parameters, Hash.new { |h, _| [Encoding::ASCII_8BIT, h] })
|
|
34
|
-
cleaned_params = parameter_filter.filter(params).
|
|
34
|
+
cleaned_params = parameter_filter.filter(params).except(*@exceptions)
|
|
35
35
|
transform_key_encoding(cleaned_params, original_encoding_map)
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
require 'grape'
|
|
2
|
-
|
|
3
1
|
module GrapeLogging
|
|
4
2
|
module Middleware
|
|
5
3
|
class RequestLogger < Grape::Middleware::Base
|
|
@@ -72,7 +70,9 @@ module GrapeLogging
|
|
|
72
70
|
# when no error occurs.
|
|
73
71
|
if error
|
|
74
72
|
# Call with error & response
|
|
75
|
-
|
|
73
|
+
status, message = status_and_message(error)
|
|
74
|
+
|
|
75
|
+
after(status, message)
|
|
76
76
|
|
|
77
77
|
# Throw again
|
|
78
78
|
throw(:error, error)
|
|
@@ -150,6 +150,17 @@ module GrapeLogging
|
|
|
150
150
|
logger.send(method_name) if logger.respond_to?(method_name)
|
|
151
151
|
end
|
|
152
152
|
end
|
|
153
|
+
|
|
154
|
+
def status_and_message(error)
|
|
155
|
+
case Gem::Version.new(Grape::VERSION)
|
|
156
|
+
when Gem::Requirement.new('>= 3.3.0')
|
|
157
|
+
# `error` is a `Grape::Exceptions::ErrorResponse`
|
|
158
|
+
[error.status, error.message]
|
|
159
|
+
else
|
|
160
|
+
# `error` is a `Hash`
|
|
161
|
+
[error[:status], error[:message]]
|
|
162
|
+
end
|
|
163
|
+
end
|
|
153
164
|
end
|
|
154
165
|
end
|
|
155
166
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
module
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
module GrapeLogging
|
|
2
|
+
module Reporters
|
|
3
|
+
class ActiveSupportReporter
|
|
4
|
+
def initialize(instrumentation_key)
|
|
5
|
+
@instrumentation_key = instrumentation_key
|
|
6
|
+
end
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
def perform(params)
|
|
9
|
+
ActiveSupport::Notifications.instrument @instrumentation_key, params
|
|
10
|
+
end
|
|
9
11
|
end
|
|
10
12
|
end
|
|
11
13
|
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
module
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
module GrapeLogging
|
|
2
|
+
module Reporters
|
|
3
|
+
class LoggerReporter
|
|
4
|
+
def initialize(logger, formatter, log_level)
|
|
5
|
+
@logger = logger.clone || Logger.new(STDOUT)
|
|
6
|
+
@log_level = log_level || :info
|
|
7
|
+
@logger.formatter = formatter || @logger.formatter || GrapeLogging::Formatters::Default.new if @logger.respond_to?(:formatter=)
|
|
8
|
+
end
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
def perform(params)
|
|
11
|
+
@logger.send(@log_level, params)
|
|
12
|
+
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -1,101 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
module GrapeLogging
|
|
2
|
+
module Util
|
|
3
|
+
if defined?(Rails.application)
|
|
4
|
+
if Gem::Version.new(Rails.version) < Gem::Version.new('6.0.0')
|
|
5
|
+
class ParameterFilter < ActionDispatch::Http::ParameterFilter
|
|
6
|
+
def initialize(_replacement, filter_parameters)
|
|
7
|
+
super(filter_parameters)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
else
|
|
11
|
+
require 'active_support/parameter_filter'
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
class ParameterFilter < ActiveSupport::ParameterFilter
|
|
14
|
+
def initialize(_replacement, filter_parameters)
|
|
15
|
+
super(filter_parameters)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
14
18
|
end
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
@filters = filters
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def filter(params)
|
|
29
|
-
compiled_filter.call(params)
|
|
30
|
-
end
|
|
19
|
+
else
|
|
20
|
+
#
|
|
21
|
+
# lifted from https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/parameter_filter.rb
|
|
22
|
+
# we could depend on Rails specifically, but that would us way to hefty!
|
|
23
|
+
#
|
|
24
|
+
class ParameterFilter
|
|
25
|
+
def initialize(replacement, filters = [])
|
|
26
|
+
@replacement = replacement
|
|
27
|
+
@filters = filters
|
|
28
|
+
end
|
|
31
29
|
|
|
32
|
-
|
|
30
|
+
def filter(params)
|
|
31
|
+
compiled_filter.call(params)
|
|
32
|
+
end
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
@compiled_filter ||= CompiledFilter.compile(@replacement, @filters)
|
|
36
|
-
end
|
|
34
|
+
private
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return ->(params) { params.dup } if filters.empty?
|
|
41
|
-
|
|
42
|
-
strings = []
|
|
43
|
-
regexps = []
|
|
44
|
-
blocks = []
|
|
45
|
-
|
|
46
|
-
filters.each do |item|
|
|
47
|
-
case item
|
|
48
|
-
when Proc
|
|
49
|
-
blocks << item
|
|
50
|
-
when Regexp
|
|
51
|
-
regexps << item
|
|
52
|
-
else
|
|
53
|
-
strings << Regexp.escape(item.to_s)
|
|
54
|
-
end
|
|
36
|
+
def compiled_filter
|
|
37
|
+
@compiled_filter ||= CompiledFilter.compile(@replacement, @filters)
|
|
55
38
|
end
|
|
56
39
|
|
|
57
|
-
|
|
58
|
-
|
|
40
|
+
class CompiledFilter # :nodoc:
|
|
41
|
+
def self.compile(replacement, filters)
|
|
42
|
+
return ->(params) { params.dup } if filters.empty?
|
|
59
43
|
|
|
60
|
-
|
|
61
|
-
|
|
44
|
+
strings = []
|
|
45
|
+
regexps = []
|
|
46
|
+
blocks = []
|
|
62
47
|
|
|
63
|
-
|
|
64
|
-
|
|
48
|
+
filters.each do |item|
|
|
49
|
+
case item
|
|
50
|
+
when Proc
|
|
51
|
+
blocks << item
|
|
52
|
+
when Regexp
|
|
53
|
+
regexps << item
|
|
54
|
+
else
|
|
55
|
+
strings << Regexp.escape(item.to_s)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
65
58
|
|
|
66
|
-
|
|
59
|
+
deep_regexps, regexps = regexps.partition { |r| r.to_s.include?('\\.'.freeze) }
|
|
60
|
+
deep_strings, strings = strings.partition { |s| s.include?('\\.'.freeze) }
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@regexps = regexps
|
|
71
|
-
@deep_regexps = deep_regexps.any? ? deep_regexps : nil
|
|
72
|
-
@blocks = blocks
|
|
73
|
-
end
|
|
62
|
+
regexps << Regexp.new(strings.join('|'.freeze), true) unless strings.empty?
|
|
63
|
+
deep_regexps << Regexp.new(deep_strings.join('|'.freeze), true) unless deep_strings.empty?
|
|
74
64
|
|
|
75
|
-
|
|
76
|
-
filtered_params = {}
|
|
77
|
-
|
|
78
|
-
original_params.each do |key, value|
|
|
79
|
-
parents.push(key) if deep_regexps
|
|
80
|
-
if regexps.any? { |r| key =~ r }
|
|
81
|
-
value = @replacement
|
|
82
|
-
elsif deep_regexps && (joined = parents.join('.')) && deep_regexps.any? { |r| joined =~ r }
|
|
83
|
-
value = @replacement
|
|
84
|
-
elsif value.is_a?(Hash)
|
|
85
|
-
value = call(value, parents)
|
|
86
|
-
elsif value.is_a?(Array)
|
|
87
|
-
value = value.map { |v| v.is_a?(Hash) ? call(v, parents) : v }
|
|
88
|
-
elsif blocks.any?
|
|
89
|
-
key = key.dup if key.duplicable?
|
|
90
|
-
value = value.dup if value.duplicable?
|
|
91
|
-
blocks.each { |b| b.call(key, value) }
|
|
65
|
+
new replacement, regexps, deep_regexps, blocks
|
|
92
66
|
end
|
|
93
|
-
parents.pop if deep_regexps
|
|
94
67
|
|
|
95
|
-
|
|
96
|
-
|
|
68
|
+
attr_reader :regexps, :deep_regexps, :blocks
|
|
69
|
+
|
|
70
|
+
def initialize(replacement, regexps, deep_regexps, blocks)
|
|
71
|
+
@replacement = replacement
|
|
72
|
+
@regexps = regexps
|
|
73
|
+
@deep_regexps = deep_regexps.any? ? deep_regexps : nil
|
|
74
|
+
@blocks = blocks
|
|
75
|
+
end
|
|
97
76
|
|
|
98
|
-
|
|
77
|
+
def call(original_params, parents = [])
|
|
78
|
+
filtered_params = {}
|
|
79
|
+
|
|
80
|
+
original_params.each do |key, value|
|
|
81
|
+
parents.push(key) if deep_regexps
|
|
82
|
+
if regexps.any? { |r| key =~ r }
|
|
83
|
+
value = @replacement
|
|
84
|
+
elsif deep_regexps && (joined = parents.join('.')) && deep_regexps.any? { |r| joined =~ r }
|
|
85
|
+
value = @replacement
|
|
86
|
+
elsif value.is_a?(Hash)
|
|
87
|
+
value = call(value, parents)
|
|
88
|
+
elsif value.is_a?(Array)
|
|
89
|
+
value = value.map { |v| v.is_a?(Hash) ? call(v, parents) : v }
|
|
90
|
+
elsif blocks.any?
|
|
91
|
+
key = key.dup if key.duplicable?
|
|
92
|
+
value = value.dup if value.duplicable?
|
|
93
|
+
blocks.each { |b| b.call(key, value) }
|
|
94
|
+
end
|
|
95
|
+
parents.pop if deep_regexps
|
|
96
|
+
|
|
97
|
+
filtered_params[key] = value
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
filtered_params
|
|
101
|
+
end
|
|
102
|
+
end
|
|
99
103
|
end
|
|
100
104
|
end
|
|
101
105
|
end
|
data/lib/grape_logging.rb
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require '
|
|
3
|
-
require '
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
require 'grape_logging/reporters/active_support_reporter'
|
|
14
|
-
require 'grape_logging/reporters/logger_reporter'
|
|
15
|
-
require 'grape_logging/timings'
|
|
16
|
-
require 'grape_logging/middleware/request_logger'
|
|
17
|
-
require 'grape_logging/util/parameter_filter'
|
|
1
|
+
require 'grape'
|
|
2
|
+
require 'rack/utils'
|
|
3
|
+
require 'zeitwerk'
|
|
4
|
+
|
|
5
|
+
# load zeitwerk
|
|
6
|
+
Zeitwerk::Loader.for_gem.tap do |loader|
|
|
7
|
+
loader.inflector.inflect 'multi_io' => 'MultiIO'
|
|
8
|
+
loader.setup
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module GrapeLogging
|
|
12
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: grape_logging
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.
|
|
4
|
+
version: 3.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- aserafin
|
|
@@ -39,47 +39,19 @@ dependencies:
|
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: zeitwerk
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- - "
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '13.3'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '13.3'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rspec
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '3.5'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '3.5'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: rubocop
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - '='
|
|
45
|
+
- - ">="
|
|
74
46
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
76
|
-
type: :
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
77
49
|
prerelease: false
|
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
51
|
requirements:
|
|
80
|
-
- -
|
|
52
|
+
- - ">="
|
|
81
53
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
54
|
+
version: '0'
|
|
83
55
|
description: This gem provides simple request logging for Grape with just few lines
|
|
84
56
|
of code you have to put in your project! In return you will get response codes,
|
|
85
57
|
paths, parameters and more!
|
|
@@ -140,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
140
112
|
- !ruby/object:Gem::Version
|
|
141
113
|
version: '0'
|
|
142
114
|
requirements: []
|
|
143
|
-
rubygems_version: 3.6.
|
|
115
|
+
rubygems_version: 3.6.9
|
|
144
116
|
specification_version: 4
|
|
145
117
|
summary: Out of the box request logging for Grape!
|
|
146
118
|
test_files: []
|