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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86f08b96d9d7d45cc1f0292a69749e5e5d853167e54a1981a26ec2b3905e31bd
4
- data.tar.gz: 50a7e86833462d2392150182abb75d37bde739b04f582a56dc9438f26f34cbc9
3
+ metadata.gz: 65b116ba192b195aca0df0f0400e8d2b0617b221c620dcaaf8eab0f16e2d85fb
4
+ data.tar.gz: 0cb2b12d7329f5f770bd8d1522b8ab0d5f7c1787d142d06116cf83908e136f63
5
5
  SHA512:
6
- metadata.gz: 3620752c8c95e09ebd81891f73ed5d30f2ff0d6b09aba90f0c34267936d7cd01e517beef6ea61aa5648124ba6d84c221ed0a42ae21a035bf12a7eb4bbdb4cf7e
7
- data.tar.gz: 2fc5bd412fbab8e6cb33c28b12b89c7a403b4f481844bcca096838119887e3321fef37d21ad3374ac88c26b0c93efc56b59691000f8d62b067c8acf690e69075
6
+ metadata.gz: 7192f5957a150267f71b4fe88a9eabb45f0966d5fda933e2a050f8a52e823ae338e6a3e35f24ff6f3ccef9f3b96c8fca9df300b8e3b3c4e69d29964f5ebdaa91
7
+ data.tar.gz: 264dd2bd5c83c1f716d272179c296a03bdf7612d2415602174432817769fa8f069612af45c0f58da722a0e499fe06bc440d3f1810bcc1a810e8c238e27fd97c5
@@ -19,6 +19,7 @@ jobs:
19
19
  ruby-version: ${{ matrix.ruby_version }}
20
20
  - name: Install sqlite
21
21
  run: |
22
+ sudo apt-get update
22
23
  sudo apt-get install libsqlite3-dev
23
24
 
24
25
  - name: Build and test with Rails ${{ matrix.rails_version }}
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tapping_device (0.3.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.1)
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
- puts "Method: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"
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 "Assoc: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"
40
+ puts(payload.method_name_and_location)
40
41
  end
41
42
  ```
42
43
 
43
44
  ```
44
- Assoc: payments line: /RUBY_PATH/gems/2.6.0/gems/jsonapi-resources-0.9.10/lib/jsonapi/resource.rb:124
45
- Assoc: line_items line: /MY_PROJECT/app/models/line_item_container_helpers.rb:44
46
- Assoc: effective_line_items line: /MY_PROJECT/app/models/line_item_container_helpers.rb:110
47
- Assoc: amending_orders line: /MY_PROJECT/app/models/order.rb:385
48
- Assoc: amends_order line: /MY_PROJECT/app/models/order.rb:432
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
- ### Info of the call
122
- All tapping methods (start with `tap_`) takes a block and yield a hash as block argument.
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
- puts "Method: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"
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
- puts "Method: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"
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 "Assoc: #{payload[:method_name]} line: #{payload[:filepath]}:#{payload[:line_number]}"
228
+ puts(payload.method_name_and_location)
222
229
  end
223
230
  ```
224
231
 
225
232
  ```
226
- Assoc: payments line: /RUBY_PATH/gems/2.6.0/gems/jsonapi-resources-0.9.10/lib/jsonapi/resource.rb:124
227
- Assoc: line_items line: /MY_PROJECT/app/models/line_item_container_helpers.rb:44
228
- Assoc: effective_line_items line: /MY_PROJECT/app/models/line_item_container_helpers.rb:110
229
- Assoc: amending_orders line: /MY_PROJECT/app/models/order.rb:385
230
- Assoc: amends_order line: /MY_PROJECT/app/models/order.rb:432
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
@@ -1,3 +1,3 @@
1
1
  class TappingDevice
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -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.0
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-25 00:00:00.000000000 Z
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