trace_location 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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