tapping_device 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +1 -0
- data/Gemfile.lock +2 -2
- data/README.md +37 -30
- data/lib/tapping_device/payload.rb +27 -0
- data/lib/tapping_device/version.rb +1 -1
- data/lib/tapping_device.rb +3 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65b116ba192b195aca0df0f0400e8d2b0617b221c620dcaaf8eab0f16e2d85fb
|
4
|
+
data.tar.gz: 0cb2b12d7329f5f770bd8d1522b8ab0d5f7c1787d142d06116cf83908e136f63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7192f5957a150267f71b4fe88a9eabb45f0966d5fda933e2a050f8a52e823ae338e6a3e35f24ff6f3ccef9f3b96c8fca9df300b8e3b3c4e69d29964f5ebdaa91
|
7
|
+
data.tar.gz: 264dd2bd5c83c1f716d272179c296a03bdf7612d2415602174432817769fa8f069612af45c0f58da722a0e499fe06bc440d3f1810bcc1a810e8c238e27fd97c5
|
data/.github/workflows/ruby.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tapping_device (0.
|
4
|
+
tapping_device (0.4.1)
|
5
5
|
activerecord (>= 5.2)
|
6
6
|
|
7
7
|
GEM
|
@@ -47,7 +47,7 @@ GEM
|
|
47
47
|
thread_safe (0.3.6)
|
48
48
|
tzinfo (1.2.5)
|
49
49
|
thread_safe (~> 0.1)
|
50
|
-
zeitwerk (2.2.
|
50
|
+
zeitwerk (2.2.2)
|
51
51
|
|
52
52
|
PLATFORMS
|
53
53
|
ruby
|
data/README.md
CHANGED
@@ -15,7 +15,8 @@ class PostsController < ApplicationController
|
|
15
15
|
def show
|
16
16
|
@post = Post.find(params[:id])
|
17
17
|
tap_on!(@post) do |payload|
|
18
|
-
|
18
|
+
# this equals to `"Method: :#{payload[:method_name]}, line: #{payload[:filepath]}:#{payload[:line_number]}"`
|
19
|
+
puts(payload.method_name_and_location)
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
@@ -24,9 +25,9 @@ end
|
|
24
25
|
And you can see these in log:
|
25
26
|
|
26
27
|
```
|
27
|
-
Method: name line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
28
|
-
Method: user_id line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
29
|
-
Method: to_param line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
28
|
+
Method: :name, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
29
|
+
Method: :user_id, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
30
|
+
Method: :to_param, line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
30
31
|
```
|
31
32
|
|
32
33
|
|
@@ -36,16 +37,16 @@ Or you can use `tap_assoc!`. This is very useful for tracking potential n+1 quer
|
|
36
37
|
|
37
38
|
```ruby
|
38
39
|
tap_assoc!(order) do |payload|
|
39
|
-
puts
|
40
|
+
puts(payload.method_name_and_location)
|
40
41
|
end
|
41
42
|
```
|
42
43
|
|
43
44
|
```
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
Method: :payments, line: /RUBY_PATH/gems/2.6.0/gems/jsonapi-resources-0.9.10/lib/jsonapi/resource.rb:124
|
46
|
+
Method: :line_items, line: /MY_PROJECT/app/models/line_item_container_helpers.rb:44
|
47
|
+
Method: :effective_line_items, line: /MY_PROJECT/app/models/line_item_container_helpers.rb:110
|
48
|
+
Method: :amending_orders, line: /MY_PROJECT/app/models/order.rb:385
|
49
|
+
Method: :amends_order, line: /MY_PROJECT/app/models/order.rb:432
|
49
50
|
```
|
50
51
|
|
51
52
|
|
@@ -118,8 +119,8 @@ In order to use `tapping_device`, you need to include `TappingDevice::Trackable`
|
|
118
119
|
- `tap_assoc!(activerecord_object)` - tracks association calls on a record, like `post.comments`
|
119
120
|
- `tap_sql!(activerecord_relation_or_model)` - tracks sql queries generated from the target
|
120
121
|
|
121
|
-
###
|
122
|
-
All tapping methods (start with `tap_`) takes a block and yield a
|
122
|
+
### Payload of the call
|
123
|
+
All tapping methods (start with `tap_`) takes a block and yield a `Payload` object as block argument. The `Payload` class inherits `Hash` so we can either use it as a hash, or you can call its keys as methods.
|
123
124
|
|
124
125
|
```ruby
|
125
126
|
{
|
@@ -149,6 +150,10 @@ The hash contains
|
|
149
150
|
- `trace` - stack trace of the call. Default is an empty array unless `with_trace_to` option is set
|
150
151
|
- `tp` - trace point object of this call
|
151
152
|
|
153
|
+
#### Some useful helpers
|
154
|
+
- `method_name_and_location` - `"Method: :initialize, line: /PROJECT_PATH/tapping_device/spec/payload_spec.rb:7"`
|
155
|
+
- `method_name_and_arguments` - `"Method: :initialize, argments: [[:name, \"Stan\"], [:age, 25]]"`
|
156
|
+
|
152
157
|
|
153
158
|
### Options
|
154
159
|
- `with_trace_to: 10` - the number of traces we want to put into `trace`. Default is `nil`, so `trace` would be empty
|
@@ -157,22 +162,23 @@ The hash contains
|
|
157
162
|
|
158
163
|
```ruby
|
159
164
|
tap_on!(@post, exclude_by_paths: [/active_record/]) do |payload|
|
160
|
-
|
165
|
+
# this equals to `"Method: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"`
|
166
|
+
puts(payload.method_name_and_location)
|
161
167
|
end
|
162
168
|
```
|
163
169
|
|
164
170
|
```
|
165
|
-
Method: _read_attribute line: /RUBY_PATH/gems/2.6.0/gems/activerecord-5.2.0/lib/active_record/attribute_methods/read.rb:40
|
166
|
-
Method: name line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
167
|
-
Method: _read_attribute line: /RUBY_PATH/gems/2.6.0/gems/activerecord-5.2.0/lib/active_record/attribute_methods/read.rb:40
|
168
|
-
Method: user_id line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
171
|
+
Method: :_read_attribute, line: /RUBY_PATH/gems/2.6.0/gems/activerecord-5.2.0/lib/active_record/attribute_methods/read.rb:40
|
172
|
+
Method: :name, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
173
|
+
Method: :_read_attribute, line: /RUBY_PATH/gems/2.6.0/gems/activerecord-5.2.0/lib/active_record/attribute_methods/read.rb:40
|
174
|
+
Method: :user_id, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
169
175
|
.......
|
170
176
|
|
171
177
|
# versus
|
172
178
|
|
173
|
-
Method: name line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
174
|
-
Method: user_id line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
175
|
-
Method: to_param line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
179
|
+
Method: :name, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
180
|
+
Method: :user_id, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
181
|
+
Method: :to_param, line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
176
182
|
```
|
177
183
|
|
178
184
|
|
@@ -200,7 +206,8 @@ class PostsController < ApplicationController
|
|
200
206
|
|
201
207
|
def show
|
202
208
|
tap_on!(@post) do |payload|
|
203
|
-
|
209
|
+
# this equals to `"Method: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"`
|
210
|
+
puts(payload.method_name_and_location)
|
204
211
|
end
|
205
212
|
end
|
206
213
|
end
|
@@ -209,25 +216,25 @@ end
|
|
209
216
|
And you can see these in log:
|
210
217
|
|
211
218
|
```
|
212
|
-
Method: name line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
213
|
-
Method: user_id line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
214
|
-
Method: to_param line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
219
|
+
Method: :name, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:5
|
220
|
+
Method: :user_id, line: /PROJECT_PATH/sample/app/views/posts/show.html.erb:10
|
221
|
+
Method: :to_param, line: /RUBY_PATH/gems/2.6.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:236
|
215
222
|
```
|
216
223
|
|
217
224
|
### `tap_assoc!`
|
218
225
|
|
219
226
|
```ruby
|
220
227
|
tap_assoc!(order) do |payload|
|
221
|
-
puts
|
228
|
+
puts(payload.method_name_and_location)
|
222
229
|
end
|
223
230
|
```
|
224
231
|
|
225
232
|
```
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
233
|
+
Method: :payments, line: /RUBY_PATH/gems/2.6.0/gems/jsonapi-resources-0.9.10/lib/jsonapi/resource.rb:124
|
234
|
+
Method: :line_items, line: /MY_PROJECT/app/models/line_item_container_helpers.rb:44
|
235
|
+
Method: :effective_line_items, line: /MY_PROJECT/app/models/line_item_container_helpers.rb:110
|
236
|
+
Method: :amending_orders, line: /MY_PROJECT/app/models/order.rb:385
|
237
|
+
Method: :amends_order, line: /MY_PROJECT/app/models/order.rb:432
|
231
238
|
```
|
232
239
|
|
233
240
|
### `tap_sql!` (beta)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class TappingDevice
|
2
|
+
class Payload < Hash
|
3
|
+
ATTRS = [:receiver, :method_name, :arguments, :return_value, :filepath, :line_number, :defined_class, :trace, :tp]
|
4
|
+
|
5
|
+
ATTRS.each do |attr|
|
6
|
+
define_method attr do
|
7
|
+
self[attr]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.init(hash)
|
12
|
+
h = new
|
13
|
+
hash.each do |k, v|
|
14
|
+
h[k] = v
|
15
|
+
end
|
16
|
+
h
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_name_and_location
|
20
|
+
"Method: :#{method_name}, line: #{filepath}:#{line_number}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_name_and_arguments
|
24
|
+
"Method: :#{method_name}, argments: #{arguments.to_s}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/tapping_device.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "active_record"
|
2
2
|
require "tapping_device/version"
|
3
|
+
require "tapping_device/payload"
|
3
4
|
require "tapping_device/trackable"
|
4
5
|
require "tapping_device/exceptions"
|
5
6
|
require "tapping_device/sql_tapping_methods"
|
@@ -152,7 +153,7 @@ class TappingDevice
|
|
152
153
|
def build_yield_parameters(tp:, filepath:, line_number:)
|
153
154
|
arguments = tp.binding.local_variables.map { |n| [n, tp.binding.local_variable_get(n)] }
|
154
155
|
|
155
|
-
{
|
156
|
+
Payload.init({
|
156
157
|
receiver: tp.self,
|
157
158
|
method_name: tp.callee_id,
|
158
159
|
arguments: arguments,
|
@@ -162,7 +163,7 @@ class TappingDevice
|
|
162
163
|
defined_class: tp.defined_class,
|
163
164
|
trace: caller[CALLER_START_POINT..(CALLER_START_POINT + options[:with_trace_to])],
|
164
165
|
tp: tp
|
165
|
-
}
|
166
|
+
})
|
166
167
|
end
|
167
168
|
|
168
169
|
def tap_init?(klass, parameters)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tapping_device
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- st0012
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- bin/setup
|
131
131
|
- lib/tapping_device.rb
|
132
132
|
- lib/tapping_device/exceptions.rb
|
133
|
+
- lib/tapping_device/payload.rb
|
133
134
|
- lib/tapping_device/sql_listener.rb
|
134
135
|
- lib/tapping_device/sql_tapping_methods.rb
|
135
136
|
- lib/tapping_device/trackable.rb
|