blib/lib/Plack/Middleware/Debug/HTML/Mason.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 24 | 78 | 30.7 |
branch | 0 | 12 | 0.0 |
condition | 0 | 5 | 0.0 |
subroutine | 8 | 13 | 61.5 |
pod | 1 | 1 | 100.0 |
total | 33 | 109 | 30.2 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Plack::Middleware::Debug::HTML::Mason; | ||||||
2 | $Plack::Middleware::Debug::HTML::Mason::VERSION = '0.3'; | ||||||
3 | 1 | 1 | 16022 | use strict; | |||
1 | 1 | ||||||
1 | 35 | ||||||
4 | 1 | 1 | 4 | use warnings; | |||
1 | 1 | ||||||
1 | 25 | ||||||
5 | |||||||
6 | 1 | 1 | 506 | use parent qw(Plack::Middleware::Debug::Base); | |||
1 | 244 | ||||||
1 | 4 | ||||||
7 | |||||||
8 | =head1 NAME | ||||||
9 | |||||||
10 | Plack::Middleware::Debug::HTML::Mason - Debug info for old HTML::Mason apps. | ||||||
11 | |||||||
12 | =head1 VERSION | ||||||
13 | |||||||
14 | version 0.3 | ||||||
15 | |||||||
16 | =head1 SYNOPSIS | ||||||
17 | |||||||
18 | # add this to your mason configuration | ||||||
19 | plugins => ['Plack::Middleware::Debug::HTML::Mason::Plugin'] | ||||||
20 | |||||||
21 | # and then enable the middleware | ||||||
22 | enable 'Debug::HTML::Mason'; | ||||||
23 | |||||||
24 | =head1 DESCRIPTION | ||||||
25 | |||||||
26 | Provides a call tree and some basic configuration information for a request | ||||||
27 | processed by HTML::Mason. To use this panel the included plugin | ||||||
28 | C |
||||||
29 | this panel is enabled, the C |
||||||
30 | in the psgi environment. This might be useful if you want load the plugin as | ||||||
31 | needed: | ||||||
32 | |||||||
33 | if ($env->{'psgi.middleware.debug.htmlmason'}) { | ||||||
34 | $handler->interp->plugins(['Plack::Middleware::Debug::HTML::Mason::Plugin']); | ||||||
35 | } | ||||||
36 | else { | ||||||
37 | $handler->interp->plugins([]); | ||||||
38 | } | ||||||
39 | |||||||
40 | ... | ||||||
41 | |||||||
42 | =cut | ||||||
43 | |||||||
44 | my $root; | ||||||
45 | my @stack; | ||||||
46 | my %env; | ||||||
47 | my $ran; | ||||||
48 | |||||||
49 | package Plack::Middleware::Debug::HTML::Mason::Plugin { | ||||||
50 | 1 | 1 | 26258 | use strict; | |||
1 | 2 | ||||||
1 | 37 | ||||||
51 | 1 | 1 | 4 | use warnings; | |||
1 | 1 | ||||||
1 | 32 | ||||||
52 | 1 | 1 | 4 | use parent qw(HTML::Mason::Plugin); | |||
1 | 2 | ||||||
1 | 10 | ||||||
53 | 1 | 1 | 1353 | use Time::HiRes qw(time); | |||
1 | 1408 | ||||||
1 | 4 | ||||||
54 | 1 | 1 | 807 | use JSON; | |||
1 | 9853 | ||||||
1 | 5 | ||||||
55 | |||||||
56 | my $json = JSON->new->convert_blessed(1)->allow_blessed(1)->allow_unknown(1)->utf8(1); | ||||||
57 | |||||||
58 | sub start_component_hook { | ||||||
59 | 0 | 0 | my ($self, $context) = @_; | ||||
60 | |||||||
61 | 0 | my $frame = { | |||||
62 | start => time(), | ||||||
63 | kids => [], | ||||||
64 | }; | ||||||
65 | 0 | 0 | $root ||= [$frame]; | ||||
66 | 0 | 0 | if (@stack) { | ||||
67 | 0 | my $parent= $stack[-1]; | |||||
68 | 0 | push @{$parent->{kids}}, $frame; | |||||
0 | |||||||
69 | } | ||||||
70 | 0 | push @stack, $frame; | |||||
71 | } | ||||||
72 | |||||||
73 | sub end_component_hook { | ||||||
74 | 0 | 0 | my ($self, $context) = @_; | ||||
75 | |||||||
76 | 0 | my $frame = pop @stack; | |||||
77 | 0 | my $name = $context->comp->title; | |||||
78 | |||||||
79 | 0 | my ($path, $root, $method) = $name =~ m/(.*) (\[.+?\])(:.+)?/; | |||||
80 | |||||||
81 | 0 | 0 | $frame->{name} = $method ? "$root $path$method" : "$root $path"; | ||||
82 | 0 | $frame->{end} = time(); | |||||
83 | 0 | $frame->{duration} = $frame->{end} - $frame->{start}; | |||||
84 | 0 | $frame->{args} = $json->encode($context->args); | |||||
85 | } | ||||||
86 | |||||||
87 | sub end_request_hook { | ||||||
88 | 0 | 0 | my ($self, $context) = @_; | ||||
89 | |||||||
90 | 0 | $env{main_comp} = $context->request->request_comp; | |||||
91 | 0 | $env{args} = $context->args; | |||||
92 | 0 | $env{comp_root} = $context->request->interp->comp_root; | |||||
93 | 0 | $ran = 1; | |||||
94 | } | ||||||
95 | |||||||
96 | } | ||||||
97 | |||||||
98 | |||||||
99 | sub run { | ||||||
100 | 0 | 0 | 1 | my ($self, $env, $panel) = @_; | |||
101 | |||||||
102 | 0 | $root = undef; | |||||
103 | 0 | @stack = (); | |||||
104 | 0 | %env = (); | |||||
105 | 0 | $ran = 0; | |||||
106 | 0 | $env->{'psgi.middleware.debug.htmlmason'} = 1; | |||||
107 | |||||||
108 | return sub { | ||||||
109 | 0 | 0 | my $res = shift; | ||||
110 | |||||||
111 | 0 | $panel->nav_title("HTML::Mason"); | |||||
112 | 0 | $panel->title("HTML::Mason Summary"); | |||||
113 | |||||||
114 | 0 | 0 | unless ($ran) { | ||||
115 | 0 | $panel->content('No DataNo data was recorded by the mason plugin. Make sure mason is configured to use the |
|||||
116 | 0 | return; | |||||
117 | } | ||||||
118 | |||||||
119 | |||||||
120 | 0 | my $depth = 0; | |||||
121 | 0 | my $frame; | |||||
122 | my $walker; | ||||||
123 | 0 | my $html = ''; | |||||
124 | 0 | my $i = 0; | |||||
125 | $walker = sub { | ||||||
126 | 0 | my ($context, $depth) = @_; | |||||
127 | 0 | 0 | 0 | return unless $context && @$context; | |||
128 | |||||||
129 | |||||||
130 | 0 | foreach my $frame (@$context) { | |||||
131 | 0 | my $margin = sprintf("%dpx", $depth * 16); | |||||
132 | 0 | my $background; | |||||
133 | 0 | $i++; | |||||
134 | 0 | 0 | if ($i % 2) { | ||||
0 | |||||||
135 | 0 | $background = '#f5f5f5'; | |||||
136 | } | ||||||
137 | elsif ($frame->{name} eq $env{main_comp}->title) { | ||||||
138 | 0 | $background = '#f0f0f0'; | |||||
139 | } | ||||||
140 | else { | ||||||
141 | 0 | $background = 'white'; | |||||
142 | } | ||||||
143 | |||||||
144 | 0 | $html .= sprintf(' %s(%s) - %.5fs ', |
|||||
145 | $background, | ||||||
146 | $margin, | ||||||
147 | $frame->{name}, | ||||||
148 | $frame->{args}, | ||||||
149 | $frame->{duration}, | ||||||
150 | ); | ||||||
151 | |||||||
152 | 0 | $walker->($frame->{kids}, $depth + 1); | |||||
153 | } | ||||||
154 | 0 | }; | |||||
155 | |||||||
156 | 0 | $walker->($root, 1); | |||||
157 | |||||||
158 | 0 | my $css = < | |||||
159 | |||||||
171 | END | ||||||
172 | |||||||
173 | 0 | $panel->content( | |||||
174 | $self->render_list_pairs([ | ||||||
175 | 'Main Comp' => $env{main_comp}->source_file, | ||||||
176 | 'Args' => $env{args}, | ||||||
177 | 'Comp Root' => $env{comp_root}, | ||||||
178 | |||||||
179 | ]) . | ||||||
180 | qq|$css $html | |
||||||
181 | ); | ||||||
182 | 0 | }; | |||||
183 | } | ||||||
184 | |||||||
185 | |||||||
186 | |||||||
187 | =head1 TODO | ||||||
188 | |||||||
189 | =over 2 | ||||||
190 | |||||||
191 | =item * | ||||||
192 | |||||||
193 | The docs are pretty middling at the moment. | ||||||
194 | |||||||
195 | =back | ||||||
196 | |||||||
197 | =head1 AUTHORS | ||||||
198 | |||||||
199 | Chris Reinhardt | ||||||
200 | crein@cpan.org | ||||||
201 | |||||||
202 | David Hand | ||||||
203 | cogent@cpan.org | ||||||
204 | |||||||
205 | =head1 COPYRIGHT | ||||||
206 | |||||||
207 | This program is free software; you can redistribute | ||||||
208 | it and/or modify it under the same terms as Perl itself. | ||||||
209 | |||||||
210 | The full text of the license can be found in the | ||||||
211 | LICENSE file included with this module. | ||||||
212 | |||||||
213 | =head1 SEE ALSO | ||||||
214 | |||||||
215 | L |
||||||
216 | |||||||
217 | =cut | ||||||
218 | |||||||
219 | 1; | ||||||
220 | $Plack::Middleware::Debug::HTML::Mason::Plugin::VERSION = '0.3'; | ||||||
221 | __END__ |