pliny 1.2.0 → 1.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53b08362a2511749050f3ca5ea9690d2adeefec8662f0a74cf391c896b119fd8
4
- data.tar.gz: 23da2c0e15bdb3bf93f719e440bf0c2ac2a093fc1de3e500850c47ce5b8d6851
3
+ metadata.gz: 251c0162450bf5e3ec77d7d3328d98cfb95c5c2b5350dc0a45da0ed67f5a7480
4
+ data.tar.gz: 78f0fba0ae08d2c57c7b5ec66701a2fecb01017ee7f8708cd6c85bf9e07bb6b5
5
5
  SHA512:
6
- metadata.gz: fc1e1a5d4fda88d1a181e06e7aefb300d1cf6ee516ca8e6018173dfd5dcf079885ebfb8c74643db317aa889a82cd38b95ce9101a592b3126fd7039f4aa7b029c
7
- data.tar.gz: 1120021ef6ade5c1470cb280504e9abad2f672610be35546d3ea2521164841e973cef2b1be2f2e1b9dd0614ac1c493e6dae818ab35cb8dff242fdd115228524c
6
+ metadata.gz: bc7ebe625e643356c66ea27a0f90e60c47ab726962f5391cc3b40ba13455fd70623566431d4e195a093d1481d610085a98521c6dca1781d62fc7867113eded8d
7
+ data.tar.gz: 41ceaae8f87a12916eca172429b023010a0d8d415cfc2d6e0ed7f87a3e9788764ee8670c1765b6e164eaca363f3b882fe723b98e0ab22ba2c8e7401d69cbaba5
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pliny
4
+ module ErrorReporters
5
+ class Sentry
6
+ def notify(exception, context:, rack_env:)
7
+ ::Sentry.with_scope do |scope|
8
+ configure_scope(scope, context: context, rack_env: rack_env)
9
+ ::Sentry.capture_exception(exception)
10
+ end
11
+ rescue Exception => e # rubocop:disable Lint/RescueException
12
+ ::Sentry.capture_exception(e)
13
+ raise
14
+ end
15
+
16
+ private
17
+
18
+ def configure_scope(scope, context:, rack_env:)
19
+ scope.set_context("custom", context)
20
+
21
+ begin
22
+ person_data = extract_person_data_from_controller(rack_env)
23
+ if person_data && !person_data.empty?
24
+ scope.set_user(
25
+ id: person_data[:id],
26
+ email: person_data[:email],
27
+ username: person_data[:username],
28
+ )
29
+ end
30
+ rescue => e
31
+ ::Sentry.capture_exception(e)
32
+ end
33
+ end
34
+
35
+ def extract_person_data_from_controller(env)
36
+ env["sentry.person_data"] || {}
37
+ end
38
+ end
39
+ end
40
+ end
data/lib/pliny/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pliny
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/template/Gemfile CHANGED
@@ -9,6 +9,7 @@ gem "rack-ssl"
9
9
  gem "rack-timeout", "~> 0.6"
10
10
  gem "rake"
11
11
  gem "rollbar"
12
+ gem "sentry-ruby"
12
13
  gem "sequel", "~> 5.73"
13
14
  gem "sequel-paranoid"
14
15
  gem "sequel_pg", "~> 1.17", require: "sequel"
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pliny/error_reporters/sentry"
4
+
5
+ Pliny::ErrorReporters.error_reporters << Pliny::ErrorReporters::Sentry
6
+
7
+ Sentry.init do |config|
8
+ config.dsn = ENV["SENTRY_DSN"]
9
+ config.environment = ENV["SENTRY_ENV"] || ENV["RACK_ENV"]
10
+ config.enabled_environments = ENV["SENTRY_ENABLED_ENVIRONMENTS"]&.split(",") || %w[production staging]
11
+ config.traces_sample_rate = ENV["SENTRY_TRACES_SAMPLE_RATE"]&.to_f || 0.1
12
+ end
13
+
14
+ Pliny.use Sentry::Rack::CaptureExceptions
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sentry-ruby"
5
+ require "pliny/error_reporters/sentry"
6
+
7
+ describe Pliny::ErrorReporters::Sentry do
8
+ subject(:reporter) { described_class.new }
9
+
10
+ describe "#notify" do
11
+ let(:exception) { StandardError.new("Something went wrong") }
12
+ let(:context) { { step: :foo } }
13
+ let(:rack_env) { { "rack.input" => StringIO.new } }
14
+
15
+ subject(:notify) do
16
+ reporter.notify(exception, context: context, rack_env: rack_env)
17
+ end
18
+
19
+ before do
20
+ allow(::Sentry).to receive(:with_scope).and_yield(scope)
21
+ allow(::Sentry).to receive(:capture_exception)
22
+ end
23
+
24
+ let(:scope) { instance_double("Sentry::Scope") }
25
+
26
+ before do
27
+ allow(scope).to receive(:set_context)
28
+ allow(scope).to receive(:set_user)
29
+ end
30
+
31
+ it "creates a sentry scope" do
32
+ notify
33
+ expect(::Sentry).to have_received(:with_scope).once
34
+ end
35
+
36
+ it "sets custom context" do
37
+ notify
38
+ expect(scope).to have_received(:set_context).with("custom", { step: :foo })
39
+ end
40
+
41
+ it "captures the exception" do
42
+ notify
43
+ expect(::Sentry).to have_received(:capture_exception).with(exception)
44
+ end
45
+
46
+ context "given a rack_env with sentry.person_data" do
47
+ let(:rack_env) { { "sentry.person_data" => { id: 123, email: "test@example.com", username: "testuser" }, "rack.input" => StringIO.new } }
48
+
49
+ it "sets user context from sentry.person_data" do
50
+ notify
51
+ expect(scope).to have_received(:set_user).with(id: 123, email: "test@example.com", username: "testuser")
52
+ end
53
+ end
54
+
55
+ context "given a rack_env with empty sentry.person_data" do
56
+ let(:rack_env) { { "sentry.person_data" => {}, "rack.input" => StringIO.new } }
57
+
58
+ it "does not set user context" do
59
+ notify
60
+ expect(scope).not_to have_received(:set_user)
61
+ end
62
+ end
63
+
64
+ context "given an empty rack_env" do
65
+ let(:rack_env) { {} }
66
+
67
+ it "expects rack_env to be a hash" do
68
+ assert_kind_of(Hash, rack_env)
69
+ end
70
+
71
+ it "sets only custom context" do
72
+ notify
73
+ expect(scope).to have_received(:set_context).once.with("custom", { step: :foo })
74
+ expect(scope).not_to have_received(:set_user)
75
+ end
76
+
77
+ it "captures the exception" do
78
+ notify
79
+ expect(::Sentry).to have_received(:capture_exception).with(exception)
80
+ end
81
+ end
82
+ end
83
+ end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pliny
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandur Leach
8
8
  - Pedro Belo
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2025-02-10 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
@@ -132,95 +131,77 @@ dependencies:
132
131
  - !ruby/object:Gem::Version
133
132
  version: '2.0'
134
133
  - !ruby/object:Gem::Dependency
135
- name: rake
134
+ name: pry
136
135
  requirement: !ruby/object:Gem::Requirement
137
136
  requirements:
138
- - - "~>"
137
+ - - ">="
139
138
  - !ruby/object:Gem::Version
140
- version: '13.0'
139
+ version: '0'
141
140
  type: :development
142
141
  prerelease: false
143
142
  version_requirements: !ruby/object:Gem::Requirement
144
143
  requirements:
145
- - - "~>"
144
+ - - ">="
146
145
  - !ruby/object:Gem::Version
147
- version: '13.0'
146
+ version: '0'
148
147
  - !ruby/object:Gem::Dependency
149
- name: rack-test
148
+ name: pry-byebug
150
149
  requirement: !ruby/object:Gem::Requirement
151
150
  requirements:
152
- - - "~>"
151
+ - - ">="
153
152
  - !ruby/object:Gem::Version
154
- version: '2'
153
+ version: '0'
155
154
  type: :development
156
155
  prerelease: false
157
156
  version_requirements: !ruby/object:Gem::Requirement
158
157
  requirements:
159
- - - "~>"
158
+ - - ">="
160
159
  - !ruby/object:Gem::Version
161
- version: '2'
160
+ version: '0'
162
161
  - !ruby/object:Gem::Dependency
163
- name: rspec
162
+ name: rack-test
164
163
  requirement: !ruby/object:Gem::Requirement
165
164
  requirements:
166
- - - "~>"
167
- - !ruby/object:Gem::Version
168
- version: '3.1'
169
165
  - - ">="
170
166
  - !ruby/object:Gem::Version
171
- version: 3.1.0
167
+ version: '0'
172
168
  type: :development
173
169
  prerelease: false
174
170
  version_requirements: !ruby/object:Gem::Requirement
175
171
  requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: '3.1'
179
172
  - - ">="
180
173
  - !ruby/object:Gem::Version
181
- version: 3.1.0
174
+ version: '0'
182
175
  - !ruby/object:Gem::Dependency
183
- name: sinatra-contrib
176
+ name: rake
184
177
  requirement: !ruby/object:Gem::Requirement
185
178
  requirements:
186
179
  - - ">="
187
180
  - !ruby/object:Gem::Version
188
- version: '2.0'
189
- - - "<"
190
- - !ruby/object:Gem::Version
191
- version: '5.0'
181
+ version: '0'
192
182
  type: :development
193
183
  prerelease: false
194
184
  version_requirements: !ruby/object:Gem::Requirement
195
185
  requirements:
196
186
  - - ">="
197
187
  - !ruby/object:Gem::Version
198
- version: '2.0'
199
- - - "<"
200
- - !ruby/object:Gem::Version
201
- version: '5.0'
188
+ version: '0'
202
189
  - !ruby/object:Gem::Dependency
203
- name: timecop
190
+ name: rollbar
204
191
  requirement: !ruby/object:Gem::Requirement
205
192
  requirements:
206
- - - "~>"
207
- - !ruby/object:Gem::Version
208
- version: '0.7'
209
193
  - - ">="
210
194
  - !ruby/object:Gem::Version
211
- version: 0.7.1
195
+ version: '0'
212
196
  type: :development
213
197
  prerelease: false
214
198
  version_requirements: !ruby/object:Gem::Requirement
215
199
  requirements:
216
- - - "~>"
217
- - !ruby/object:Gem::Version
218
- version: '0.7'
219
200
  - - ">="
220
201
  - !ruby/object:Gem::Version
221
- version: 0.7.1
202
+ version: '0'
222
203
  - !ruby/object:Gem::Dependency
223
- name: pry
204
+ name: rspec
224
205
  requirement: !ruby/object:Gem::Requirement
225
206
  requirements:
226
207
  - - ">="
@@ -234,7 +215,7 @@ dependencies:
234
215
  - !ruby/object:Gem::Version
235
216
  version: '0'
236
217
  - !ruby/object:Gem::Dependency
237
- name: pry-byebug
218
+ name: rubocop
238
219
  requirement: !ruby/object:Gem::Requirement
239
220
  requirements:
240
221
  - - ">="
@@ -248,79 +229,61 @@ dependencies:
248
229
  - !ruby/object:Gem::Version
249
230
  version: '0'
250
231
  - !ruby/object:Gem::Dependency
251
- name: pg
232
+ name: sentry-ruby
252
233
  requirement: !ruby/object:Gem::Requirement
253
234
  requirements:
254
- - - "~>"
255
- - !ruby/object:Gem::Version
256
- version: '1.0'
257
- - - "<"
235
+ - - ">="
258
236
  - !ruby/object:Gem::Version
259
- version: '2.0'
237
+ version: '0'
260
238
  type: :development
261
239
  prerelease: false
262
240
  version_requirements: !ruby/object:Gem::Requirement
263
241
  requirements:
264
- - - "~>"
265
- - !ruby/object:Gem::Version
266
- version: '1.0'
267
- - - "<"
242
+ - - ">="
268
243
  - !ruby/object:Gem::Version
269
- version: '2.0'
244
+ version: '0'
270
245
  - !ruby/object:Gem::Dependency
271
- name: rollbar
246
+ name: sequel
272
247
  requirement: !ruby/object:Gem::Requirement
273
248
  requirements:
274
- - - "~>"
249
+ - - ">="
275
250
  - !ruby/object:Gem::Version
276
- version: '3.2'
251
+ version: '0'
277
252
  type: :development
278
253
  prerelease: false
279
254
  version_requirements: !ruby/object:Gem::Requirement
280
255
  requirements:
281
- - - "~>"
256
+ - - ">="
282
257
  - !ruby/object:Gem::Version
283
- version: '3.2'
258
+ version: '0'
284
259
  - !ruby/object:Gem::Dependency
285
- name: sequel
260
+ name: sinatra-contrib
286
261
  requirement: !ruby/object:Gem::Requirement
287
262
  requirements:
288
- - - "~>"
289
- - !ruby/object:Gem::Version
290
- version: '5.4'
291
- - - "<"
263
+ - - ">="
292
264
  - !ruby/object:Gem::Version
293
- version: '6.0'
265
+ version: '0'
294
266
  type: :development
295
267
  prerelease: false
296
268
  version_requirements: !ruby/object:Gem::Requirement
297
269
  requirements:
298
- - - "~>"
299
- - !ruby/object:Gem::Version
300
- version: '5.4'
301
- - - "<"
270
+ - - ">="
302
271
  - !ruby/object:Gem::Version
303
- version: '6.0'
272
+ version: '0'
304
273
  - !ruby/object:Gem::Dependency
305
- name: rubocop
274
+ name: timecop
306
275
  requirement: !ruby/object:Gem::Requirement
307
276
  requirements:
308
- - - "~>"
309
- - !ruby/object:Gem::Version
310
- version: '0.52'
311
277
  - - ">="
312
278
  - !ruby/object:Gem::Version
313
- version: 0.52.1
279
+ version: '0'
314
280
  type: :development
315
281
  prerelease: false
316
282
  version_requirements: !ruby/object:Gem::Requirement
317
283
  requirements:
318
- - - "~>"
319
- - !ruby/object:Gem::Version
320
- version: '0.52'
321
284
  - - ">="
322
285
  - !ruby/object:Gem::Version
323
- version: 0.52.1
286
+ version: '0'
324
287
  description: Pliny is a set of base classes and helpers to help developers write excellent
325
288
  APIs in Sinatra
326
289
  email:
@@ -353,6 +316,7 @@ files:
353
316
  - lib/pliny/db_support.rb
354
317
  - lib/pliny/error_reporters.rb
355
318
  - lib/pliny/error_reporters/rollbar.rb
319
+ - lib/pliny/error_reporters/sentry.rb
356
320
  - lib/pliny/errors.rb
357
321
  - lib/pliny/helpers/encode.rb
358
322
  - lib/pliny/helpers/params.rb
@@ -411,7 +375,7 @@ files:
411
375
  - lib/template/config/initializers/database.rb
412
376
  - lib/template/config/initializers/log.rb
413
377
  - lib/template/config/initializers/metrics.rb
414
- - lib/template/config/initializers/rollbar.rb
378
+ - lib/template/config/initializers/sentry.rb
415
379
  - lib/template/config/puma.rb
416
380
  - lib/template/db/schema.sql
417
381
  - lib/template/db/seeds.rb
@@ -448,6 +412,7 @@ files:
448
412
  - spec/config_helpers_spec.rb
449
413
  - spec/db_support_spec.rb
450
414
  - spec/error_reporters/rollbar_spec.rb
415
+ - spec/error_reporters/sentry_spec.rb
451
416
  - spec/error_reporters_spec.rb
452
417
  - spec/errors_spec.rb
453
418
  - spec/helpers/encode_spec.rb
@@ -477,7 +442,6 @@ homepage: https://github.com/interagent/pliny
477
442
  licenses:
478
443
  - MIT
479
444
  metadata: {}
480
- post_install_message:
481
445
  rdoc_options: []
482
446
  require_paths:
483
447
  - lib
@@ -492,8 +456,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
492
456
  - !ruby/object:Gem::Version
493
457
  version: '0'
494
458
  requirements: []
495
- rubygems_version: 3.5.22
496
- signing_key:
459
+ rubygems_version: 3.6.7
497
460
  specification_version: 4
498
461
  summary: Basic tooling to support API apps in Sinatra
499
462
  test_files: []
@@ -1,12 +0,0 @@
1
- require "pliny/error_reporters/rollbar"
2
-
3
- Pliny::ErrorReporters.error_reporters << Pliny::ErrorReporters::Rollbar
4
-
5
- Rollbar.configure do |config|
6
- config.enabled = ENV.key?("ROLLBAR_ACCESS_TOKEN")
7
- config.disable_rack_monkey_patch = true
8
- config.access_token = ENV["ROLLBAR_ACCESS_TOKEN"]
9
- config.environment = ENV["ROLLBAR_ENV"]
10
- config.logger = Pliny::RollbarLogger.new
11
- config.use_sucker_punch
12
- end