--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MetricsReporter.st Wed Nov 07 19:40:22 2012 +0100
@@ -0,0 +1,311 @@
+"
+ COPYRIGHT (c) 2012 by eXept Software AG
+ All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+"
+"{ Package: 'stx:goodies/sunit' }"
+
+Object subclass:#MetricsReporter
+ instanceVariableNames:'packages stream classMetricNames methodMetricNames
+ packageMetricNames'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'SUnit-Report'
+!
+
+!MetricsReporter class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2012 by eXept Software AG
+ All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+
+"
+!
+
+documentation
+"
+ this is used as a last step in jenkins automated builds.
+
+ Currently supported formats are:
+ #xml_metrics - a java metrics compatible format
+
+ [author:]
+ Claus Gittinger
+
+ [see also:]
+"
+!
+
+examples
+"
+ [exBegin]
+ 'metrics.xml' asFilename writingFileDo:[:stream |
+ MetricsReporter reportPackages:{ 'stx:libjavascript' } format:#xml_metrics on:stream.
+ ].
+ [exEnd]
+
+ [exBegin]
+ 'metrics.xml' asFilename writingFileDo:[:stream |
+ MetricsReporter
+ reportPackages:
+ {
+ 'exept:workflow'
+ 'exept:expecco'
+ 'exept:expecco/plugins/*'
+ }
+ format:#xml_metrics
+ on:stream.
+ ].
+ [exEnd]
+"
+!
+
+format_metrics
+"
+<?xml version=""1.0"" encoding=""UTF-8"" ?>
+
+<!!ELEMENT metrics (project)* >
+<!!ELEMENT project (name, measurement*, group*) >
+<!!ELEMENT group (name, measurement*, class*) >
+<!!ELEMENT class (name, measurement*, method*) >
+<!!ELEMENT method (name, measurement*) >
+<!!ELEMENT name (#PCDATA) >
+<!!ELEMENT measurement (short-name, long-name, value, (members? | (minimum, median, average, standard-deviation, maximum, sum, nb-data-points))) >
+<!!ELEMENT short-name (#PCDATA) >
+<!!ELEMENT long-name (#PCDATA) >
+<!!ELEMENT value (#PCDATA) >
+<!!ELEMENT members (member*) >
+<!!ELEMENT minimum (#PCDATA) >
+<!!ELEMENT median (#PCDATA) >
+<!!ELEMENT average (#PCDATA) >
+<!!ELEMENT standard-deviation (#PCDATA) >
+<!!ELEMENT maximum (#PCDATA) >
+<!!ELEMENT sum (#PCDATA) >
+<!!ELEMENT nb-data-points (#PCDATA) >
+<!!ELEMENT member (#PCDATA) >
+"
+! !
+
+!MetricsReporter class methodsFor:'queries'!
+
+supportedFormats
+ "return a list of formats and short-info-string, as per supported format symbol"
+
+ ^ #(
+ (#'xml_metrics' 'xml format')
+ )
+
+ "Created: / 30-07-2011 / 10:18:18 / cg"
+! !
+
+!MetricsReporter class methodsFor:'reporting'!
+
+reportPackages: aCollectionOfPackages format: format on: stream
+ self new
+ reportPackages: aCollectionOfPackages format: format on: stream
+! !
+
+!MetricsReporter methodsFor:'accessing'!
+
+classMetricNames
+ ^ classMetricNames ? #( 'LOC' )
+!
+
+methodMetricNames
+ ^ methodMetricNames ? #( "'LOC'" )
+!
+
+packageMetricNames
+ ^ packageMetricNames ? #( 'LOC' )
+!
+
+packages:something
+ packages := something.
+!
+
+stream:something
+ stream := something.
+! !
+
+!MetricsReporter methodsFor:'metric generation'!
+
+classMetricValue:metricName for:aClass
+ |metric|
+
+ metric := OOM::ClassMetrics type:metricName for:aClass.
+ ^ self metricInfoFor:metric
+!
+
+methodMetricValue:metricName for:aMethod
+ |metric|
+
+ metric := OOM::MethodMetrics type:metricName for:aMethod.
+ ^ self metricInfoFor:metric
+!
+
+metricInfoFor:metric
+ ^ { metric class shortName . metric class descriptiveName . metric metricValue }
+!
+
+packageMetricValue:metricName for:aPackageID
+ |metric|
+
+ metric := OOM::PackageMetrics type:metricName for:aPackageID.
+ ^ self metricInfoFor:metric
+! !
+
+!MetricsReporter methodsFor:'reporting'!
+
+reportPackages: aCollectionOfPackages format: aSymbol on: aStream
+
+ packages := aCollectionOfPackages.
+ stream := aStream.
+ self report: aSymbol
+! !
+
+!MetricsReporter methodsFor:'reporting - xml-metrics'!
+
+generateClassMetricsFor:aClass
+ ^ self classMetricNames collect:[:metricName |
+ self classMetricValue:metricName for:aClass.
+ ].
+!
+
+generateMethodMetricsFor:aMethod
+ ^ self methodMetricNames collect:[:metricName |
+ self methodMetricValue:metricName for:aMethod.
+ ].
+!
+
+generatePackageMetricsFor:aPackage
+ ^ self packageMetricNames collect:[:metricName |
+ self packageMetricValue:metricName for:aPackage.
+ ].
+!
+
+reportXml_metricValues:metricValues
+ |metricShortName metricLongName metricValue|
+
+ metricValues do:[:eachTuple |
+ metricShortName := eachTuple first.
+ metricLongName := eachTuple second.
+ metricValue := eachTuple third.
+
+ stream nextPutLine: ' <measurement>'.
+ stream nextPutLine: (' <short-name>%1</short-name>' bindWith:metricShortName).
+ stream nextPutLine: (' <long-name>%1</long-name>' bindWith:metricLongName).
+ stream nextPutLine: (' <value>%1</value>' bindWith:metricValue).
+ stream nextPutLine: ' </measurement>'.
+ ]
+!
+
+reportXml_metrics
+ "
+ self new
+ stream:Transcript;
+ packages:#( 'exept:workflow' );
+ reportXml_metrics
+ "
+
+ Smalltalk loadPackage:'exept:programming/oom'.
+
+ stream nextPutLine: '<?xml version="1.0"?>';
+ nextPutLine: '<metrics>'.
+
+ packages do:[:eachPackageID |
+ Smalltalk loadPackage:eachPackageID.
+ self reportXml_metricsForPackage:eachPackageID
+ ].
+
+ stream nextPutLine: '</metrics>'.
+!
+
+reportXml_metricsForClass:aClass
+ stream nextPutLine: ' <class>'.
+ stream nextPutLine: (' <name>%1</name>' bindWith:aClass name).
+
+ self classMetricNames notEmptyOrNil ifTrue:[
+ self reportXml_metricValues:(self generateClassMetricsFor:aClass).
+ ].
+
+ self methodMetricNames notEmptyOrNil ifTrue:[
+ aClass instAndClassMethodsDo:[:eachMethod |
+ self reportXml_metricsForMethod:eachMethod
+ ].
+ ].
+
+ stream nextPutLine: ' </class>'.
+!
+
+reportXml_metricsForMethod:aMethod
+ stream nextPutLine: ' <method>'.
+ stream nextPutLine:(' <name>%1</name>' bindWith:aMethod selector).
+
+ self reportXml_metricValues:(self generateMethodMetricsFor:aMethod).
+
+ stream nextPutLine: ' </method>'.
+!
+
+reportXml_metricsForPackage:aPackageID
+ stream nextPutLine: ' <project>'.
+ stream nextPutLine: (' <name>%1</name>' bindWith:aPackageID).
+
+ self reportXml_metricValues:(self generatePackageMetricsFor:aPackageID).
+
+ (self classMetricNames notEmptyOrNil
+ or:[self methodMetricNames notEmptyOrNil]) ifTrue:[
+ Smalltalk allClassesInPackage:aPackageID do:[:eachClass |
+ Autoload autoloadFailedSignal handle:[:ex |
+ ] do:[
+ eachClass autoload.
+ self reportXml_metricsForClass:eachClass
+ ].
+ ].
+ ].
+
+ stream nextPutLine: ' </project>'.
+! !
+
+!MetricsReporter methodsFor:'reporting-private'!
+
+report:formatSymbol
+ "currently supported formatSymbols:
+ xml_cobertura"
+
+ |reportFormatSelector|
+
+ reportFormatSelector := self reportFormatSelector:formatSymbol.
+ (self respondsTo: reportFormatSelector)
+ ifTrue:[self perform: reportFormatSelector]
+ ifFalse:[self error:'Unsupported format: ', formatSymbol].
+
+ "Modified (comment): / 03-08-2011 / 12:57:54 / cg"
+!
+
+reportFormatSelector:format
+ ^ ('report' , format asString capitalized) asSymbol
+! !
+
+!MetricsReporter class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.1 2012-11-07 18:40:22 cg Exp $'
+!
+
+version_CVS
+ ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.1 2012-11-07 18:40:22 cg Exp $'
+! !