localtower 0.2.3 → 0.3.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
  SHA1:
3
- metadata.gz: cb98edd013a8dd3adffd7ec30785cf4e6371a788
4
- data.tar.gz: '093b0a9efd88f6223b95c22a513217198138df2d'
3
+ metadata.gz: 98aac578fc2ae63c3eb8ead3984e40552358eb70
4
+ data.tar.gz: 9d37649aa3aad2e7f5e5bd98f97896a50fb873d4
5
5
  SHA512:
6
- metadata.gz: 11fbdc9b9580686adbd0c8c78a3904a753479fb4110ea0e04e1784ce9fcfa240a3d8063769c6da37a4edfc042d8675a9b52f5a0bea42ac91a806ce25a6a6c68f
7
- data.tar.gz: 52ecc1ff573680f0a9879c13b2b5539b0aef4a214b44a2106d385efb83e7196fcc7059756c3468ffd96378bc79eb872f96a2c94d71594b2936e31f6cee78ef0b
6
+ metadata.gz: a6a760895312eebaf0da5545abe5750b64de83211766f174ea4ea219e57fcbd9fb1a0ba2650f5f8474907288d0883e232949de55734dc09ae4e25281620e7b4b
7
+ data.tar.gz: bf53f8dda0685922284843e043cf13d1fadd91b59a88305eb34fd3c9233b0a109a8bef3a75ac56d968fb61f953896f655ef706ec356df3f4e30e835b1d08b5ca
data/README.md CHANGED
@@ -105,6 +105,6 @@ Thanks for reporting issues, I'll do my best.
105
105
 
106
106
  ## Deploy
107
107
 
108
- rm *.gem | gem build localtower.gemspec | gem push localtower-*.gem
108
+ rm *.gem | gem build localtower.gemspec && gem push localtower-*.gem
109
109
 
110
110
 
@@ -10,6 +10,23 @@ module Localtower
10
10
  @logs = Localtower::Plugins::Capture.new.logs
11
11
  end
12
12
 
13
+ def log
14
+ file = Dir["#{Localtower::Plugins::Capture::LOG_PATH.call}/localtower*#{params[:md5]}*"][0]
15
+
16
+ render json: JSON.parse(open(file).read)
17
+ end
18
+
19
+ def log_var
20
+ answer = {}
21
+
22
+ file = Dir["#{Localtower::Plugins::Capture::LOG_PATH.call}/localtower*#{params[:md5]}*"][0]
23
+ data = JSON.parse(open(file).read)
24
+
25
+ answer = data["variables"].select {|i| i["event_name"] == params[:var] }[0]["returned"]
26
+
27
+ render json: answer
28
+ end
29
+
13
30
  def status
14
31
  @data = ::Localtower::Status.new.run
15
32
  end
@@ -14,53 +14,67 @@
14
14
  border: 1px solid #cacaca;
15
15
  line-height: 1.2em;
16
16
  overflow:auto;
17
+ max-height: 800px;
18
+ max-width: 800px;
17
19
  -moz-background-clip: padding;
18
20
  -webkit-background-clip: padding-box;
19
21
  background-clip: padding-box;
20
22
  background-color: #FAFAFB;
21
23
  color: #393939;
22
24
  margin: 0px;
23
- max-width: 800px;
24
25
  display: block;
25
26
  }
26
-
27
27
  </style>
28
-
29
-
30
-
31
28
  <% content_for :title do %>Logs<% end %>
32
-
33
29
  <div class="row">
34
30
  <div class="col-md-12">
35
31
  <div class="card">
36
32
  <div class="header">
37
- <h4 class="title"><pre>Localtower::Plugins::Capture.new(self, binding).save</pre></h4>
33
+ <h4 class="title">
34
+ <pre>Localtower::Plugins::Capture.new(self, binding).save</pre>
35
+ </h4>
38
36
  </div>
39
-
40
37
  <div class="content">
41
38
  <table class="table">
42
39
  <thead>
43
- <th>Variable</th>
44
- <th>Value</th>
45
- <th>Value Type</th>
40
+ <th>TYPE</th>
41
+ <th>IN CLASS</th>
42
+ <th>IN METHOD</th>
43
+ <th>VARIABLE</th>
44
+ <th>VALUE</th>
46
45
  </thead>
47
-
48
- <tbody data-selector="tbody">
49
- <% @logs["variables"].each do |item| %>
50
-
51
- <tr data-selector="tr">
52
- <td class="code">
53
- <%= item["name"] %>
54
- </td>
55
-
56
- <td>
57
- <pre class="value json code"><%= Localtower::Plugins::Capture.printable(item["value"]) %></pre>
58
- </td>
59
-
60
- <td>
61
- <pre class="code"><%= item["klass"] %></pre>
62
- </td>
63
- </tr>
46
+ <tbody>
47
+ <% @logs.each do |log| %>
48
+ <% log["variables"].each do |item| %>
49
+ <tr>
50
+ <td>
51
+ <span class="label label-success">
52
+ <%= item["type"] %>
53
+ </span>
54
+ </td>
55
+ <td>
56
+ <span>
57
+ <a class="code" href="subl://open/?url=file://<%= item["meta"]["sublime_path"] %>">
58
+ <%= item["meta"]["from_klass"] %>
59
+ </a>
60
+ </span>
61
+ </td>
62
+ <td>
63
+ <span class="code">
64
+ <%= item["meta"]["from_method"] %>
65
+ </span>
66
+ </td>
67
+ <td>
68
+ <span class="code">
69
+ <%= item["event_name"] %>
70
+ </span>
71
+ </td>
72
+ <td>
73
+ <a href="<%= log_var_path(log["md5"], item["event_name"]) %>">open</a>
74
+ <pre class="value json code"><%= Localtower::Plugins::Capture.printable(item["returned"]) %></pre>
75
+ </td>
76
+ </tr>
77
+ <% end %>
64
78
  <% end %>
65
79
  </tbody>
66
80
  </table>
data/config/routes.rb CHANGED
@@ -13,6 +13,8 @@ Localtower::Engine.routes.draw do
13
13
 
14
14
  get 'dashboard', to: 'pages#dashboard', as: 'dashboard'
15
15
  get 'logs', to: 'pages#logs', as: 'logs'
16
+ get 'logs/:md5', to: 'pages#log', as: 'log'
17
+ get 'logs/:md5/:var', to: 'pages#log_var', as: 'log_var'
16
18
 
17
19
  root :to => redirect('dashboard')
18
20
  end
@@ -2,6 +2,7 @@ module Localtower
2
2
  module Plugins
3
3
  class Capture
4
4
  LOG_FILE = lambda { "#{Rails.root}/log/localtower_capture.log" }
5
+ LOG_PATH = lambda { "#{Rails.root}/log" }
5
6
  EXCLUDE_INSTANCE_VARIABLES = [
6
7
  "@_action_has_layout",
7
8
  "@_routes",
@@ -47,15 +48,14 @@ module Localtower
47
48
  end
48
49
 
49
50
  def logs
50
- if File.exist?(LOG_FILE.call)
51
- content = File.open(LOG_FILE.call).read
52
- else
53
- content = nil
54
- end
51
+ list = []
55
52
 
56
- return {"variables" => []} if not content.present?
53
+ Dir["#{LOG_PATH.call}/localtower_capture_*.json"].each do |file|
54
+ json = JSON.parse(open(file).read)
55
+ list << json
56
+ end
57
57
 
58
- data = JSON.parse(content)
58
+ list
59
59
  end
60
60
 
61
61
  def my_logger
@@ -70,16 +70,24 @@ module Localtower
70
70
  def values
71
71
  hash = {}
72
72
 
73
- a = @context.send(:caller)[1] # xx/xx/app/controllers/clients/events_controller.rb:57:in `new'
73
+ callers = @context.send(:caller)
74
+ a = callers[1] # xx/xx/app/controllers/clients/events_controller.rb:57:in `new'
74
75
  a = a.split(Rails.root.to_s).last # events_controller.rb:57:in `new'
75
76
  a = a.split("\:")
76
77
 
78
+
77
79
  file = a[0].strip
78
80
  line_number = a[1].strip
79
81
  method = a[2].strip.gsub("in \`", "").gsub("\'", "")
80
82
 
83
+ sublime_path = "#{callers[1].split(":")[0]}:#{line_number}"
84
+
81
85
  hash["class"] = self.klass_name
82
- hash["method"] = "#{file}##{method}:#{line_number}"
86
+ hash["file"] = "#{file}##{method}:#{line_number}"
87
+ hash["method"] = method
88
+ hash["md5"] = Digest::MD5.hexdigest(hash["file"])
89
+ hash["type"] = "CAPTURE_METHOD"
90
+ hash["time"] = Time.now.utc.strftime('%Y-%m-%d %H:%M:%S.%L')
83
91
 
84
92
  variables = []
85
93
 
@@ -89,19 +97,28 @@ module Localtower
89
97
  value = @context_binding.local_variable_get(var)
90
98
  klass = self.class.type_of(value)
91
99
 
92
- variables << {
93
- name: var,
94
- value: value,
95
- klass: klass
100
+ data = {
101
+ type: 'CAPTURE',
102
+ time: Time.now.utc.strftime('%Y-%m-%d %H:%M:%S.%L'),
103
+ event_name: var,
104
+ identifier: nil,
105
+ returned: value,
106
+ meta: {
107
+ from_klass: hash["class"],
108
+ from_method: hash["method"],
109
+ klass: klass.to_s,
110
+ method: method.to_s,
111
+ # arguments: data[:arguments],
112
+ callers: callers,
113
+ # table_name: data[:table_name],
114
+ # sql: data[:sql],
115
+ sublime_path: sublime_path,
116
+ file: hash["file"],
117
+ line: line_number
118
+ }
96
119
  }
97
120
 
98
- if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
99
- variables << {
100
- name: "#{var}_count",
101
- value: value.count,
102
- klass: nil
103
- }
104
- end
121
+ variables << data
105
122
  end
106
123
 
107
124
  @context.instance_variables.each do |var|
@@ -110,19 +127,36 @@ module Localtower
110
127
  value = @context.instance_variable_get(var.to_sym)
111
128
  klass = self.class.type_of(value)
112
129
 
113
- variables << {
114
- name: var,
115
- value: value,
116
- klass: klass
130
+ data = {
131
+ type: 'CAPTURE',
132
+ time: Time.now.utc.strftime('%Y-%m-%d %H:%M:%S.%L'),
133
+ event_name: var,
134
+ identifier: nil,
135
+ returned: value,
136
+ meta: {
137
+ from_klass: hash["class"],
138
+ from_method: hash["method"],
139
+ klass: klass.to_s,
140
+ method: method.to_s,
141
+ # arguments: data[:arguments],
142
+ callers: callers,
143
+ # table_name: data[:table_name],
144
+ # sql: data[:sql],
145
+ sublime_path: sublime_path,
146
+ file: hash["file"],
147
+ line: line_number
148
+ }
117
149
  }
118
150
 
119
- if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
120
- variables << {
121
- name: "#{var}_count",
122
- value: value.count,
123
- klass: nil
124
- }
125
- end
151
+ variables << data
152
+
153
+ # if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
154
+ # variables << {
155
+ # name: "#{var}_count",
156
+ # value: value.count,
157
+ # klass: nil
158
+ # }
159
+ # end
126
160
  end
127
161
 
128
162
  hash["variables"] = variables
@@ -140,28 +174,23 @@ module Localtower
140
174
  value.to_s
141
175
  end
142
176
 
143
- # def context_caller
144
- # @context.send(:caller)[0]
145
- # end
177
+ def clear
178
+ Dir["#{LOG_PATH.call}/localtower_capture_*.json"].each do |file|
179
+ File.delete(file)
180
+ end
146
181
 
147
- def init
148
- # Clear the logs
149
- File.open(LOG_FILE.call, 'w') { |f| f.write("{}") }
182
+ self
150
183
  end
151
184
 
152
185
  def save
153
186
  return nil if Rails.env.production?
154
-
155
- self.init
187
+ self.clear
156
188
 
157
189
  data = self.values
158
- data.each do |value|
159
- puts value
160
- end
161
-
162
190
  json = data.to_json
191
+ file = "#{LOG_PATH.call}/localtower_capture_#{data['md5']}.json"
163
192
 
164
- File.open(LOG_FILE.call, 'w') { |f| f.write(json) }
193
+ File.open(file, 'w') { |f| f.write(json) }
165
194
  # log "#{json}\n"
166
195
  end
167
196
 
@@ -1,3 +1,3 @@
1
1
  module Localtower
2
- VERSION = '0.2.3'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: localtower
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damian Le Nouaille
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-04 00:00:00.000000000 Z
11
+ date: 2017-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails