localtower 0.1.9 → 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 +4 -4
- data/README.md +5 -0
- data/app/views/localtower/pages/logs.html.erb +24 -11
- data/lib/localtower/plugins/capture.rb +70 -22
- data/lib/localtower/version.rb +1 -1
- data/public/js/app.js +33 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcfd04482b7b0798e66c863f019e56a6b5af16d2
|
4
|
+
data.tar.gz: c8729e1ed2b16a5a09851e3e5ee828d59137cfc7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b5f5ad3608a85599a661ae92cb2da043039f7b45a49e2943aafea4b2ae6426bd2edc9dfc037e9dcd8fdd8ef4edb16ca9d0c0a094610a3b2d78624c73a6d3545
|
7
|
+
data.tar.gz: d71724de93ea68cd9e5f5a4ffd32f8995664dd7d34897ab8a9131eed797a9d0c976e2e402194ccbac0c8887ae6e6fcc6d278924cc6ba1818185cf7b179ac8a6d
|
data/README.md
CHANGED
@@ -101,3 +101,8 @@ Tests are currently very slow because this is testing rails commands so it boots
|
|
101
101
|
Thanks for reporting issues, I'll do my best.
|
102
102
|
|
103
103
|
[](https://github.com/damln/localtower)
|
104
|
+
|
105
|
+
|
106
|
+
## Deploy
|
107
|
+
|
108
|
+
gem build localtower.gemspec
|
@@ -1,9 +1,18 @@
|
|
1
1
|
<style type="text/css">
|
2
|
+
.string { color: green; }
|
3
|
+
.number { color: darkorange; }
|
4
|
+
.boolean { color: blue; }
|
5
|
+
.null { color: magenta; }
|
6
|
+
.key { color: red; }
|
7
|
+
|
8
|
+
.code {
|
9
|
+
font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
|
10
|
+
}
|
11
|
+
|
2
12
|
.value {
|
13
|
+
padding: 10px;
|
3
14
|
border: 1px solid #cacaca;
|
4
15
|
line-height: 1.2em;
|
5
|
-
font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
|
6
|
-
padding: 10px;
|
7
16
|
overflow:auto;
|
8
17
|
-moz-background-clip: padding;
|
9
18
|
-webkit-background-clip: padding-box;
|
@@ -16,6 +25,9 @@
|
|
16
25
|
}
|
17
26
|
|
18
27
|
</style>
|
28
|
+
|
29
|
+
|
30
|
+
|
19
31
|
<% content_for :title do %>Logs<% end %>
|
20
32
|
|
21
33
|
<div class="row">
|
@@ -26,26 +38,27 @@
|
|
26
38
|
</div>
|
27
39
|
|
28
40
|
<div class="content">
|
29
|
-
<table class="table
|
41
|
+
<table class="table">
|
30
42
|
<thead>
|
31
43
|
<th>Variable</th>
|
32
44
|
<th>Value</th>
|
45
|
+
<th>Value Type</th>
|
33
46
|
</thead>
|
34
47
|
|
35
48
|
<tbody data-selector="tbody">
|
36
|
-
<% @logs.each do |item| %>
|
37
|
-
|
38
|
-
<%
|
39
|
-
variable = item[:variable]
|
40
|
-
value = item[:value]
|
41
|
-
%>
|
49
|
+
<% @logs["variables"].each do |item| %>
|
42
50
|
|
43
51
|
<tr data-selector="tr">
|
52
|
+
<td class="code">
|
53
|
+
<%= item["name"] %>
|
54
|
+
</td>
|
55
|
+
|
44
56
|
<td>
|
45
|
-
|
57
|
+
<pre class="value json code"><%= Localtower::Plugins::Capture.printable(item["value"]) %></pre>
|
46
58
|
</td>
|
59
|
+
|
47
60
|
<td>
|
48
|
-
|
61
|
+
<pre class="code"><%= item["klass"] %></pre>
|
49
62
|
</td>
|
50
63
|
</tr>
|
51
64
|
<% end %>
|
@@ -18,6 +18,29 @@ module Localtower
|
|
18
18
|
"@_response_body",
|
19
19
|
]
|
20
20
|
|
21
|
+
class << self
|
22
|
+
def printable(content)
|
23
|
+
if content.respond_to?(:to_json)
|
24
|
+
# content.to_json
|
25
|
+
JSON.pretty_generate(content)
|
26
|
+
else
|
27
|
+
content.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def type_of(value)
|
32
|
+
if value.instance_of?(Float); return Float.to_s; end;
|
33
|
+
if value.instance_of?(Integer); return Integer.to_s; end;
|
34
|
+
if value.instance_of?(String); return String.to_s; end;
|
35
|
+
if value.instance_of?(Array); return Array.to_s; end;
|
36
|
+
if value.instance_of?(Hash); return Hash.to_s; end;
|
37
|
+
if value.instance_of?(ApplicationController); return ApplicationController.to_s; end;
|
38
|
+
if value.instance_of?(NilClass); return NilClass.to_s; end;
|
39
|
+
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
21
44
|
def initialize(context = nil, context_binding = nil)
|
22
45
|
@context = context
|
23
46
|
@context_binding = context_binding
|
@@ -25,27 +48,15 @@ module Localtower
|
|
25
48
|
|
26
49
|
def logs
|
27
50
|
content = File.open(LOG_FILE).read
|
28
|
-
return [] unless content.present?
|
51
|
+
return {"variables" => []} unless content.present?
|
29
52
|
|
30
53
|
data = JSON.parse(content)
|
31
|
-
|
32
|
-
data.map do |key, value|
|
33
|
-
if value.respond_to?(:to_json)
|
34
|
-
value = JSON.pretty_generate(value)
|
35
|
-
end
|
36
|
-
|
37
|
-
{
|
38
|
-
variable: key,
|
39
|
-
value: value,
|
40
|
-
}
|
41
|
-
end
|
42
54
|
end
|
43
55
|
|
44
56
|
def my_logger
|
45
57
|
@@my_logger ||= Logger.new(LOG_FILE)
|
46
58
|
@@my_logger.formatter = proc do |severity, datetime, progname, msg|
|
47
59
|
"#{msg}\n"
|
48
|
-
# "[#{datetime}] | #{msg}\n"
|
49
60
|
end
|
50
61
|
|
51
62
|
@@my_logger
|
@@ -54,37 +65,74 @@ module Localtower
|
|
54
65
|
def values
|
55
66
|
hash = {}
|
56
67
|
|
68
|
+
a = @context.send(:caller)[1] # xx/xx/app/controllers/clients/events_controller.rb:57:in `new'
|
69
|
+
a = a.split(Rails.root.to_s).last # events_controller.rb:57:in `new'
|
70
|
+
a = a.split("\:")
|
71
|
+
|
72
|
+
file = a[0].strip
|
73
|
+
line_number = a[1].strip
|
74
|
+
method = a[2].strip.gsub("in \`", "").gsub("\'", "")
|
75
|
+
|
76
|
+
hash["class"] = self.klass_name
|
77
|
+
hash["method"] = "#{file}##{method}:#{line_number}"
|
78
|
+
|
79
|
+
variables = []
|
80
|
+
|
57
81
|
@context_binding.local_variables.each do |var|
|
58
82
|
next if EXCLUDE_INSTANCE_VARIABLES.include?(var.to_s)
|
59
|
-
hash[var] = @context_binding.local_variable_get(var)
|
60
83
|
|
61
|
-
|
62
|
-
|
84
|
+
value = @context_binding.local_variable_get(var)
|
85
|
+
klass = self.class.type_of(value)
|
86
|
+
|
87
|
+
variables << {
|
88
|
+
name: var,
|
89
|
+
value: value,
|
90
|
+
klass: klass
|
91
|
+
}
|
92
|
+
|
93
|
+
if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
|
94
|
+
variables << {
|
95
|
+
name: "#{var}_count",
|
96
|
+
value: value.count,
|
97
|
+
klass: nil
|
98
|
+
}
|
63
99
|
end
|
64
100
|
end
|
65
101
|
|
66
102
|
@context.instance_variables.each do |var|
|
67
103
|
next if EXCLUDE_INSTANCE_VARIABLES.include?(var.to_s)
|
68
104
|
|
69
|
-
|
70
|
-
|
105
|
+
value = @context.instance_variable_get(var.to_sym)
|
106
|
+
klass = self.class.type_of(value)
|
71
107
|
|
72
|
-
|
108
|
+
variables << {
|
109
|
+
name: var,
|
110
|
+
value: value,
|
111
|
+
klass: klass
|
112
|
+
}
|
73
113
|
|
74
|
-
if
|
75
|
-
|
114
|
+
if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
|
115
|
+
variables << {
|
116
|
+
name: "#{var}_count",
|
117
|
+
value: value.count,
|
118
|
+
klass: nil
|
119
|
+
}
|
76
120
|
end
|
77
121
|
end
|
78
122
|
|
123
|
+
hash["variables"] = variables
|
124
|
+
|
79
125
|
hash
|
80
126
|
end
|
81
127
|
|
82
128
|
def klass_name
|
83
|
-
if @context.class == "Class"
|
129
|
+
value = if @context.class == "Class"
|
84
130
|
@context
|
85
131
|
else
|
86
132
|
@context.class
|
87
133
|
end
|
134
|
+
|
135
|
+
value.to_s
|
88
136
|
end
|
89
137
|
|
90
138
|
# def context_caller
|
data/lib/localtower/version.rb
CHANGED
data/public/js/app.js
CHANGED
@@ -2,10 +2,16 @@ window.MainApp = {};
|
|
2
2
|
|
3
3
|
MainApp = {
|
4
4
|
init: function() {
|
5
|
-
|
6
5
|
},
|
7
6
|
|
8
7
|
ready: function() {
|
8
|
+
|
9
|
+
$(".json").each(function() {
|
10
|
+
var $el = $(this);
|
11
|
+
var done = MainApp.syntaxHighlight($el.text());
|
12
|
+
$el.html(done);
|
13
|
+
});
|
14
|
+
|
9
15
|
MainApp.whenActionOnElement("click", "duplicate", function(e) {
|
10
16
|
e.preventDefault();
|
11
17
|
MainApp.duplicateLine();
|
@@ -41,7 +47,28 @@ MainApp = {
|
|
41
47
|
});
|
42
48
|
},
|
43
49
|
|
44
|
-
// INSTANCE
|
50
|
+
// INSTANCE --------------------------------------------------
|
51
|
+
|
52
|
+
syntaxHighlight: function(json) {
|
53
|
+
json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
54
|
+
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function(match) {
|
55
|
+
var cls = 'number';
|
56
|
+
if (/^"/.test(match)) {
|
57
|
+
if (/:$/.test(match)) {
|
58
|
+
cls = 'key';
|
59
|
+
} else {
|
60
|
+
cls = 'string';
|
61
|
+
}
|
62
|
+
} else if (/true|false/.test(match)) {
|
63
|
+
cls = 'boolean';
|
64
|
+
} else if (/null/.test(match)) {
|
65
|
+
cls = 'null';
|
66
|
+
}
|
67
|
+
return '<span class="' + cls + '">' + match + '</span>';
|
68
|
+
});
|
69
|
+
},
|
70
|
+
|
71
|
+
|
45
72
|
|
46
73
|
// This is a little bit dirty but it works well for the moment:
|
47
74
|
// We dynamically show/hide fields
|
@@ -95,9 +122,10 @@ MainApp = {
|
|
95
122
|
|
96
123
|
nullable_input,
|
97
124
|
nullable_label,
|
98
|
-
],
|
99
|
-
el
|
100
|
-
|
125
|
+
],
|
126
|
+
function(i, el) {
|
127
|
+
el.hide();
|
128
|
+
});
|
101
129
|
|
102
130
|
var mapping = {
|
103
131
|
add_column: [
|