class: MetricsReporter
authorClaus Gittinger <cg@exept.de>
Tue, 16 Apr 2013 20:09:01 +0200
changeset 568 49eafe2c5ae8
parent 567 3c563253ddc1
child 569 edb941b33667
class: MetricsReporter allow package-matchpatterns
MetricsReporter.st
--- a/MetricsReporter.st	Thu Apr 04 19:37:02 2013 +0200
+++ b/MetricsReporter.st	Tue Apr 16 20:09:01 2013 +0200
@@ -53,8 +53,35 @@
 examples
 "
                                                                                [exBegin]
+    String streamContents:[:stream |
+        MetricsReporter 
+            reportPackages:{ 'stx:libjavascript' } 
+            format:#xml_metrics 
+            on:stream.
+    ].
+                                                                               [exEnd]
+                                                                               [exBegin]
+    String streamContents:[:stream |
+        MetricsReporter 
+            reportPackages:{ 'stx:libbasic' } 
+            format:#xml_metrics 
+            on:stream.
+    ].
+                                                                               [exEnd]
+                                                                               [exBegin]
+    String streamContents:[:stream |
+        MetricsReporter 
+            reportPackages:{ 'stx:libbasic*' } 
+            format:#xml_metrics 
+            on:stream.
+    ].
+                                                                               [exEnd]
+                                                                               [exBegin]
     'metrics.xml' asFilename writingFileDo:[:stream |
-        MetricsReporter reportPackages:{ 'stx:libjavascript' } format:#xml_metrics on:stream.
+        MetricsReporter 
+            reportPackages:{ 'stx:libjavascript' } 
+            format:#xml_metrics 
+            on:stream.
     ].
                                                                                [exEnd]
 
@@ -72,6 +99,7 @@
     ].
                                                                                [exEnd]
 
+  package metrics only:
                                                                                [exBegin]
     MetricsReporter new
             stream: Transcript;
@@ -85,6 +113,44 @@
             packageMetricNames: #( 'LOC' 'NOM' 'NOC');    
             reportXml_metrics.
                                                                                [exEnd]
+                                                                               [exBegin]
+    MetricsReporter new
+            stream: Transcript;
+            packages:
+                    { 
+                        'stx:libbasic' . 
+                        'stx:libbasic2' . 
+                        'stx:libbasic3' . 
+                    };
+            classMetricNames: #();    
+            methodMetricNames: #();    
+            packageMetricNames: #( 'LOC' 'NOM' 'NOC');    
+            reportXml_metrics.
+                                                                               [exEnd]
+                                                                               [exBegin]
+    MetricsReporter new
+            stream: Transcript;
+            packages:
+                    { 
+                        'stx:libbasic*' . 
+                    };
+            classMetricNames: #();    
+            methodMetricNames: #();    
+            packageMetricNames: #( 'LOC' 'NOM' 'NOC');    
+            reportXml_metrics.
+                                                                               [exEnd]
+                                                                               [exBegin]
+    MetricsReporter new
+            stream: Transcript;
+            packages:
+                    { 
+                        'stx:*' . 
+                    };
+            classMetricNames: #();    
+            methodMetricNames: #();    
+            packageMetricNames: #( 'LOC' 'NOM' 'NOC');    
+            reportXml_metrics.
+                                                                               [exEnd]
 "
 !
 
@@ -187,11 +253,27 @@
     ^ { metric class shortName . metric class descriptiveName . metric metricValue }
 !
 
-packageMetricValue:metricName for:aPackageID
-    |metric|
+packageMetricValue:metricName for:aPackageIDOrPattern
+    |overAllInfo|
+
+    aPackageIDOrPattern includesMatchCharacters ifTrue:[
+        Smalltalk allProjectIDs do:[:eachPackageID |
+            |thisInfo|
 
-    metric := OOM::PackageMetrics type:metricName for:aPackageID.
-    ^ self metricInfoFor:metric
+            (eachPackageID matches:aPackageIDOrPattern) ifTrue:[
+                thisInfo := self metricInfoFor:(OOM::PackageMetrics type:metricName for:eachPackageID).
+                overAllInfo isNil ifTrue:[
+                    overAllInfo := thisInfo
+                ] ifFalse:[
+                    "/ kludge: only works with accumulative metrics (i.e. not with averages etc.)
+                    overAllInfo at:(overAllInfo size) put:(overAllInfo last + thisInfo last).   
+                ].
+            ].
+        ].
+        ^ overAllInfo
+    ] ifFalse:[
+        ^ self metricInfoFor:(OOM::PackageMetrics type:metricName for:aPackageIDOrPattern).
+    ].
 ! !
 
 !MetricsReporter methodsFor:'reporting'!
@@ -217,9 +299,9 @@
     ].
 !
 
-generatePackageMetricsFor:aPackage
+generatePackageMetricsFor:aPackageIDOrPattern
     ^ self packageMetricNames collect:[:metricName |
-        self packageMetricValue:metricName for:aPackage.
+        self packageMetricValue:metricName for:aPackageIDOrPattern.
     ].
 !
 
@@ -247,16 +329,24 @@
             reportXml_metrics
     "
 
-    Smalltalk loadPackage:'exept:programming/oom'.
+    "/ need the exept-metrics package
+    (Smalltalk loadPackage:'exept:programming/oom') ifFalse:[
+        self error:'cannot load oom package'.
+    ].
 
     stream nextPutLine: '<?xml version="1.0"?>';
            nextPutLine: '<metrics>'.
 
     packages do:[:eachPackageID |
-        Smalltalk loadPackage:eachPackageID.
+        "/ if the package is a matchPattern, generate metrics for all loaded packages
+        "/ which match that pattern.
+        "/ Otherwise, make sure that this package is loaded and generate metrics for that
+        "/ one only.
+        eachPackageID includesMatchCharacters ifFalse:[
+            Smalltalk loadPackage:eachPackageID.
+        ].
         self reportXml_metricsForPackage:eachPackageID
     ].
-
     stream nextPutLine: '</metrics>'.
 !
 
@@ -286,22 +376,35 @@
     stream nextPutLine: '      </method>'.
 !
 
-reportXml_metricsForPackage:aPackageID
+reportXml_metricsForPackage:aPackageIDOrPattern
+    |genMetricsForClass|
+
+    genMetricsForClass :=
+        [:aClass |
+            Autoload autoloadFailedSignal handle:[:ex |
+            ] do:[
+                aClass autoload.
+                self reportXml_metricsForClass:aClass
+            ]
+        ].
+
     stream nextPutLine: '  <project>'.
-    stream nextPutLine: ('    <name>%1</name>' bindWith:aPackageID).
+    stream nextPutLine: ('    <name>%1</name>' bindWith:aPackageIDOrPattern).
 
     (self classMetricNames notEmptyOrNil 
     or:[self methodMetricNames notEmptyOrNil]) ifTrue:[
-        Smalltalk allClassesInPackage:aPackageID do:[:eachClass |
-            Autoload autoloadFailedSignal handle:[:ex |
-            ] do:[
-                eachClass autoload.
-                self reportXml_metricsForClass:eachClass
+        aPackageIDOrPattern includesMatchCharacters ifTrue:[
+            Smalltalk allClasses do:[:eachClass |
+                (eachClass package matches:aPackageIDOrPattern) iftrue:[ 
+                    genMetricsForClass value:eachClass
+                ].
             ].
+        ] ifFalse:[
+            Smalltalk allClassesInPackage:aPackageIDOrPattern do:genMetricsForClass.
         ].
     ].
 
-    self reportXml_metricValues:(self generatePackageMetricsFor:aPackageID).
+    self reportXml_metricValues:(self generatePackageMetricsFor:aPackageIDOrPattern).
 
     stream nextPutLine: '  </project>'.
 ! !
@@ -310,7 +413,7 @@
 
 report:formatSymbol
     "currently supported formatSymbols:
-            xml_cobertura"
+            xml_metrics"
 
     |reportFormatSelector|
 
@@ -329,9 +432,10 @@
 !MetricsReporter class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.5 2012-11-07 21:21:56 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.6 2013-04-16 18:09:01 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.5 2012-11-07 21:21:56 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.6 2013-04-16 18:09:01 cg Exp $'
 ! !
+