51 ! |
51 ! |
52 |
52 |
53 examples |
53 examples |
54 " |
54 " |
55 [exBegin] |
55 [exBegin] |
|
56 String streamContents:[:stream | |
|
57 MetricsReporter |
|
58 reportPackages:{ 'stx:libjavascript' } |
|
59 format:#xml_metrics |
|
60 on:stream. |
|
61 ]. |
|
62 [exEnd] |
|
63 [exBegin] |
|
64 String streamContents:[:stream | |
|
65 MetricsReporter |
|
66 reportPackages:{ 'stx:libbasic' } |
|
67 format:#xml_metrics |
|
68 on:stream. |
|
69 ]. |
|
70 [exEnd] |
|
71 [exBegin] |
|
72 String streamContents:[:stream | |
|
73 MetricsReporter |
|
74 reportPackages:{ 'stx:libbasic*' } |
|
75 format:#xml_metrics |
|
76 on:stream. |
|
77 ]. |
|
78 [exEnd] |
|
79 [exBegin] |
56 'metrics.xml' asFilename writingFileDo:[:stream | |
80 'metrics.xml' asFilename writingFileDo:[:stream | |
57 MetricsReporter reportPackages:{ 'stx:libjavascript' } format:#xml_metrics on:stream. |
81 MetricsReporter |
|
82 reportPackages:{ 'stx:libjavascript' } |
|
83 format:#xml_metrics |
|
84 on:stream. |
58 ]. |
85 ]. |
59 [exEnd] |
86 [exEnd] |
60 |
87 |
61 [exBegin] |
88 [exBegin] |
62 'metrics.xml' asFilename writingFileDo:[:stream | |
89 'metrics.xml' asFilename writingFileDo:[:stream | |
70 format:#xml_metrics |
97 format:#xml_metrics |
71 on:stream. |
98 on:stream. |
72 ]. |
99 ]. |
73 [exEnd] |
100 [exEnd] |
74 |
101 |
|
102 package metrics only: |
75 [exBegin] |
103 [exBegin] |
76 MetricsReporter new |
104 MetricsReporter new |
77 stream: Transcript; |
105 stream: Transcript; |
78 packages: |
106 packages: |
79 { |
107 { |
80 'exept:workflow' . |
108 'exept:workflow' . |
81 'exept:expecco' . |
109 'exept:expecco' . |
|
110 }; |
|
111 classMetricNames: #(); |
|
112 methodMetricNames: #(); |
|
113 packageMetricNames: #( 'LOC' 'NOM' 'NOC'); |
|
114 reportXml_metrics. |
|
115 [exEnd] |
|
116 [exBegin] |
|
117 MetricsReporter new |
|
118 stream: Transcript; |
|
119 packages: |
|
120 { |
|
121 'stx:libbasic' . |
|
122 'stx:libbasic2' . |
|
123 'stx:libbasic3' . |
|
124 }; |
|
125 classMetricNames: #(); |
|
126 methodMetricNames: #(); |
|
127 packageMetricNames: #( 'LOC' 'NOM' 'NOC'); |
|
128 reportXml_metrics. |
|
129 [exEnd] |
|
130 [exBegin] |
|
131 MetricsReporter new |
|
132 stream: Transcript; |
|
133 packages: |
|
134 { |
|
135 'stx:libbasic*' . |
|
136 }; |
|
137 classMetricNames: #(); |
|
138 methodMetricNames: #(); |
|
139 packageMetricNames: #( 'LOC' 'NOM' 'NOC'); |
|
140 reportXml_metrics. |
|
141 [exEnd] |
|
142 [exBegin] |
|
143 MetricsReporter new |
|
144 stream: Transcript; |
|
145 packages: |
|
146 { |
|
147 'stx:*' . |
82 }; |
148 }; |
83 classMetricNames: #(); |
149 classMetricNames: #(); |
84 methodMetricNames: #(); |
150 methodMetricNames: #(); |
85 packageMetricNames: #( 'LOC' 'NOM' 'NOC'); |
151 packageMetricNames: #( 'LOC' 'NOM' 'NOC'); |
86 reportXml_metrics. |
152 reportXml_metrics. |
185 |
251 |
186 metricInfoFor:metric |
252 metricInfoFor:metric |
187 ^ { metric class shortName . metric class descriptiveName . metric metricValue } |
253 ^ { metric class shortName . metric class descriptiveName . metric metricValue } |
188 ! |
254 ! |
189 |
255 |
190 packageMetricValue:metricName for:aPackageID |
256 packageMetricValue:metricName for:aPackageIDOrPattern |
191 |metric| |
257 |overAllInfo| |
192 |
258 |
193 metric := OOM::PackageMetrics type:metricName for:aPackageID. |
259 aPackageIDOrPattern includesMatchCharacters ifTrue:[ |
194 ^ self metricInfoFor:metric |
260 Smalltalk allProjectIDs do:[:eachPackageID | |
|
261 |thisInfo| |
|
262 |
|
263 (eachPackageID matches:aPackageIDOrPattern) ifTrue:[ |
|
264 thisInfo := self metricInfoFor:(OOM::PackageMetrics type:metricName for:eachPackageID). |
|
265 overAllInfo isNil ifTrue:[ |
|
266 overAllInfo := thisInfo |
|
267 ] ifFalse:[ |
|
268 "/ kludge: only works with accumulative metrics (i.e. not with averages etc.) |
|
269 overAllInfo at:(overAllInfo size) put:(overAllInfo last + thisInfo last). |
|
270 ]. |
|
271 ]. |
|
272 ]. |
|
273 ^ overAllInfo |
|
274 ] ifFalse:[ |
|
275 ^ self metricInfoFor:(OOM::PackageMetrics type:metricName for:aPackageIDOrPattern). |
|
276 ]. |
195 ! ! |
277 ! ! |
196 |
278 |
197 !MetricsReporter methodsFor:'reporting'! |
279 !MetricsReporter methodsFor:'reporting'! |
198 |
280 |
199 reportPackages: aCollectionOfPackages format: aSymbol on: aStream |
281 reportPackages: aCollectionOfPackages format: aSymbol on: aStream |
215 ^ self methodMetricNames collect:[:metricName | |
297 ^ self methodMetricNames collect:[:metricName | |
216 self methodMetricValue:metricName for:aMethod. |
298 self methodMetricValue:metricName for:aMethod. |
217 ]. |
299 ]. |
218 ! |
300 ! |
219 |
301 |
220 generatePackageMetricsFor:aPackage |
302 generatePackageMetricsFor:aPackageIDOrPattern |
221 ^ self packageMetricNames collect:[:metricName | |
303 ^ self packageMetricNames collect:[:metricName | |
222 self packageMetricValue:metricName for:aPackage. |
304 self packageMetricValue:metricName for:aPackageIDOrPattern. |
223 ]. |
305 ]. |
224 ! |
306 ! |
225 |
307 |
226 reportXml_metricValues:metricValues |
308 reportXml_metricValues:metricValues |
227 |metricShortName metricLongName metricValue| |
309 |metricShortName metricLongName metricValue| |
245 stream:Transcript; |
327 stream:Transcript; |
246 packages:#( 'exept:workflow' ); |
328 packages:#( 'exept:workflow' ); |
247 reportXml_metrics |
329 reportXml_metrics |
248 " |
330 " |
249 |
331 |
250 Smalltalk loadPackage:'exept:programming/oom'. |
332 "/ need the exept-metrics package |
|
333 (Smalltalk loadPackage:'exept:programming/oom') ifFalse:[ |
|
334 self error:'cannot load oom package'. |
|
335 ]. |
251 |
336 |
252 stream nextPutLine: '<?xml version="1.0"?>'; |
337 stream nextPutLine: '<?xml version="1.0"?>'; |
253 nextPutLine: '<metrics>'. |
338 nextPutLine: '<metrics>'. |
254 |
339 |
255 packages do:[:eachPackageID | |
340 packages do:[:eachPackageID | |
256 Smalltalk loadPackage:eachPackageID. |
341 "/ if the package is a matchPattern, generate metrics for all loaded packages |
|
342 "/ which match that pattern. |
|
343 "/ Otherwise, make sure that this package is loaded and generate metrics for that |
|
344 "/ one only. |
|
345 eachPackageID includesMatchCharacters ifFalse:[ |
|
346 Smalltalk loadPackage:eachPackageID. |
|
347 ]. |
257 self reportXml_metricsForPackage:eachPackageID |
348 self reportXml_metricsForPackage:eachPackageID |
258 ]. |
349 ]. |
259 |
|
260 stream nextPutLine: '</metrics>'. |
350 stream nextPutLine: '</metrics>'. |
261 ! |
351 ! |
262 |
352 |
263 reportXml_metricsForClass:aClass |
353 reportXml_metricsForClass:aClass |
264 stream nextPutLine: ' <class>'. |
354 stream nextPutLine: ' <class>'. |
284 self reportXml_metricValues:(self generateMethodMetricsFor:aMethod). |
374 self reportXml_metricValues:(self generateMethodMetricsFor:aMethod). |
285 |
375 |
286 stream nextPutLine: ' </method>'. |
376 stream nextPutLine: ' </method>'. |
287 ! |
377 ! |
288 |
378 |
289 reportXml_metricsForPackage:aPackageID |
379 reportXml_metricsForPackage:aPackageIDOrPattern |
|
380 |genMetricsForClass| |
|
381 |
|
382 genMetricsForClass := |
|
383 [:aClass | |
|
384 Autoload autoloadFailedSignal handle:[:ex | |
|
385 ] do:[ |
|
386 aClass autoload. |
|
387 self reportXml_metricsForClass:aClass |
|
388 ] |
|
389 ]. |
|
390 |
290 stream nextPutLine: ' <project>'. |
391 stream nextPutLine: ' <project>'. |
291 stream nextPutLine: (' <name>%1</name>' bindWith:aPackageID). |
392 stream nextPutLine: (' <name>%1</name>' bindWith:aPackageIDOrPattern). |
292 |
393 |
293 (self classMetricNames notEmptyOrNil |
394 (self classMetricNames notEmptyOrNil |
294 or:[self methodMetricNames notEmptyOrNil]) ifTrue:[ |
395 or:[self methodMetricNames notEmptyOrNil]) ifTrue:[ |
295 Smalltalk allClassesInPackage:aPackageID do:[:eachClass | |
396 aPackageIDOrPattern includesMatchCharacters ifTrue:[ |
296 Autoload autoloadFailedSignal handle:[:ex | |
397 Smalltalk allClasses do:[:eachClass | |
297 ] do:[ |
398 (eachClass package matches:aPackageIDOrPattern) iftrue:[ |
298 eachClass autoload. |
399 genMetricsForClass value:eachClass |
299 self reportXml_metricsForClass:eachClass |
400 ]. |
300 ]. |
401 ]. |
|
402 ] ifFalse:[ |
|
403 Smalltalk allClassesInPackage:aPackageIDOrPattern do:genMetricsForClass. |
301 ]. |
404 ]. |
302 ]. |
405 ]. |
303 |
406 |
304 self reportXml_metricValues:(self generatePackageMetricsFor:aPackageID). |
407 self reportXml_metricValues:(self generatePackageMetricsFor:aPackageIDOrPattern). |
305 |
408 |
306 stream nextPutLine: ' </project>'. |
409 stream nextPutLine: ' </project>'. |
307 ! ! |
410 ! ! |
308 |
411 |
309 !MetricsReporter methodsFor:'reporting-private'! |
412 !MetricsReporter methodsFor:'reporting-private'! |
310 |
413 |
311 report:formatSymbol |
414 report:formatSymbol |
312 "currently supported formatSymbols: |
415 "currently supported formatSymbols: |
313 xml_cobertura" |
416 xml_metrics" |
314 |
417 |
315 |reportFormatSelector| |
418 |reportFormatSelector| |
316 |
419 |
317 reportFormatSelector := self reportFormatSelector:formatSymbol. |
420 reportFormatSelector := self reportFormatSelector:formatSymbol. |
318 (self respondsTo: reportFormatSelector) |
421 (self respondsTo: reportFormatSelector) |