rails_dt 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.html +171 -0
- data/README.md +78 -15
- data/VERSION.yml +2 -1
- data/generators/rails_dt/USAGE +11 -0
- data/generators/rails_dt/WARNING +2 -0
- data/generators/rails_dt/rails_dt_generator.rb +1 -2
- data/generators/rails_dt/templates/INSTALL +6 -9
- data/generators/rails_dt/templates/{stylesheets/dt.css → dt.css} +0 -0
- data/generators/rails_dt/templates/{initializers/dt.rb → dt.rb} +2 -2
- data/lib/dt.rb +155 -118
- data/lib/dt/action_controller_extensions.rb +4 -3
- data/lib/generators/rails_dt/USAGE +11 -0
- data/lib/generators/rails_dt/rails_dt_generator.rb +9 -0
- data/lib/generators/rails_dt/templates/INSTALL +20 -0
- data/lib/generators/rails_dt/templates/dt.css +27 -0
- data/lib/generators/rails_dt/templates/dt.rb +4 -0
- data/rails_dt.gemspec +26 -18
- metadata +19 -9
data/README.html
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
<head>
|
2
|
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
3
|
+
<link href="dev/github.css" rel="stylesheet" type="text/css" />
|
4
|
+
</head>
|
5
|
+
<h1 id="rails-debug-toolkit">Rails Debug Toolkit</h1>
|
6
|
+
|
7
|
+
<h2 id="introduction">Introduction</h2>
|
8
|
+
|
9
|
+
<p><code>rails_dt</code> gem gives you <code>DT.p()</code> method you can use anywhere in your project to print your debug messages.</p>
|
10
|
+
|
11
|
+
<p>It’s somewhat similar to Ruby’s native <code>p()</code> with output being sent to log, console and web.</p>
|
12
|
+
|
13
|
+
<p>For example, <code>DT.p "hello, world!"</code> invoked in <code>RootController</code> will give you a:</p>
|
14
|
+
|
15
|
+
<pre><code>[DT app/controllers/root_controller.rb:3] hello, world!
|
16
|
+
</code></pre>
|
17
|
+
|
18
|
+
<h2 id="the-ideas-behind-it">The Ideas Behind It</h2>
|
19
|
+
|
20
|
+
<ul>
|
21
|
+
<li>Debug message printer must <strong>not require initialization</strong>.</li>
|
22
|
+
<li>Debug message printer must be <strong>nothing else</strong>, but a debug message printer.</li>
|
23
|
+
<li>Debug message printer must be simple and invoked <strong>always the same way</strong> regardless of where you call it from.</li>
|
24
|
+
<li>Debug message printer calls must be <strong>clearly visible</strong> in the code.</li>
|
25
|
+
<li>Debug message printer must <strong>print its location in code</strong> so you can find and modify/remove it as easy as possible.</li>
|
26
|
+
</ul>
|
27
|
+
|
28
|
+
<h2 id="express-setup-rails-3">Express Setup (Rails 3)</h2>
|
29
|
+
|
30
|
+
<p>In your <code>Gemfile</code>, add:</p>
|
31
|
+
|
32
|
+
<pre><code>gem "rails_dt"
|
33
|
+
</code></pre>
|
34
|
+
|
35
|
+
<p>Then do a <code>bundle install</code>.</p>
|
36
|
+
|
37
|
+
<p>This gives you an express (zero-conf) setup, which outputs messages to log, <code>log/dt.log</code> and console.</p>
|
38
|
+
|
39
|
+
<h2 id="express-setup-rails-2">Express Setup (Rails 2)</h2>
|
40
|
+
|
41
|
+
<pre><code>$ gem sources --add http://rubygems.org
|
42
|
+
$ gem install rails_dt
|
43
|
+
</code></pre>
|
44
|
+
|
45
|
+
<p>In your <code>config/environment.rb</code>, add:</p>
|
46
|
+
|
47
|
+
<pre><code>config.gem "rails_dt"
|
48
|
+
</code></pre>
|
49
|
+
|
50
|
+
<h2 id="setting-up-web-output-both-rails-3-and-rails-2">Setting Up Web Output (Both Rails 3 and Rails 2)</h2>
|
51
|
+
|
52
|
+
<p>In your application root, do a:</p>
|
53
|
+
|
54
|
+
<pre><code>$ rails generate rails_dt # Rails 3
|
55
|
+
$ script/generate rails_dt # Rails 2
|
56
|
+
</code></pre>
|
57
|
+
|
58
|
+
<p>Follow the instructions the generator gives you then. They are listed below.</p>
|
59
|
+
|
60
|
+
<p>Inside your <code>ApplicationController</code> class, add:</p>
|
61
|
+
|
62
|
+
<pre><code>handles_dt
|
63
|
+
</code></pre>
|
64
|
+
|
65
|
+
<p>Inside your <code>app/views/layouts/application.html.erb</code> <code><head></code> section, add:</p>
|
66
|
+
|
67
|
+
<pre><code><%= stylesheet_link_tag "dt" %>
|
68
|
+
</code></pre>
|
69
|
+
|
70
|
+
<p>Inside your <code>app/views/layouts/application.html.erb</code> <code><body></code> section, add:</p>
|
71
|
+
|
72
|
+
<pre><code><div class="DT">
|
73
|
+
<%= DT.web_messages_as_html %>
|
74
|
+
</div>
|
75
|
+
</code></pre>
|
76
|
+
|
77
|
+
<h2 id="checking-setup">Checking Setup</h2>
|
78
|
+
|
79
|
+
<p>Somewhere in your <code>app/views/layouts/application.html.erb</code>, add:</p>
|
80
|
+
|
81
|
+
<pre><code><% DT.p "hello, world!" %>
|
82
|
+
</code></pre>
|
83
|
+
|
84
|
+
<p>Refresh the page. You should see “hello, world!”:</p>
|
85
|
+
|
86
|
+
<ul>
|
87
|
+
<li>In your application log.</li>
|
88
|
+
<li>In <code>log/dt.log</code>.</li>
|
89
|
+
<li>On the web page, if you’ve set it up (see above).</li>
|
90
|
+
</ul>
|
91
|
+
|
92
|
+
<h2 id="debugging">Debugging…</h2>
|
93
|
+
|
94
|
+
<h3 id="models">…Models</h3>
|
95
|
+
|
96
|
+
<pre><code>def before_save
|
97
|
+
DT.p "in before_save"
|
98
|
+
end
|
99
|
+
</code></pre>
|
100
|
+
|
101
|
+
<h3 id="controllers">…Controllers</h3>
|
102
|
+
|
103
|
+
<pre><code>def action
|
104
|
+
DT.p "hi, I'm #{action_name}"
|
105
|
+
end
|
106
|
+
</code></pre>
|
107
|
+
|
108
|
+
<h3 id="views">…Views</h3>
|
109
|
+
|
110
|
+
<pre><code><div class="body">
|
111
|
+
<% DT.p "@users", @users %>
|
112
|
+
</div>
|
113
|
+
</code></pre>
|
114
|
+
|
115
|
+
<h3 id="filters">…Filters</h3>
|
116
|
+
|
117
|
+
<p>Insert debugging code:</p>
|
118
|
+
|
119
|
+
<pre><code>before_filter do
|
120
|
+
DT.p "in before_filter xyz"
|
121
|
+
end
|
122
|
+
|
123
|
+
after_filter do
|
124
|
+
DT.p "in after_filter xyz"
|
125
|
+
end
|
126
|
+
</code></pre>
|
127
|
+
|
128
|
+
<p>See it in action:</p>
|
129
|
+
|
130
|
+
<pre><code>$ tail -f log/dt.log
|
131
|
+
</code></pre>
|
132
|
+
|
133
|
+
<h3 id="anything">…Anything!</h3>
|
134
|
+
|
135
|
+
<p>Just use <code>DT.p</code> anywhere you want.</p>
|
136
|
+
|
137
|
+
<h2 id="customizing-output-format">Customizing Output Format</h2>
|
138
|
+
|
139
|
+
<p>Create a sample initializer, by doing a:</p>
|
140
|
+
|
141
|
+
<pre><code>$ rails generate rails_dt # Rails 3
|
142
|
+
$ script/generate rails_dt # Rails 2
|
143
|
+
</code></pre>
|
144
|
+
|
145
|
+
<p>In <code>config/initializers/dt.rb</code> you’ll see something like:</p>
|
146
|
+
|
147
|
+
<pre><code># Customize your DT output.
|
148
|
+
#DT.log_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
149
|
+
#DT.console_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
150
|
+
#DT.web_prefix = '<a href="txmt://open?url=file://<%= file %>&line=<%= line %>"><%= file_rel %>:<%= line %></a> '
|
151
|
+
</code></pre>
|
152
|
+
|
153
|
+
<p>Uncomment and edit lines appropriately. Restart server for changes to take effect.</p>
|
154
|
+
|
155
|
+
<p>Values are in ERB format. The following macros are available:</p>
|
156
|
+
|
157
|
+
<ul>
|
158
|
+
<li><code>file</code> – full path to file.</li>
|
159
|
+
<li><code>file_base</code> – file base name.</li>
|
160
|
+
<li><code>file_rel</code> – file name relative to Rails application root.</li>
|
161
|
+
<li><code>line</code> – line number.</li>
|
162
|
+
</ul>
|
163
|
+
|
164
|
+
<p>You can also disable particular output target by setting its prefix to <code>nil</code>:</p>
|
165
|
+
|
166
|
+
<pre><code>DT.console_prefix = nil # Disable console output.
|
167
|
+
</code></pre>
|
168
|
+
|
169
|
+
<h2 id="feedback">Feedback</h2>
|
170
|
+
|
171
|
+
<p>Send bug reports, suggestions and criticisms through <a href="http://github.com/dadooda/rails_dt">project’s page on GitHub</a>.</p>
|
data/README.md
CHANGED
@@ -4,39 +4,70 @@ Rails Debug Toolkit
|
|
4
4
|
Introduction
|
5
5
|
------------
|
6
6
|
|
7
|
-
`rails_dt` gem gives you `DT.p()` method you can use anywhere in your project to print
|
7
|
+
`rails_dt` gem gives you `DT.p()` method you can use anywhere in your project to print your debug messages.
|
8
8
|
|
9
|
-
It's similar to Ruby's native `p()` with output being sent to
|
9
|
+
It's somewhat similar to Ruby's native `p()` with output being sent to log, console and web.
|
10
10
|
|
11
|
+
For example, `DT.p "Hello, world!"` invoked in `RootController` will give you a:
|
11
12
|
|
12
|
-
|
13
|
-
-----
|
13
|
+
[DT app/controllers/root_controller.rb:3] Hello, world!
|
14
14
|
|
15
|
-
$ gem sources --add http://rubygems.org
|
16
|
-
$ gem install rails_dt
|
17
15
|
|
18
|
-
|
16
|
+
The Ideas Behind It
|
17
|
+
-------------------
|
18
|
+
|
19
|
+
* Debug message printer must **not require initialization**.
|
20
|
+
* Debug message printer must be **nothing else**, but a debug message printer.
|
21
|
+
* Debug message printer must be simple and invoked **always the same way** regardless of where you call it from.
|
22
|
+
* Debug message printer calls must be **clearly visible** in the code.
|
23
|
+
* Debug message printer must **print its location in code** so you can find and modify/remove it as easy as possible.
|
24
|
+
|
25
|
+
|
26
|
+
Express Setup (Rails 3)
|
27
|
+
-----------------------
|
28
|
+
|
29
|
+
In your `Gemfile`, add:
|
30
|
+
|
31
|
+
gem "rails_dt"
|
19
32
|
|
20
|
-
|
33
|
+
Then do a `bundle install`.
|
21
34
|
|
22
|
-
|
35
|
+
This gives you an express (zero-conf) setup, which outputs messages to log, `log/dt.log` and console.
|
36
|
+
|
37
|
+
|
38
|
+
Express Setup (Rails 2)
|
39
|
+
-----------------------
|
40
|
+
|
41
|
+
$ gem sources --add http://rubygems.org
|
42
|
+
$ gem install rails_dt
|
23
43
|
|
24
44
|
In your `config/environment.rb`, add:
|
25
45
|
|
26
46
|
config.gem "rails_dt"
|
27
47
|
|
48
|
+
|
49
|
+
Setting Up Web Output (Both Rails 3 and Rails 2)
|
50
|
+
------------------------------------------------
|
51
|
+
|
52
|
+
In your application root, do a:
|
53
|
+
|
54
|
+
$ rails generate rails_dt # Rails 3
|
55
|
+
$ script/generate rails_dt # Rails 2
|
56
|
+
|
57
|
+
Follow the instructions the generator gives you then. They are listed below.
|
58
|
+
|
28
59
|
Inside your `ApplicationController` class, add:
|
29
60
|
|
30
61
|
handles_dt
|
31
62
|
|
32
|
-
|
63
|
+
Inside your `app/views/layouts/application.html.erb` `<head>` section, add:
|
33
64
|
|
34
65
|
<%= stylesheet_link_tag "dt" %>
|
35
66
|
|
36
|
-
|
67
|
+
Inside your `app/views/layouts/application.html.erb` `<body>` section, add:
|
37
68
|
|
38
69
|
<div class="DT">
|
39
|
-
<%= DT.
|
70
|
+
<%= DT.web_messages_as_html %>
|
40
71
|
</div>
|
41
72
|
|
42
73
|
|
@@ -45,9 +76,13 @@ Checking Setup
|
|
45
76
|
|
46
77
|
Somewhere in your `app/views/layouts/application.html.erb`, add:
|
47
78
|
|
48
|
-
<% DT.p "hello, world" %>
|
79
|
+
<% DT.p "hello, world!" %>
|
49
80
|
|
50
|
-
Refresh
|
81
|
+
Refresh the page. You should see "hello, world!":
|
82
|
+
|
83
|
+
* In your application log.
|
84
|
+
* In `log/dt.log`.
|
85
|
+
* On the web page, if you've set it up (see above).
|
51
86
|
|
52
87
|
|
53
88
|
Debugging...
|
@@ -89,8 +124,36 @@ See it in action:
|
|
89
124
|
|
90
125
|
### ...Anything! ###
|
91
126
|
|
92
|
-
|
127
|
+
Just use `DT.p` anywhere you want.
|
128
|
+
|
129
|
+
|
130
|
+
Customizing Output Format
|
131
|
+
-------------------------
|
132
|
+
|
133
|
+
Create a sample initializer, by doing a:
|
134
|
+
|
135
|
+
$ rails generate rails_dt # Rails 3
|
136
|
+
$ script/generate rails_dt # Rails 2
|
137
|
+
|
138
|
+
In `config/initializers/dt.rb` you'll see something like:
|
139
|
+
|
140
|
+
# Customize your DT output.
|
141
|
+
#DT.log_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
142
|
+
#DT.console_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
143
|
+
#DT.web_prefix = '<a href="txmt://open?url=file://<%= file %>&line=<%= line %>"><%= file_rel %>:<%= line %></a> '
|
144
|
+
|
145
|
+
Uncomment and edit lines appropriately. Restart server for changes to take effect.
|
146
|
+
|
147
|
+
Values are in ERB format. The following macros are available:
|
148
|
+
|
149
|
+
* `file` -- full path to file.
|
150
|
+
* `file_base` -- file base name.
|
151
|
+
* `file_rel` -- file name relative to Rails application root.
|
152
|
+
* `line` -- line number.
|
153
|
+
|
154
|
+
You can also disable particular output target by setting its prefix to `nil`:
|
93
155
|
|
156
|
+
DT.console_prefix = nil # Disable console output.
|
94
157
|
|
95
158
|
|
96
159
|
Feedback
|
data/VERSION.yml
CHANGED
@@ -1,23 +1,20 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
In your `config/environment.rb`, add:
|
6
|
-
|
7
|
-
config.gem "rails_dt"
|
2
|
+
Setting Up Web Output
|
3
|
+
=====================
|
8
4
|
|
9
5
|
Inside your `ApplicationController` class, add:
|
10
6
|
|
11
7
|
handles_dt
|
12
8
|
|
13
|
-
|
9
|
+
Inside your `app/views/layouts/application.html.erb` `<head>` section, add:
|
14
10
|
|
15
11
|
<%= stylesheet_link_tag "dt" %>
|
16
12
|
|
17
|
-
|
13
|
+
Inside your `app/views/layouts/application.html.erb` `<body>` section, add:
|
18
14
|
|
19
15
|
<div class="DT">
|
20
|
-
<%= DT.
|
16
|
+
<%= DT.web_messages_as_html %>
|
21
17
|
</div>
|
22
18
|
|
23
19
|
Happy debugging!
|
20
|
+
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
1
|
# Customize your DT output.
|
2
|
-
#DT.
|
2
|
+
#DT.log_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
3
3
|
#DT.console_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
4
|
-
#DT.
|
4
|
+
#DT.web_prefix = '<a href="txmt://open?url=file://<%= file %>&line=<%= line %>"><%= file_rel %>:<%= line %></a> '
|
data/lib/dt.rb
CHANGED
@@ -5,147 +5,206 @@ Dir[File.join(File.dirname(__FILE__), "dt/**/*.rb")].each {|fn| require fn}
|
|
5
5
|
|
6
6
|
# Debug toolkit.
|
7
7
|
#
|
8
|
-
# Allows to
|
8
|
+
# Allows to print debug messages from anywhere in your Rails project. Do a:
|
9
9
|
#
|
10
|
-
#
|
11
|
-
# $ script/generate rails_dt
|
10
|
+
# DT.p "Hello, world!"
|
12
11
|
#
|
13
|
-
#
|
12
|
+
# , and see the message in log, <tt>log/dt.log</tt>, console and web.
|
14
13
|
#
|
15
|
-
#
|
16
|
-
# DT.p "Hello, world!"
|
17
|
-
# DT.p "myvar", myvar
|
14
|
+
# To set up web output, in your application root do a:
|
18
15
|
#
|
19
|
-
#
|
16
|
+
# $ rails generate rails_dt # Rails 3
|
17
|
+
# $ script/generate rails_dt # Rails 2
|
18
|
+
#
|
19
|
+
# Follow the instructions the generator gives you then.
|
20
20
|
module DT #:doc:
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
# Maximum number of stored messages, if they're not cleared.
|
22
|
+
# If web output is configured, messages are cleared before every request.
|
23
|
+
MAX_WEB_MESSAGES = 100
|
24
|
+
|
25
|
+
# Initializer.
|
26
|
+
def self._initialize #:nodoc:
|
27
|
+
clear_web_messages
|
28
|
+
|
29
|
+
# NOTES:
|
30
|
+
# * Stuffing is inserted in order to work around buggy RDoc parser.
|
31
|
+
# "a""bc" => "abc", just in case.
|
32
|
+
# * Don't forget to update generator/initializers/dt.rb with these.
|
33
|
+
# * "Canonical" order of imporance: log, console, web.
|
34
|
+
@log_prefix = "[DT <""%= file_rel %>:<""%= line %>] "
|
35
|
+
@console_prefix = @log_prefix.dup
|
36
|
+
@web_prefix = '<a href="txmt://open?url=file://<''%= file %>&line=<''%= line %>"><''%= file_rel %>:<''%= line %></a> '
|
27
37
|
|
28
|
-
|
29
|
-
|
30
|
-
@messages
|
38
|
+
# In case of path problems @log will be nil.
|
39
|
+
@log = Logger.new(Rails.root + "log/dt.log") rescue nil
|
31
40
|
end
|
32
41
|
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
# NOTE: May be lacking file information, e.g. when in an irb session.
|
39
|
-
file, line = caller.first.split(":")
|
40
|
-
|
41
|
-
# Template variables. Documented in web_prefix=.
|
42
|
-
hc = {
|
43
|
-
:file => file,
|
44
|
-
:line => line,
|
45
|
-
:file_base => (begin; File.basename(file); rescue; file; end),
|
46
|
-
:file_rel => (begin; Pathname(file).relative_path_from(Rails.root).to_s; rescue; file; end),
|
47
|
-
}
|
48
|
-
|
49
|
-
##return hc
|
50
|
-
|
51
|
-
args.each do |r|
|
52
|
-
s = r.is_a?(String) ? r : r.inspect
|
53
|
-
|
54
|
-
# NOTE: "Canonical" order of imporance: web, console, log.
|
55
|
-
|
56
|
-
# To Web.
|
57
|
-
if self.web_prefix
|
58
|
-
pfx = ERB.new(self.web_prefix, nil, "-").result(_hash_kbinding(hc))
|
59
|
-
|
60
|
-
pcs = []
|
61
|
-
pcs << pfx
|
62
|
-
pcs << CGI.escapeHTML(s).gsub("\n", "<br/>\n")
|
63
|
-
pcs << "<br/>\n"
|
64
|
-
@messages << pcs.join
|
65
|
-
end
|
66
|
-
|
67
|
-
# To console.
|
68
|
-
if self.console_prefix
|
69
|
-
pfx = ERB.new(self.console_prefix, nil, "-").result(_hash_kbinding(hc))
|
70
|
-
puts [pfx, s].join
|
71
|
-
end
|
72
|
-
|
73
|
-
# To log.
|
74
|
-
if self.log_prefix and @log
|
75
|
-
pfx = ERB.new(self.log_prefix, nil, "-").result(_hash_kbinding(hc))
|
76
|
-
@log.info [pfx, s].join
|
42
|
+
# On-the-fly initializer.
|
43
|
+
def self._otf_init #:nodoc:
|
44
|
+
# Consider job done, replace self with a blank.
|
45
|
+
class_eval {
|
46
|
+
def self._otf_init #:nodoc:
|
77
47
|
end
|
78
|
-
|
79
|
-
|
80
|
-
# Be like puts -- more comfy when debugging in console.
|
81
|
-
nil
|
82
|
-
end
|
83
|
-
|
84
|
-
# Format accumulated messages as HTML.
|
85
|
-
# to_html # => Something like "<ul><li>A message!</li></ul>".
|
86
|
-
def self.to_html
|
87
|
-
pcs = []
|
88
|
-
pcs << "<ul>"
|
89
|
-
@messages.each do |s|
|
90
|
-
pcs << ["<li>", s, "</li>"].join
|
91
|
-
end
|
92
|
-
pcs << "</ul>"
|
48
|
+
}
|
93
49
|
|
94
|
-
|
50
|
+
_initialize
|
95
51
|
end
|
96
52
|
|
97
|
-
|
98
|
-
|
99
|
-
# Set message prefix for console. See <tt>web_prefix=</tt>.
|
53
|
+
# Set message prefix for console. See <tt>log_prefix=</tt>.
|
100
54
|
def self.console_prefix=(s)
|
55
|
+
_otf_init
|
101
56
|
@console_prefix = s
|
102
57
|
end
|
103
58
|
|
104
59
|
def self.console_prefix
|
60
|
+
_otf_init
|
105
61
|
@console_prefix
|
106
62
|
end
|
107
63
|
|
108
64
|
# Set logger to use. Must be a <tt>Logger</tt>.
|
65
|
+
#
|
109
66
|
# log = Logger.new("log/my.log")
|
110
67
|
def self.log=(obj)
|
68
|
+
_otf_init
|
111
69
|
raise "Logger expected, #{obj.class} given" if not obj.is_a? Logger
|
112
70
|
@log = obj
|
113
71
|
end
|
114
72
|
|
115
73
|
def self.log
|
74
|
+
_otf_init
|
116
75
|
@log
|
117
76
|
end
|
118
77
|
|
119
|
-
# Set message prefix for log.
|
78
|
+
# Set message prefix for log. Syntax is ERB.
|
79
|
+
#
|
80
|
+
# log_prefix = "[DT <""%= file_rel %>:<""%= line %>] "
|
81
|
+
#
|
82
|
+
# NOTE: In the above example some stuffing was made to satisfy the buggy RDoc parser.
|
83
|
+
# Just in case, <tt>"a""bc"</tt> is <tt>"abc"</tt> in Ruby.
|
84
|
+
#
|
85
|
+
# Template variables:
|
86
|
+
#
|
87
|
+
# * <tt>file</tt> -- full path to file.
|
88
|
+
# * <tt>file_base</tt> -- file base name.
|
89
|
+
# * <tt>file_rel</tt> -- file name relative to Rails application root.
|
90
|
+
# * <tt>line</tt> -- line number.
|
91
|
+
#
|
92
|
+
# By setting prefix to <tt>nil</tt> you disable respective output.
|
93
|
+
#
|
94
|
+
# web_prefix = nil # Disable web output.
|
120
95
|
def self.log_prefix=(s)
|
96
|
+
_otf_init
|
121
97
|
@log_prefix = s
|
122
98
|
end
|
123
99
|
|
124
100
|
def self.log_prefix
|
101
|
+
_otf_init
|
125
102
|
@log_prefix
|
126
103
|
end
|
127
104
|
|
128
|
-
#
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
#
|
135
|
-
# * <tt>file_rel</tt> -- file name relative to Rails application root
|
136
|
-
#
|
137
|
-
# By setting prefix to <tt>nil</tt> you disable respective output.
|
138
|
-
# web_prefix = nil # Web output is disabled now.
|
105
|
+
# Return messages accumulated since last cleared.
|
106
|
+
def self.web_messages
|
107
|
+
_otf_init
|
108
|
+
@web_messages
|
109
|
+
end
|
110
|
+
|
111
|
+
# Set message prefix for web. See <tt>log_prefix=</tt>.
|
139
112
|
def self.web_prefix=(s)
|
113
|
+
_otf_init
|
140
114
|
@web_prefix = s
|
141
115
|
end
|
142
116
|
|
143
117
|
def self.web_prefix
|
118
|
+
_otf_init
|
144
119
|
@web_prefix
|
145
120
|
end
|
146
121
|
|
147
122
|
#---------------------------------------
|
148
123
|
|
124
|
+
# Clear messages.
|
125
|
+
def self.clear_web_messages
|
126
|
+
_otf_init
|
127
|
+
@web_messages = []
|
128
|
+
end
|
129
|
+
|
130
|
+
# Print a debug message or dump a value. Somewhat similar to Ruby's native <tt>p</tt>.
|
131
|
+
#
|
132
|
+
# p "Hello, world!"
|
133
|
+
# p "myvar", myvar
|
134
|
+
def self.p(*args)
|
135
|
+
_otf_init
|
136
|
+
# Fetch caller information.
|
137
|
+
# NOTE: May be lacking file information, e.g. when in an irb session.
|
138
|
+
file, line = caller.first.split(":")
|
139
|
+
|
140
|
+
# Assign template variables.
|
141
|
+
hc = {
|
142
|
+
:file => file,
|
143
|
+
:line => line,
|
144
|
+
:file_base => (begin; File.basename(file); rescue; file; end),
|
145
|
+
:file_rel => (begin; Pathname(file).relative_path_from(Rails.root).to_s; rescue; file; end),
|
146
|
+
}
|
147
|
+
|
148
|
+
args.each do |r|
|
149
|
+
s = r.is_a?(String) ? r : r.inspect
|
150
|
+
|
151
|
+
# To log.
|
152
|
+
if @log_prefix
|
153
|
+
##Kernel.p "@log", @log #DEBUG
|
154
|
+
if @log
|
155
|
+
pfx = ERB.new(@log_prefix, nil, "-").result(_hash_kbinding(hc))
|
156
|
+
msg = [pfx, s].join
|
157
|
+
@log.info msg
|
158
|
+
Rails.logger.info msg rescue nil # In case something's wrong with `Rails.logger`.
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# To console.
|
163
|
+
if @console_prefix
|
164
|
+
pfx = ERB.new(@console_prefix, nil, "-").result(_hash_kbinding(hc))
|
165
|
+
puts [pfx, s].join
|
166
|
+
end
|
167
|
+
|
168
|
+
# To web.
|
169
|
+
if @web_prefix
|
170
|
+
pfx = ERB.new(@web_prefix, nil, "-").result(_hash_kbinding(hc))
|
171
|
+
|
172
|
+
pcs = []
|
173
|
+
pcs << pfx
|
174
|
+
pcs << CGI.escapeHTML(s).gsub("\n", "<br/>\n")
|
175
|
+
@web_messages << pcs.join
|
176
|
+
|
177
|
+
# Rotate messages.
|
178
|
+
@web_messages.slice!(0..-(MAX_WEB_MESSAGES + 1))
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Be like `puts`, return nil.
|
183
|
+
nil
|
184
|
+
end
|
185
|
+
|
186
|
+
# Format accumulated web messages as HTML. Usually called from a view template.
|
187
|
+
#
|
188
|
+
# web_messages_as_html # => Something like "<ul><li>Message 1</li><li>Message 2</li>...</ul>".
|
189
|
+
def self.web_messages_as_html
|
190
|
+
_otf_init
|
191
|
+
|
192
|
+
pcs = []
|
193
|
+
pcs << "<ul>"
|
194
|
+
@web_messages.each do |s|
|
195
|
+
pcs << ["<li>", s, "</li>"].join
|
196
|
+
end
|
197
|
+
pcs << "</ul>"
|
198
|
+
|
199
|
+
if (out = pcs.join).respond_to? :html_safe
|
200
|
+
out.html_safe
|
201
|
+
else
|
202
|
+
out
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
#---------------------------------------
|
207
|
+
|
149
208
|
# NOTE: Singletons can't be private, so mark them syntactically.
|
150
209
|
|
151
210
|
# Turn hash's entries into locals and return binding.
|
@@ -155,36 +214,14 @@ module DT #:doc:
|
|
155
214
|
bnd = binding
|
156
215
|
|
157
216
|
_value = nil
|
158
|
-
h.each do |k,
|
159
|
-
##puts "-- k-#{k.inspect} v-#{_value.inspect}"
|
217
|
+
h.each do |k, v|
|
218
|
+
##puts "-- k-#{k.inspect} v-#{_value.inspect}" #DEBUG
|
219
|
+
_value = v # IMPORTANT: Ruby 1.9 compatibility hack.
|
160
220
|
eval("#{k} = _value", bnd)
|
161
221
|
end
|
162
222
|
|
163
223
|
bnd
|
164
224
|
end
|
165
225
|
|
166
|
-
|
167
|
-
|
168
|
-
def self._init #:nodoc:
|
169
|
-
# Require Rails environment.
|
170
|
-
if not defined? Rails
|
171
|
-
raise "Rails environment not found. This module is meaningful in Rails only"
|
172
|
-
end
|
173
|
-
|
174
|
-
clear
|
175
|
-
|
176
|
-
# NOTE: Don't forget to update generator/initializers/dt.rb with these.
|
177
|
-
self.web_prefix = '<a href="txmt://open?url=file://<%= file %>&line=<%= line %>"><%= file_rel %>:<%= line %></a> '
|
178
|
-
self.console_prefix = "[DT <%= file_rel %>:<%= line %>] "
|
179
|
-
self.log_prefix = self.console_prefix
|
180
|
-
|
181
|
-
# In case of path problems @log will be nil.
|
182
|
-
@log = begin
|
183
|
-
Logger.new("log/dt.log")
|
184
|
-
rescue Exception
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
_init
|
189
|
-
|
226
|
+
# DO NOT invoke `_initialize` load-time, it won't see Rails3 stuff.
|
190
227
|
end # DT
|
@@ -5,14 +5,15 @@ module DT
|
|
5
5
|
end
|
6
6
|
|
7
7
|
module MetaClassMethods
|
8
|
-
#
|
8
|
+
# Enable DT in the controller.
|
9
|
+
#
|
9
10
|
# class ApplicationController < ActionController::Base
|
10
11
|
# handles_dt
|
11
12
|
# end
|
12
13
|
def handles_dt
|
13
14
|
# NOTE: after_filter() is nicer and lets debug more, but... It's not getting control when there's a rendering exception, such as 404.
|
14
|
-
# Use
|
15
|
-
before_filter {DT.
|
15
|
+
# Use log and console to debug complex stuff like prefilters.
|
16
|
+
before_filter {DT.clear_web_messages}
|
16
17
|
end
|
17
18
|
end # MetaClassMethods
|
18
19
|
end # ActionControllerExtensions
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class RailsDtGenerator < Rails::Generators::Base #:nodoc:
|
2
|
+
source_root File.expand_path("../templates", __FILE__)
|
3
|
+
|
4
|
+
def go
|
5
|
+
copy_file (fn = "dt.css"), "public/stylesheets/#{fn}"
|
6
|
+
copy_file (fn = "dt.rb"), "config/initializers/#{fn}"
|
7
|
+
readme "INSTALL"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
Setting Up Web Output
|
3
|
+
=====================
|
4
|
+
|
5
|
+
Inside your `ApplicationController` class, add:
|
6
|
+
|
7
|
+
handles_dt
|
8
|
+
|
9
|
+
Inside your `app/views/layouts/application.html.erb` `<head>` section, add:
|
10
|
+
|
11
|
+
<%= stylesheet_link_tag "dt" %>
|
12
|
+
|
13
|
+
Inside your `app/views/layouts/application.html.erb` `<body>` section, add:
|
14
|
+
|
15
|
+
<div class="DT">
|
16
|
+
<%= DT.web_messages_as_html %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
Happy debugging!
|
20
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/* DT styles. */
|
2
|
+
|
3
|
+
.DT {
|
4
|
+
margin: 10px 0 0 0;
|
5
|
+
border-top: 1px dotted;
|
6
|
+
padding: 0;
|
7
|
+
background: #dfd;
|
8
|
+
}
|
9
|
+
|
10
|
+
.DT ul {
|
11
|
+
list-style: none;
|
12
|
+
margin: 0;
|
13
|
+
padding: 0;
|
14
|
+
font-family: monospace;
|
15
|
+
font-size: 12px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.DT ul li {
|
19
|
+
margin: 2px 0 2px 0;
|
20
|
+
}
|
21
|
+
|
22
|
+
.DT a {
|
23
|
+
text-decoration: none;
|
24
|
+
color: Black;
|
25
|
+
background: #edd;
|
26
|
+
padding: 0 2px 0 2px;
|
27
|
+
}
|
data/rails_dt.gemspec
CHANGED
@@ -1,46 +1,54 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails_dt}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Fortuna"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-07-10}
|
13
13
|
s.description = %q{Rails Debug Toolkit}
|
14
14
|
s.email = %q{alex.r@askit.org}
|
15
15
|
s.extra_rdoc_files = [
|
16
|
+
"README.html",
|
16
17
|
"README.md"
|
17
18
|
]
|
18
19
|
s.files = [
|
20
|
+
"README.html",
|
19
21
|
"README.md",
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
"VERSION.yml",
|
23
|
+
"generators/rails_dt/USAGE",
|
24
|
+
"generators/rails_dt/WARNING",
|
25
|
+
"generators/rails_dt/rails_dt_generator.rb",
|
26
|
+
"generators/rails_dt/templates/INSTALL",
|
27
|
+
"generators/rails_dt/templates/dt.css",
|
28
|
+
"generators/rails_dt/templates/dt.rb",
|
29
|
+
"init.rb",
|
30
|
+
"lib/dt.rb",
|
31
|
+
"lib/dt/action_controller_extensions.rb",
|
32
|
+
"lib/generators/rails_dt/USAGE",
|
33
|
+
"lib/generators/rails_dt/rails_dt_generator.rb",
|
34
|
+
"lib/generators/rails_dt/templates/INSTALL",
|
35
|
+
"lib/generators/rails_dt/templates/dt.css",
|
36
|
+
"lib/generators/rails_dt/templates/dt.rb",
|
37
|
+
"lib/rails_dt.rb",
|
38
|
+
"rails_dt.gemspec"
|
30
39
|
]
|
31
40
|
s.homepage = %q{http://github.com/dadooda/rails_dt}
|
32
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
33
41
|
s.require_paths = ["lib"]
|
34
|
-
s.rubygems_version = %q{1.
|
42
|
+
s.rubygems_version = %q{1.6.2}
|
35
43
|
s.summary = %q{Rails Debug Toolkit}
|
36
44
|
|
37
45
|
if s.respond_to? :specification_version then
|
38
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
39
46
|
s.specification_version = 3
|
40
47
|
|
41
|
-
if Gem::Version.new(Gem::
|
48
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
42
49
|
else
|
43
50
|
end
|
44
51
|
else
|
45
52
|
end
|
46
53
|
end
|
54
|
+
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_dt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.2
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Alex Fortuna
|
@@ -9,7 +10,7 @@ autorequire:
|
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date:
|
13
|
+
date: 2011-07-10 00:00:00 +04:00
|
13
14
|
default_executable:
|
14
15
|
dependencies: []
|
15
16
|
|
@@ -20,17 +21,26 @@ executables: []
|
|
20
21
|
extensions: []
|
21
22
|
|
22
23
|
extra_rdoc_files:
|
24
|
+
- README.html
|
23
25
|
- README.md
|
24
26
|
files:
|
27
|
+
- README.html
|
25
28
|
- README.md
|
26
29
|
- VERSION.yml
|
30
|
+
- generators/rails_dt/USAGE
|
31
|
+
- generators/rails_dt/WARNING
|
27
32
|
- generators/rails_dt/rails_dt_generator.rb
|
28
33
|
- generators/rails_dt/templates/INSTALL
|
29
|
-
- generators/rails_dt/templates/
|
30
|
-
- generators/rails_dt/templates/
|
34
|
+
- generators/rails_dt/templates/dt.css
|
35
|
+
- generators/rails_dt/templates/dt.rb
|
31
36
|
- init.rb
|
32
37
|
- lib/dt.rb
|
33
38
|
- lib/dt/action_controller_extensions.rb
|
39
|
+
- lib/generators/rails_dt/USAGE
|
40
|
+
- lib/generators/rails_dt/rails_dt_generator.rb
|
41
|
+
- lib/generators/rails_dt/templates/INSTALL
|
42
|
+
- lib/generators/rails_dt/templates/dt.css
|
43
|
+
- lib/generators/rails_dt/templates/dt.rb
|
34
44
|
- lib/rails_dt.rb
|
35
45
|
- rails_dt.gemspec
|
36
46
|
has_rdoc: true
|
@@ -38,26 +48,26 @@ homepage: http://github.com/dadooda/rails_dt
|
|
38
48
|
licenses: []
|
39
49
|
|
40
50
|
post_install_message:
|
41
|
-
rdoc_options:
|
42
|
-
|
51
|
+
rdoc_options: []
|
52
|
+
|
43
53
|
require_paths:
|
44
54
|
- lib
|
45
55
|
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
46
57
|
requirements:
|
47
58
|
- - ">="
|
48
59
|
- !ruby/object:Gem::Version
|
49
60
|
version: "0"
|
50
|
-
version:
|
51
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
52
63
|
requirements:
|
53
64
|
- - ">="
|
54
65
|
- !ruby/object:Gem::Version
|
55
66
|
version: "0"
|
56
|
-
version:
|
57
67
|
requirements: []
|
58
68
|
|
59
69
|
rubyforge_project:
|
60
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.6.2
|
61
71
|
signing_key:
|
62
72
|
specification_version: 3
|
63
73
|
summary: Rails Debug Toolkit
|