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.
- checksums.yaml +4 -4
- data/.standard.yml +2 -0
- data/.yard-lint.yml +296 -0
- data/AGENTS.md +56 -0
- data/Appraisals +6 -2
- data/CHANGELOG.md +20 -0
- data/README.md +101 -11
- data/Rakefile +7 -0
- data/config/mutant.rb +37 -0
- data/config/mutant.yml +25 -0
- data/example/Gemfile +5 -6
- data/example/Gemfile.lock +260 -141
- data/example/app/webhooks/acme_handler.rb +16 -0
- data/example/app/webhooks/flaky_handler.rb +8 -0
- data/example/app/webhooks/signed_handler.rb +10 -0
- data/example/config/initializers/webhukhs.rb +4 -3
- data/example/config/routes.rb +3 -0
- data/example/db/migrate/20240601000000_add_headers_to_webhukhs_webhooks.rb +7 -0
- data/example/db/schema.rb +2 -1
- data/example/db/seeds.rb +71 -7
- data/gemfiles/{rails_7.1.gemfile → rails_7.2.gemfile} +1 -4
- data/gemfiles/rails_7.2.gemfile.lock +477 -0
- data/gemfiles/rails_8.0.gemfile +0 -3
- data/gemfiles/rails_8.0.gemfile.lock +74 -4
- data/gemfiles/rails_8.1.gemfile +0 -3
- data/gemfiles/rails_8.1.gemfile.lock +74 -4
- data/gemfiles/rails_master.gemfile +7 -0
- data/lib/webhukhs/admin/application_controller.rb +32 -0
- data/lib/webhukhs/admin/assets/admin.css +476 -0
- data/lib/webhukhs/admin/assets/admin.js +111 -0
- data/lib/webhukhs/admin/config/routes.rb +6 -0
- data/lib/webhukhs/admin/engine.rb +20 -0
- data/lib/webhukhs/admin/received_webhook_presenter.rb +63 -0
- data/lib/webhukhs/admin/received_webhooks_controller.rb +60 -0
- data/lib/webhukhs/admin/view_helper.rb +50 -0
- data/lib/webhukhs/admin/views/layouts/webhukhs/admin/application.html.erb +22 -0
- data/lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/index.html.erb +50 -0
- data/lib/webhukhs/admin/views/webhukhs/admin/received_webhooks/show.html.erb +55 -0
- data/lib/webhukhs/admin.rb +17 -0
- data/lib/webhukhs/base_handler.rb +9 -6
- data/lib/webhukhs/controllers/receive_webhooks_controller.rb +26 -7
- data/lib/webhukhs/engine.rb +1 -4
- data/lib/webhukhs/install_generator.rb +9 -2
- data/lib/webhukhs/jobs/processing_job.rb +13 -12
- data/lib/webhukhs/models/received_webhook.rb +21 -9
- data/lib/webhukhs/version.rb +1 -1
- data/lib/webhukhs.rb +9 -0
- data/test/admin_test.rb +334 -0
- data/test/base_handler_test.rb +125 -0
- data/test/browser/admin_click_through.rb +208 -0
- data/test/processing_job_test.rb +152 -12
- data/test/received_webhook_test.rb +260 -0
- data/test/test_app.rb +39 -15
- data/test/test_helper.rb +69 -0
- data/test/webhukhs_test.rb +111 -49
- metadata +173 -11
- data/example/.ruby-version +0 -1
- data/gemfiles/rails_7.1.gemfile.lock +0 -412
data/test/webhukhs_test.rb
CHANGED
|
@@ -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
|
|
7
|
-
|
|
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
|
|
10
|
-
|
|
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 "
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
-
assert_equal
|
|
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
|
-
|
|
180
|
+
original_error_context = Webhukhs.configuration.error_context
|
|
181
|
+
Webhukhs.configuration.error_context = {component: "webhooks"}
|
|
149
182
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
191
|
-
- gemfiles/rails_7.
|
|
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.
|
|
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.
|
|
407
|
+
rubygems_version: 4.0.20
|
|
246
408
|
specification_version: 4
|
|
247
409
|
summary: Webhooks processing engine for Rails applications
|
|
248
410
|
test_files: []
|
data/example/.ruby-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
ruby-3.2.2
|