jscruggs-metric_fu 1.1.1 → 1.1.2

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.
data/HISTORY CHANGED
@@ -1,3 +1,11 @@
1
+ === MetricFu 1.1.2 / 2009-7-09
2
+
3
+ * Removed dependency on gruff and rmagick (unless the user wants graphs, of course).
4
+ * New look for styling -- Edouard Brière
5
+ * Extra param in rcov call was causing problems -- Stewart Welbourne
6
+ * Preventing rake task from being run multiple times when other rake tasks switch the environment -- Matthew Van Horn
7
+ * Typo in Rcov dependency verification and fixing parsing Saikuro nested information -- Mark Wilden
8
+
1
9
  === MetricFu 1.1.1 / 2009-6-29
2
10
 
3
11
  * Fix for empty flog files
data/TODO CHANGED
@@ -2,10 +2,6 @@
2
2
 
3
3
  * Color code flog results with scale from: http://jakescruggs.blogspot.com/2008/08/whats-good-flog-score.html
4
4
  * Integrate Flog, Saikuro, and Coverage into one report so you can see methods that have high complexity and low coverage (this is a big one)
5
- * Move HTML out of code and into templates/
6
- * Replace #generate_report with #new on each metric class
7
- * Make each class descend from MetricFu::CodeMetric
8
- * Generate metrics:* rake tasks for each of CodeMetric's descendants
9
5
  * Update flog specs so that they actually run flog
10
6
  * Add flay specs that run flay
11
7
  * Convert readme to markdown and rename to README.mkdn so github will render it
@@ -19,6 +19,7 @@ module MetricFu
19
19
 
20
20
 
21
21
  def generate
22
+ return if self.clazz.empty?
22
23
  puts "Generating graphs"
23
24
  Dir[File.join(MetricFu.data_directory, '*.yml')].sort.each do |metric_file|
24
25
  puts "Generating graphs for #{metric_file}"
@@ -35,9 +35,9 @@ module MetricFu
35
35
 
36
36
  # Instantiates a new template class based on the configuration set
37
37
  # in MetricFu::Configuration, or through the MetricFu.config block
38
- # in your rake file (defaults to the included StandardTemplate) and
39
- # assigns the report_hash to the report_hash to the template and
40
- # asks itself to write itself out.
38
+ # in your rake file (defaults to the included AwesomeTemplate),
39
+ # assigns the report_hash to the report_hash in the template, and
40
+ # tells the template to to write itself out.
41
41
  def save_templatized_report
42
42
  @template = MetricFu.template_class.new
43
43
  @template.report = report_hash
@@ -6,7 +6,7 @@ module MetricFu
6
6
  NEW_FILE_MARKER = ("=" * 80) + "\n"
7
7
 
8
8
  def self.verify_dependencies!
9
- `flay --help`
9
+ `rcov --help`
10
10
  unless $?.success?
11
11
  if RUBY_PLATFORM =~ /java/
12
12
  raise 'running in jruby - rcov tasks not available'
@@ -36,7 +36,7 @@ module MetricFu
36
36
  test_files = FileList[*MetricFu.rcov[:test_files]].join(' ')
37
37
  rcov_opts = MetricFu.rcov[:rcov_opts].join(' ')
38
38
  output = ">> #{MetricFu::Rcov.metric_directory}/rcov.txt"
39
- `rcov --include-file #{test_files} #{rcov_opts} #{output}`
39
+ `rcov #{test_files} #{rcov_opts} #{output}`
40
40
  rescue LoadError
41
41
  if RUBY_PLATFORM =~ /java/
42
42
  puts 'running in jruby - rcov tasks not available'
@@ -120,10 +120,10 @@ module MetricFu
120
120
  line = @file_handle.readline
121
121
  element = Saikuro::ParsingElement.new(line)
122
122
  elsif line.match /END/
123
- @elements << element unless element.nil?
123
+ @elements << element if element
124
124
  element = nil
125
125
  else
126
- element << line
126
+ element << line if element
127
127
  end
128
128
  end
129
129
  rescue EOFError
@@ -1,11 +1,12 @@
1
- require 'gruff'
1
+
2
2
  module MetricFu
3
3
 
4
- class FlayGrapher
4
+ class FlayGrapher < Grapher
5
5
 
6
6
  attr_accessor :flay_score, :labels
7
7
 
8
8
  def initialize
9
+ super
9
10
  self.flay_score = []
10
11
  self.labels = {}
11
12
  end
@@ -1,11 +1,11 @@
1
- require 'gruff'
2
1
  module MetricFu
3
2
 
4
- class FlogGrapher
3
+ class FlogGrapher < Grapher
5
4
 
6
5
  attr_accessor :flog_total, :flog_average, :labels
7
6
 
8
7
  def initialize
8
+ super
9
9
  self.flog_total = []
10
10
  self.flog_average = []
11
11
  self.labels = {}
@@ -0,0 +1,19 @@
1
+ module MetricFu
2
+ class Grapher
3
+ def initialize
4
+ self.class.require_gruff
5
+ end
6
+
7
+ def self.require_gruff
8
+ require 'gruff'
9
+ rescue LoadError
10
+ puts "#"*99 + "\n" +
11
+ "If you want to use metric_fu's graphing features then you'll need to install the gems 'topfunky-gruff' and 'rmagick' "+
12
+ "(and rmagick requires ImageMagick). "+
13
+ "If you don't want to deal with that, then make sure you set config.graphs = [] (see the metric_fu's homepage for more details) "+
14
+ "to indicate that you don't want graphing." +
15
+ "\n" + "#"*99
16
+ raise
17
+ end
18
+ end
19
+ end
@@ -1,11 +1,11 @@
1
- require 'gruff'
2
1
  module MetricFu
3
2
 
4
- class RcovGrapher
3
+ class RcovGrapher < Grapher
5
4
 
6
5
  attr_accessor :rcov_percent, :labels
7
6
 
8
7
  def initialize
8
+ super
9
9
  self.rcov_percent = []
10
10
  self.labels = {}
11
11
  end
@@ -1,11 +1,11 @@
1
- require 'gruff'
2
1
  module MetricFu
3
2
 
4
- class ReekGrapher
3
+ class ReekGrapher < Grapher
5
4
 
6
5
  attr_accessor :reek_count, :labels
7
6
 
8
7
  def initialize
8
+ super
9
9
  self.reek_count = {}
10
10
  self.labels= {}
11
11
  end
@@ -1,11 +1,11 @@
1
- require 'gruff'
2
1
  module MetricFu
3
2
 
4
- class RoodiGrapher
3
+ class RoodiGrapher < Grapher
5
4
 
6
5
  attr_accessor :roodi_count, :labels
7
6
 
8
7
  def initialize
8
+ super
9
9
  self.roodi_count = []
10
10
  self.labels = {}
11
11
  end
@@ -1,3 +1,4 @@
1
+ require 'rake'
1
2
  # Load a few things to make our lives easier elsewhere.
2
3
  module MetricFu
3
4
  LIB_ROOT = File.dirname(__FILE__)
@@ -13,12 +14,16 @@ require File.join(base_dir, 'report')
13
14
  require File.join(base_dir, 'generator')
14
15
  require File.join(base_dir, 'graph')
15
16
 
16
- # Load the rakefile so users of the gem get the default metric_fu task
17
- load File.join(MetricFu::LIB_ROOT, '..', 'tasks', 'metric_fu.rake')
17
+ # prevent the task from being run multiple times.
18
+ unless Rake::Task.task_defined? "metrics:all"
19
+ # Load the rakefile so users of the gem get the default metric_fu task
20
+ load File.join(MetricFu::LIB_ROOT, '..', 'tasks', 'metric_fu.rake')
21
+ end
18
22
 
19
23
  # Now load everything else that's in the directory
20
24
  Dir[File.join(base_dir, '*.rb')].each{|l| require l }
21
25
  Dir[File.join(generator_dir, '*.rb')].each {|l| require l }
22
26
  Dir[File.join(template_dir, 'standard/*.rb')].each {|l| require l}
23
27
  Dir[File.join(template_dir, 'awesome/*.rb')].each {|l| require l}
28
+ require graph_dir + "/grapher"
24
29
  Dir[File.join(graph_dir, '*.rb')].each {|l| require l}
@@ -0,0 +1,82 @@
1
+ /* --------------------------------------------------------------
2
+
3
+ buttons.css
4
+ * Gives you some great CSS-only buttons.
5
+
6
+ Created by Kevin Hale [particletree.com]
7
+ * particletree.com/features/rediscovering-the-button-element
8
+
9
+ See Readme.txt in this folder for instructions.
10
+
11
+ -------------------------------------------------------------- */
12
+
13
+ button {
14
+ display:block;
15
+ float:left;
16
+ margin:0 0.583em 0.667em 0;
17
+ padding:5px 10px 5px 7px; /* Links */
18
+
19
+ border:1px solid #dedede;
20
+ border-top:1px solid #eee;
21
+ border-left:1px solid #eee;
22
+
23
+ background-color:#f5f5f5;
24
+ font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
25
+ font-size:100%;
26
+ line-height:130%;
27
+ text-decoration:none;
28
+ font-weight:bold;
29
+ color:#565656;
30
+ cursor:pointer;
31
+ }
32
+ button {
33
+ width:auto;
34
+ overflow:visible;
35
+ padding:4px 10px 3px 7px; /* IE6 */
36
+ }
37
+ button[type] {
38
+ padding:4px 10px 4px 7px; /* Firefox */
39
+ line-height:17px; /* Safari */
40
+ }
41
+ *:first-child+html button[type] {
42
+ padding:4px 10px 3px 7px; /* IE7 */
43
+ }
44
+ button img {
45
+ margin:0 3px -3px 0 !important;
46
+ padding:0;
47
+ border:none;
48
+ width:16px;
49
+ height:16px;
50
+ float:none;
51
+ }
52
+
53
+
54
+ /* Button colors
55
+ -------------------------------------------------------------- */
56
+
57
+ /* Standard */
58
+ button:hover {
59
+ background-color:#dff4ff;
60
+ border:1px solid #c2e1ef;
61
+ color:#336699;
62
+ }
63
+
64
+ /* Positive */
65
+ body .positive {
66
+ color:#529214;
67
+ }
68
+ button.positive:hover {
69
+ background-color:#E6EFC2;
70
+ border:1px solid #C6D880;
71
+ color:#529214;
72
+ }
73
+
74
+ /* Negative */
75
+ body .negative {
76
+ color:#d12f19;
77
+ }
78
+ button.negative:hover {
79
+ background:#fbe3e4;
80
+ border:1px solid #fbc2c4;
81
+ color:#d12f19;
82
+ }
@@ -0,0 +1,335 @@
1
+ html {
2
+ background-color: #e0e0e0; }
3
+
4
+ body {
5
+ font-size: 100%;
6
+ font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
7
+ color: #333333; }
8
+
9
+ a {
10
+ color: #ed1556;
11
+ text-decoration: none; }
12
+ a:hover {
13
+ color: #ffffff;
14
+ background-color: #ed1556; }
15
+
16
+ #header, #content, #footer {
17
+ margin: 0 auto;
18
+ background: #eeeeee;
19
+ padding: 0 2em;
20
+ z-index: 0;
21
+ position: relative;
22
+ font-size: 1em; }
23
+
24
+ #header {
25
+ background: #ffffff; }
26
+ #header h1 {
27
+ font-weight: bold;
28
+ font-size: 1.5em; }
29
+ #header address.watermark {
30
+ position: absolute;
31
+ font-weight: bold;
32
+ right: 3em;
33
+ top: 0;
34
+ font-size: .75em;
35
+ color: #cccccc; }
36
+ #header address.watermark a {
37
+ color: #cccccc;
38
+ font-weight: bold;
39
+ font-size: 2em; }
40
+ #header address.watermark a:hover {
41
+ background: transparent;
42
+ color: #aaaaaa; }
43
+
44
+ #content {
45
+ padding-top: 1em;
46
+ padding-bottom: 2em; }
47
+ #content strong {
48
+ font-weight: bold; }
49
+ #content em {
50
+ font-style: italic; }
51
+ #content h1, #content h2, #content h3, #content h4, #content h5, #content h6 {
52
+ color: #4e4e4e; }
53
+ #content h1 {
54
+ font-size: 2em;
55
+ font-weight: bold;
56
+ margin-bottom: .75em;
57
+ padding: .25em 0;
58
+ line-height: 1.2;
59
+ border-bottom: 1px solid #c0c0c0; }
60
+ #content h2 {
61
+ font-weight: bold;
62
+ font-size: 1.5em;
63
+ margin: 1em 0 .2em; }
64
+ #content h3 {
65
+ font-weight: bold;
66
+ font-size: 1.25em;
67
+ margin: .25em 0; }
68
+ #content h4, #content h5, #content h6 {
69
+ font-weight: bold;
70
+ margin-top: .5em; }
71
+ #content code, #content pre, #content textarea, #content input {
72
+ font-family: Monaco, Deja Vu Sans Mono, Inconsolata, Consolas, monospace; }
73
+ #content form p {
74
+ margin-top: 1em;
75
+ position: relative; }
76
+ #content form p.checkbox label {
77
+ margin-top: 0 !important; }
78
+ #content form input.text, #content form textarea {
79
+ width: 30em;
80
+ padding: .2em .4em;
81
+ color: #4e4e4e; }
82
+ #content form input.text {
83
+ height: 1.4em; }
84
+ #content form label {
85
+ float: left;
86
+ display: block;
87
+ margin-top: .5em;
88
+ width: 8em;
89
+ margin-right: .75em; }
90
+ #content form .with_errors label {
91
+ background: red;
92
+ color: white;
93
+ position: relative;
94
+ top: -.7em; }
95
+ #content form .with_errors.required label {
96
+ position: static;
97
+ margin-right: .25em;
98
+ padding: 0 .2em; }
99
+ #content form .with_errors input, #content form .with_errors textarea {
100
+ border: 2px solid #f22;
101
+ background: #fee;
102
+ color: #222222; }
103
+ #content form .required label {
104
+ float: none;
105
+ display: block;
106
+ width: auto;
107
+ position: relative;
108
+ font-weight: bold;
109
+ margin-top: 1em;
110
+ text-indent: -.65em; }
111
+ #content form .required label:before {
112
+ content: "* ";
113
+ color: #ed1556; }
114
+ #content form .required input.text {
115
+ width: 25.6em;
116
+ font-size: 24px;
117
+ font-weight: bold; }
118
+ #content form .normal {
119
+ margin-top: 2em; }
120
+ #content form h2.notifier label {
121
+ float: none;
122
+ width: auto;
123
+ margin-right: 0; }
124
+ #content form h2.notifier label .warning {
125
+ font-size: .5em;
126
+ font-weight: normal;
127
+ color: #999999; }
128
+ #content form fieldset {
129
+ padding-bottom: 1em;
130
+ margin-left: 1.35em;
131
+ border-bottom: 1px solid #c0c0c0;
132
+ margin-bottom: 1em; }
133
+ #content form fieldset h3 {
134
+ margin-top: 1em;
135
+ margin-bottom: 0; }
136
+ #content form fieldset p.normal {
137
+ margin-top: 1em; }
138
+ #content form fieldset p label {
139
+ width: 6.7em; }
140
+ #content form p.submit {
141
+ margin-top: 2em; }
142
+ #content form p.submit:after {
143
+ display: block;
144
+ clear: both;
145
+ float: none;
146
+ content: ".";
147
+ text-indent: -9999em;
148
+ text-align: left; }
149
+ #content form p.submit.destroy button, #content form p.submit.manual-build button {
150
+ float: none;
151
+ display: inline; }
152
+ #content form p.submit.manual-build button {
153
+ margin-right: 0; }
154
+ #content #build form, #content #last_build form {
155
+ font-size: .75em; }
156
+ #content #build form p.submit, #content #last_build form p.submit {
157
+ margin: 0;
158
+ padding: 0;
159
+ position: absolute;
160
+ right: .5em;
161
+ top: 1.25em; }
162
+ #content .blank_slate p, #content .error p {
163
+ position: relative;
164
+ top: .3em; }
165
+ #content .blank_slate h1, #content .error h1 {
166
+ border-width: 0;
167
+ margin: 0;
168
+ padding: 0; }
169
+ #content .blank_slate h1 button, #content .error h1 button {
170
+ float: none;
171
+ border: 0 none;
172
+ background: transparent;
173
+ display: inline;
174
+ color: #ed1556;
175
+ padding: 0.25em 0;
176
+ margin: 0; }
177
+ #content .blank_slate h1 button:hover, #content .error h1 button:hover {
178
+ background: #ed1556;
179
+ color: #ffffff; }
180
+ #content .error dt {
181
+ margin-top: 1.4em;
182
+ margin-bottom: .3em;
183
+ font-size: 1.75em;
184
+ font-family: Georgia, Times New Roman, serif; }
185
+ #content .error dd {
186
+ line-height: 1.4; }
187
+ #content .error .backtrace {
188
+ margin: 1em 0;
189
+ overflow: scroll;
190
+ height: 30em;
191
+ border: 1px solid #c0c0c0;
192
+ line-height: 1.6; }
193
+ #content #projects {
194
+ margin: 1em 0 2em;
195
+ border-top: 1px solid #c0c0c0; }
196
+ #content #projects li {
197
+ position: relative;
198
+ border-bottom: 1px solid #c0c0c0; }
199
+ #content #projects li.odd {
200
+ background: #e6e6e6; }
201
+ #content #projects li.building {
202
+ background: transparent url(/spinner.gif) no-repeat scroll right; }
203
+ #content #projects li a {
204
+ font-size: 2em;
205
+ padding: .25em;
206
+ line-height: 1.2;
207
+ font-weight: bold;
208
+ display: block; }
209
+ #content #projects li a.success {
210
+ color: #337022; }
211
+ #content #projects li a.failed {
212
+ color: #ff1100; }
213
+ #content #projects li .meta {
214
+ position: absolute;
215
+ right: .6em;
216
+ top: 1.5em;
217
+ font-size: 0.8em;
218
+ color: #999999;
219
+ text-align: right; }
220
+ #content #projects li.building .meta {
221
+ right: 1.6em; }
222
+ #content #projects li.success .meta {
223
+ color: #337022; }
224
+ #content #projects li.failed .meta {
225
+ color: #ff1100; }
226
+ #content #previous_builds li a {
227
+ display: block;
228
+ padding: .25em;
229
+ margin-bottom: .25em;
230
+ border-width: 1px;
231
+ border-style: solid; }
232
+ #content #previous_builds li a strong {
233
+ font-size: 1.3em; }
234
+ #content #previous_builds li a .attribution {
235
+ font-size: .9em; }
236
+ #content #projects li.success a, #content #previous_builds li.success a {
237
+ background-color: #bbf8aa;
238
+ border-color: #99d688;
239
+ color: #337022; }
240
+ #content #projects li.success a .attribution, #content #previous_builds li.success a .attribution {
241
+ color: #77b466; }
242
+ #content #projects li.success a:hover, #content #previous_builds li.success a:hover {
243
+ background-color: #ddffcc; }
244
+ #content #projects li.failed a, #content #previous_builds li.failed a {
245
+ background-color: #ffbbaa;
246
+ border-color: #dd9988;
247
+ color: #ff1100; }
248
+ #content #projects li.failed a .attribution, #content #previous_builds li.failed a .attribution {
249
+ color: #bb7766; }
250
+ #content #projects li.failed a:hover, #content #previous_builds li.failed a:hover {
251
+ background-color: #ffddcc; }
252
+ #content #build, #content #last_build {
253
+ position: relative; }
254
+ #content #build h1, #content #build blockquote, #content #last_build h1, #content #last_build blockquote {
255
+ border-width: 0 1px;
256
+ border-style: solid; }
257
+ #content #build h1, #content #last_build h1 {
258
+ border-top-width: 1px; }
259
+ #content #build blockquote, #content #last_build blockquote {
260
+ bottom-bottom-width: 1px;
261
+ line-height: 1.4; }
262
+ #content #build.success h1, #content #build.success blockquote, #content #last_build.success h1, #content #last_build.success blockquote {
263
+ background-color: #bbf8aa;
264
+ border-color: #99d688 #ccffbb #ccffbb #99d688; }
265
+ #content #build.success h1, #content #last_build.success h1 {
266
+ color: #337022; }
267
+ #content #build.success .meta, #content #last_build.success .meta {
268
+ color: #77b466; }
269
+ #content #build.failed h1, #content #build.failed blockquote, #content #last_build.failed h1, #content #last_build.failed blockquote {
270
+ background-color: #ffbbaa;
271
+ border-color: #dd9988 #ffccbb #ffccbb #dd9988; }
272
+ #content #build.failed h1, #content #last_build.failed h1 {
273
+ color: #ff1100; }
274
+ #content #build.failed .meta, #content #last_build.failed .meta {
275
+ color: #bb7766; }
276
+ #content #build h1, #content #last_build h1 {
277
+ margin-top: .5em;
278
+ margin-bottom: 0;
279
+ padding: .25em;
280
+ color: #337022; }
281
+ #content #build blockquote, #content #last_build blockquote {
282
+ padding: .75em;
283
+ margin-bottom: 2em; }
284
+ #content #build blockquote .meta, #content #last_build blockquote .meta {
285
+ margin-top: 1em;
286
+ display: block;
287
+ font-size: .9em; }
288
+ #content #build pre.output, #content #last_build pre.output {
289
+ background: #111;
290
+ color: #fff;
291
+ padding: .5em;
292
+ overflow: auto;
293
+ max-height: 50em;
294
+ font-size: .825em; }
295
+ #content #build pre.output .color30, #content #last_build pre.output .color30 {
296
+ color: #333; }
297
+ #content #build pre.output .color31, #content #last_build pre.output .color31 {
298
+ color: #e33; }
299
+ #content #build pre.output .color32, #content #last_build pre.output .color32 {
300
+ color: #3e3; }
301
+ #content #build pre.output .color33, #content #last_build pre.output .color33 {
302
+ color: #ee3; }
303
+ #content #build pre.output .color34, #content #last_build pre.output .color34 {
304
+ color: #33e; }
305
+ #content #build pre.output .color35, #content #last_build pre.output .color35 {
306
+ color: #e3e; }
307
+ #content #build pre.output .color36, #content #last_build pre.output .color36 {
308
+ color: #3ee; }
309
+ #content #build pre.output .color37, #content #last_build pre.output .color37 {
310
+ color: #fff; }
311
+ #content #push_path {
312
+ display: block;
313
+ margin-top: 1em;
314
+ margin-left: 2em; }
315
+
316
+ a.success {
317
+ color: #bbf8aa; }
318
+ a.success:hover {
319
+ background-color: #bbf8aa;
320
+ color: white; }
321
+ a.failed {
322
+ color: #ffbbaa; }
323
+ a.failed:hover {
324
+ background-color: #ffbbaa;
325
+ color: white; }
326
+
327
+ #footer {
328
+ padding: 1.5em 2.5em;
329
+ border-top: 1px solid #ccc;
330
+ font-size: .8em;
331
+ color: #666;
332
+ text-align: right; }
333
+ #footer strong {
334
+ font-weight: bold; }
335
+