fiveruns_tuneup 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +3 -0
- data/Manifest +57 -0
- data/README.rdoc +44 -0
- data/Rakefile +15 -0
- data/assets/images/arrows.gif +0 -0
- data/assets/images/edit.png +0 -0
- data/assets/images/fade.png +0 -0
- data/assets/images/fade_down.png +0 -0
- data/assets/images/head.gif +0 -0
- data/assets/images/logo.gif +0 -0
- data/assets/images/logo_clear.png +0 -0
- data/assets/images/magnify.png +0 -0
- data/assets/images/pip.gif +0 -0
- data/assets/images/pointer.gif +0 -0
- data/assets/images/schema.png +0 -0
- data/assets/images/signin.gif +0 -0
- data/assets/images/spinner.gif +0 -0
- data/assets/images/warning.gif +0 -0
- data/assets/javascripts/prototype.js +2515 -0
- data/assets/javascripts/tuneup.js +30 -0
- data/assets/stylesheets/tuneup.css +204 -0
- data/bin/fiveruns_tuneup +26 -0
- data/fiveruns_tuneup.gemspec +49 -0
- data/init.rb +2 -0
- data/install.rb +18 -0
- data/lib/bumpspark_helper.rb +52 -0
- data/lib/fiveruns/tuneup.rb +103 -0
- data/lib/fiveruns/tuneup/asset_tags.rb +39 -0
- data/lib/fiveruns/tuneup/custom_methods.rb +8 -0
- data/lib/fiveruns/tuneup/environment.rb +29 -0
- data/lib/fiveruns/tuneup/instrumentation/action_controller/base.rb +59 -0
- data/lib/fiveruns/tuneup/instrumentation/action_view/base.rb +77 -0
- data/lib/fiveruns/tuneup/instrumentation/active_record/base.rb +126 -0
- data/lib/fiveruns/tuneup/instrumentation/cgi/session.rb +30 -0
- data/lib/fiveruns/tuneup/instrumentation/utilities.rb +172 -0
- data/lib/fiveruns/tuneup/multipart.rb +75 -0
- data/lib/fiveruns/tuneup/runs.rb +86 -0
- data/lib/fiveruns/tuneup/schema.rb +43 -0
- data/lib/fiveruns/tuneup/step.rb +219 -0
- data/lib/fiveruns/tuneup/urls.rb +23 -0
- data/lib/fiveruns/tuneup/version.rb +80 -0
- data/lib/fiveruns_tuneup.rb +1 -0
- data/lib/tuneup_config.rb +29 -0
- data/lib/tuneup_controller.rb +140 -0
- data/lib/tuneup_helper.rb +185 -0
- data/rails/init.rb +20 -0
- data/tasks/assets.rake +32 -0
- data/test/test_helper.rb +3 -0
- data/test/tuneup_test.rb +0 -0
- data/uninstall.rb +6 -0
- data/views/tuneup/_data.html.erb +15 -0
- data/views/tuneup/_flash.html.erb +6 -0
- data/views/tuneup/_link.html.erb +1 -0
- data/views/tuneup/_schema.html.erb +17 -0
- data/views/tuneup/_sql.html.erb +23 -0
- data/views/tuneup/_step.html.erb +15 -0
- data/views/tuneup/panel/_registered.html.erb +4 -0
- data/views/tuneup/panel/_unregistered.html.erb +14 -0
- metadata +146 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
TuneUp.switchSchema = function(table) {
|
2
|
+
var element = $('tuneup-schema-table-' + table);
|
3
|
+
var operation = element.visible() ? 'hide' : 'show';
|
4
|
+
$$('#tuneup-schema .tuneup-schema-table').each(function(s) { s.hide(); })
|
5
|
+
element[operation]();
|
6
|
+
$('tuneup-schema')[operation]();
|
7
|
+
}
|
8
|
+
TuneUp.Spinner = {
|
9
|
+
start: function() { $('tuneup_spinner').show(); },
|
10
|
+
stop: function() { $('tuneup_spinner').hide(); }
|
11
|
+
}
|
12
|
+
|
13
|
+
|
14
|
+
Event.observe(window, 'load', function() {
|
15
|
+
$A($(document.body).descendants()).each(function(e){
|
16
|
+
var pos = Element.getStyle(e, 'position');
|
17
|
+
if(pos == 'absolute' || pos == 'fixed') {
|
18
|
+
var top = parseFloat(Element.getStyle(e, 'top') || 0);
|
19
|
+
e.style.top = (top + 50) + 'px';
|
20
|
+
}
|
21
|
+
})
|
22
|
+
new Insertion.Top(document.body, "<div id='tuneup'><h1>FiveRuns TuneUp</h1><img id='tuneup_spinner' style='display:none' src='/images/tuneup/spinner.gif' alt=''/><div id='tuneup-content'></div></div><div id='tuneup-flash'></div>");
|
23
|
+
new Ajax.Request('/tuneup?uri=' + encodeURIComponent(document.location.href),
|
24
|
+
{
|
25
|
+
asynchronous:true,
|
26
|
+
evalScripts:true,
|
27
|
+
onLoading: TuneUp.Spinner.start,
|
28
|
+
onComplete: TuneUp.Spinner.stop
|
29
|
+
});
|
30
|
+
});
|
@@ -0,0 +1,204 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
|
3
|
+
Code licensed under the BSD License:
|
4
|
+
http://developer.yahoo.net/yui/license.txt
|
5
|
+
version: 2.5.1
|
6
|
+
*/
|
7
|
+
/* Modified to target #tuneup div */
|
8
|
+
#tuneup div,#tuneup dl,#tuneup dt,#tuneup dd,#tuneup ul,#tuneup ol,#tuneup #tuneup li,#tuneup h1,#tuneup h2,#tuneup h3,#tuneup h4,#tuneup h5,#tuneup h6,#tuneup pre,#tuneup code,#tuneup form,#tuneup fieldset,#tuneup #tuneup legend,#tuneup input,#tuneup textarea,#tuneup p,#tuneup blockquote,#tuneup th,#tuneup td{margin:0;padding:0;}
|
9
|
+
#tuneup table{border-collapse:collapse;border-spacing:0;}
|
10
|
+
#tuneup fieldset,#tuneup img{border:0;}
|
11
|
+
#tuneup address,#tuneup caption,#tuneup cite,#tuneup code,#tuneup dfn,#tuneup em,#tuneup strong,#tuneup th,#tuneup var{font-style:normal;font-weight:normal;}
|
12
|
+
#tuneup li{list-style:none;}
|
13
|
+
#tuneup caption,#tuneup th{text-align:left;}
|
14
|
+
#tuneup h1,#tuneup h2,#tuneup h3,#tuneup h4,#tuneup h5,#tuneup h6{font-size:100%;font-weight:normal;}
|
15
|
+
#tuneup q:before,#tuneup q:after{content:'';}
|
16
|
+
#tuneup abbr,#tuneup acronym {border:0;font-variant:normal;}
|
17
|
+
#tuneup sup {vertical-align:text-top;}
|
18
|
+
#tuneup sub {vertical-align:text-bottom;}
|
19
|
+
#tuneup input,#tuneup textarea,#tuneup select{font-family:inherit;font-size:inherit;font-weight:inherit;}
|
20
|
+
#tuneup input,#tuneup textarea,#tuneup select{*font-size:100%;}
|
21
|
+
#tuneup legend{color:#000;}
|
22
|
+
#tuneup body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
|
23
|
+
#tuneup table {font-size:inherit;font:100%;}
|
24
|
+
#tuneup pre,#tuneup code,#tuneup kbd,#tuneup samp,#tuneup tt{font-family:monospace;*font-size:108%;line-height:100%;}
|
25
|
+
|
26
|
+
#tuneup-flash div,#tuneup-flash dl,#tuneup-flash dt,#tuneup-flash dd,#tuneup-flash ul,#tuneup-flash ol,#tuneup-flash #tuneup-flash li,#tuneup-flash h1,#tuneup-flash h2,#tuneup-flash h3,#tuneup-flash h4,#tuneup-flash h5,#tuneup-flash h6,#tuneup-flash pre,#tuneup-flash code,#tuneup-flash form,#tuneup-flash fieldset,#tuneup-flash #tuneup-flash legend,#tuneup-flash input,#tuneup-flash textarea,#tuneup-flash p,#tuneup-flash blockquote,#tuneup-flash th,#tuneup-flash td{margin:0;padding:0;}
|
27
|
+
#tuneup-flash table{border-collapse:collapse;border-spacing:0;}
|
28
|
+
#tuneup-flash fieldset,#tuneup-flash img{border:0;}
|
29
|
+
#tuneup-flash address,#tuneup-flash caption,#tuneup-flash cite,#tuneup-flash code,#tuneup-flash dfn,#tuneup-flash em,#tuneup-flash strong,#tuneup-flash th,#tuneup-flash var{font-style:normal;font-weight:normal;}
|
30
|
+
#tuneup-flash li{list-style:none;}
|
31
|
+
#tuneup-flash caption,#tuneup-flash th{text-align:left;}
|
32
|
+
#tuneup-flash h1,#tuneup-flash h2,#tuneup-flash h3,#tuneup-flash h4,#tuneup-flash h5,#tuneup-flash h6{font-size:100%;font-weight:normal;}
|
33
|
+
#tuneup-flash q:before,#tuneup-flash q:after{content:'';}
|
34
|
+
#tuneup-flash abbr,#tuneup-flash acronym {border:0;font-variant:normal;}
|
35
|
+
#tuneup-flash sup {vertical-align:text-top;}
|
36
|
+
#tuneup-flash sub {vertical-align:text-bottom;}
|
37
|
+
#tuneup-flash input,#tuneup-flash textarea,#tuneup-flash select{font-family:inherit;font-size:inherit;font-weight:inherit;}
|
38
|
+
#tuneup-flash input,#tuneup-flash textarea,#tuneup-flash select{*font-size:100%;}
|
39
|
+
#tuneup-flash legend{color:#000;}
|
40
|
+
#tuneup-flash body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
|
41
|
+
#tuneup-flash table {font-size:inherit;font:100%;}
|
42
|
+
#tuneup-flash pre,#tuneup-flash code,#tuneup-flash kbd,#tuneup-flash samp,#tuneup-flash tt{font-family:monospace;*font-size:108%;line-height:100%;}
|
43
|
+
/* END YUI RESET */
|
44
|
+
|
45
|
+
/* Styling */
|
46
|
+
#tuneup { height: 50px; color: #ddd; background: #000 url(/images/tuneup/head.gif) 0 100% repeat-x; padding: 0; font-family: "Helvetica Neue", "Lucida Grande", Calibri, Helvetica, Verdana, sans-serif; font-size: 12px; }
|
47
|
+
#tuneup #tuneup-content { margin-left: 170px; color: #ddd; height: 50px; vertical-align: middle; text-align: left; }
|
48
|
+
#tuneup #tuneup-root-bar { float: right; }
|
49
|
+
#tuneup a, #tuneup a:visited, #tuneup a:active { color: #fff; text-decoration: underline; font-size: 12px; border: 0; }
|
50
|
+
|
51
|
+
#tuneup #tuneup-logo { float: left;}
|
52
|
+
#tuneup label { display: inline; font-size: 13px; font-weight: normal; color: #CCC; padding: 2px 2px; }
|
53
|
+
#tuneup label, #tuneup button { margin: 0 6px 0 20px; }
|
54
|
+
|
55
|
+
#tuneup #tuneup-content p.full { height: 50px; line-height: 50px; vertical-align: middle; padding: 0; }
|
56
|
+
#tuneup .small { font-size: 10px; color: #666; padding: 0 8px 0 8px;}
|
57
|
+
|
58
|
+
|
59
|
+
#tuneup .tuneup-bar { margin: 0 4px; margin-left: 10px; height: 15px; list-style: none; }
|
60
|
+
#tuneup .tuneup-bar li { float:left; height: 20px; color: #fff; line-height: 20px; vertical-align: middle; font-size: 11px; padding: 0 4px;
|
61
|
+
background-image: url(/images/tuneup/fade.png);
|
62
|
+
background-position: bottom left;
|
63
|
+
background-repeat: repeat-x;
|
64
|
+
}
|
65
|
+
#tuneup .tuneup-layer-model { background-color: #FF9800; }
|
66
|
+
#tuneup .tuneup-layer-view { background-color: #38D023; }
|
67
|
+
#tuneup .tuneup-layer-controller { background-color: #3388D5; }
|
68
|
+
#tuneup .tuneup-bar li.tuneup-layer-other { background: #222 url(/images/tuneup/fade_down.png) top left repeat-x;}
|
69
|
+
|
70
|
+
#tuneup #tuneup-top { position: absolute; top: 0px; right: 10px; padding: 0; margin: 0; z-index: 11000; }
|
71
|
+
#tuneup #tuneup-top #tuneup-save-link { line-height: 45px; vertical-align: bottom; margin: 9px; text-align: center; font-weight: bold; padding-left: 20px; background: url(/images/tuneup/pointer.gif) 0 50% no-repeat; }
|
72
|
+
#tuneup #tuneup-summary {float: right; padding: 9px; padding-bottom: 25px; margin: 3px; text-align: center; color: #ddd; -moz-border-radius: 6px; }
|
73
|
+
|
74
|
+
#tuneup #tuneup-data:hover #tuneup-summary { /* h */
|
75
|
+
border-bottom: 0px;
|
76
|
+
background: #000;
|
77
|
+
}
|
78
|
+
#tuneup #tuneup-details { display: none; position: absolute; top: 46px; right: 13px; padding: 9px; text-align: left; z-index: 10999;}
|
79
|
+
#tuneup #tuneup-data:hover #tuneup-details { /* h */
|
80
|
+
display: block;
|
81
|
+
background: #000;
|
82
|
+
min-width: 300px;
|
83
|
+
-moz-border-radius: 6px;
|
84
|
+
}
|
85
|
+
|
86
|
+
#tuneup #tuneup-details ul dl { margin: 0; padding: 0; width: 700; overflow: hidden; }
|
87
|
+
#tuneup #tuneup-details ul dt { float: left; overflow: hidden; height: 20px; margin: 0 10px 0 0; padding: 0; color: #ddd; font-size: 12px; text-transform: none; font-weight: inherit;}
|
88
|
+
#tuneup #tuneup-details ul dt p { }
|
89
|
+
#tuneup #tuneup-details ul dt strong { color: #fff; font-weight: bold; }
|
90
|
+
#tuneup #tuneup-details ul dt span.time { float: right; text-transform: none; font-size: 11px; font-weight: normal; margin-right: 0px; }
|
91
|
+
|
92
|
+
#tuneup #tuneup-details ul dt a, #tuneup-details ul dt a:active, #tuneup-details ul dt a:visited {
|
93
|
+
color: inherit;
|
94
|
+
font-size: inherit;
|
95
|
+
font-weight: inherit;
|
96
|
+
text-decoration: none;
|
97
|
+
text-align: left;
|
98
|
+
position: inherit;
|
99
|
+
}
|
100
|
+
|
101
|
+
#tuneup .tuneup-bar li { text-align: center; }
|
102
|
+
|
103
|
+
#tuneup #tuneup-details li.fiveruns_tuneup_step { padding-left: 4px; background: url(/images/tuneup/pip.gif) 4px 0 no-repeat; }
|
104
|
+
#tuneup #tuneup-details li.fiveruns_tuneup_step.with-children { background: url(/images/tuneup/arrows.gif) 4px 0 no-repeat;}
|
105
|
+
#tuneup #tuneup-details li.fiveruns_tuneup_step.with-children.tuneup-opened { background: url(/images/tuneup/arrows.gif) 4px -20px no-repeat; }
|
106
|
+
|
107
|
+
#tuneup #tuneup-details ul { margin: 0; padding: 0; }
|
108
|
+
#tuneup #tuneup-details ul span.time { margin-right: 12px; }
|
109
|
+
|
110
|
+
#tuneup li .children { display: none; }
|
111
|
+
|
112
|
+
#tuneup_spinner { position: absolute; z-index: 11002; top: 15px; right: 30px; }
|
113
|
+
|
114
|
+
#tuneup #tuneup-details ul dd {
|
115
|
+
margin: 0 0 0 410px;
|
116
|
+
height: 20px;
|
117
|
+
padding: 0;
|
118
|
+
}
|
119
|
+
#tuneup #tuneup-details ul dt { padding-left: 16px; width: 400px; clear: left; }
|
120
|
+
|
121
|
+
#tuneup #tuneup-details ul ul.fiveruns_tuneup_children { background: #111; }
|
122
|
+
#tuneup #tuneup-details ul ul dd { margin-left: 406px; }
|
123
|
+
#tuneup #tuneup-details ul ul dt { width: 396px; }
|
124
|
+
|
125
|
+
#tuneup #tuneup-details ul ul ul.fiveruns_tuneup_children { background: #222;}
|
126
|
+
#tuneup #tuneup-details ul ul ul dd { margin-left: 402px; }
|
127
|
+
#tuneup #tuneup-details ul ul ul dt { width: 392px; }
|
128
|
+
|
129
|
+
|
130
|
+
#tuneup #tuneup-details ul ul ul ul.fiveruns_tuneup_children { background: #333;}
|
131
|
+
#tuneup #tuneup-details ul ul ul ul dd { margin-left: 398px; }
|
132
|
+
#tuneup #tuneup-details ul ul ul ul dt { width: 388px; }
|
133
|
+
|
134
|
+
|
135
|
+
#tuneup #tuneup-details ul ul ul ul ul.fiveruns_tuneup_children { background: #444;}
|
136
|
+
#tuneup #tuneup-details ul ul ul ul ul dd { margin-left: 394px; }
|
137
|
+
#tuneup #tuneup-details ul ul ul ul ul dt { width: 384px; }
|
138
|
+
|
139
|
+
|
140
|
+
#tuneup #tuneup-details ul ul ul ul ul ul.fiveruns_tuneup_children { background: #555;}
|
141
|
+
#tuneup #tuneup-details ul ul ul ul ul ul dd { margin-left: 390px; }
|
142
|
+
#tuneup #tuneup-details ul ul ul ul ul ul dt { width: 380px; }
|
143
|
+
|
144
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul.fiveruns_tuneup_children { background: #666;}
|
145
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul dd { margin-left: 386px; }
|
146
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul dt { width: 376px; }
|
147
|
+
|
148
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul ul dd { margin-left: 382px; }
|
149
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul ul dt { width: 372px; }
|
150
|
+
|
151
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul ul ul dd { margin-left: 378px; }
|
152
|
+
#tuneup #tuneup-details ul ul ul ul ul ul ul ul ul dt { width: 368px; }
|
153
|
+
|
154
|
+
#tuneup-flash { display: none; text-align: left; font-size: 12px; padding: 5px; color: #000; border-bottom: 1px #000 solid; }
|
155
|
+
#tuneup-flash emph { color: #666; font-style: italic; }
|
156
|
+
#tuneup-flash p { font-family: sans-serif; margin: 0; }
|
157
|
+
#tuneup-flash p { padding: 0; padding-left: 20px; font-family: sans-serif; background: none; color: #000; border: 0; }
|
158
|
+
#tuneup-flash.tuneup-show { display: block; }
|
159
|
+
#tuneup-flash.tuneup-error { background: #FDFCDB; }
|
160
|
+
#tuneup-flash.tuneup-error p { background: url(/images/tuneup/warning.gif) 0 50% no-repeat; }
|
161
|
+
#tuneup-flash.tuneup-notice { padding-left: 0; background: #E4FFDE; }
|
162
|
+
|
163
|
+
#tuneup #tuneup-details .tuneup-bar { width: 300px; height: 20px; padding: 0; margin: 0 !important; overflow: hidden; }
|
164
|
+
#tuneup #tuneup-details .tuneup-bar li { height: 18px; padding: 0; margin: 0 !important; }
|
165
|
+
|
166
|
+
#tuneup #tuneup-details a.tuneup-sql { color: 001999; margin-left: 10px; }
|
167
|
+
#tuneup #tuneup-details a img { border: 0; }
|
168
|
+
|
169
|
+
#tuneup .tuneup-halo { display: none; margin-left: 4px; }
|
170
|
+
#tuneup .tuneup-step-info:hover .tuneup-halo { display: inline; }
|
171
|
+
|
172
|
+
#tuneup textarea { background: none; overflow: auto; color: #fff; font-size: 12px; font-family: sans-serif; padding: 4px; border: 0; font-family: monospace; }
|
173
|
+
#tuneup table { border: 0; margin-top: 4px; background: #111; } /* sql */
|
174
|
+
#tuneup th { background: #000; padding: 4px; color: #fff; font-size: 12px; text-align: left; border: 0; font-weight: bold; border: 1px #333 solid; border-left: 0; border-top: 0; }
|
175
|
+
#tuneup td { background: #111; padding: 4px; color: #ddd; font-size: 12px; text-align: left; border: 0; }
|
176
|
+
|
177
|
+
#tuneup #tuneup-schema { display: none; position: absolute; top: 46px; right: 735px; padding: 9px; text-align: left; z-index: 10998; background: #000; opacity: 0.85; color: #ddd; overflow: hidden; -moz-border-radius: 6px; }
|
178
|
+
|
179
|
+
#tuneup h1 {
|
180
|
+
background: transparent url(/images/tuneup/logo_clear.png) center left no-repeat;
|
181
|
+
border: 0;
|
182
|
+
color: white;
|
183
|
+
display: block;
|
184
|
+
float: left;
|
185
|
+
font-family: 'Helvetica Neue';
|
186
|
+
font-size: 18px;
|
187
|
+
font-weight: bold;
|
188
|
+
height: 50px;
|
189
|
+
letter-spacing: 1px;
|
190
|
+
line-height: 50px;
|
191
|
+
margin: 0 18px 0 18px;
|
192
|
+
padding: 0 0 0 38px;
|
193
|
+
text-shadow: rgb(0, 0, 0) -1px -1px 0px;
|
194
|
+
vertical-align: middle;
|
195
|
+
}
|
196
|
+
|
197
|
+
#tuneup #tuneup-schema h3 { color: #fff; font-weight: bold; font-size: 14px; margin-bottom: 5px; }
|
198
|
+
#tuneup #tuneup-data:hover #tuneup-schema { display: block; }
|
199
|
+
#tuneup #tuneup-schema table, #tuneup #tuneup-schema tr { background: transparent; }
|
200
|
+
#tuneup #tuneup-schema th { background: #111; color: #fff; border: 0 }
|
201
|
+
#tuneup #tuneup-schema td { background: #000; font-family: monospace; color: #ddd; padding: 1px; font-size: 11px; }
|
202
|
+
#tuneup #tuneup-trend { float: right; width: 100px; }
|
203
|
+
|
204
|
+
#tuneup button { background: none; border: 0; margin: 0; padding: 0; height: 50px; line-height: 50px; vertical-align: middle; }
|
data/bin/fiveruns_tuneup
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require File.dirname(__FILE__) << "/../lib/fiveruns/tuneup/version"
|
5
|
+
|
6
|
+
# For older Rails versions
|
7
|
+
# USAGE: fiveruns_manage [RAILS_ROOT]
|
8
|
+
plugin_dir = File.join(ARGV[0] || Dir.pwd, 'vendor/plugins')
|
9
|
+
unless File.directory?(plugin_dir)
|
10
|
+
abort "FiveRuns TuneUp: #{plugin_dir} does not exist; cannot install plugin"
|
11
|
+
end
|
12
|
+
|
13
|
+
FileUtils.rm_rf File.join(plugin_dir, 'fiveruns_tuneup') rescue nil
|
14
|
+
|
15
|
+
File.readlines(File.dirname(__FILE__) << "/../Manifest").each do |line|
|
16
|
+
stub = line.strip
|
17
|
+
origin = File.dirname(__FILE__) << "/../#{stub}"
|
18
|
+
next if origin =~ /\/fiveruns_tuneup$/
|
19
|
+
if File.file?(origin)
|
20
|
+
destination = File.join(plugin_dir, 'fiveruns_tuneup', stub)
|
21
|
+
FileUtils.mkdir_p File.dirname(destination)
|
22
|
+
FileUtils.cp origin, destination
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
STDERR.puts "Installed FiveRuns TuneUp (#{Fiveruns::Tuneup::Version::STRING}) in vendor/plugins/fiveruns_tuneup"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
# Gem::Specification for Fiveruns_tuneup-0.8.2
|
3
|
+
# Originally generated by Echoe
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{fiveruns_tuneup}
|
7
|
+
s.version = "0.8.2"
|
8
|
+
|
9
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["FiveRuns Development Team"]
|
13
|
+
s.date = %q{2008-05-30}
|
14
|
+
s.default_executable = %q{fiveruns_tuneup}
|
15
|
+
s.description = %q{Instrumentation for the FiveRuns TuneUp product.}
|
16
|
+
s.email = %q{dev@fiveruns.com}
|
17
|
+
s.executables = ["fiveruns_tuneup"]
|
18
|
+
s.extra_rdoc_files = ["bin/fiveruns_tuneup", "lib/bumpspark_helper.rb", "lib/fiveruns/tuneup/asset_tags.rb", "lib/fiveruns/tuneup/custom_methods.rb", "lib/fiveruns/tuneup/environment.rb", "lib/fiveruns/tuneup/instrumentation/action_controller/base.rb", "lib/fiveruns/tuneup/instrumentation/action_view/base.rb", "lib/fiveruns/tuneup/instrumentation/active_record/base.rb", "lib/fiveruns/tuneup/instrumentation/cgi/session.rb", "lib/fiveruns/tuneup/instrumentation/utilities.rb", "lib/fiveruns/tuneup/multipart.rb", "lib/fiveruns/tuneup/runs.rb", "lib/fiveruns/tuneup/schema.rb", "lib/fiveruns/tuneup/step.rb", "lib/fiveruns/tuneup/urls.rb", "lib/fiveruns/tuneup/version.rb", "lib/fiveruns/tuneup.rb", "lib/fiveruns_tuneup.rb", "lib/tuneup_config.rb", "lib/tuneup_controller.rb", "lib/tuneup_helper.rb", "README.rdoc", "tasks/assets.rake"]
|
19
|
+
s.files = ["assets/images/arrows.gif", "assets/images/edit.png", "assets/images/fade.png", "assets/images/fade_down.png", "assets/images/head.gif", "assets/images/logo.gif", "assets/images/logo_clear.png", "assets/images/magnify.png", "assets/images/pip.gif", "assets/images/pointer.gif", "assets/images/schema.png", "assets/images/signin.gif", "assets/images/spinner.gif", "assets/images/warning.gif", "assets/javascripts/prototype.js", "assets/javascripts/tuneup.js", "assets/stylesheets/tuneup.css", "bin/fiveruns_tuneup", "History.rdoc", "init.rb", "install.rb", "lib/bumpspark_helper.rb", "lib/fiveruns/tuneup/asset_tags.rb", "lib/fiveruns/tuneup/custom_methods.rb", "lib/fiveruns/tuneup/environment.rb", "lib/fiveruns/tuneup/instrumentation/action_controller/base.rb", "lib/fiveruns/tuneup/instrumentation/action_view/base.rb", "lib/fiveruns/tuneup/instrumentation/active_record/base.rb", "lib/fiveruns/tuneup/instrumentation/cgi/session.rb", "lib/fiveruns/tuneup/instrumentation/utilities.rb", "lib/fiveruns/tuneup/multipart.rb", "lib/fiveruns/tuneup/runs.rb", "lib/fiveruns/tuneup/schema.rb", "lib/fiveruns/tuneup/step.rb", "lib/fiveruns/tuneup/urls.rb", "lib/fiveruns/tuneup/version.rb", "lib/fiveruns/tuneup.rb", "lib/fiveruns_tuneup.rb", "lib/tuneup_config.rb", "lib/tuneup_controller.rb", "lib/tuneup_helper.rb", "Manifest", "rails/init.rb", "Rakefile", "README.rdoc", "tasks/assets.rake", "test/test_helper.rb", "test/tuneup_test.rb", "uninstall.rb", "views/tuneup/_data.html.erb", "views/tuneup/_flash.html.erb", "views/tuneup/_link.html.erb", "views/tuneup/_schema.html.erb", "views/tuneup/_sql.html.erb", "views/tuneup/_step.html.erb", "views/tuneup/panel/_registered.html.erb", "views/tuneup/panel/_unregistered.html.erb", "fiveruns_tuneup.gemspec"]
|
20
|
+
s.has_rdoc = true
|
21
|
+
s.homepage = %q{http://github.com/fiveruns/fiveruns_tuneup}
|
22
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Fiveruns_tuneup", "--main", "README.rdoc"]
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
s.rubyforge_project = %q{fiveruns}
|
25
|
+
s.rubygems_version = %q{1.1.1}
|
26
|
+
s.summary = %q{Instrumentation for the FiveRuns TuneUp product.}
|
27
|
+
s.test_files = ["test/test_helper.rb", "test/tuneup_test.rb"]
|
28
|
+
|
29
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# # Original Rakefile source (requires the Echoe gem):
|
34
|
+
#
|
35
|
+
# require 'rubygems'
|
36
|
+
# require 'echoe'
|
37
|
+
#
|
38
|
+
# require File.dirname(__FILE__) << "/lib/fiveruns/tuneup/version"
|
39
|
+
#
|
40
|
+
# Echoe.new 'fiveruns_tuneup' do |p|
|
41
|
+
# p.version = Fiveruns::Tuneup::Version::STRING
|
42
|
+
# p.author = "FiveRuns Development Team"
|
43
|
+
# p.email = 'dev@fiveruns.com'
|
44
|
+
# p.project = 'fiveruns'
|
45
|
+
# p.summary = "Instrumentation for the FiveRuns TuneUp product."
|
46
|
+
# p.url = "http://github.com/fiveruns/fiveruns_tuneup"
|
47
|
+
# p.dependencies = %w(activesupport)
|
48
|
+
# p.include_rakefile = true
|
49
|
+
# end
|
data/init.rb
ADDED
data/install.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Allow linking (for development)
|
2
|
+
method = ENV['LINK'] ? :ln_s : :cp
|
3
|
+
installed = false
|
4
|
+
Dir[File.dirname(__FILE__) << "/assets/*"].each do |location|
|
5
|
+
directory = File.basename(location)
|
6
|
+
destination = File.join(RAILS_ROOT, 'public', directory, 'tuneup')
|
7
|
+
FileUtils.mkdir_p(destination) rescue nil
|
8
|
+
Dir[File.join(location, '*')].each do |file|
|
9
|
+
new_filename = File.join(destination, File.basename(file))
|
10
|
+
unless File.exists?(new_filename)
|
11
|
+
FileUtils.send(method, file, new_filename)
|
12
|
+
installed = true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
if installed
|
17
|
+
STDERR.puts "FiveRuns TuneUp: Installed assets in public/"
|
18
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'zlib'
|
3
|
+
|
4
|
+
# Note: This is a modified copy of _why's `bumpspark' library,
|
5
|
+
# discussed and collaborated on at:
|
6
|
+
# http://redhanded.hobix.com/inspect/sparklinesForMinimalists.html
|
7
|
+
# Many thanks to the various collaborators; _why (concept), MenTaLguY (transparency), and jzp (png)
|
8
|
+
module BumpsparkHelper
|
9
|
+
|
10
|
+
def build_png_chunk(type,data)
|
11
|
+
to_check = type + data
|
12
|
+
return [data.length].pack("N") + to_check + [Zlib.crc32(to_check)].pack("N")
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_png(image_rows)
|
16
|
+
header = [137, 80, 78, 71, 13, 10, 26, 10].pack("C*")
|
17
|
+
raw_data = image_rows.map { |row| [0] + row }.flatten.pack("C*")
|
18
|
+
ihdr_data = [ image_rows.first.length,image_rows.length,
|
19
|
+
8,2,0,0,0].pack("NNCCCCC")
|
20
|
+
ihdr = build_png_chunk("IHDR", ihdr_data)
|
21
|
+
trns = build_png_chunk("tRNS", ([ 0 ]*6).pack("C6"))
|
22
|
+
idat = build_png_chunk("IDAT", Zlib::Deflate.deflate(raw_data))
|
23
|
+
iend = build_png_chunk("IEND", "")
|
24
|
+
|
25
|
+
return header + ihdr + trns + idat + iend
|
26
|
+
end
|
27
|
+
def bumpspark(results)
|
28
|
+
black = [0, 0, 0]
|
29
|
+
white, red, grey = [0xFF,0xFF,0xFF], [0xFF,0,0], [0x99,0x99,0x99]
|
30
|
+
rows = normalize(results).inject([]) do |ary, r|
|
31
|
+
ary << [black]*15 << [black]*15
|
32
|
+
ary.last[r/9,4] = [(r > 50 and red or grey)]*4
|
33
|
+
ary
|
34
|
+
end.transpose.reverse
|
35
|
+
return build_png(rows)
|
36
|
+
end
|
37
|
+
def build_data_url(type,data)
|
38
|
+
data = Base64.encode64(data).delete("\n")
|
39
|
+
return "data:#{type};base64,#{CGI.escape(data)}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def normalize(results)
|
43
|
+
min, max = results.min, results.max
|
44
|
+
width = max - min
|
45
|
+
return [1] * results.size if width == 0
|
46
|
+
width += (300 * 1000)
|
47
|
+
results.map do |result|
|
48
|
+
((result - min) * 100 / width.to_f).to_i
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.dirname(__FILE__) << "/tuneup/step"
|
2
|
+
|
3
|
+
require 'digest/sha1'
|
4
|
+
require 'yaml'
|
5
|
+
require 'zlib'
|
6
|
+
|
7
|
+
module Fiveruns
|
8
|
+
module Tuneup
|
9
|
+
|
10
|
+
LOGGER = Logger.new('log/tuneup.log')
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
include Fiveruns::Tuneup::Urls
|
15
|
+
include Fiveruns::Tuneup::AssetTags
|
16
|
+
include Fiveruns::Tuneup::Runs
|
17
|
+
include Fiveruns::Tuneup::Instrumentation::Utilities
|
18
|
+
include Fiveruns::Tuneup::Environment
|
19
|
+
include Fiveruns::Tuneup::Schema
|
20
|
+
|
21
|
+
attr_writer :collecting
|
22
|
+
attr_accessor :running
|
23
|
+
attr_reader :trend
|
24
|
+
|
25
|
+
def run(controller, request)
|
26
|
+
@running = (!controller.is_a?(TuneupController) && !request.xhr?)
|
27
|
+
result = nil
|
28
|
+
record controller, request do
|
29
|
+
result = yield
|
30
|
+
end
|
31
|
+
@running = false
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
def collecting
|
36
|
+
if defined?(@collecting)
|
37
|
+
@collecting
|
38
|
+
else
|
39
|
+
@collecting = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def record(controller, request)
|
44
|
+
if recording?
|
45
|
+
@stack = [Fiveruns::Tuneup::RootStep.new]
|
46
|
+
@trend = nil
|
47
|
+
@environment = environment
|
48
|
+
yield
|
49
|
+
log :info, "Persisting for #{request.url} using stub #{stub(request.url)}"
|
50
|
+
data = @stack.shift
|
51
|
+
persist(generate_run_id(request.url, data.time), @environment, schemas, data)
|
52
|
+
elsif !@running
|
53
|
+
# Plugin displaying the data
|
54
|
+
# TODO: Support targeted selection (for historical run)
|
55
|
+
if request.parameters['uri']
|
56
|
+
last_id = last_run_id_for(request.parameters['uri'])
|
57
|
+
log :info, "Retrieved last run id of #{last_id} for #{request.parameters['uri']} using stub #{stub(request.parameters['uri'])}"
|
58
|
+
if last_id && (data = retrieve_run(last_id))
|
59
|
+
@stack = [data]
|
60
|
+
@trend = trend_for(last_id)
|
61
|
+
else
|
62
|
+
log :debug, "No stack found"
|
63
|
+
clear_stack
|
64
|
+
end
|
65
|
+
else
|
66
|
+
clear_stack
|
67
|
+
end
|
68
|
+
yield
|
69
|
+
else
|
70
|
+
yield
|
71
|
+
end
|
72
|
+
clear_stack
|
73
|
+
end
|
74
|
+
|
75
|
+
def recording?
|
76
|
+
@running && @collecting
|
77
|
+
end
|
78
|
+
|
79
|
+
def start
|
80
|
+
log :info, "Starting..."
|
81
|
+
install_instrumentation
|
82
|
+
log :debug, "Using collector at #{collector_url}"
|
83
|
+
log :debug, "Using frontend at #{frontend_url}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def log(level, text)
|
87
|
+
LOGGER.send(level, "FiveRuns TuneUp (v#{Fiveruns::Tuneup::Version::STRING}): #{text}")
|
88
|
+
end
|
89
|
+
|
90
|
+
#######
|
91
|
+
private
|
92
|
+
#######
|
93
|
+
|
94
|
+
def clear_stack
|
95
|
+
@stack = nil
|
96
|
+
@exclusion_stack = nil
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|