trace_location 0.4.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +20 -10
- data/README.md +295 -87
- data/lib/trace_location/collector.rb +21 -3
- data/lib/trace_location/config.rb +1 -1
- data/lib/trace_location/event.rb +5 -2
- data/lib/trace_location/generator/csv.rb +7 -5
- data/lib/trace_location/generator/log.rb +2 -3
- data/lib/trace_location/generator/markdown.rb +65 -0
- data/lib/trace_location/generator.rb +1 -0
- data/lib/trace_location/report.rb +2 -1
- data/lib/trace_location/version.rb +1 -1
- data/lib/trace_location.rb +4 -1
- data/trace_location.gemspec +6 -3
- metadata +43 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7f8eaee17fe797de0ea3da6917dabcaa764bf9037a5748905061775edb9d3df
|
4
|
+
data.tar.gz: c54da8e56e1ab1d10eaab5ca1c946914ed79b9b371a6705f7854a2f96165ed91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afc12795bbe5f3fcd185ae87163c978484bc4be5bc793ed6df4da83dd8885ccac1df7c3cd2e059520d41577ec95bcda8e3b49ba426abe7daf1a03894ce833405
|
7
|
+
data.tar.gz: 6b680efb7dc27b7dc804df6ef55cdb07f5a78c4f4e0fb42f6733d125f6d04fa07ce2962c65140c502953038c94a6789c827e8c151c7f8713c60051d85b5b3672
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,29 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
trace_location (0.
|
4
|
+
trace_location (0.9.0)
|
5
|
+
binding_of_caller
|
6
|
+
pry
|
5
7
|
|
6
8
|
GEM
|
7
9
|
remote: https://rubygems.org/
|
8
10
|
specs:
|
9
11
|
ast (2.4.0)
|
12
|
+
binding_of_caller (0.8.0)
|
13
|
+
debug_inspector (>= 0.0.1)
|
14
|
+
coderay (1.1.2)
|
15
|
+
debug_inspector (0.0.3)
|
10
16
|
diff-lcs (1.3)
|
11
17
|
jaro_winkler (1.5.2)
|
18
|
+
method_source (0.9.2)
|
12
19
|
parallel (1.17.0)
|
13
20
|
parser (2.6.3.0)
|
14
21
|
ast (~> 2.4.0)
|
22
|
+
pry (0.12.2)
|
23
|
+
coderay (~> 1.1.0)
|
24
|
+
method_source (~> 0.9.0)
|
15
25
|
rainbow (3.0.0)
|
16
|
-
rake (
|
26
|
+
rake (12.3.2)
|
17
27
|
rspec (3.8.0)
|
18
28
|
rspec-core (~> 3.8.0)
|
19
29
|
rspec-expectations (~> 3.8.0)
|
@@ -27,23 +37,23 @@ GEM
|
|
27
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
28
38
|
rspec-support (~> 3.8.0)
|
29
39
|
rspec-support (3.8.0)
|
30
|
-
rubocop (0.
|
40
|
+
rubocop (0.71.0)
|
31
41
|
jaro_winkler (~> 1.5.1)
|
32
42
|
parallel (~> 1.10)
|
33
|
-
parser (>= 2.
|
43
|
+
parser (>= 2.6)
|
34
44
|
rainbow (>= 2.2.2, < 4.0)
|
35
45
|
ruby-progressbar (~> 1.7)
|
36
|
-
unicode-display_width (>= 1.4.0, < 1.
|
37
|
-
ruby-progressbar (1.10.
|
38
|
-
unicode-display_width (1.
|
46
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
47
|
+
ruby-progressbar (1.10.1)
|
48
|
+
unicode-display_width (1.6.0)
|
39
49
|
|
40
50
|
PLATFORMS
|
41
51
|
ruby
|
42
52
|
|
43
53
|
DEPENDENCIES
|
44
|
-
bundler
|
45
|
-
rake
|
46
|
-
rspec
|
54
|
+
bundler
|
55
|
+
rake
|
56
|
+
rspec
|
47
57
|
rubocop
|
48
58
|
trace_location!
|
49
59
|
|
data/README.md
CHANGED
@@ -22,14 +22,307 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
You just surround the code which you want to track the process.
|
24
24
|
|
25
|
-
### Example 01. Track the
|
25
|
+
### Example 01. Track the validation process of Active Record
|
26
|
+
|
27
|
+
```
|
28
|
+
% bin/rails c
|
29
|
+
|
30
|
+
irb(main):001:0> book = Book.new(title: "My Book Title")
|
31
|
+
irb(main):002:0> TraceLocation.trace(ignore: /active_support/) { book.validate }
|
32
|
+
Created at /path/to/sampleapp/log/trace_location-2019060401061559579741.md
|
33
|
+
=> true
|
34
|
+
```
|
35
|
+
|
36
|
+
Then you can get a markdown file like this:
|
37
|
+
|
38
|
+
--
|
39
|
+
|
40
|
+
Generated by [trace_location](https://github.com/yhirano55/trace_location) at 2019-06-04 01:35:41 +0900
|
41
|
+
|
42
|
+
<details open>
|
43
|
+
<summary>activerecord-5.2.3/lib/active_record/validations.rb:65</summary>
|
44
|
+
|
45
|
+
##### ActiveRecord::Validations#valid?
|
46
|
+
```ruby
|
47
|
+
def valid?(context = nil)
|
48
|
+
context ||= default_validation_context
|
49
|
+
output = super(context)
|
50
|
+
errors.empty? && output
|
51
|
+
end
|
52
|
+
# called from (irb):2
|
53
|
+
```
|
54
|
+
|
55
|
+
</details>
|
56
|
+
<details open>
|
57
|
+
<summary>activerecord-5.2.3/lib/active_record/validations.rb:75</summary>
|
58
|
+
|
59
|
+
##### ActiveRecord::Validations#default_validation_context
|
60
|
+
```ruby
|
61
|
+
def default_validation_context
|
62
|
+
new_record? ? :create : :update
|
63
|
+
end
|
64
|
+
# called from activerecord-5.2.3/lib/active_record/validations.rb:66
|
65
|
+
```
|
66
|
+
|
67
|
+
</details>
|
68
|
+
<details open>
|
69
|
+
<summary>activerecord-5.2.3/lib/active_record/persistence.rb:231</summary>
|
70
|
+
|
71
|
+
##### ActiveRecord::Persistence#new_record?
|
72
|
+
```ruby
|
73
|
+
def new_record?
|
74
|
+
sync_with_transaction_state
|
75
|
+
@new_record
|
76
|
+
end
|
77
|
+
# called from activerecord-5.2.3/lib/active_record/validations.rb:76
|
78
|
+
```
|
79
|
+
|
80
|
+
</details>
|
81
|
+
<details open>
|
82
|
+
<summary>activerecord-5.2.3/lib/active_record/transactions.rb:490</summary>
|
83
|
+
|
84
|
+
##### ActiveRecord::Transactions#sync_with_transaction_state
|
85
|
+
```ruby
|
86
|
+
def sync_with_transaction_state
|
87
|
+
update_attributes_from_transaction_state(@transaction_state)
|
88
|
+
end
|
89
|
+
# called from activerecord-5.2.3/lib/active_record/persistence.rb:232
|
90
|
+
```
|
91
|
+
|
92
|
+
</details>
|
93
|
+
<details open>
|
94
|
+
<summary>activerecord-5.2.3/lib/active_record/transactions.rb:494</summary>
|
95
|
+
|
96
|
+
##### ActiveRecord::Transactions#update_attributes_from_transaction_state
|
97
|
+
```ruby
|
98
|
+
def update_attributes_from_transaction_state(transaction_state)
|
99
|
+
if transaction_state && transaction_state.finalized?
|
100
|
+
restore_transaction_record_state(transaction_state.fully_rolledback?) if transaction_state.rolledback?
|
101
|
+
force_clear_transaction_record_state if transaction_state.fully_committed?
|
102
|
+
clear_transaction_record_state if transaction_state.fully_completed?
|
103
|
+
end
|
104
|
+
end
|
105
|
+
# called from activerecord-5.2.3/lib/active_record/transactions.rb:491
|
106
|
+
```
|
107
|
+
|
108
|
+
</details>
|
109
|
+
<details open>
|
110
|
+
<summary>activemodel-5.2.3/lib/active_model/validations.rb:336</summary>
|
111
|
+
|
112
|
+
##### ActiveModel::Validations#valid?
|
113
|
+
```ruby
|
114
|
+
def valid?(context = nil)
|
115
|
+
current_context, self.validation_context = validation_context, context
|
116
|
+
errors.clear
|
117
|
+
run_validations!
|
118
|
+
ensure
|
119
|
+
self.validation_context = current_context
|
120
|
+
end
|
121
|
+
# called from activerecord-5.2.3/lib/active_record/validations.rb:67
|
122
|
+
```
|
123
|
+
|
124
|
+
</details>
|
125
|
+
<details open>
|
126
|
+
<summary>activemodel-5.2.3/lib/active_model/validations.rb:303</summary>
|
127
|
+
|
128
|
+
##### ActiveModel::Validations#errors
|
129
|
+
```ruby
|
130
|
+
def errors
|
131
|
+
@errors ||= Errors.new(self)
|
132
|
+
end
|
133
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:338
|
134
|
+
```
|
135
|
+
|
136
|
+
</details>
|
137
|
+
<details open>
|
138
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:74</summary>
|
139
|
+
|
140
|
+
##### ActiveModel::Errors#initialize
|
141
|
+
```ruby
|
142
|
+
def initialize(base)
|
143
|
+
@base = base
|
144
|
+
@messages = apply_default_array({})
|
145
|
+
@details = apply_default_array({})
|
146
|
+
end
|
147
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:304
|
148
|
+
```
|
149
|
+
|
150
|
+
</details>
|
151
|
+
<details open>
|
152
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:470</summary>
|
153
|
+
|
154
|
+
##### ActiveModel::Errors#apply_default_array
|
155
|
+
```ruby
|
156
|
+
def apply_default_array(hash)
|
157
|
+
hash.default_proc = proc { |h, key| h[key] = [] }
|
158
|
+
hash
|
159
|
+
end
|
160
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:76
|
161
|
+
```
|
162
|
+
|
163
|
+
</details>
|
164
|
+
<details open>
|
165
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:470</summary>
|
166
|
+
|
167
|
+
##### ActiveModel::Errors#apply_default_array
|
168
|
+
```ruby
|
169
|
+
def apply_default_array(hash)
|
170
|
+
hash.default_proc = proc { |h, key| h[key] = [] }
|
171
|
+
hash
|
172
|
+
end
|
173
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:77
|
174
|
+
```
|
175
|
+
|
176
|
+
</details>
|
177
|
+
<details open>
|
178
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:115</summary>
|
179
|
+
|
180
|
+
##### ActiveModel::Errors#clear
|
181
|
+
```ruby
|
182
|
+
def clear
|
183
|
+
messages.clear
|
184
|
+
details.clear
|
185
|
+
end
|
186
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:338
|
187
|
+
```
|
188
|
+
|
189
|
+
</details>
|
190
|
+
<details open>
|
191
|
+
<summary>activemodel-5.2.3/lib/active_model/validations/callbacks.rb:117</summary>
|
192
|
+
|
193
|
+
##### ActiveModel::Validations::Callbacks#run_validations!
|
194
|
+
```ruby
|
195
|
+
def run_validations!
|
196
|
+
_run_validation_callbacks { super }
|
197
|
+
end
|
198
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:339
|
199
|
+
```
|
200
|
+
|
201
|
+
</details>
|
202
|
+
<details open>
|
203
|
+
<summary>activemodel-5.2.3/lib/active_model/validations.rb:408</summary>
|
204
|
+
|
205
|
+
##### ActiveModel::Validations#run_validations!
|
206
|
+
```ruby
|
207
|
+
def run_validations!
|
208
|
+
_run_validate_callbacks
|
209
|
+
errors.empty?
|
210
|
+
end
|
211
|
+
# called from activemodel-5.2.3/lib/active_model/validations/callbacks.rb:118
|
212
|
+
```
|
213
|
+
|
214
|
+
</details>
|
215
|
+
<details open>
|
216
|
+
<summary>activemodel-5.2.3/lib/active_model/validations.rb:303</summary>
|
217
|
+
|
218
|
+
##### ActiveModel::Validations#errors
|
219
|
+
```ruby
|
220
|
+
def errors
|
221
|
+
@errors ||= Errors.new(self)
|
222
|
+
end
|
223
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:410
|
224
|
+
```
|
225
|
+
|
226
|
+
</details>
|
227
|
+
<details open>
|
228
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:209</summary>
|
229
|
+
|
230
|
+
##### ActiveModel::Errors#empty?
|
231
|
+
```ruby
|
232
|
+
def empty?
|
233
|
+
size.zero?
|
234
|
+
end
|
235
|
+
# called from activemodel-5.2.3/lib/active_model/validations.rb:410
|
236
|
+
```
|
237
|
+
|
238
|
+
</details>
|
239
|
+
<details open>
|
240
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:179</summary>
|
241
|
+
|
242
|
+
##### ActiveModel::Errors#size
|
243
|
+
```ruby
|
244
|
+
def size
|
245
|
+
values.flatten.size
|
246
|
+
end
|
247
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:210
|
248
|
+
```
|
249
|
+
|
250
|
+
</details>
|
251
|
+
<details open>
|
252
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:188</summary>
|
253
|
+
|
254
|
+
##### ActiveModel::Errors#values
|
255
|
+
```ruby
|
256
|
+
def values
|
257
|
+
messages.select do |key, value|
|
258
|
+
!value.empty?
|
259
|
+
end.values
|
260
|
+
end
|
261
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:180
|
262
|
+
```
|
263
|
+
|
264
|
+
</details>
|
265
|
+
<details open>
|
266
|
+
<summary>activemodel-5.2.3/lib/active_model/validations.rb:303</summary>
|
267
|
+
|
268
|
+
##### ActiveModel::Validations#errors
|
269
|
+
```ruby
|
270
|
+
def errors
|
271
|
+
@errors ||= Errors.new(self)
|
272
|
+
end
|
273
|
+
# called from activerecord-5.2.3/lib/active_record/validations.rb:68
|
274
|
+
```
|
275
|
+
|
276
|
+
</details>
|
277
|
+
<details open>
|
278
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:209</summary>
|
279
|
+
|
280
|
+
##### ActiveModel::Errors#empty?
|
281
|
+
```ruby
|
282
|
+
def empty?
|
283
|
+
size.zero?
|
284
|
+
end
|
285
|
+
# called from activerecord-5.2.3/lib/active_record/validations.rb:68
|
286
|
+
```
|
287
|
+
|
288
|
+
</details>
|
289
|
+
<details open>
|
290
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:179</summary>
|
291
|
+
|
292
|
+
##### ActiveModel::Errors#size
|
293
|
+
```ruby
|
294
|
+
def size
|
295
|
+
values.flatten.size
|
296
|
+
end
|
297
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:210
|
298
|
+
```
|
299
|
+
|
300
|
+
</details>
|
301
|
+
<details open>
|
302
|
+
<summary>activemodel-5.2.3/lib/active_model/errors.rb:188</summary>
|
303
|
+
|
304
|
+
##### ActiveModel::Errors#values
|
305
|
+
```ruby
|
306
|
+
def values
|
307
|
+
messages.select do |key, value|
|
308
|
+
!value.empty?
|
309
|
+
end.values
|
310
|
+
end
|
311
|
+
# called from activemodel-5.2.3/lib/active_model/errors.rb:180
|
312
|
+
```
|
313
|
+
|
314
|
+
</details>
|
315
|
+
|
316
|
+
|
317
|
+
|
318
|
+
### Example 02. Track the lifecycle of Rails application
|
26
319
|
|
27
320
|
|
28
321
|
```
|
29
322
|
% bin/rails c
|
30
323
|
|
31
324
|
irb(main):001:0> env = Rack::MockRequest.env_for('http://localhost:3000/books')
|
32
|
-
irb(main):002:0> TraceLocation.trace { status, headers, body = Rails.application.call(env) }
|
325
|
+
irb(main):002:0> TraceLocation.trace(format: :log) { status, headers, body = Rails.application.call(env) }
|
33
326
|
Created at /path/to/sampleapp/log/trace_location-2019050602051557077971.log
|
34
327
|
=> true
|
35
328
|
```
|
@@ -77,91 +370,6 @@ C railties-5.2.3/lib/rails/engine.rb:522 [Rails::Engine#call]
|
|
77
370
|
..................
|
78
371
|
```
|
79
372
|
|
80
|
-
### Example 02. Track the validation process of Active Record
|
81
|
-
|
82
|
-
```
|
83
|
-
% bin/rails c
|
84
|
-
|
85
|
-
irb(main):001:0> book = Book.new(title: "My Book Title")
|
86
|
-
irb(main):002:0> TraceLocation.trace { book.validate }
|
87
|
-
Created at /path/to/sampleapp/log/trace_location-2019050104049576006131.log
|
88
|
-
=> true
|
89
|
-
```
|
90
|
-
|
91
|
-
Then you can get a log like this:
|
92
|
-
|
93
|
-
```
|
94
|
-
Logged by TraceLocation gem at 2019-05-06 02:44:29 +0900
|
95
|
-
https://github.com/yhirano55/trace_location
|
96
|
-
|
97
|
-
[Tracing events] C: Call, R: Return
|
98
|
-
|
99
|
-
C activerecord-5.2.3/lib/active_record/validations.rb:65 [ActiveRecord::Validations#valid?]
|
100
|
-
C activerecord-5.2.3/lib/active_record/validations.rb:75 [ActiveRecord::Validations#default_validation_context]
|
101
|
-
C activerecord-5.2.3/lib/active_record/persistence.rb:231 [ActiveRecord::Persistence#new_record?]
|
102
|
-
C activerecord-5.2.3/lib/active_record/transactions.rb:490 [ActiveRecord::Transactions#sync_with_transaction_state]
|
103
|
-
C activerecord-5.2.3/lib/active_record/transactions.rb:494 [ActiveRecord::Transactions#update_attributes_from_transaction_state]
|
104
|
-
R activerecord-5.2.3/lib/active_record/transactions.rb:500 [ActiveRecord::Transactions#update_attributes_from_transaction_state]
|
105
|
-
R activerecord-5.2.3/lib/active_record/transactions.rb:492 [ActiveRecord::Transactions#sync_with_transaction_state]
|
106
|
-
R activerecord-5.2.3/lib/active_record/persistence.rb:234 [ActiveRecord::Persistence#new_record?]
|
107
|
-
R activerecord-5.2.3/lib/active_record/validations.rb:77 [ActiveRecord::Validations#default_validation_context]
|
108
|
-
C activemodel-5.2.3/lib/active_model/validations.rb:336 [ActiveModel::Validations#valid?]
|
109
|
-
C activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
|
110
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:74 [ActiveModel::Errors#initialize]
|
111
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:470 [ActiveModel::Errors#apply_default_array]
|
112
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:473 [ActiveModel::Errors#apply_default_array]
|
113
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:470 [ActiveModel::Errors#apply_default_array]
|
114
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:473 [ActiveModel::Errors#apply_default_array]
|
115
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:78 [ActiveModel::Errors#initialize]
|
116
|
-
R activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
|
117
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:115 [ActiveModel::Errors#clear]
|
118
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:118 [ActiveModel::Errors#clear]
|
119
|
-
C activemodel-5.2.3/lib/active_model/validations/callbacks.rb:117 [ActiveModel::Validations::Callbacks#run_validations!]
|
120
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:815 [ActiveRecord::Base#_run_validation_callbacks]
|
121
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:94 [ActiveSupport::Callbacks#run_callbacks]
|
122
|
-
C activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:124 [ActiveRecord::Base#__callbacks]
|
123
|
-
C activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:106 [ActiveRecord::Base.__callbacks]
|
124
|
-
R activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:128 [ActiveRecord::Base.__callbacks]
|
125
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:95 [ActiveRecord::Base#__callbacks]
|
126
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
|
127
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
|
128
|
-
C activemodel-5.2.3/lib/active_model/validations.rb:408 [ActiveModel::Validations#run_validations!]
|
129
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:815 [ActiveRecord::Base#_run_validate_callbacks]
|
130
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:94 [ActiveSupport::Callbacks#run_callbacks]
|
131
|
-
C activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:124 [ActiveRecord::Base#__callbacks]
|
132
|
-
C activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:106 [ActiveRecord::Base.__callbacks]
|
133
|
-
R activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:128 [ActiveRecord::Base.__callbacks]
|
134
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:95 [ActiveRecord::Base#__callbacks]
|
135
|
-
C activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
|
136
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
|
137
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:139 [ActiveSupport::Callbacks#run_callbacks]
|
138
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:817 [ActiveRecord::Base#_run_validate_callbacks]
|
139
|
-
C activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
|
140
|
-
R activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
|
141
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:209 [ActiveModel::Errors#empty?]
|
142
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:179 [ActiveModel::Errors#size]
|
143
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:188 [ActiveModel::Errors#values]
|
144
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:192 [ActiveModel::Errors#values]
|
145
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:181 [ActiveModel::Errors#size]
|
146
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:211 [ActiveModel::Errors#empty?]
|
147
|
-
R activemodel-5.2.3/lib/active_model/validations.rb:411 [ActiveModel::Validations#run_validations!]
|
148
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:139 [ActiveSupport::Callbacks#run_callbacks]
|
149
|
-
R activesupport-5.2.3/lib/active_support/callbacks.rb:817 [ActiveRecord::Base#_run_validation_callbacks]
|
150
|
-
R activemodel-5.2.3/lib/active_model/validations/callbacks.rb:119 [ActiveModel::Validations::Callbacks#run_validations!]
|
151
|
-
R activemodel-5.2.3/lib/active_model/validations.rb:342 [ActiveModel::Validations#valid?]
|
152
|
-
C activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
|
153
|
-
R activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
|
154
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:209 [ActiveModel::Errors#empty?]
|
155
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:179 [ActiveModel::Errors#size]
|
156
|
-
C activemodel-5.2.3/lib/active_model/errors.rb:188 [ActiveModel::Errors#values]
|
157
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:192 [ActiveModel::Errors#values]
|
158
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:181 [ActiveModel::Errors#size]
|
159
|
-
R activemodel-5.2.3/lib/active_model/errors.rb:211 [ActiveModel::Errors#empty?]
|
160
|
-
R activerecord-5.2.3/lib/active_record/validations.rb:69 [ActiveRecord::Validations#valid?]
|
161
|
-
|
162
|
-
Result: true
|
163
|
-
```
|
164
|
-
|
165
373
|
## License
|
166
374
|
|
167
375
|
[MIT License](https://opensource.org/licenses/MIT)
|
@@ -1,22 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'binding_of_caller'
|
4
|
+
|
3
5
|
module TraceLocation
|
4
6
|
module Collector # :nodoc:
|
5
7
|
require_relative 'event'
|
6
8
|
Result = Struct.new(:events, :return_value)
|
7
9
|
|
8
|
-
def self.collect(&block)
|
10
|
+
def self.collect(match:, ignore:, &block)
|
9
11
|
events = []
|
10
12
|
hierarchy = 0
|
13
|
+
id = 0
|
14
|
+
cache = {}
|
15
|
+
|
11
16
|
tracer = TracePoint.new(:call, :return) do |trace_point|
|
12
|
-
next
|
17
|
+
next if match && !trace_point.path.to_s.match?(/#{match}/)
|
18
|
+
next if ignore && trace_point.path.to_s.match?(/#{ignore}/)
|
19
|
+
|
20
|
+
id += 1
|
21
|
+
caller_path, caller_lineno = trace_point.binding.of_caller(2).source_location
|
22
|
+
location_cache_key = "#{caller_path}:#{caller_lineno}"
|
13
23
|
|
14
24
|
case trace_point.event
|
15
25
|
when :call
|
26
|
+
cache[location_cache_key] = hierarchy
|
27
|
+
|
16
28
|
events << Event.new(
|
29
|
+
id: id,
|
17
30
|
event: trace_point.event,
|
18
31
|
path: trace_point.path,
|
19
32
|
lineno: trace_point.lineno,
|
33
|
+
caller_path: caller_path,
|
34
|
+
caller_lineno: caller_lineno,
|
20
35
|
method_id: trace_point.method_id,
|
21
36
|
defined_class: trace_point.defined_class,
|
22
37
|
hierarchy: hierarchy
|
@@ -24,12 +39,15 @@ module TraceLocation
|
|
24
39
|
|
25
40
|
hierarchy += 1
|
26
41
|
when :return
|
27
|
-
hierarchy
|
42
|
+
hierarchy = cache[location_cache_key] || hierarchy
|
28
43
|
|
29
44
|
events << Event.new(
|
45
|
+
id: id,
|
30
46
|
event: trace_point.event,
|
31
47
|
path: trace_point.path,
|
32
48
|
lineno: trace_point.lineno,
|
49
|
+
caller_path: caller_path,
|
50
|
+
caller_lineno: caller_lineno,
|
33
51
|
method_id: trace_point.method_id,
|
34
52
|
defined_class: trace_point.defined_class,
|
35
53
|
hierarchy: hierarchy
|
data/lib/trace_location/event.rb
CHANGED
@@ -3,12 +3,15 @@
|
|
3
3
|
module TraceLocation
|
4
4
|
class Event # :nodoc:
|
5
5
|
CLASS_FORMAT = /\A#<(?:Class|refinement)\:([A-Za-z0-9\:]+).*>\z/.freeze
|
6
|
-
attr_reader :event, :path, :lineno, :method_id, :defined_class, :hierarchy
|
6
|
+
attr_reader :id, :event, :path, :lineno, :caller_path, :caller_lineno, :method_id, :defined_class, :hierarchy
|
7
7
|
|
8
|
-
def initialize(event:, path:, lineno:, method_id:, defined_class:, hierarchy:)
|
8
|
+
def initialize(id:, event:, path:, lineno:, caller_path:, caller_lineno:, method_id:, defined_class:, hierarchy:)
|
9
|
+
@id = id
|
9
10
|
@event = event
|
10
11
|
@path = path
|
11
12
|
@lineno = lineno
|
13
|
+
@caller_path = caller_path
|
14
|
+
@caller_lineno = caller_lineno
|
12
15
|
@method_id = method_id
|
13
16
|
@defined_class = defined_class
|
14
17
|
@hierarchy = hierarchy.to_i
|
@@ -5,9 +5,10 @@ require 'csv'
|
|
5
5
|
module TraceLocation
|
6
6
|
module Generator
|
7
7
|
class Csv < Base # :nodoc:
|
8
|
+
ATTRIBUTES = %w[id event path lineno caller_path caller_lineno method_str hierarchy].freeze
|
9
|
+
|
8
10
|
def initialize(events, return_value, options)
|
9
|
-
|
10
|
-
@return_value = return_value
|
11
|
+
super
|
11
12
|
@dest_dir = options.fetch(:dest_dir) { ::TraceLocation.config.dest_dir }
|
12
13
|
@file_path = File.join(@dest_dir, "trace_location-#{Time.now.strftime('%Y%m%d%H%m%s')}.csv")
|
13
14
|
end
|
@@ -28,9 +29,10 @@ module TraceLocation
|
|
28
29
|
|
29
30
|
def create_file
|
30
31
|
CSV.open(file_path, 'wb+') do |csv|
|
31
|
-
csv <<
|
32
|
-
|
33
|
-
|
32
|
+
csv << ATTRIBUTES
|
33
|
+
|
34
|
+
events.each do |event|
|
35
|
+
csv << ATTRIBUTES.map { |attr| event.public_send(attr) }
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
@@ -10,8 +10,7 @@ module TraceLocation
|
|
10
10
|
INDENT_STRING = ' '
|
11
11
|
|
12
12
|
def initialize(events, return_value, options)
|
13
|
-
|
14
|
-
@return_value = return_value
|
13
|
+
super
|
15
14
|
@gems_dir = ::TraceLocation.config.gems_dir
|
16
15
|
@dest_dir = options.fetch(:dest_dir) { ::TraceLocation.config.dest_dir }
|
17
16
|
@current = Time.now
|
@@ -34,7 +33,7 @@ module TraceLocation
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def create_file
|
37
|
-
File.open(file_path, '
|
36
|
+
File.open(file_path, 'wb+') do |io|
|
38
37
|
io.puts "Logged by TraceLocation gem at #{current}"
|
39
38
|
io.puts 'https://github.com/yhirano55/trace_location'
|
40
39
|
io.puts
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module TraceLocation
|
6
|
+
module Generator
|
7
|
+
class Markdown < Base # :nodoc:
|
8
|
+
def initialize(events, return_value, options)
|
9
|
+
super
|
10
|
+
@gems_dir = ::TraceLocation.config.gems_dir
|
11
|
+
@dest_dir = options.fetch(:dest_dir) { ::TraceLocation.config.dest_dir }
|
12
|
+
@current = Time.now
|
13
|
+
@filename = "trace_location-#{@current.strftime('%Y%m%d%H%m%s')}.md"
|
14
|
+
@file_path = File.join(@dest_dir, @filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate
|
18
|
+
setup_dir
|
19
|
+
create_file
|
20
|
+
$stdout.puts "Created at #{file_path}"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :events, :return_value, :gems_dir, :dest_dir, :current, :filename, :file_path
|
26
|
+
|
27
|
+
def setup_dir
|
28
|
+
FileUtils.mkdir_p(dest_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_file
|
32
|
+
File.open(file_path, 'wb+') do |io|
|
33
|
+
io.write <<~MARKDOWN
|
34
|
+
Generated by [trace_location](https://github.com/yhirano55/trace_location) at #{current}
|
35
|
+
|
36
|
+
MARKDOWN
|
37
|
+
|
38
|
+
events.select(&:call?).each do |e|
|
39
|
+
pm = begin
|
40
|
+
Pry::Method.from_str(e.method_str)
|
41
|
+
rescue StandardError
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
next if pm.nil?
|
45
|
+
|
46
|
+
path = e.path.to_s.gsub(%r{#{gems_dir}/}, '')
|
47
|
+
caller_path = e.caller_path.to_s.gsub(%r{#{gems_dir}/}, '')
|
48
|
+
io.write <<~MARKDOWN
|
49
|
+
<details open>
|
50
|
+
<summary>#{path}:#{e.lineno}</summary>
|
51
|
+
|
52
|
+
##### #{pm.name_with_owner}
|
53
|
+
```#{pm.source_type}
|
54
|
+
#{pm.source.chomp}
|
55
|
+
# called from #{caller_path}:#{e.caller_lineno}
|
56
|
+
```
|
57
|
+
|
58
|
+
</details>
|
59
|
+
MARKDOWN
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -8,7 +8,8 @@ module TraceLocation
|
|
8
8
|
|
9
9
|
GENERATORS = {
|
10
10
|
csv: ::TraceLocation::Generator::Csv,
|
11
|
-
log: ::TraceLocation::Generator::Log
|
11
|
+
log: ::TraceLocation::Generator::Log,
|
12
|
+
markdown: ::TraceLocation::Generator::Markdown
|
12
13
|
}.freeze
|
13
14
|
|
14
15
|
def self.build(events, return_value, options)
|
data/lib/trace_location.rb
CHANGED
@@ -14,7 +14,10 @@ end
|
|
14
14
|
|
15
15
|
module TraceLocation # :nodoc:
|
16
16
|
def self.trace(options = {}, &block)
|
17
|
-
|
17
|
+
match = options.delete(:match)
|
18
|
+
ignore = options.delete(:ignore)
|
19
|
+
|
20
|
+
result = Collector.collect(match: match, ignore: ignore, &block)
|
18
21
|
Report.build(result.events, result.return_value, options).generate
|
19
22
|
true
|
20
23
|
rescue StandardError => e
|
data/trace_location.gemspec
CHANGED
@@ -23,7 +23,10 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.require_paths = ['lib']
|
24
24
|
s.required_ruby_version = '>= 2.5.0'
|
25
25
|
|
26
|
-
s.
|
27
|
-
s.
|
28
|
-
|
26
|
+
s.add_dependency 'binding_of_caller'
|
27
|
+
s.add_dependency 'pry'
|
28
|
+
|
29
|
+
s.add_development_dependency 'bundler'
|
30
|
+
s.add_development_dependency 'rake'
|
31
|
+
s.add_development_dependency 'rspec'
|
29
32
|
end
|
metadata
CHANGED
@@ -1,57 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trace_location
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshiyuki Hirano
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: binding_of_caller
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
|
-
- - "
|
45
|
+
- - ">="
|
18
46
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
47
|
+
version: '0'
|
20
48
|
type: :development
|
21
49
|
prerelease: false
|
22
50
|
version_requirements: !ruby/object:Gem::Requirement
|
23
51
|
requirements:
|
24
|
-
- - "
|
52
|
+
- - ">="
|
25
53
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rake
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
|
-
- - "
|
59
|
+
- - ">="
|
32
60
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
61
|
+
version: '0'
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
|
-
- - "
|
66
|
+
- - ">="
|
39
67
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rspec
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- - "
|
73
|
+
- - ">="
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
75
|
+
version: '0'
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
|
-
- - "
|
80
|
+
- - ">="
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
82
|
+
version: '0'
|
55
83
|
description: TraceLocation helps you get tracing the source location of codes, and
|
56
84
|
helps you can get reading the huge open souce libraries in Ruby
|
57
85
|
email:
|
@@ -80,6 +108,7 @@ files:
|
|
80
108
|
- lib/trace_location/generator/base.rb
|
81
109
|
- lib/trace_location/generator/csv.rb
|
82
110
|
- lib/trace_location/generator/log.rb
|
111
|
+
- lib/trace_location/generator/markdown.rb
|
83
112
|
- lib/trace_location/railtie.rb
|
84
113
|
- lib/trace_location/report.rb
|
85
114
|
- lib/trace_location/version.rb
|