webhukhs 0.6.0 → 0.8.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +2 -0
  3. data/.yard-lint.yml +296 -0
  4. data/AGENTS.md +56 -0
  5. data/Appraisals +6 -2
  6. data/CHANGELOG.md +20 -0
  7. data/README.md +101 -11
  8. data/Rakefile +7 -0
  9. data/config/mutant.rb +37 -0
  10. data/config/mutant.yml +25 -0
  11. data/example/Gemfile +5 -6
  12. data/example/Gemfile.lock +260 -141
  13. data/example/app/webhooks/acme_handler.rb +16 -0
  14. data/example/app/webhooks/flaky_handler.rb +8 -0
  15. data/example/app/webhooks/signed_handler.rb +10 -0
  16. data/example/config/initializers/webhukhs.rb +4 -3
  17. data/example/config/routes.rb +3 -0
  18. data/example/db/migrate/20240601000000_add_headers_to_webhukhs_webhooks.rb +7 -0
  19. data/example/db/schema.rb +2 -1
  20. data/example/db/seeds.rb +71 -7
  21. data/gemfiles/{rails_7.1.gemfile → rails_7.2.gemfile} +1 -4
  22. data/gemfiles/rails_7.2.gemfile.lock +477 -0
  23. data/gemfiles/rails_8.0.gemfile +0 -3
  24. data/gemfiles/rails_8.0.gemfile.lock +74 -4
  25. data/gemfiles/rails_8.1.gemfile +0 -3
  26. data/gemfiles/rails_8.1.gemfile.lock +74 -4
  27. data/gemfiles/rails_master.gemfile +7 -0
  28. data/lib/webhukhs/admin/application_controller.rb +32 -0
  29. data/lib/webhukhs/admin/assets/admin.css +476 -0
  30. data/lib/webhukhs/admin/assets/admin.js +111 -0
  31. data/lib/webhukhs/admin/config/routes.rb +6 -0
  32. data/lib/webhukhs/admin/engine.rb +20 -0
  33. data/lib/webhukhs/admin/received_webhook_presenter.rb +63 -0
  34. data/lib/webhukhs/admin/received_webhooks_controller.rb +60 -0
  35. data/lib/webhukhs/admin/view_helper.rb +50 -0
  36. data/lib/webhukhs/admin/views/layouts/webhukhs/admin/application.html.erb +22 -0
  37. data/lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/index.html.erb +50 -0
  38. data/lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/show.html.erb +55 -0
  39. data/lib/webhukhs/admin.rb +17 -0
  40. data/lib/webhukhs/base_handler.rb +9 -6
  41. data/lib/webhukhs/controllers/receive_webhooks_controller.rb +26 -7
  42. data/lib/webhukhs/engine.rb +1 -4
  43. data/lib/webhukhs/install_generator.rb +9 -2
  44. data/lib/webhukhs/jobs/processing_job.rb +13 -12
  45. data/lib/webhukhs/models/received_webhook.rb +21 -9
  46. data/lib/webhukhs/version.rb +1 -1
  47. data/lib/webhukhs.rb +9 -0
  48. data/test/admin_test.rb +334 -0
  49. data/test/base_handler_test.rb +125 -0
  50. data/test/browser/admin_click_through.rb +208 -0
  51. data/test/processing_job_test.rb +152 -12
  52. data/test/received_webhook_test.rb +260 -0
  53. data/test/test_app.rb +39 -15
  54. data/test/test_helper.rb +69 -0
  55. data/test/webhukhs_test.rb +111 -49
  56. metadata +173 -11
  57. data/example/.ruby-version +0 -1
  58. data/gemfiles/rails_7.1.gemfile.lock +0 -412
@@ -1,14 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "test_helper"
4
- require_relative "test_app"
5
4
 
6
- class TestWebhukhs < ActionDispatch::IntegrationTest
7
- teardown { Webhukhs::ReceivedWebhook.delete_all }
5
+ class FailingLookupReceiveWebhooksController < Webhukhs::ReceiveWebhooksController
6
+ def initialize(error)
7
+ super()
8
+ @error = error
9
+ end
10
+
11
+ def service_id = "broken"
8
12
 
9
- def test_that_it_has_a_version_number
10
- refute_nil ::Webhukhs::VERSION
13
+ def lookup_handler(_service_id)
14
+ raise @error
11
15
  end
16
+ end
17
+
18
+ class TestWebhukhs < ActionDispatch::IntegrationTest
19
+ cover "Webhukhs*"
20
+ cover "Webhukhs::BaseHandler*"
21
+ cover "Webhukhs::Configuration*"
22
+ cover "Webhukhs::ProcessingJob*"
23
+ cover "Webhukhs::ReceiveWebhooksController*"
24
+ cover "Webhukhs::ReceivedWebhook*"
25
+
26
+ teardown { Webhukhs::ReceivedWebhook.delete_all }
12
27
 
13
28
  def webhook_body
14
29
  <<~JSON
@@ -28,15 +43,25 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
28
43
  test(msg) { skip }
29
44
  end
30
45
 
31
- test "ensure webhook is processed only once during creation" do
32
- tf = Tempfile.new
33
- body = {isValid: true, outputToFilename: tf.path}
34
- body_json = body.to_json
46
+ test "returns a memoized configuration object and yields it to configure" do
47
+ original_configuration = Webhukhs.instance_variable_get(:@configuration)
48
+ Webhukhs.remove_instance_variable(:@configuration) if Webhukhs.instance_variable_defined?(:@configuration)
35
49
 
36
- assert_enqueued_jobs 1, only: Webhukhs::ProcessingJob do
37
- post "/webhukhs/test", params: body_json, headers: {"CONTENT_TYPE" => "application/json"}
38
- assert_response 200
39
- end
50
+ configuration = Webhukhs.configuration
51
+
52
+ assert_instance_of Webhukhs::Configuration, configuration
53
+ assert_same configuration, Webhukhs.configuration
54
+
55
+ yielded = nil
56
+ Webhukhs.configure { |config| yielded = config }
57
+
58
+ assert_same configuration, yielded
59
+ ensure
60
+ Webhukhs.instance_variable_set(:@configuration, original_configuration)
61
+ end
62
+
63
+ test "loads engine generators" do
64
+ assert_nothing_raised { Webhukhs::Engine.load_generators }
40
65
  end
41
66
 
42
67
  test "accepts a webhook, stores and processes it" do
@@ -46,20 +71,25 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
46
71
 
47
72
  post "/webhukhs/test", params: body_json, headers: {"CONTENT_TYPE" => "application/json"}
48
73
  assert_response 200
74
+ assert_equal({"ok" => true, "error" => nil}, response.parsed_body)
49
75
 
50
76
  webhook = Webhukhs::ReceivedWebhook.last!
51
77
 
52
- assert_predicate webhook, :received?
53
- assert_equal "WebhookTestHandler", webhook.handler_module_name
54
- assert_equal webhook.status, "received"
55
- assert_equal webhook.body, body_json
56
-
57
78
  perform_enqueued_jobs
58
79
  assert_predicate webhook.reload, :processed?
59
80
  tf.rewind
60
81
  assert_equal tf.read, body_json
61
82
  end
62
83
 
84
+ test "stores the body of a form-encoded webhook" do
85
+ # Rails parses the form into params before the handler sees the request, which leaves the body
86
+ # stream at its end
87
+ post "/webhukhs/test", params: "event=paid&amount=12.50", headers: {"CONTENT_TYPE" => "application/x-www-form-urlencoded"}
88
+ assert_response 200
89
+
90
+ assert_equal "event=paid&amount=12.50", Webhukhs::ReceivedWebhook.last!.body
91
+ end
92
+
63
93
  test "accepts a webhook but does not process it if it is invalid" do
64
94
  tf = Tempfile.new
65
95
  body = {isValid: false, outputToFilename: tf.path}
@@ -70,11 +100,6 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
70
100
 
71
101
  webhook = Webhukhs::ReceivedWebhook.last!
72
102
 
73
- assert_predicate webhook, :received?
74
- assert_equal "WebhookTestHandler", webhook.handler_module_name
75
- assert_equal webhook.status, "received"
76
- assert_equal webhook.body, body_json
77
-
78
103
  perform_enqueued_jobs
79
104
  assert_predicate webhook.reload, :failed_validation?
80
105
 
@@ -92,11 +117,6 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
92
117
 
93
118
  webhook = Webhukhs::ReceivedWebhook.last!
94
119
 
95
- assert_predicate webhook, :received?
96
- assert_equal "WebhookTestHandler", webhook.handler_module_name
97
- assert_equal webhook.status, "received"
98
- assert_equal webhook.body, body_json
99
-
100
120
  assert_raises(StandardError) { perform_enqueued_jobs }
101
121
  assert_predicate webhook.reload, :error?
102
122
 
@@ -133,23 +153,46 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
133
153
  end
134
154
 
135
155
  test "raises an error if the service_id is not known" do
136
- post "/webhukhs/missing_service", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
137
- assert_response 404
156
+ report = assert_error_reported(Webhukhs::ReceiveWebhooksController::UnknownHandler) do
157
+ post "/webhukhs/missing_service", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
158
+
159
+ assert_response 404
160
+ assert_equal "No handler found for \"missing_service\"", response.parsed_body["error"]
161
+ end
162
+
163
+ assert_predicate report, :handled?
164
+ assert_equal :error, report.severity
138
165
  end
139
166
 
140
167
  test "returns a 503 when a handler is inactive" do
141
- post "/webhukhs/inactive", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
168
+ report = assert_error_reported(Webhukhs::ReceiveWebhooksController::HandlerInactive) do
169
+ post "/webhukhs/inactive", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
170
+
171
+ assert_response 503
172
+ assert_equal 'Webhook handler "inactive" is inactive', response.parsed_body["error"]
173
+ end
142
174
 
143
- assert_response 503
144
- assert_equal 'Webhook handler "inactive" is inactive', response.parsed_body["error"]
175
+ assert_predicate report, :handled?
176
+ assert_equal :error, report.severity
145
177
  end
146
178
 
147
179
  test "returns a 200 status and error message if the handler does not expose errors" do
148
- post "/webhukhs/failing-with-concealed-errors", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
180
+ original_error_context = Webhukhs.configuration.error_context
181
+ Webhukhs.configuration.error_context = {component: "webhooks"}
149
182
 
150
- assert_response 200
151
- assert_equal false, response.parsed_body["ok"]
152
- assert response.parsed_body["error"]
183
+ report = assert_error_reported(RuntimeError) do
184
+ post "/webhukhs/failing-with-concealed-errors", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
185
+
186
+ assert_response 200
187
+ assert_false response.parsed_body["ok"]
188
+ assert_equal "Internal error (oops)", response.parsed_body["error"]
189
+ end
190
+
191
+ assert_predicate report, :handled?
192
+ assert_equal :error, report.severity
193
+ assert_equal "webhooks", report.context[:component]
194
+ ensure
195
+ Webhukhs.configuration.error_context = original_error_context
153
196
  end
154
197
 
155
198
  test "returns a 500 status and error message if the handler does not expose errors" do
@@ -160,6 +203,37 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
160
203
  # common Rails error page
161
204
  end
162
205
 
206
+ test "re-raises lookup errors before a handler has been assigned" do
207
+ original_active_handlers = Webhukhs.configuration.active_handlers
208
+ Webhukhs.configuration.active_handlers = original_active_handlers.merge(broken: "MissingHandler")
209
+
210
+ post "/webhukhs/broken", params: webhook_body, headers: {"CONTENT_TYPE" => "application/json"}
211
+
212
+ assert_response 500
213
+ assert_includes response.body, "NameError"
214
+ assert_includes response.body, "MissingHandler"
215
+ ensure
216
+ Webhukhs.configuration.active_handlers = original_active_handlers
217
+ end
218
+
219
+ test "re-raises the original error when lookup fails before assigning a handler" do
220
+ original_error = NameError.new("uninitialized constant MissingHandler")
221
+ controller = FailingLookupReceiveWebhooksController.new(original_error)
222
+
223
+ raised_error = assert_raises(NameError) { controller.create }
224
+
225
+ assert_same original_error, raised_error
226
+ end
227
+
228
+ test "accepts handlers configured as class constants" do
229
+ original_active_handlers = Webhukhs.configuration.active_handlers
230
+ Webhukhs.configuration.active_handlers = original_active_handlers.merge(class_handler: WebhookTestHandler)
231
+
232
+ assert_instance_of WebhookTestHandler, Webhukhs::ReceiveWebhooksController.new.lookup_handler("class_handler")
233
+ ensure
234
+ Webhukhs.configuration.active_handlers = original_active_handlers
235
+ end
236
+
163
237
  test "deduplicates received webhooks based on the event ID" do
164
238
  body = {event_id: SecureRandom.uuid, body: "test"}.to_json
165
239
 
@@ -200,16 +274,4 @@ class TestWebhukhs < ActionDispatch::IntegrationTest
200
274
  assert_equal "received", webhook.status
201
275
  end
202
276
  end
203
-
204
- test "ensure_id does not override id for integer primary key columns" do
205
- webhook = Webhukhs::ReceivedWebhook.create!(
206
- handler_event_id: SecureRandom.uuid,
207
- handler_module_name: "WebhookTestHandler",
208
- status: "received",
209
- body: {isValid: true}.to_json
210
- )
211
-
212
- assert_kind_of Integer, webhook.id
213
- assert webhook.id > 0
214
- end
215
277
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webhukhs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav Katkov
@@ -15,14 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '7.0'
18
+ version: '7.2'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '7.0'
25
+ version: '7.2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: assiette
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.6'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.6'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: state_machine_enum
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -107,10 +121,134 @@ dependencies:
107
121
  - - "~>"
108
122
  - !ruby/object:Gem::Version
109
123
  version: '5.0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: minitest-strict
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: sqlite3
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: sprockets-rails
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: yard-lint
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: mutant
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: mutant-minitest
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: simplecov
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.22'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0.22'
222
+ - !ruby/object:Gem::Dependency
223
+ name: ferrum
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '0.19'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '0.19'
236
+ - !ruby/object:Gem::Dependency
237
+ name: puma
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
110
250
  description: Webhukhs is a Rails engine for processing webhooks from various services.
111
- Engine saves webhook in database first and later processes webhook in async process.
112
- Supports custom handlers with Webhukhs::BaseHandler and integrates with Rails common
113
- error reporter.
251
+ Engine saves webhook in database first and later processes in async job.
114
252
  email:
115
253
  - github@skatkov.com
116
254
  executables: []
@@ -120,15 +258,18 @@ files:
120
258
  - ".editorconfig"
121
259
  - ".rubocop.yml"
122
260
  - ".standard.yml"
261
+ - ".yard-lint.yml"
262
+ - AGENTS.md
123
263
  - Appraisals
124
264
  - CHANGELOG.md
125
265
  - LICENSE
126
266
  - README.md
127
267
  - Rakefile
268
+ - config/mutant.rb
269
+ - config/mutant.yml
128
270
  - config/routes.rb
129
271
  - example/.gitattributes
130
272
  - example/.gitignore
131
- - example/.ruby-version
132
273
  - example/Gemfile
133
274
  - example/Gemfile.lock
134
275
  - example/README.md
@@ -141,6 +282,9 @@ files:
141
282
  - example/app/models/application_record.rb
142
283
  - example/app/models/concerns/.keep
143
284
  - example/app/views/layouts/application.html.erb
285
+ - example/app/webhooks/acme_handler.rb
286
+ - example/app/webhooks/flaky_handler.rb
287
+ - example/app/webhooks/signed_handler.rb
144
288
  - example/app/webhooks/webhook_test_handler.rb
145
289
  - example/bin/bundle
146
290
  - example/bin/rails
@@ -166,6 +310,7 @@ files:
166
310
  - example/config/puma.rb
167
311
  - example/config/routes.rb
168
312
  - example/db/migrate/20240523125859_create_webhukhs_tables.rb
313
+ - example/db/migrate/20240601000000_add_headers_to_webhukhs_webhooks.rb
169
314
  - example/db/schema.rb
170
315
  - example/db/seeds.rb
171
316
  - example/lib/assets/.keep
@@ -187,18 +332,31 @@ files:
187
332
  - example/tmp/.keep
188
333
  - example/tmp/pids/.keep
189
334
  - example/vendor/.keep
190
- - gemfiles/rails_7.1.gemfile
191
- - gemfiles/rails_7.1.gemfile.lock
335
+ - gemfiles/rails_7.2.gemfile
336
+ - gemfiles/rails_7.2.gemfile.lock
192
337
  - gemfiles/rails_8.0.gemfile
193
338
  - gemfiles/rails_8.0.gemfile.lock
194
339
  - gemfiles/rails_8.1.gemfile
195
340
  - gemfiles/rails_8.1.gemfile.lock
341
+ - gemfiles/rails_master.gemfile
196
342
  - handler-examples/customer_io_handler.rb
197
343
  - handler-examples/revolut_business_v1_handler.rb
198
344
  - handler-examples/revolut_business_v2_handler.rb
199
345
  - handler-examples/starling_payments_handler.rb
200
346
  - lib/tasks/webhukhs_tasks.rake
201
347
  - lib/webhukhs.rb
348
+ - lib/webhukhs/admin.rb
349
+ - lib/webhukhs/admin/application_controller.rb
350
+ - lib/webhukhs/admin/assets/admin.css
351
+ - lib/webhukhs/admin/assets/admin.js
352
+ - lib/webhukhs/admin/config/routes.rb
353
+ - lib/webhukhs/admin/engine.rb
354
+ - lib/webhukhs/admin/received_webhook_presenter.rb
355
+ - lib/webhukhs/admin/received_webhooks_controller.rb
356
+ - lib/webhukhs/admin/view_helper.rb
357
+ - lib/webhukhs/admin/views/layouts/webhukhs/admin/application.html.erb
358
+ - lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/index.html.erb
359
+ - lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/show.html.erb
202
360
  - lib/webhukhs/base_handler.rb
203
361
  - lib/webhukhs/controllers/receive_webhooks_controller.rb
204
362
  - lib/webhukhs/engine.rb
@@ -209,7 +367,11 @@ files:
209
367
  - lib/webhukhs/templates/create_webhukhs_tables.rb.erb
210
368
  - lib/webhukhs/templates/webhukhs.rb
211
369
  - lib/webhukhs/version.rb
370
+ - test/admin_test.rb
371
+ - test/base_handler_test.rb
372
+ - test/browser/admin_click_through.rb
212
373
  - test/processing_job_test.rb
374
+ - test/received_webhook_test.rb
213
375
  - test/test-webhook-handlers/.DS_Store
214
376
  - test/test-webhook-handlers/extract_id_handler.rb
215
377
  - test/test-webhook-handlers/failing_with_concealed_errors.rb
@@ -235,14 +397,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
397
  requirements:
236
398
  - - ">="
237
399
  - !ruby/object:Gem::Version
238
- version: '3.0'
400
+ version: '3.1'
239
401
  required_rubygems_version: !ruby/object:Gem::Requirement
240
402
  requirements:
241
403
  - - ">="
242
404
  - !ruby/object:Gem::Version
243
405
  version: '0'
244
406
  requirements: []
245
- rubygems_version: 4.0.1
407
+ rubygems_version: 4.0.20
246
408
  specification_version: 4
247
409
  summary: Webhooks processing engine for Rails applications
248
410
  test_files: []
@@ -1 +0,0 @@
1
- ruby-3.2.2