influxdb-rails 1.0.0 → 1.0.1.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +11 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -1
- data/.travis.yml +4 -7
- data/CHANGELOG.md +17 -0
- data/README.md +47 -5
- data/Rakefile +0 -6
- data/gemfiles/Gemfile.rails-5.0.x +2 -0
- data/gemfiles/Gemfile.rails-6.0.x +10 -0
- data/influxdb-rails.gemspec +5 -3
- data/lib/influxdb-rails.rb +11 -0
- data/lib/influxdb/rails/configuration.rb +8 -12
- data/lib/influxdb/rails/context.rb +6 -40
- data/lib/influxdb/rails/helpers/rspec_matchers.rb +48 -0
- data/lib/influxdb/rails/metric.rb +39 -0
- data/lib/influxdb/rails/middleware/active_job_subscriber.rb +67 -0
- data/lib/influxdb/rails/middleware/active_record_subscriber.rb +26 -0
- data/lib/influxdb/rails/middleware/block_instrumentation_subscriber.rb +24 -0
- data/lib/influxdb/rails/middleware/render_subscriber.rb +15 -16
- data/lib/influxdb/rails/middleware/request_subscriber.rb +16 -21
- data/lib/influxdb/rails/middleware/sql_subscriber.rb +18 -18
- data/lib/influxdb/rails/middleware/subscriber.rb +40 -27
- data/lib/influxdb/rails/railtie.rb +15 -18
- data/lib/influxdb/rails/tags.rb +33 -0
- data/lib/influxdb/rails/test_client.rb +13 -0
- data/lib/influxdb/rails/values.rb +24 -0
- data/lib/influxdb/rails/version.rb +1 -1
- data/sample-dashboard/README.md +1 -1
- data/spec/requests/action_controller_metrics_spec.rb +83 -0
- data/spec/requests/action_view_collection_metrics_spec.rb +66 -0
- data/spec/requests/action_view_partial_metrics_spec.rb +62 -0
- data/spec/requests/action_view_template_metrics_spec.rb +62 -0
- data/spec/requests/active_job_enqueue_metrics_spec.rb +65 -0
- data/spec/requests/active_job_perform_metrics_spec.rb +68 -0
- data/spec/requests/active_job_perform_start_metrics_spec.rb +68 -0
- data/spec/requests/active_record_instantiation_metrics_spec.rb +65 -0
- data/spec/requests/active_record_sql_metrics_spec.rb +103 -0
- data/spec/requests/block_inistrumentation_spec.rb +64 -0
- data/spec/requests/context_spec.rb +27 -0
- data/spec/requests/logger_spec.rb +10 -0
- data/spec/spec_helper.rb +10 -4
- data/spec/support/broken_client.rb +11 -0
- data/spec/support/rails5/app.rb +32 -10
- data/spec/support/rails6/app.rb +70 -0
- data/spec/support/views/{widgets → metrics}/_item.html.erb +0 -0
- data/spec/support/views/{widgets → metrics}/index.html.erb +0 -0
- data/spec/support/views/metrics/show.html.erb +4 -0
- data/spec/unit/block_instrumentation_spec.rb +18 -0
- metadata +87 -37
- data/gemfiles/Gemfile.rails-4.2.x +0 -7
- data/lib/influxdb/rails/instrumentation.rb +0 -34
- data/lib/influxdb/rails/middleware/simple_subscriber.rb +0 -33
- data/spec/controllers/widgets_controller_spec.rb +0 -15
- data/spec/integration/integration_helper.rb +0 -1
- data/spec/integration/metrics_spec.rb +0 -27
- data/spec/shared_examples/data.rb +0 -61
- data/spec/support/rails4/app.rb +0 -48
- data/spec/unit/context_spec.rb +0 -40
- data/spec/unit/middleware/render_subscriber_spec.rb +0 -96
- data/spec/unit/middleware/request_subscriber_spec.rb +0 -103
- data/spec/unit/middleware/sql_subscriber_spec.rb +0 -108
@@ -0,0 +1,70 @@
|
|
1
|
+
require "action_controller/railtie"
|
2
|
+
require "active_record/railtie"
|
3
|
+
require "active_job"
|
4
|
+
|
5
|
+
app = Class.new(Rails::Application)
|
6
|
+
app.config.secret_key_base = "1234567890abcdef1234567890abcdef"
|
7
|
+
app.config.secret_token = "1234567890abcdef1234567890abcdef"
|
8
|
+
app.config.session_store :cookie_store, key: "_myapp_session"
|
9
|
+
app.config.active_support.deprecation = :log
|
10
|
+
app.config.eager_load = false
|
11
|
+
app.config.root = __dir__
|
12
|
+
Rails.backtrace_cleaner.remove_silencers!
|
13
|
+
ActiveJob::Base.logger = Rails.logger
|
14
|
+
app.initialize!
|
15
|
+
|
16
|
+
app.routes.draw do
|
17
|
+
resources :metrics, only: %i[index show]
|
18
|
+
resources :exceptions, only: :index
|
19
|
+
end
|
20
|
+
|
21
|
+
InfluxDB::Rails.configure do |config|
|
22
|
+
end
|
23
|
+
|
24
|
+
ENV["DATABASE_URL"] = "sqlite3::memory:"
|
25
|
+
ActiveRecord::Schema.define do
|
26
|
+
create_table :metrics, force: true do |t|
|
27
|
+
t.string :name
|
28
|
+
|
29
|
+
t.timestamps
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class MetricJob < ActiveJob::Base
|
34
|
+
queue_as :default
|
35
|
+
|
36
|
+
def perform
|
37
|
+
# Do something later
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Metric < ActiveRecord::Base; end
|
42
|
+
class ApplicationController < ActionController::Base; end
|
43
|
+
class MetricsController < ApplicationController
|
44
|
+
prepend_view_path File.join(__dir__, "..", "views")
|
45
|
+
|
46
|
+
before_action do
|
47
|
+
InfluxDB::Rails.current.values = { additional_value: :value }
|
48
|
+
InfluxDB::Rails.current.tags = { additional_tag: :value }
|
49
|
+
end
|
50
|
+
|
51
|
+
def index
|
52
|
+
InfluxDB::Rails.instrument "name", tags: { block_tag: :block_tag }, values: { block_value: :block_value } do
|
53
|
+
1 + 1
|
54
|
+
end
|
55
|
+
MetricJob.perform_later
|
56
|
+
Metric.create!(name: "name")
|
57
|
+
end
|
58
|
+
|
59
|
+
def show
|
60
|
+
@metric = Metric.find_by(name: "name")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class ExceptionsController < ApplicationController
|
65
|
+
def index
|
66
|
+
1 / 0
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
Object.const_set(:ApplicationHelper, Module.new)
|
File without changes
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe InfluxDB::Rails do
|
4
|
+
describe ".instrument" do
|
5
|
+
it "supports calling wihout a block" do
|
6
|
+
InfluxDB::Rails.instrument "name", values: { value: 1 }
|
7
|
+
|
8
|
+
expect_metric(
|
9
|
+
values: a_hash_including(value: 1),
|
10
|
+
tags: a_hash_including(
|
11
|
+
hook: "block_instrumentation",
|
12
|
+
server: Socket.gethostname,
|
13
|
+
location: :raw
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: influxdb-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Bruckmayer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: influxdb
|
@@ -37,14 +37,28 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '5.0'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '5.0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: activejob
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
48
62
|
- !ruby/object:Gem::Dependency
|
49
63
|
name: activerecord
|
50
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +101,20 @@ dependencies:
|
|
87
101
|
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '0'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: launchy
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
90
118
|
- !ruby/object:Gem::Dependency
|
91
119
|
name: pry
|
92
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,16 +203,16 @@ dependencies:
|
|
175
203
|
name: sqlite3
|
176
204
|
requirement: !ruby/object:Gem::Requirement
|
177
205
|
requirements:
|
178
|
-
- -
|
206
|
+
- - ">="
|
179
207
|
- !ruby/object:Gem::Version
|
180
|
-
version:
|
208
|
+
version: '0'
|
181
209
|
type: :development
|
182
210
|
prerelease: false
|
183
211
|
version_requirements: !ruby/object:Gem::Requirement
|
184
212
|
requirements:
|
185
|
-
- -
|
213
|
+
- - ">="
|
186
214
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
215
|
+
version: '0'
|
188
216
|
- !ruby/object:Gem::Dependency
|
189
217
|
name: tzinfo
|
190
218
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,6 +235,7 @@ executables: []
|
|
207
235
|
extensions: []
|
208
236
|
extra_rdoc_files: []
|
209
237
|
files:
|
238
|
+
- ".github/dependabot.yml"
|
210
239
|
- ".gitignore"
|
211
240
|
- ".rspec"
|
212
241
|
- ".rubocop.yml"
|
@@ -217,23 +246,29 @@ files:
|
|
217
246
|
- README.md
|
218
247
|
- Rakefile
|
219
248
|
- config.ru
|
220
|
-
- gemfiles/Gemfile.rails-4.2.x
|
221
249
|
- gemfiles/Gemfile.rails-5.0.x
|
222
250
|
- gemfiles/Gemfile.rails-5.1.x
|
223
251
|
- gemfiles/Gemfile.rails-5.2.x
|
252
|
+
- gemfiles/Gemfile.rails-6.0.x
|
224
253
|
- influxdb-rails.gemspec
|
225
254
|
- lib/influxdb-rails.rb
|
226
255
|
- lib/influxdb/rails/configuration.rb
|
227
256
|
- lib/influxdb/rails/context.rb
|
228
|
-
- lib/influxdb/rails/
|
257
|
+
- lib/influxdb/rails/helpers/rspec_matchers.rb
|
258
|
+
- lib/influxdb/rails/metric.rb
|
259
|
+
- lib/influxdb/rails/middleware/active_job_subscriber.rb
|
260
|
+
- lib/influxdb/rails/middleware/active_record_subscriber.rb
|
261
|
+
- lib/influxdb/rails/middleware/block_instrumentation_subscriber.rb
|
229
262
|
- lib/influxdb/rails/middleware/render_subscriber.rb
|
230
263
|
- lib/influxdb/rails/middleware/request_subscriber.rb
|
231
|
-
- lib/influxdb/rails/middleware/simple_subscriber.rb
|
232
264
|
- lib/influxdb/rails/middleware/sql_subscriber.rb
|
233
265
|
- lib/influxdb/rails/middleware/subscriber.rb
|
234
266
|
- lib/influxdb/rails/railtie.rb
|
235
267
|
- lib/influxdb/rails/sql/normalizer.rb
|
236
268
|
- lib/influxdb/rails/sql/query.rb
|
269
|
+
- lib/influxdb/rails/tags.rb
|
270
|
+
- lib/influxdb/rails/test_client.rb
|
271
|
+
- lib/influxdb/rails/values.rb
|
237
272
|
- lib/influxdb/rails/version.rb
|
238
273
|
- lib/rails/generators/influxdb/influxdb_generator.rb
|
239
274
|
- lib/rails/generators/influxdb/templates/initializer.rb
|
@@ -249,20 +284,27 @@ files:
|
|
249
284
|
- sample-dashboard/provisioning/performance-action.json
|
250
285
|
- sample-dashboard/provisioning/performance-request.json
|
251
286
|
- sample-dashboard/provisioning/performance.json
|
252
|
-
- spec/
|
253
|
-
- spec/
|
254
|
-
- spec/
|
255
|
-
- spec/
|
287
|
+
- spec/requests/action_controller_metrics_spec.rb
|
288
|
+
- spec/requests/action_view_collection_metrics_spec.rb
|
289
|
+
- spec/requests/action_view_partial_metrics_spec.rb
|
290
|
+
- spec/requests/action_view_template_metrics_spec.rb
|
291
|
+
- spec/requests/active_job_enqueue_metrics_spec.rb
|
292
|
+
- spec/requests/active_job_perform_metrics_spec.rb
|
293
|
+
- spec/requests/active_job_perform_start_metrics_spec.rb
|
294
|
+
- spec/requests/active_record_instantiation_metrics_spec.rb
|
295
|
+
- spec/requests/active_record_sql_metrics_spec.rb
|
296
|
+
- spec/requests/block_inistrumentation_spec.rb
|
297
|
+
- spec/requests/context_spec.rb
|
298
|
+
- spec/requests/logger_spec.rb
|
256
299
|
- spec/spec_helper.rb
|
257
|
-
- spec/support/
|
300
|
+
- spec/support/broken_client.rb
|
258
301
|
- spec/support/rails5/app.rb
|
259
|
-
- spec/support/
|
260
|
-
- spec/support/views/
|
302
|
+
- spec/support/rails6/app.rb
|
303
|
+
- spec/support/views/metrics/_item.html.erb
|
304
|
+
- spec/support/views/metrics/index.html.erb
|
305
|
+
- spec/support/views/metrics/show.html.erb
|
306
|
+
- spec/unit/block_instrumentation_spec.rb
|
261
307
|
- spec/unit/configuration_spec.rb
|
262
|
-
- spec/unit/context_spec.rb
|
263
|
-
- spec/unit/middleware/render_subscriber_spec.rb
|
264
|
-
- spec/unit/middleware/request_subscriber_spec.rb
|
265
|
-
- spec/unit/middleware/sql_subscriber_spec.rb
|
266
308
|
- spec/unit/sql/normalizer_spec.rb
|
267
309
|
- spec/unit/sql/query_spec.rb
|
268
310
|
homepage: https://influxdata.com
|
@@ -281,31 +323,39 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
281
323
|
requirements:
|
282
324
|
- - ">="
|
283
325
|
- !ruby/object:Gem::Version
|
284
|
-
version: 2.
|
326
|
+
version: 2.4.0
|
285
327
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
286
328
|
requirements:
|
287
|
-
- - "
|
329
|
+
- - ">"
|
288
330
|
- !ruby/object:Gem::Version
|
289
|
-
version:
|
331
|
+
version: 1.3.1
|
290
332
|
requirements: []
|
291
|
-
|
333
|
+
rubyforge_project:
|
334
|
+
rubygems_version: 2.7.6.2
|
292
335
|
signing_key:
|
293
336
|
specification_version: 4
|
294
337
|
summary: InfluxDB bindings for Ruby on Rails.
|
295
338
|
test_files:
|
296
|
-
- spec/
|
297
|
-
- spec/
|
298
|
-
- spec/
|
299
|
-
- spec/
|
339
|
+
- spec/requests/action_controller_metrics_spec.rb
|
340
|
+
- spec/requests/action_view_collection_metrics_spec.rb
|
341
|
+
- spec/requests/action_view_partial_metrics_spec.rb
|
342
|
+
- spec/requests/action_view_template_metrics_spec.rb
|
343
|
+
- spec/requests/active_job_enqueue_metrics_spec.rb
|
344
|
+
- spec/requests/active_job_perform_metrics_spec.rb
|
345
|
+
- spec/requests/active_job_perform_start_metrics_spec.rb
|
346
|
+
- spec/requests/active_record_instantiation_metrics_spec.rb
|
347
|
+
- spec/requests/active_record_sql_metrics_spec.rb
|
348
|
+
- spec/requests/block_inistrumentation_spec.rb
|
349
|
+
- spec/requests/context_spec.rb
|
350
|
+
- spec/requests/logger_spec.rb
|
300
351
|
- spec/spec_helper.rb
|
301
|
-
- spec/support/
|
352
|
+
- spec/support/broken_client.rb
|
302
353
|
- spec/support/rails5/app.rb
|
303
|
-
- spec/support/
|
304
|
-
- spec/support/views/
|
354
|
+
- spec/support/rails6/app.rb
|
355
|
+
- spec/support/views/metrics/_item.html.erb
|
356
|
+
- spec/support/views/metrics/index.html.erb
|
357
|
+
- spec/support/views/metrics/show.html.erb
|
358
|
+
- spec/unit/block_instrumentation_spec.rb
|
305
359
|
- spec/unit/configuration_spec.rb
|
306
|
-
- spec/unit/context_spec.rb
|
307
|
-
- spec/unit/middleware/render_subscriber_spec.rb
|
308
|
-
- spec/unit/middleware/request_subscriber_spec.rb
|
309
|
-
- spec/unit/middleware/sql_subscriber_spec.rb
|
310
360
|
- spec/unit/sql/normalizer_spec.rb
|
311
361
|
- spec/unit/sql/query_spec.rb
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module InfluxDB
|
2
|
-
module Rails
|
3
|
-
module Instrumentation
|
4
|
-
def benchmark_for_instrumentation # rubocop:disable Metrics/MethodLength
|
5
|
-
start = Time.now
|
6
|
-
yield
|
7
|
-
|
8
|
-
c = InfluxDB::Rails.configuration
|
9
|
-
return if c.ignore_current_environment?
|
10
|
-
|
11
|
-
InfluxDB::Rails.client.write_point \
|
12
|
-
"instrumentation".freeze,
|
13
|
-
values: {
|
14
|
-
value: ((Time.now - start) * 1000).ceil,
|
15
|
-
},
|
16
|
-
tags: c.tags_middleware.call(
|
17
|
-
method: "#{controller_name}##{action_name}",
|
18
|
-
server: Socket.gethostname
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.included(base)
|
23
|
-
base.extend(ClassMethods)
|
24
|
-
end
|
25
|
-
|
26
|
-
module ClassMethods
|
27
|
-
def instrument(methods = [])
|
28
|
-
methods = [methods] unless methods.is_a?(Array)
|
29
|
-
around_filter :benchmark_for_instrumentation, only: methods
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require "influxdb/rails/middleware/subscriber"
|
2
|
-
|
3
|
-
module InfluxDB
|
4
|
-
module Rails
|
5
|
-
module Middleware
|
6
|
-
# Subscriber acts as base class for different *Subscriber classes,
|
7
|
-
# which are intended as ActiveSupport::Notifications.subscribe
|
8
|
-
# consumers.
|
9
|
-
class SimpleSubscriber < Subscriber
|
10
|
-
def call(_name, started, finished, _id, payload)
|
11
|
-
return unless enabled?
|
12
|
-
|
13
|
-
InfluxDB::Rails.client.write_point \
|
14
|
-
configuration.measurement_name,
|
15
|
-
values: values(started, finished, payload),
|
16
|
-
tags: tags(payload),
|
17
|
-
timestamp: timestamp(finished)
|
18
|
-
rescue StandardError => e
|
19
|
-
::Rails.logger.error("[InfluxDB::Rails] Unable to write points: #{e.message}")
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def values(started, finished, _payload)
|
25
|
-
result = { value: ((finished - started) * 1000).ceil }
|
26
|
-
result.merge(InfluxDB::Rails.current.values).reject do |_, value|
|
27
|
-
value.nil? || value == ""
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe WidgetsController, type: :controller do
|
4
|
-
describe "#new" do
|
5
|
-
it "should raise an exception" do
|
6
|
-
expect { get :new }.to raise_error(ZeroDivisionError)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "#index" do
|
11
|
-
it "should not raise an exception" do
|
12
|
-
expect { get :index }.to_not raise_error
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + "/../spec_helper"
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/integration_helper")
|
2
|
-
|
3
|
-
RSpec.describe "User visits widgets", type: :request do
|
4
|
-
before do
|
5
|
-
allow_any_instance_of(InfluxDB::Rails::Configuration).to receive(:ignored_environments).and_return(%w[development])
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "in a normal request" do
|
9
|
-
it "should result in attempts to write metrics via the client" do
|
10
|
-
expect(InfluxDB::Rails.client).to receive(:write_point).exactly(5).times
|
11
|
-
get "/widgets"
|
12
|
-
end
|
13
|
-
|
14
|
-
context "additional values" do
|
15
|
-
it "should result in attempts to write metrics via the client" do
|
16
|
-
allow_any_instance_of(ActionDispatch::Request).to receive(:request_id).and_return(:request_id)
|
17
|
-
expect(InfluxDB::Rails.client).to receive(:write_point).with(
|
18
|
-
"rails", a_hash_including(
|
19
|
-
tags: a_hash_including(method: "WidgetsController#index", hook: "process_action"),
|
20
|
-
values: a_hash_including(request_id: :request_id, key: :value)
|
21
|
-
)
|
22
|
-
)
|
23
|
-
get "/widgets"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|