lamian 1.0.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c6851ffad052c2a8937a913f880a1b6a5424c218
4
- data.tar.gz: 2f3d5a8e3c67f2583d6778394f077cdfece11378
2
+ SHA256:
3
+ metadata.gz: d42eee8929a0bb372234198aade127f4ea73bbf7315133d2f88e6e6caff69084
4
+ data.tar.gz: f173c941c4ab3d54d54a85a6c53742bfd0dab1b7b6333920dbb0ffebdebe772e
5
5
  SHA512:
6
- metadata.gz: 2310ee71cae10bdca125a2832002bf62ad4cd98f154525afe2b3f2eba43526eb0c4ac9d09df484b23ae5d89d6e1dfdd8d40d77a8cc216fcd196b0e03a5c7aa3f
7
- data.tar.gz: '08b05982d5c0d01fd1491de1255111defa75b9cd7c188c288e8472d7123d9ed4ad8e714f34e01f47329ede890050f5ddb8369f8f7e36364cb150e4446c163aa8'
6
+ metadata.gz: 4d6f8d04d0f95eae97dd23450507d01e49afc7bfa82ec0a4d5a35db0ab06a38595e79f41a8f60f45f500bfc9dc5f0d3bc6dff77f446ad6c8d26bc42338a044b9
7
+ data.tar.gz: '05872e41faae73675db913eff599a98ec497e2eaaa01335b5dcf8d54b3238e1a858d449667cfe415ec1ed17bafc38a88b9b1b4091e05e4c683ce2ab88b31e863'
@@ -0,0 +1,56 @@
1
+ name: Test
2
+
3
+ on: [push, pull_request]
4
+
5
+ env:
6
+ FULL_COVERAGE_CHECK: true
7
+
8
+ jobs:
9
+ full-check:
10
+ runs-on: ubuntu-latest
11
+
12
+ # We want to run on external PRs, but not on our own internal PRs as they'll be run on push event
13
+ if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != 'umbrellio/lamian'
14
+
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: 3
20
+ bundler-cache: true
21
+ - name: Run Linter
22
+ run: bundle exec ci-helper RubocopLint
23
+ - name: Check missed spec suffixes
24
+ run: bundle exec ci-helper CheckSpecSuffixes --extra-paths spec/*.rb --ignored-paths spec/*_helper.rb
25
+ - name: Run specs
26
+ run: bundle exec ci-helper RunSpecs
27
+ - name: Audit
28
+ run: bundle exec ci-helper BundlerAudit
29
+ - name: Documentation coverage
30
+ run: bundle exec rake doc:coverage
31
+ - name: Coveralls
32
+ uses: coverallsapp/github-action@master
33
+ with:
34
+ github-token: ${{ secrets.GITHUB_TOKEN }}
35
+ specs:
36
+ runs-on: ubuntu-latest
37
+
38
+ env:
39
+ FULL_COVERAGE_CHECK: false
40
+
41
+ # We want to run on external PRs, but not on our own internal PRs as they'll be run on push event
42
+ if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != 'umbrellio/lamian'
43
+
44
+ strategy:
45
+ fail-fast: false
46
+ matrix:
47
+ ruby: [2.5, 2.6, 2.7]
48
+
49
+ steps:
50
+ - uses: actions/checkout@v2
51
+ - uses: ruby/setup-ruby@v1
52
+ with:
53
+ ruby-version: ${{ matrix.ruby }}
54
+ bundler-cache: true
55
+ - name: Run specs
56
+ run: bundle exec ci-helper RunSpecs
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /.ruby-version
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ inherit_gem:
2
+ rubocop-config-umbrellio: lib/rubocop.yml
3
+
4
+ AllCops:
5
+ DisplayCopNames: true
6
+ TargetRubyVersion: 2.5
7
+
8
+ RSpec/EmptyLineAfterHook:
9
+ Enabled: false
10
+
11
+ Style/HashConversion:
12
+ Exclude:
13
+ - spec/**/*_spec.rb
data/Changelog.md ADDED
@@ -0,0 +1,55 @@
1
+ # Lamian version changes (since 0.1.0)
2
+
3
+ Update this on a pull request, under `Lamian::VERSION`
4
+ (also known as next version). If this constant would be changed without release,
5
+ I'll update it here too
6
+
7
+ ## 1.3.0
8
+ * Add support for the (new sentry gem)[https://github.com/getsentry/sentry-ruby].
9
+
10
+ ## 1.2.0
11
+ * Add `raven_log_size_limit` config option for limiting amount of data sent to sentry (defaults to `500_000`)
12
+
13
+ ## 1.1.0
14
+ * Add support for sentry and sidekiq
15
+
16
+ ## 1.0.0
17
+
18
+ * `6d8fee8` fixed a bug when ::Logger#log was not prepended. `::Logger#log` is an alias for `::Logger#add`,
19
+ which ruins concept of single entry point :(. Also tied it to lamian instance
20
+
21
+ ## 0.3.3
22
+
23
+ * `8136689` fixed crashes when dump used outside lamian context
24
+
25
+
26
+ ## 0.3.2
27
+
28
+ * `e57e6cec` Changed rails dependency from `~> 4.2` to `>= 4.2`
29
+
30
+
31
+ ## 0.3.1
32
+
33
+ * 34ca83b5 Fixed formatting
34
+
35
+ Stabilized formatting api, which removes control sequences from loggers data.
36
+ E.g. `"[23mNice, lol[0m\n"` becomes `"Nice, lol\n"`
37
+
38
+
39
+ ## 0.3.0
40
+
41
+ * `d24f895b` API update
42
+
43
+ Updated API, so lamian is now forced to be used with block.
44
+ It also simplified usage outside a middleware
45
+
46
+
47
+ ## 0.2.0
48
+ * `3166517e` Added integrtation with rails
49
+
50
+ Injected middleware before `ExceptionNotification`, so `ExceptionNotification`
51
+ can use current log without any configuration. Also added some views
52
+
53
+
54
+ ## 0.1.0
55
+ * `62eb8685` Made test version to check it's integration with rails application
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in lamian.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,278 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ lamian (1.4.0)
5
+ rails (>= 4.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (6.1.4.1)
11
+ actionpack (= 6.1.4.1)
12
+ activesupport (= 6.1.4.1)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.1.4.1)
16
+ actionpack (= 6.1.4.1)
17
+ activejob (= 6.1.4.1)
18
+ activerecord (= 6.1.4.1)
19
+ activestorage (= 6.1.4.1)
20
+ activesupport (= 6.1.4.1)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.1.4.1)
23
+ actionpack (= 6.1.4.1)
24
+ actionview (= 6.1.4.1)
25
+ activejob (= 6.1.4.1)
26
+ activesupport (= 6.1.4.1)
27
+ mail (~> 2.5, >= 2.5.4)
28
+ rails-dom-testing (~> 2.0)
29
+ actionpack (6.1.4.1)
30
+ actionview (= 6.1.4.1)
31
+ activesupport (= 6.1.4.1)
32
+ rack (~> 2.0, >= 2.0.9)
33
+ rack-test (>= 0.6.3)
34
+ rails-dom-testing (~> 2.0)
35
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
36
+ actiontext (6.1.4.1)
37
+ actionpack (= 6.1.4.1)
38
+ activerecord (= 6.1.4.1)
39
+ activestorage (= 6.1.4.1)
40
+ activesupport (= 6.1.4.1)
41
+ nokogiri (>= 1.8.5)
42
+ actionview (6.1.4.1)
43
+ activesupport (= 6.1.4.1)
44
+ builder (~> 3.1)
45
+ erubi (~> 1.4)
46
+ rails-dom-testing (~> 2.0)
47
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
48
+ activejob (6.1.4.1)
49
+ activesupport (= 6.1.4.1)
50
+ globalid (>= 0.3.6)
51
+ activemodel (6.1.4.1)
52
+ activesupport (= 6.1.4.1)
53
+ activerecord (6.1.4.1)
54
+ activemodel (= 6.1.4.1)
55
+ activesupport (= 6.1.4.1)
56
+ activestorage (6.1.4.1)
57
+ actionpack (= 6.1.4.1)
58
+ activejob (= 6.1.4.1)
59
+ activerecord (= 6.1.4.1)
60
+ activesupport (= 6.1.4.1)
61
+ marcel (~> 1.0.0)
62
+ mini_mime (>= 1.1.0)
63
+ activesupport (6.1.4.1)
64
+ concurrent-ruby (~> 1.0, >= 1.0.2)
65
+ i18n (>= 1.6, < 2)
66
+ minitest (>= 5.1)
67
+ tzinfo (~> 2.0)
68
+ zeitwerk (~> 2.3)
69
+ addressable (2.8.0)
70
+ public_suffix (>= 2.0.2, < 5.0)
71
+ ast (2.4.2)
72
+ builder (3.2.4)
73
+ bundler-audit (0.9.0.1)
74
+ bundler (>= 1.2.0, < 3)
75
+ thor (~> 1.0)
76
+ ci-helper (0.4.2)
77
+ colorize (~> 0.8)
78
+ dry-inflector (~> 0.2)
79
+ umbrellio-sequel-plugins (~> 0.4)
80
+ coderay (1.1.3)
81
+ colorize (0.8.1)
82
+ concurrent-ruby (1.1.9)
83
+ crass (1.0.6)
84
+ diff-lcs (1.4.4)
85
+ docile (1.4.0)
86
+ dry-inflector (0.2.1)
87
+ erubi (1.10.0)
88
+ faraday (1.8.0)
89
+ faraday-em_http (~> 1.0)
90
+ faraday-em_synchrony (~> 1.0)
91
+ faraday-excon (~> 1.1)
92
+ faraday-httpclient (~> 1.0.1)
93
+ faraday-net_http (~> 1.0)
94
+ faraday-net_http_persistent (~> 1.1)
95
+ faraday-patron (~> 1.0)
96
+ faraday-rack (~> 1.0)
97
+ multipart-post (>= 1.2, < 3)
98
+ ruby2_keywords (>= 0.0.4)
99
+ faraday-em_http (1.0.0)
100
+ faraday-em_synchrony (1.0.0)
101
+ faraday-excon (1.1.0)
102
+ faraday-httpclient (1.0.1)
103
+ faraday-net_http (1.0.1)
104
+ faraday-net_http_persistent (1.2.0)
105
+ faraday-patron (1.0.0)
106
+ faraday-rack (1.0.0)
107
+ globalid (0.5.2)
108
+ activesupport (>= 5.0)
109
+ i18n (1.8.10)
110
+ concurrent-ruby (~> 1.0)
111
+ launchy (2.5.0)
112
+ addressable (~> 2.7)
113
+ loofah (2.12.0)
114
+ crass (~> 1.0.2)
115
+ nokogiri (>= 1.5.9)
116
+ mail (2.7.1)
117
+ mini_mime (>= 0.1.1)
118
+ marcel (1.0.2)
119
+ method_source (1.0.0)
120
+ mini_mime (1.1.2)
121
+ minitest (5.14.4)
122
+ multipart-post (2.1.1)
123
+ nio4r (2.5.8)
124
+ nokogiri (1.12.5-x86_64-darwin)
125
+ racc (~> 1.4)
126
+ nokogiri (1.12.5-x86_64-linux)
127
+ racc (~> 1.4)
128
+ parallel (1.21.0)
129
+ parser (3.0.2.0)
130
+ ast (~> 2.4.1)
131
+ pry (0.14.1)
132
+ coderay (~> 1.1)
133
+ method_source (~> 1.0)
134
+ public_suffix (4.0.6)
135
+ racc (1.6.0)
136
+ rack (2.2.3)
137
+ rack-test (1.1.0)
138
+ rack (>= 1.0, < 3)
139
+ rails (6.1.4.1)
140
+ actioncable (= 6.1.4.1)
141
+ actionmailbox (= 6.1.4.1)
142
+ actionmailer (= 6.1.4.1)
143
+ actionpack (= 6.1.4.1)
144
+ actiontext (= 6.1.4.1)
145
+ actionview (= 6.1.4.1)
146
+ activejob (= 6.1.4.1)
147
+ activemodel (= 6.1.4.1)
148
+ activerecord (= 6.1.4.1)
149
+ activestorage (= 6.1.4.1)
150
+ activesupport (= 6.1.4.1)
151
+ bundler (>= 1.15.0)
152
+ railties (= 6.1.4.1)
153
+ sprockets-rails (>= 2.0.0)
154
+ rails-dom-testing (2.0.3)
155
+ activesupport (>= 4.2.0)
156
+ nokogiri (>= 1.6)
157
+ rails-html-sanitizer (1.4.2)
158
+ loofah (~> 2.3)
159
+ railties (6.1.4.1)
160
+ actionpack (= 6.1.4.1)
161
+ activesupport (= 6.1.4.1)
162
+ method_source
163
+ rake (>= 0.13)
164
+ thor (~> 1.0)
165
+ rainbow (3.0.0)
166
+ rake (13.0.6)
167
+ regexp_parser (2.1.1)
168
+ rexml (3.2.5)
169
+ rspec (3.10.0)
170
+ rspec-core (~> 3.10.0)
171
+ rspec-expectations (~> 3.10.0)
172
+ rspec-mocks (~> 3.10.0)
173
+ rspec-core (3.10.1)
174
+ rspec-support (~> 3.10.0)
175
+ rspec-expectations (3.10.1)
176
+ diff-lcs (>= 1.2.0, < 2.0)
177
+ rspec-support (~> 3.10.0)
178
+ rspec-mocks (3.10.2)
179
+ diff-lcs (>= 1.2.0, < 2.0)
180
+ rspec-support (~> 3.10.0)
181
+ rspec-support (3.10.2)
182
+ rubocop (1.17.0)
183
+ parallel (~> 1.10)
184
+ parser (>= 3.0.0.0)
185
+ rainbow (>= 2.2.2, < 4.0)
186
+ regexp_parser (>= 1.8, < 3.0)
187
+ rexml
188
+ rubocop-ast (>= 1.7.0, < 2.0)
189
+ ruby-progressbar (~> 1.7)
190
+ unicode-display_width (>= 1.4.0, < 3.0)
191
+ rubocop-ast (1.12.0)
192
+ parser (>= 3.0.1.1)
193
+ rubocop-config-umbrellio (1.17.0.53)
194
+ rubocop (= 1.17.0)
195
+ rubocop-performance (= 1.10.0)
196
+ rubocop-rails (= 2.9.1)
197
+ rubocop-rake (= 0.5.1)
198
+ rubocop-rspec (= 2.2.0)
199
+ rubocop-sequel (= 0.2.0)
200
+ rubocop-performance (1.10.0)
201
+ rubocop (>= 0.90.0, < 2.0)
202
+ rubocop-ast (>= 0.4.0)
203
+ rubocop-rails (2.9.1)
204
+ activesupport (>= 4.2.0)
205
+ rack (>= 1.1)
206
+ rubocop (>= 0.90.0, < 2.0)
207
+ rubocop-rake (0.5.1)
208
+ rubocop
209
+ rubocop-rspec (2.2.0)
210
+ rubocop (~> 1.0)
211
+ rubocop-ast (>= 1.1.0)
212
+ rubocop-sequel (0.2.0)
213
+ rubocop (~> 1.0)
214
+ ruby-progressbar (1.11.0)
215
+ ruby2_keywords (0.0.5)
216
+ semantic_logger (4.8.2)
217
+ concurrent-ruby (~> 1.0)
218
+ sentry-raven (3.1.2)
219
+ faraday (>= 1.0)
220
+ sentry-ruby (4.7.3)
221
+ concurrent-ruby (~> 1.0, >= 1.0.2)
222
+ faraday (>= 1.0)
223
+ sentry-ruby-core (= 4.7.3)
224
+ sentry-ruby-core (4.7.3)
225
+ concurrent-ruby
226
+ faraday
227
+ sequel (5.50.0)
228
+ simplecov (0.21.2)
229
+ docile (~> 1.1)
230
+ simplecov-html (~> 0.11)
231
+ simplecov_json_formatter (~> 0.1)
232
+ simplecov-html (0.12.3)
233
+ simplecov-lcov (0.8.0)
234
+ simplecov_json_formatter (0.1.3)
235
+ sprockets (4.0.2)
236
+ concurrent-ruby (~> 1.0)
237
+ rack (> 1, < 3)
238
+ sprockets-rails (3.2.2)
239
+ actionpack (>= 4.0)
240
+ activesupport (>= 4.0)
241
+ sprockets (>= 3.0.0)
242
+ symbiont-ruby (0.7.0)
243
+ thor (1.1.0)
244
+ tzinfo (2.0.4)
245
+ concurrent-ruby (~> 1.0)
246
+ umbrellio-sequel-plugins (0.5.1.27)
247
+ sequel
248
+ symbiont-ruby
249
+ unicode-display_width (2.1.0)
250
+ websocket-driver (0.7.5)
251
+ websocket-extensions (>= 0.1.0)
252
+ websocket-extensions (0.1.5)
253
+ yard (0.9.26)
254
+ zeitwerk (2.5.1)
255
+
256
+ PLATFORMS
257
+ x86_64-darwin-19
258
+ x86_64-darwin-20
259
+ x86_64-linux
260
+
261
+ DEPENDENCIES
262
+ bundler-audit
263
+ ci-helper
264
+ lamian!
265
+ launchy
266
+ pry
267
+ rake
268
+ rspec
269
+ rubocop-config-umbrellio
270
+ semantic_logger
271
+ sentry-raven
272
+ sentry-ruby
273
+ simplecov
274
+ simplecov-lcov
275
+ yard
276
+
277
+ BUNDLED WITH
278
+ 2.2.30
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 JelF, Umbrellio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # Lamian
2
+ [![Actions Status](https://github.com/umbrellio/lamian/workflows/Test/badge.svg)](https://github.com/umbrellio/lamian/actions) [![Coverage Status](https://coveralls.io/repos/github/umbrellio/lamian/badge.svg?branch=master)](https://coveralls.io/github/umbrellio/lamian?branch=master) [![Gem Version](https://badge.fury.io/rb/lamian.svg)](https://badge.fury.io/rb/lamian)
3
+
4
+
5
+ Lamian is an in-memory logger, which content could be released for error messages.
6
+ It is designed to work in pair with `exception_notification` gem inside rails
7
+ aplications
8
+
9
+ ## Usage with ExceptionNotification
10
+
11
+ 1. Add `gem 'lamian'` into your Gemfile
12
+ 2. Extend `Rails.logger` and any other loggers you want to mirror by
13
+ `Lamian::LoggerExtension`: `Lamian.extend_logger(logger)`
14
+ 3. Add 'request_log' section inside your `ExceptionNotification.configure`
15
+ (see [ExceptionNotification README](https://github.com/smartinez87/exception_notification/blob/master/README.md))
16
+ 4. ExceptionNotification's messages would have 'Request Log' section
17
+
18
+ ## Extended Usage
19
+
20
+ Add a 'request_log' section into ExceptionNotification's background section.
21
+ Add `Lamian.run { }` around code with logs you want to collect. Note, that
22
+ logs would be accessible only inside this section and removed after section end.
23
+
24
+ ## Sentry (sentry-ruby)
25
+
26
+ ### Usage
27
+
28
+ It automatically redefines `Sentry.configuration.before_send` callback
29
+ if Sentry initialization is completed. If `before_send` is already defined
30
+ it wraps custom callback.
31
+
32
+ ### Usage with Sidekiq
33
+
34
+ You should add Lamian middleware to the Sidekiq initializer like this:
35
+
36
+ ```ruby
37
+ config.server_middleware do |chain|
38
+ chain.prepend(Lamian::SidekiqSentryMiddleware)
39
+ end
40
+ ```
41
+
42
+ ### Usage with SemanticLogger
43
+
44
+ You should add Lamian appender to the SematicLogger appenders like this:
45
+
46
+ ```ruby
47
+ SemanticLogger.add_appender(appender: Lamian::SemanticLoggerAppender.new)
48
+ ```
49
+
50
+ ## Raven (deprecated)
51
+
52
+ ### Usage
53
+
54
+ Add this line to your Sentry initializer:
55
+
56
+ ```ruby
57
+ Raven::Context.prepend(Lamian::RavenContextExtension)
58
+ ```
59
+
60
+ ### Usage with Sidekiq
61
+
62
+ You should add Lamian middleware to the Sidekiq initializer like this:
63
+
64
+ ```ruby
65
+ config.server_middleware do |chain|
66
+ chain.prepend(Lamian::SidekiqRavenMiddleware)
67
+ end
68
+ ```
69
+
70
+ ## Contribution
71
+
72
+ Feel free to contribute by making PRs and Issues on [GitHub](https://github.com/JelF/lamian)
73
+ You also can contact me using my email begdory4+lamian@gmail.com
74
+
75
+ ## TODO
76
+
77
+ - It probably should be separated to `lamian` and `lamian-rails` gems.
78
+ Rails dependency is never cool
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+ require "rubocop/rake_task"
6
+ require "yard"
7
+ require "pathname"
8
+ require "launchy"
9
+ require "uri"
10
+
11
+ ROOT = Pathname.new(__FILE__).join("..")
12
+
13
+ RSpec::Core::RakeTask.new(:spec)
14
+ RuboCop::RakeTask.new(:lint)
15
+
16
+ YARD::Rake::YardocTask.new(:doc) do |t|
17
+ t.files = Dir[ROOT.join("lib/**/*.rb")]
18
+ t.options = %w[--private]
19
+ end
20
+
21
+ def open_in_browser(path)
22
+ Launchy.open(URI.join("file:///", path.to_s))
23
+ end
24
+
25
+ namespace :doc do
26
+ desc "open doc"
27
+ task open: :doc do
28
+ open_in_browser ROOT.join("doc/frames.html")
29
+ end
30
+
31
+ desc "checks doc coverage"
32
+ task coverage: :doc do
33
+ # ideally you've already generated the database to .load it
34
+ # if not, have this task depend on the docs task.
35
+ YARD::Registry.load
36
+ objs = YARD::Registry.select do |o|
37
+ puts "pending #{o}" if /TODO|FIXME|@pending/.match?(o.docstring)
38
+ o.docstring.blank?
39
+ end
40
+
41
+ next if objs.empty?
42
+ puts "No documentation found for:"
43
+ objs.each { |x| puts "\t#{x}" }
44
+
45
+ raise "100% document coverage required"
46
+ end
47
+ end
48
+
49
+ task default: %i[lint doc:coverage spec]
data/bin/console ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "lamian"
5
+ require "semantic_logger"
6
+
7
+ require "pry"
8
+ Pry.start
data/bin/rake ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
data/bin/rubocop ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rubocop' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath)
12
+
13
+ require "rubygems"
14
+ require "bundler/setup"
15
+
16
+ load Gem.bin_path("rubocop", "rubocop")
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/lamian/config.rb CHANGED
@@ -6,9 +6,12 @@ module Lamian
6
6
  # General lamian configuration class
7
7
  # @attr formatter [Logger::Foramtter]
8
8
  # formatter to use in lamian, global
9
- Config = Struct.new(:formatter) do
9
+ # @attr raven_log_size_limit [Integer]
10
+ # size limit when sending lamian log to sentry, defaults to +500_000+
11
+ Config = Struct.new(:formatter, :raven_log_size_limit) do
10
12
  def initialize
11
13
  self.formatter = ::Logger::Formatter.new
14
+ self.raven_log_size_limit = 500_000
12
15
  end
13
16
  end
14
17
  end
data/lib/lamian/engine.rb CHANGED
@@ -1,20 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails"
4
- require "exception_notification"
5
- require "exception_notification/rails"
6
4
 
7
5
  module Lamian
8
- # Rails engine, which injects middleware and appends
9
- # lamian views to rails library.
10
- # Lamian views are used in exception_notifier to provide
11
- # request_log section
6
+ # This engine is automatically loaded by Rails
7
+ # @see https://edgeguides.rubyonrails.org/engines.html Rails::Engine docs
12
8
  class Engine < ::Rails::Engine
13
- config.app_middleware.insert_before(
14
- ExceptionNotification::Rack,
15
- ::Lamian::Middleware,
16
- )
17
-
9
+ # Lamian views are used in exception_notifier to provide request_log section
18
10
  paths["app/views"] << "lib/lamian/rails_views"
11
+
12
+ initializer "lamian.use_rack_middleware" do |app|
13
+ # :nocov:
14
+ app.config.middleware.unshift(Lamian::Middleware)
15
+ # :nocov:
16
+ end
17
+
18
+ config.after_initialize do
19
+ # :nocov:
20
+ next unless defined?(Sentry)
21
+ next unless Sentry.initialized?
22
+
23
+ Sentry.configuration.before_send = rebuild_before_send
24
+ # :nocov:
25
+ end
26
+
27
+ # Reassembles the callback that runs before sending the event to the Sentry:
28
+ # connects the user callback with the callback that adds lamian logs to the event.
29
+ # @private
30
+ # @return [Proc] final callback.
31
+ def rebuild_before_send
32
+ defined_callback = Sentry.configuration.before_send || build_default_lambda
33
+ lamian_callback = build_lamian_callback
34
+
35
+ proc { |*args, **kwargs| lamian_callback.call(defined_callback.call(*args, **kwargs)) }
36
+ end
37
+
38
+ # Builds a callback, which does nothing.
39
+ # @private
40
+ # @return [Proc] empty callback.
41
+ def build_default_lambda
42
+ -> (event, _hint) { event }
43
+ end
44
+
45
+ # Builds a callback that adds logs to the event.
46
+ # @private
47
+ # @return [Proc] callback.
48
+ def build_lamian_callback
49
+ lambda do |event|
50
+ event.tap do |event|
51
+ extra = event&.extra or return
52
+ log = Lamian.dump_limited
53
+ extra[Lamian::SENTRY_EXTRA_KEY] = log if log
54
+ end
55
+ end
56
+ end
19
57
  end
20
58
  end
data/lib/lamian/logger.rb CHANGED
@@ -7,12 +7,6 @@ module Lamian
7
7
  # Provides thread-local loggers to catch teed messages from
8
8
  # regular loggers.
9
9
  # Uses :__lamian_logger thread variable
10
- # @attr level [Int]
11
- # current log level, implicitly set to zero
12
- # @attr logdevs [Array(StringIO)]
13
- # stack of log devices used to store logs
14
- # @attr formatter [Logger::Formatter]
15
- # formatter, inherited from Lamian.config
16
10
  class Logger < ::Logger
17
11
  # Provides access to logger bound to curent thread
18
12
  # @return [Lamian::Logger] current logger
@@ -21,24 +15,30 @@ module Lamian
21
15
  end
22
16
 
23
17
  def initialize
18
+ super(nil)
24
19
  self.level = 0
25
20
  self.logdevs = []
26
- self.formatter = Lamian.config.formatter
27
21
  end
28
22
 
29
23
  # @see Lamian.run
30
24
  # Collects logs sent inside block
31
25
  def run
32
- push_logdev(StringIO.new)
26
+ logdevs.push(StringIO.new)
27
+
33
28
  yield
34
29
  ensure
35
- pop_logdev
30
+ logdevs.pop
36
31
  end
37
32
 
38
33
  # Part of Logger api, entry point for all logs
39
34
  # extened to run on each log device in stack
40
35
  def add(*args, &block)
41
- each_logdev { super(*args, &block) }
36
+ @formatter = Lamian.config.formatter
37
+
38
+ logdevs.each do |logdev|
39
+ @logdev = logdev
40
+ super
41
+ end
42
42
  end
43
43
 
44
44
  # @see Lamian.dump
@@ -56,7 +56,13 @@ module Lamian
56
56
 
57
57
  private
58
58
 
59
- attr_accessor :level, :logdevs, :formatter
59
+ # @return [Int]
60
+ # current log level, implicitly set to zero
61
+ attr_accessor :level
62
+
63
+ # @return [Array(StringIO)]
64
+ # stack of log devices used to store logs
65
+ attr_accessor :logdevs
60
66
 
61
67
  # Formats string using given format
62
68
  # @todo create `formatters` interface to allow real format selection
@@ -71,26 +77,5 @@ module Lamian
71
77
  return unless string
72
78
  string.gsub!(/\[\d{1,2}m/, "")
73
79
  end
74
-
75
- # Pushes new logdev in the start of #run call
76
- # @param logdev [StringIO] new StringIO
77
- def push_logdev(logdev)
78
- logdevs << logdev
79
- end
80
-
81
- # Pops logdev in the end of #run call
82
- # @return [StringIO] logdev
83
- def pop_logdev
84
- logdevs.pop
85
- end
86
-
87
- # Runs specific block with all logdevs in stack to
88
- # populate them all
89
- def each_logdev
90
- logdevs.each do |logdev|
91
- @logdev = logdev
92
- yield
93
- end
94
- end
95
80
  end
96
81
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lamian
4
- # Provides rack middleware, which allows to colelct request logs
4
+ # Provides rack middleware, which allows to collect request logs
5
5
  # @attr app [Proc] stored application
6
6
  class Middleware
7
7
  # @param app [Proc] stored application
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A patch for Raven::Context class
4
+ module Lamian::RavenContextExtension
5
+ # Adds current lamian log to the extra part of all raven events generated inside Lamian.run block
6
+ # @see https://www.rubydoc.info/gems/sentry-raven/0.9.2/Raven/Context#extra-instance_method
7
+ def extra
8
+ log = Lamian.dump_limited
9
+ log ? super.merge!(Lamian::SENTRY_EXTRA_KEY => log) : super
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lamian
4
+ # Custom appender for the `semantic_logger` library.
5
+ # This appender adds all logs to the current Lamian logger.
6
+ # Since Lamian stores logs in a thread variable,
7
+ # it is necessary that this appender writes logs synchronously:
8
+ # just call `SematicLogger.sync!` somewhere in the initialization process.
9
+ # @see https://logger.rocketjob.io Semantic Logger documentation.
10
+ class SemanticLoggerAppender < SemanticLogger::Subscriber
11
+ # Mapping between standard Logger severity and SemanticLogger log levels.
12
+ LOGGER_LEVELS_MAPPING = { trace: 0, debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }.freeze
13
+
14
+ # The method to be implemented when creating a custom appender.
15
+ # @see https://logger.rocketjob.io/custom_appenders.html Documentation about custom appenders.
16
+ # @returns [Boolean]
17
+ def log(log)
18
+ mapped_level = LOGGER_LEVELS_MAPPING[log.level] || ::Logger::UNKNOWN
19
+ Lamian::Logger.current.add(mapped_level, log.message)
20
+
21
+ true
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A sidekiq middleware
4
+ class Lamian::SidekiqRavenMiddleware
5
+ # Adds current lamian log to the extra part of raven events generated inside sidekiq jobs
6
+ def call(*)
7
+ Lamian.run do
8
+ yield
9
+ rescue Exception # rubocop:disable Lint/RescueException
10
+ Raven.extra_context # Just trigger saving of the current log
11
+ raise
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A sidekiq middleware
4
+ class Lamian::SidekiqSentryMiddleware
5
+ # Adds current lamian log to the extra part of raven events generated inside sidekiq jobs
6
+ def call(*)
7
+ Lamian.run do
8
+ yield
9
+ rescue Exception # rubocop:disable Lint/RescueException
10
+ # Save current log
11
+ log = Lamian.dump_limited
12
+ Sentry.set_extras(Lamian::SENTRY_EXTRA_KEY => log) if log
13
+ raise
14
+ end
15
+ end
16
+ end
@@ -13,5 +13,5 @@ module Lamian
13
13
  # According to this, it is enought to specify '~> a.b'
14
14
  # if private API was not used and to specify '~> a.b.c' if it was
15
15
 
16
- VERSION = "1.0.1"
16
+ VERSION = "1.4.0"
17
17
  end
data/lib/lamian.rb CHANGED
@@ -10,6 +10,13 @@ module Lamian
10
10
  autoload :Logger, "lamian/logger"
11
11
  autoload :LoggerExtension, "lamian/logger_extension"
12
12
  autoload :Middleware, "lamian/middleware"
13
+ autoload :RavenContextExtension, "lamian/raven_context_extension"
14
+ autoload :SidekiqRavenMiddleware, "lamian/sidekiq_raven_middleware"
15
+ autoload :SidekiqSentryMiddleware, "lamian/sidekiq_sentry_middleware"
16
+ autoload :SemanticLoggerAppender, "lamian/semantic_logger_appender"
17
+
18
+ # The key under which logs are stored in the Sentry extra data.
19
+ SENTRY_EXTRA_KEY = :lamian_log
13
20
 
14
21
  require "lamian/engine"
15
22
 
@@ -43,12 +50,12 @@ module Lamian
43
50
  end
44
51
 
45
52
  # Collects logs sent inside block
46
- def run
47
- logger.run { yield }
53
+ def run(&block)
54
+ logger.run(&block)
48
55
  end
49
56
 
50
57
  # Dumps log collected in this run
51
- # @option format [Symbol]
58
+ # @param format [Symbol]
52
59
  # requested format of log. At this point, returns raw log if falsey
53
60
  # or log without controll sequences (such as '[23m') if truthy
54
61
  # value given (for now)
@@ -56,5 +63,11 @@ module Lamian
56
63
  def dump(format: nil)
57
64
  logger.dump(format: format)
58
65
  end
66
+
67
+ # Truncates the collected log to the specified limit and dumps it.
68
+ # @return [String, nil] truncated formatted log.
69
+ def dump_limited
70
+ dump(format: :txt)&.slice(0, Lamian.config.raven_log_size_limit)
71
+ end
59
72
  end
60
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lamian
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - JelF
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-02 00:00:00.000000000 Z
11
+ date: 2021-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -25,13 +25,13 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: exception_notification
28
+ name: bundler-audit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
- type: :runtime
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -39,131 +39,173 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: ci-helper
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.12'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.12'
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: launchy
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rake
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
- - - "~>"
87
+ - - ">="
60
88
  - !ruby/object:Gem::Version
61
- version: '10.0'
89
+ version: '0'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
- - - "~>"
94
+ - - ">="
67
95
  - !ruby/object:Gem::Version
68
- version: '10.0'
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rspec
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
- - - "~>"
101
+ - - ">="
74
102
  - !ruby/object:Gem::Version
75
- version: '3.0'
103
+ version: '0'
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
- - - "~>"
108
+ - - ">="
81
109
  - !ruby/object:Gem::Version
82
- version: '3.0'
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: rubocop-config-umbrellio
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
- - - '='
115
+ - - ">="
88
116
  - !ruby/object:Gem::Version
89
- version: 0.49.1.4
117
+ version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - '='
122
+ - - ">="
95
123
  - !ruby/object:Gem::Version
96
- version: 0.49.1.4
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
- name: pry
126
+ name: semantic_logger
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
- - - "~>"
129
+ - - ">="
102
130
  - !ruby/object:Gem::Version
103
- version: '0.10'
131
+ version: '0'
104
132
  type: :development
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
- - - "~>"
136
+ - - ">="
109
137
  - !ruby/object:Gem::Version
110
- version: '0.10'
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
- name: coveralls
140
+ name: sentry-raven
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
- - - "~>"
143
+ - - ">="
116
144
  - !ruby/object:Gem::Version
117
- version: '0.8'
145
+ version: '0'
118
146
  type: :development
119
147
  prerelease: false
120
148
  version_requirements: !ruby/object:Gem::Requirement
121
149
  requirements:
122
- - - "~>"
150
+ - - ">="
123
151
  - !ruby/object:Gem::Version
124
- version: '0.8'
152
+ version: '0'
125
153
  - !ruby/object:Gem::Dependency
126
- name: yard
154
+ name: sentry-ruby
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
- - - "~>"
157
+ - - ">="
130
158
  - !ruby/object:Gem::Version
131
- version: '0.9'
159
+ version: '0'
132
160
  type: :development
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
- - - "~>"
164
+ - - ">="
137
165
  - !ruby/object:Gem::Version
138
- version: '0.9'
166
+ version: '0'
139
167
  - !ruby/object:Gem::Dependency
140
- name: launchy
168
+ name: simplecov
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
- - - "~>"
171
+ - - ">="
144
172
  - !ruby/object:Gem::Version
145
- version: 2.4.3
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: simplecov-lcov
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
146
188
  type: :development
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
- - - "~>"
192
+ - - ">="
151
193
  - !ruby/object:Gem::Version
152
- version: 2.4.3
194
+ version: '0'
153
195
  - !ruby/object:Gem::Dependency
154
- name: json
196
+ name: yard
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - ">="
158
200
  - !ruby/object:Gem::Version
159
- version: 2.1.0
201
+ version: '0'
160
202
  type: :development
161
203
  prerelease: false
162
204
  version_requirements: !ruby/object:Gem::Requirement
163
205
  requirements:
164
206
  - - ">="
165
207
  - !ruby/object:Gem::Version
166
- version: 2.1.0
208
+ version: '0'
167
209
  description: Add logs to your error messages, using exception_notifier or smth like
168
210
  it
169
211
  email:
@@ -172,6 +214,19 @@ executables: []
172
214
  extensions: []
173
215
  extra_rdoc_files: []
174
216
  files:
217
+ - ".github/workflows/test.yml"
218
+ - ".gitignore"
219
+ - ".rubocop.yml"
220
+ - Changelog.md
221
+ - Gemfile
222
+ - Gemfile.lock
223
+ - LICENSE.txt
224
+ - README.md
225
+ - Rakefile
226
+ - bin/console
227
+ - bin/rake
228
+ - bin/rubocop
229
+ - bin/setup
175
230
  - lib/lamian.rb
176
231
  - lib/lamian/config.rb
177
232
  - lib/lamian/engine.rb
@@ -180,11 +235,16 @@ files:
180
235
  - lib/lamian/middleware.rb
181
236
  - lib/lamian/rails_views/exception_notifier/_request_log.html.erb
182
237
  - lib/lamian/rails_views/exception_notifier/_request_log.text.erb
238
+ - lib/lamian/raven_context_extension.rb
239
+ - lib/lamian/semantic_logger_appender.rb
240
+ - lib/lamian/sidekiq_raven_middleware.rb
241
+ - lib/lamian/sidekiq_sentry_middleware.rb
183
242
  - lib/lamian/version.rb
184
- homepage: https://github.com/JelF/lamian
185
- licenses: []
243
+ homepage: https://github.com/umbrellio/lamian
244
+ licenses:
245
+ - MIT
186
246
  metadata: {}
187
- post_install_message:
247
+ post_install_message:
188
248
  rdoc_options: []
189
249
  require_paths:
190
250
  - lib
@@ -192,16 +252,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
252
  requirements:
193
253
  - - ">="
194
254
  - !ruby/object:Gem::Version
195
- version: '0'
255
+ version: 2.5.0
196
256
  required_rubygems_version: !ruby/object:Gem::Requirement
197
257
  requirements:
198
258
  - - ">="
199
259
  - !ruby/object:Gem::Version
200
260
  version: '0'
201
261
  requirements: []
202
- rubyforge_project:
203
- rubygems_version: 2.5.2
204
- signing_key:
262
+ rubygems_version: 3.2.30
263
+ signing_key:
205
264
  specification_version: 4
206
265
  summary: Add logs to your error messages
207
266
  test_files: []