trace_location 0.1.1 → 0.2.0

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: fb85210c00084f35e0ec599fd74807dcd3d0db6e03ce25802f4088e0aa4f60a1
4
- data.tar.gz: ae4e038de2ce1a518458211b88ce5a7b89d3444ded0073bd130bb005ad1362c0
3
+ metadata.gz: 45a88decc19e23e871527790f179e0dc744b520ee6333c85096cecc055ffdb4f
4
+ data.tar.gz: d068436f8c8a1cc632a5dafb6e5f75a57dccc214e22943e9949ce1f7418cdb30
5
5
  SHA512:
6
- metadata.gz: 22fd9789dae1f5bc5027630c09aba9bc544575f3f281ddfa6c9aab33201c54c1f403f578d2d7052d6ca68a011a4b90abe70a4ead8e3441fd9a115cb92c24a0fa
7
- data.tar.gz: 11420a3b2d4a2af2cc9e1b7f7cda1e02f4b62053de42bf4bbbefece74ce28c46b474ef249e3b90da0d0bb6131a93015f7e7757d55b3d2e677d55ff792cce6154
6
+ metadata.gz: 1b26332b7fc93c77c1c2f9f043f71d8a9192a9610a6b8529c5eab31483331f31db69a550fa2c36733a9b54e431f898dec55330f1a53528ab476c24cf746e24db
7
+ data.tar.gz: bb4f7a02d04fc6bc5b04da69397afd46a06110301936fcb9c58bcd905eeb1216f46fab14c4a2ea13cfb70389fd791500e04529ca31d32d0fbe14c840b12e93ce
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trace_location (0.1.1)
4
+ trace_location (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -21,75 +21,147 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  You just surround the code which you want to track the process.
24
- For example, when you want to track **the lifecycle of Rails application request/response**:
24
+
25
+ ### Example 01. Track the lifecycle of Rails application
26
+
25
27
 
26
28
  ```
27
29
  % bin/rails c
28
30
 
29
- irb(main):001:0> env = Rack::MockRequest.env_for('http://localhost:3000/api/stories')
31
+ irb(main):001:0> env = Rack::MockRequest.env_for('http://localhost:3000/books')
30
32
  irb(main):002:0> TraceLocation.trace { status, headers, body = Rails.application.call(env) }
31
- Created at /path/to/sampleapp/log/trace_location-2019050105051556706139.log
33
+ Created at /path/to/sampleapp/log/trace_location-2019050602051557077971.log
32
34
  => true
33
35
  ```
34
36
 
35
37
  Then you can get a log like this:
36
38
 
37
39
  ```
38
- Logged by TraceLocation gem at 2019-05-01 05:22:19 -0500
40
+ Logged by TraceLocation gem at 2019-05-06 02:39:31 +0900
39
41
  https://github.com/yhirano55/trace_location
40
42
 
41
43
  [Tracing events] C: Call, R: Return
42
44
 
43
- R <internal:prelude>:138#enable
44
- C /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:39#application
45
- R /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:41#application
46
- C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:522#call
47
- C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:607#build_request
48
- C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:705#build_request
49
- C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:247#env_config
50
- R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:275#env_config
51
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:59#initialize
52
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:40#initialize
53
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/url.rb:186#initialize
54
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/filter_parameters.rb:34#initialize
55
- R /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/filter_parameters.rb:39#initialize
56
- R /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/url.rb:190#initialize
57
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:43#initialize
58
- R /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:67#initialize
59
- C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:534#routes
60
- R /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:538#routes
61
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:142#routes=
62
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:68#set_header
63
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:70#set_header
64
- R /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:144#routes=
65
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:129#script_name
66
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:52#get_header
67
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:54#get_header
68
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:129#script_name
69
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:150#engine_script_name=
70
- C /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/http/request.rb:138#routes
71
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:52#get_header
72
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/request.rb:54#get_header
45
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:39 [Rails.application]
46
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:41 [Rails.application]
47
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:522 [Rails::Engine#call]
48
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:607 [Rails::Application#build_request]
49
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:705 [Rails::Engine#build_request]
50
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:247 [Rails::Application#env_config]
51
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:528 [Rails::Engine#env_config]
52
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:530 [Rails::Engine#env_config]
53
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:372 [Rails::Application#config]
54
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:374 [Rails::Application#config]
55
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:372 [Rails::Application#config]
56
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:374 [Rails::Application#config]
57
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:394 [Rails::Application#secrets]
58
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:414 [Rails::Application#secrets]
59
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:41 [ActiveSupport::OrderedOptions#method_missing]
60
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:37 [ActiveSupport::OrderedOptions#[]]
61
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:39 [ActiveSupport::OrderedOptions#[]]
62
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:54 [ActiveSupport::OrderedOptions#method_missing]
63
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:428 [Rails::Application#secret_key_base]
64
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:72 [Rails.env]
65
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails.rb:74 [Rails.env]
66
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/string_inquirer.rb:26 [ActiveSupport::StringInquirer#method_missing]
67
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/string_inquirer.rb:32 [ActiveSupport::StringInquirer#method_missing]
68
+ C /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:394 [Rails::Application#secrets]
69
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:414 [Rails::Application#secrets]
70
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:41 [ActiveSupport::OrderedOptions#method_missing]
71
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:37 [ActiveSupport::OrderedOptions#[]]
72
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:39 [ActiveSupport::OrderedOptions#[]]
73
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/ordered_options.rb:54 [ActiveSupport::OrderedOptions#method_missing]
74
+ R /vendor/bundle/gems/railties-5.2.3/lib/rails/application.rb:436 [Rails::Application#secret_key_base]
73
75
  ..................
74
76
  (an omission)
75
77
  ..................
76
- R /vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/middleware/static.rb:128#call
77
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:9#respond_to?
78
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:9#respond_to?
79
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:9#respond_to?
80
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:9#respond_to?
81
- C /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:9#respond_to?
82
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:15#respond_to?
83
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:15#respond_to?
84
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:15#respond_to?
85
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:15#respond_to?
86
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/body_proxy.rb:15#respond_to?
87
- R /vendor/bundle/gems/rack-2.0.7/lib/rack/sendfile.rb:140#call
88
- R /vendor/bundle/gems/railties-5.2.3/lib/rails/engine.rb:525#call
89
-
90
- Result: [200, {"Content-Type"=>"application/json; charset=utf-8", "ETag"=>"W/\"42334f8fba25471804e2cfa66fa989a7\"", "Cache-Control"=>"max-age=0, private, must-revalidate", "X-Request-Id"=>"f30153ff-3446-453a-a547-34c4b3766bfc", "X-Runtime"=>"0.455604"}, #<Rack::BodyProxy:0x00007f957960a430 @body=#<Rack::BodyProxy:0x00007f957f1c1f08 @body=#<Rack::BodyProxy:0x00007f957f1a8c10 @body=#<Rack::BodyProxy:0x00007f957f198040 @body=#<Rack::BodyProxy:0x00007f957f17bf58 @body=["[{\"id\":1,\"title\":\"The boy who cried 'wolf!'\",\"parentId\":1},{\"id\":2,\"title\":\"story 2\",\"parentId\":4},{\"id\":3,\"title\":\"story 3\",\"parentId\":null},{\"id\":4,\"title\":\"story 4\",\"parentId\":null},{\"id\":5,\"title\":\"story 1\",\"parentId\":null},{\"id\":6,\"title\":\"story 6\",\"parentId\":null},{\"id\":7,\"title\":\"story 7\",\"parentId\":null},{\"id\":8,\"title\":\"story 8\",\"parentId\":null},{\"id\":9,\"title\":\"story 9\",\"parentId\":null},{\"id\":10,\"title\":\"story 10\",\"parentId\":null},{\"id\":11,\"title\":\"story 11\",\"parentId\":null},{\"id\":12,\"title\":\"story 12\",\"parentId\":null},{\"id\":13,\"title\":\"story 13\",\"parentId\":null}]"], @block=#<Proc:0x00007f957f17ae78@/path/to/sampleapp/vendor/bundle/gems/rack-2.0.7/lib/rack/etag.rb:30>, @closed=false>, @block=#<Proc:0x00007f957f1a2d38@/path/to/sampleapp/vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/middleware/executor.rb:15>, @closed=false>, @block=#<Proc:0x00007f957f1b3728@/path/to/sampleapp/vendor/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:39>, @closed=false>, @block=#<Proc:0x00007f957f1c07c0@/path/to/sampleapp/vendor/bundle/gems/activesupport-5.2.3/lib/active_support/cache/strategy/local_cache_middleware.rb:30>, @closed=false>, @block=#<Proc:0x00007f95796096c0@/path/to/sampleapp/vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/middleware/executor.rb:15>, @closed=false>]
78
+ ```
79
+
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 /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/validations.rb:65 [ActiveRecord::Validations#valid?]
100
+ C /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/validations.rb:75 [ActiveRecord::Validations#default_validation_context]
101
+ C /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/persistence.rb:231 [ActiveRecord::Persistence#new_record?]
102
+ C /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/transactions.rb:490 [ActiveRecord::Transactions#sync_with_transaction_state]
103
+ C /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/transactions.rb:494 [ActiveRecord::Transactions#update_attributes_from_transaction_state]
104
+ R /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/transactions.rb:500 [ActiveRecord::Transactions#update_attributes_from_transaction_state]
105
+ R /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/transactions.rb:492 [ActiveRecord::Transactions#sync_with_transaction_state]
106
+ R /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/persistence.rb:234 [ActiveRecord::Persistence#new_record?]
107
+ R /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/validations.rb:77 [ActiveRecord::Validations#default_validation_context]
108
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:336 [ActiveModel::Validations#valid?]
109
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
110
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:74 [ActiveModel::Errors#initialize]
111
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:470 [ActiveModel::Errors#apply_default_array]
112
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:473 [ActiveModel::Errors#apply_default_array]
113
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:470 [ActiveModel::Errors#apply_default_array]
114
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:473 [ActiveModel::Errors#apply_default_array]
115
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:78 [ActiveModel::Errors#initialize]
116
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
117
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:115 [ActiveModel::Errors#clear]
118
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:118 [ActiveModel::Errors#clear]
119
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations/callbacks.rb:117 [ActiveModel::Validations::Callbacks#run_validations!]
120
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:815 [ActiveRecord::Base#_run_validation_callbacks]
121
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:94 [ActiveSupport::Callbacks#run_callbacks]
122
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:124 [ActiveRecord::Base#__callbacks]
123
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:106 [ActiveRecord::Base.__callbacks]
124
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:128 [ActiveRecord::Base.__callbacks]
125
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:95 [ActiveRecord::Base#__callbacks]
126
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
127
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
128
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:408 [ActiveModel::Validations#run_validations!]
129
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:815 [ActiveRecord::Base#_run_validate_callbacks]
130
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:94 [ActiveSupport::Callbacks#run_callbacks]
131
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:124 [ActiveRecord::Base#__callbacks]
132
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:106 [ActiveRecord::Base.__callbacks]
133
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:128 [ActiveRecord::Base.__callbacks]
134
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:95 [ActiveRecord::Base#__callbacks]
135
+ C /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
136
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:539 [ActiveSupport::Callbacks::CallbackChain#empty?]
137
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:139 [ActiveSupport::Callbacks#run_callbacks]
138
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:817 [ActiveRecord::Base#_run_validate_callbacks]
139
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
140
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
141
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:209 [ActiveModel::Errors#empty?]
142
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:179 [ActiveModel::Errors#size]
143
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:188 [ActiveModel::Errors#values]
144
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:192 [ActiveModel::Errors#values]
145
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:181 [ActiveModel::Errors#size]
146
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:211 [ActiveModel::Errors#empty?]
147
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:411 [ActiveModel::Validations#run_validations!]
148
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:139 [ActiveSupport::Callbacks#run_callbacks]
149
+ R /vendor/bundle/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:817 [ActiveRecord::Base#_run_validation_callbacks]
150
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations/callbacks.rb:119 [ActiveModel::Validations::Callbacks#run_validations!]
151
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:342 [ActiveModel::Validations#valid?]
152
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:303 [ActiveModel::Validations#errors]
153
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/validations.rb:305 [ActiveModel::Validations#errors]
154
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:209 [ActiveModel::Errors#empty?]
155
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:179 [ActiveModel::Errors#size]
156
+ C /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:188 [ActiveModel::Errors#values]
157
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:192 [ActiveModel::Errors#values]
158
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:181 [ActiveModel::Errors#size]
159
+ R /vendor/bundle/gems/activemodel-5.2.3/lib/active_model/errors.rb:211 [ActiveModel::Errors#empty?]
160
+ R /vendor/bundle/gems/activerecord-5.2.3/lib/active_record/validations.rb:69 [ActiveRecord::Validations#valid?]
161
+
162
+ Result: true
91
163
  ```
92
164
 
93
165
  ## License
94
166
 
95
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
167
+ [MIT License](https://opensource.org/licenses/MIT)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ module Collector # :nodoc:
5
+ require_relative 'event'
6
+ Result = Struct.new(:events, :return_value)
7
+
8
+ def self.collect(&block)
9
+ events = []
10
+ hierarchy = 0
11
+ tracer = TracePoint.new(:call, :return) do |trace_point|
12
+ case trace_point.event
13
+ when :call
14
+ events << Event.new(
15
+ event: trace_point.event,
16
+ path: trace_point.path,
17
+ lineno: trace_point.lineno,
18
+ method_id: trace_point.method_id,
19
+ defined_class: trace_point.defined_class,
20
+ hierarchy: hierarchy
21
+ )
22
+
23
+ hierarchy += 1
24
+ when :return
25
+ hierarchy -= 1
26
+
27
+ events << Event.new(
28
+ event: trace_point.event,
29
+ path: trace_point.path,
30
+ lineno: trace_point.lineno,
31
+ method_id: trace_point.method_id,
32
+ defined_class: trace_point.defined_class,
33
+ hierarchy: hierarchy
34
+ )
35
+ end
36
+ end
37
+ return_value = tracer.enable { block.call }
38
+ Result.new(events, return_value)
39
+ end
40
+ end
41
+ end
@@ -2,11 +2,12 @@
2
2
 
3
3
  module TraceLocation
4
4
  class Config # :nodoc:
5
- attr_accessor :root_dir, :dest_dir
5
+ attr_accessor :root_dir, :dest_dir, :default_format
6
6
 
7
7
  def initialize
8
8
  @root_dir = Dir.pwd
9
9
  @dest_dir = Dir.pwd
10
+ @default_format = :log
10
11
  end
11
12
  end
12
13
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ class Event # :nodoc:
5
+ CLASS_FORMAT = /\A#<Class\:(.+)?>\z/.freeze
6
+ attr_reader :event, :path, :lineno, :method_id, :defined_class, :hierarchy
7
+
8
+ def initialize(event:, path:, lineno:, method_id:, defined_class:, hierarchy:)
9
+ @event = event
10
+ @path = path
11
+ @lineno = lineno
12
+ @method_id = method_id
13
+ @defined_class = defined_class
14
+ @hierarchy = hierarchy.to_i
15
+ end
16
+
17
+ def valid?
18
+ hierarchy >= 0
19
+ end
20
+
21
+ def invalid?
22
+ !valid?
23
+ end
24
+
25
+ def call?
26
+ event == :call
27
+ end
28
+
29
+ def return?
30
+ event == :return
31
+ end
32
+
33
+ def method_str
34
+ match = defined_class.to_s.match(CLASS_FORMAT)
35
+
36
+ if match
37
+ "#{match[1]}.#{method_id}"
38
+ else
39
+ "#{defined_class}##{method_id}"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ module Generator
5
+ class Base # :nodoc:
6
+ def initialize(events, return_value, options)
7
+ @events = events
8
+ @return_value = return_value
9
+ @options = options
10
+ end
11
+
12
+ def generate
13
+ raise NotImplementedError
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ module Generator
5
+ class Log < Base # :nodoc:
6
+ EVENTS = { call: 'C', return: 'R' }.freeze
7
+ INDENT_SPACES = 2
8
+ INDENT_STRING = ' '
9
+
10
+ def initialize(events, return_value, options)
11
+ @events = events
12
+ @return_value = return_value
13
+ @root_dir = options.fetch(:root_dir) { TraceLocation.config.root_dir }
14
+ @dest_dir = options.fetch(:dest_dir) { TraceLocation.config.dest_dir }
15
+ @current = Time.now
16
+ end
17
+
18
+ def generate
19
+ filename = "trace_location-#{current.strftime('%Y%m%d%H%m%s')}.log"
20
+ file_path = File.join(dest_dir, filename)
21
+
22
+ File.open(file_path, 'w+') do |io|
23
+ io.puts "Logged by TraceLocation gem at #{current}"
24
+ io.puts 'https://github.com/yhirano55/trace_location'
25
+ io.puts
26
+ io.puts '[Tracing events] C: Call, R: Return'
27
+ io.puts
28
+ io.puts format_events(events).join("\n")
29
+ io.puts
30
+ io.puts "Result: #{return_value}"
31
+ end
32
+
33
+ $stdout.puts "Created at #{file_path}"
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :events, :return_value, :root_dir, :dest_dir, :current
39
+
40
+ def format_events(events)
41
+ events.select(&:valid?).map do |e|
42
+ indent = indent(e.hierarchy)
43
+ event = EVENTS[e.event]
44
+ path = e.path.to_s.gsub(/#{root_dir}/, '')
45
+
46
+ %(#{indent}#{event} #{path}:#{e.lineno} [#{e.method_str}])
47
+ end
48
+ end
49
+
50
+ def indent(hierarchy)
51
+ INDENT_STRING * (hierarchy * INDENT_SPACES)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ module Generator # :nodoc:
5
+ require_relative 'generator/base'
6
+ require_relative 'generator/log'
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceLocation
4
+ module Report # :nodoc:
5
+ require_relative 'generator'
6
+
7
+ class InvalidFormatError < ArgumentError; end
8
+
9
+ GENERATORS = {
10
+ log: ::TraceLocation::Generator::Log
11
+ }.freeze
12
+
13
+ def self.build(events, return_value, options)
14
+ resolve_generator(options[:format]).new(events, return_value, options)
15
+ end
16
+
17
+ def self.resolve_generator(format)
18
+ format ||= TraceLocation.config.default_format
19
+ GENERATORS.fetch(format) { raise InvalidFormatError }
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TraceLocation
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'trace_location/version'
3
+ require_relative 'trace_location/collector'
4
4
  require_relative 'trace_location/config'
5
- require_relative 'trace_location/tracer'
5
+ require_relative 'trace_location/report'
6
+ require_relative 'trace_location/version'
6
7
 
7
8
  begin
8
9
  require 'rails'
@@ -13,7 +14,12 @@ end
13
14
 
14
15
  module TraceLocation # :nodoc:
15
16
  def self.trace(options = {}, &block)
16
- Tracer.new(options).call(&block)
17
+ result = Collector.collect(&block)
18
+ Report.build(result.events, result.return_value, options).generate
19
+ true
20
+ rescue StandardError => e
21
+ $stdout.puts "Failure: #{e.message}"
22
+ false
17
23
  end
18
24
 
19
25
  def self.configure
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trace_location
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.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-05-01 00:00:00.000000000 Z
11
+ date: 2019-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,9 +72,14 @@ files:
72
72
  - bin/console
73
73
  - bin/setup
74
74
  - lib/trace_location.rb
75
+ - lib/trace_location/collector.rb
75
76
  - lib/trace_location/config.rb
77
+ - lib/trace_location/event.rb
78
+ - lib/trace_location/generator.rb
79
+ - lib/trace_location/generator/base.rb
80
+ - lib/trace_location/generator/log.rb
76
81
  - lib/trace_location/railtie.rb
77
- - lib/trace_location/tracer.rb
82
+ - lib/trace_location/report.rb
78
83
  - lib/trace_location/version.rb
79
84
  - trace_location.gemspec
80
85
  homepage: https://github.com/yhirano55/trace_location
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TraceLocation
4
- class Tracer # :nodoc:
5
- EVENTS = { call: 'C', return: 'R' }.freeze
6
- INDENT_SPACES = 2
7
- INDENT_STRING = ' '
8
-
9
- def initialize(options = {})
10
- @root_dir = options.fetch(:root_dir) { TraceLocation.config.root_dir }
11
- @dest_dir = options.fetch(:dest_dir) { TraceLocation.config.dest_dir }
12
- end
13
-
14
- def call(&block)
15
- logs = []
16
- nest = 0
17
- trace_point = TracePoint.new(:call, :return) do |tp|
18
- case tp.event
19
- when :call
20
- logs << build_log(trace_point: tp, nest: nest, root_dir: root_dir)
21
- nest += 1
22
- when :return
23
- nest = nest.positive? ? nest - 1 : 0
24
- logs << build_log(trace_point: tp, nest: nest, root_dir: root_dir)
25
- end
26
- end
27
-
28
- trace_point.enable
29
- result = block.call
30
- trace_point.disable
31
-
32
- current = Time.now
33
- filename = "trace_location-#{current.strftime('%Y%m%d%H%m%s')}.log"
34
- file_path = File.join(dest_dir, filename)
35
- File.open(file_path, 'w+') do |io|
36
- io.puts "Logged by TraceLocation gem at #{current}"
37
- io.puts 'https://github.com/yhirano55/trace_location'
38
- io.puts
39
- io.puts '[Tracing events] C: Call, R: Return'
40
- io.puts
41
- io.puts logs.join("\n")
42
- io.puts
43
- io.puts "Result: #{result.inspect}"
44
- end
45
- $stdout.puts "Created at #{file_path}"
46
- true
47
- rescue StandardError => e
48
- $stdout.puts "Failure: #{e.message}"
49
- false
50
- ensure
51
- trace_point.disable if trace_point.enabled?
52
- end
53
-
54
- private
55
-
56
- attr_reader :root_dir, :dest_dir, :block
57
-
58
- def build_log(trace_point:, nest:, root_dir:)
59
- indent = indent(nest)
60
- event = EVENTS[trace_point.event]
61
- path = trace_point.path.to_s.gsub(/#{root_dir}/, '')
62
- lineno = trace_point.lineno
63
- method_id = trace_point.method_id
64
-
65
- %(#{indent}#{event} #{path}:#{lineno}##{method_id})
66
- end
67
-
68
- def indent(nest)
69
- INDENT_STRING * (nest * INDENT_SPACES)
70
- end
71
- end
72
- end