MetricsReporter.st
changeset 568 49eafe2c5ae8
parent 522 3582d5e59c14
child 584 aab981776647
equal deleted inserted replaced
567:3c563253ddc1 568:49eafe2c5ae8
    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)
   327 ! !
   430 ! !
   328 
   431 
   329 !MetricsReporter class methodsFor:'documentation'!
   432 !MetricsReporter class methodsFor:'documentation'!
   330 
   433 
   331 version
   434 version
   332     ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.5 2012-11-07 21:21:56 cg Exp $'
   435     ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.6 2013-04-16 18:09:01 cg Exp $'
   333 !
   436 !
   334 
   437 
   335 version_CVS
   438 version_CVS
   336     ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.5 2012-11-07 21:21:56 cg Exp $'
   439     ^ '$Header: /cvs/stx/stx/goodies/sunit/MetricsReporter.st,v 1.6 2013-04-16 18:09:01 cg Exp $'
   337 ! !
   440 ! !
       
   441