PageRenderTime 40ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/sample_app/data/scripts/count.pl

https://github.com/ulisses/Static-Code-Analyzer
Perl | 381 lines | 364 code | 15 blank | 2 comment | 13 complexity | 452cbb39d1dec8624dc2e6727b55169f MD5 | raw file
  1. #!/usr/bin/perl
  2. use Path::Class;
  3. use GD::Graph::bars;
  4. use GD::Graph::pie;
  5. use Getopt::Long;
  6. GetOptions("open=s" => \$_opt_filePath,
  7. "separated!" => \$_opt_separated,
  8. "allTogether!" => \$_opt_allTogether,
  9. "percent!" => \$_opt_percent,
  10. "verbose!" => \$_opt_verbose,
  11. "pie!" => \$_opt_pie,
  12. "bars!" => \$_opt_abrs,
  13. "out=s" => \$_opt_fileNamePrefix,
  14. "path:s" => \$_opt_fileSavePath,
  15. "optional:s" => \$optionalstring,
  16. "int=i" => \$mandatoryinteger,
  17. "optint:i" => \$optionalinteger,
  18. "float=f" => \$mandatoryfloat,
  19. "optfloat:f" => \$optionalfloat);
  20. if(!$_opt_fileSavePath) {
  21. $_opt_fileSavePath = dir('.');
  22. }
  23. if($_opt_bars eq $_opt_pie) {
  24. $_opt_bars = 1;
  25. $_opt_pie = 1;
  26. }
  27. if($_opt_bars) {
  28. $_opt_pie = 0;
  29. } else {
  30. $_opt_pie = 1;
  31. }
  32. if($_opt_separated eq $_opt_allTogether) {
  33. $_opt_separated = 1;
  34. $_opt_allTogether = 0;
  35. }
  36. if($_opt_separated) {
  37. $_opt_allTogether = 0;
  38. } else {
  39. $_opt_allTogether = 1;
  40. $_opt_percent = 1;
  41. }
  42. my %_types = ("tcl" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/^[ \t\n]*#.*/; }, "nrComments" => 0,
  43. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  44. },
  45. "cs" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  46. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  47. },
  48. "h" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  49. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  50. },
  51. "hpp" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  52. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  53. },
  54. "cpp" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  55. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  56. },
  57. "php" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  58. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  59. },
  60. "js" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  61. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  62. },
  63. "c" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  64. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  65. },
  66. "css" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  67. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  68. },
  69. "hs" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/({-(.|\n|\r)*?-})|(^[ \t\n]*--.*)/; }, "nrComments" => 0,
  70. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  71. },
  72. "java" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(\*(.|\n|\r)*?\*)|(^[ \t\n]*\/\/.*)/; }, "nrComments" => 0,
  73. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  74. },
  75. "pl" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/^[ \t\n]*#.*/; }, "nrComments" => 0,
  76. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  77. },
  78. "py" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(^[ \t\n]*#.*)|('''(.|\n|\r)*?''')/; }, "nrComments" => 0,
  79. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  80. },
  81. "rb" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(^[ \t\n]*#.*)|(=begin(.|\n|\r)*?=end)/; }, "nrComments" => 0,
  82. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  83. },
  84. "tex" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/^[ \t\n]*%.*/; }, "nrComments" => 0,
  85. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  86. },
  87. "xml" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(<!--(.|\n|\r)*?-->)/; }, "nrComments" => 0,
  88. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  89. },
  90. "xsl" => {"nrFiles" => 0, "nrLines" => 0, "comments" => sub { return shift =~ m/(<!--(.|\n|\r)*?-->)/; }, "nrComments" => 0,
  91. "percentageNrFiles" => 0, "percentageNrLines" => 0, "percentageNrComments" => 0
  92. }
  93. );
  94. my @_files = getAllFiles($_opt_filePath);
  95. for my $type (keys %_types) {
  96. if($_opt_verbose) {
  97. print "Working on $type...\n";
  98. }
  99. for my $file_source ( getFiles($type) ) {
  100. chomp $file_source;
  101. $_types{$type}{"nrFiles"}++;
  102. my $file_source_name = file($file_source);
  103. $file_source_name =~ $file_source_name->stringify;
  104. open(FILESOURCE,'<',$file_source_name) or warn "can't open $file_source_name\n";
  105. while(<FILESOURCE>) {
  106. $_types{$type}{"nrLines"} += 1-$_types{$type}{"comments"}($_);
  107. $_types{$type}{"nrComments"} += $_types{$type}{"comments"}($_);
  108. }
  109. }
  110. }
  111. if($_opt_percent) {
  112. my $totalNrFiles = 0;
  113. my $totalNrLines = 0;
  114. my $totalNrComments = 0;
  115. map {
  116. $totalNrFiles += $_types{$_}{"nrFiles"};
  117. $totalNrLines += $_types{$_}{"nrLines"};
  118. $totalNrComments += $_types{$_}{"nrComments"};
  119. } (keys %_types);
  120. map {
  121. $_types{$_}{"percentageNrFiles"} = ($_types{$_}{"nrFiles"} / $totalNrFiles) * 100;
  122. $_types{$_}{"percentageNrLines"} = ($_types{$_}{"nrLines"} / $totalNrLines) * 100;
  123. $_types{$_}{"percentageNrComments"} = ($_types{$_}{"nrComments"} / $totalNrComments) * 100;
  124. } grep($_types{$_}{"nrFiles"} != 0,keys %_types);
  125. }
  126. my @_dataTypes = grep($_types{$_}{"nrFiles"} != 0,keys %_types);
  127. my @_dataNrLines = map { $_types{$_}{"nrLines"} } @_dataTypes;
  128. my @_dataNrFiles = map { $_types{$_}{"nrFiles"} } @_dataTypes;
  129. my @_dataNrComments = map { $_types{$_}{"nrComments"} } @_dataTypes;
  130. my @_dataRatioNrFilesNrLines = map { $_types{$_}{"nrLines"} / $_types{$_}{"nrFiles"} } @_dataTypes;
  131. my @_dataPercentageLines = map { $_types{$_}{"percentageNrLines"} } @_dataTypes;
  132. my @_dataPercentageFiles = map { $_types{$_}{"percentageNrFiles"} } @_dataTypes;
  133. my @_dataPercentageComments = map { $_types{$_}{"percentageNrComments"} } @_dataTypes;
  134. if($_opt_allTogether) {
  135. my $file = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_projectLanguages.png") ;
  136. plotToPng($file,\@_dataTypes,\@_dataPercentageLines,\@_dataPercentageFiles,\@_dataPercentageComments,"Languages", "Percentage", "Global project");
  137. }
  138. if($_opt_separated && !$_opt_percent) {
  139. my $file1 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_LinesPerLanguage.png") ;
  140. my $file2 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_FilesPerLanguage.png") ;
  141. my $file3 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_RatioFilesLines.png") ;
  142. my @arr = ("Nr of lines","Nr of comments");
  143. plotToPngLinesAndComments($file1
  144. ,\@_dataTypes,\@_dataNrLines,\@_dataNrComments,
  145. "Languages", "Number of lines", "Number of lines per language"
  146. ,\@arr);
  147. plotToPng($file2,\@_dataTypes,\@_dataNrFiles,"Languages", "Number of files", "Number of files per language");
  148. plotToPng($file3,\@_dataTypes,\@_dataRatioNrFilesNrLines,"Languages", "Number of lines per file", "Ratio of nr lines/nr files per language");
  149. }
  150. if($_opt_separated && $_opt_percent) {
  151. my $file1 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_LinesPerLanguage.png") ;
  152. my $file2 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_FilesPerLanguage.png") ;
  153. my $file3 = file($_opt_fileSavePath, "$_opt_fileNamePrefix\_RatioFilesLines.png") ;
  154. my @arr = ("% of lines","% of comments");
  155. plotToPngLinesAndComments($file1
  156. ,\@_dataTypes,\@_dataPercentageLines,\@_dataPercentageComments
  157. ,"Languages", "Percentage", "% number of lines per language"
  158. ,\@arr);
  159. plotToPng($file2
  160. ,\@_dataTypes,\@_dataPercentageFiles
  161. ,"Languages", "% number of files", "% number of files per language"
  162. );
  163. plotToPng($file3
  164. ,\@_dataTypes,\@_dataRatioNrFilesNrLines
  165. ,"Languages", "Number of lines per file", "Ratio of nr lines/nr files per language"
  166. );
  167. }
  168. sub plotToPngLinesAndComments {
  169. my $fileName = $_[0];
  170. my $dX = $_[1];
  171. my $dY = $_[2];
  172. my $dY2 = $_[3];
  173. my $x_label = $_[4];
  174. my $y_label = $_[5];
  175. my $title = $_[6];
  176. my $legend_keys = $_[7];
  177. my @data;
  178. push(@data,$dX);
  179. push(@data,$dY);
  180. push(@data,$dY2);
  181. my $mygraph;
  182. if($_opt_pie) {
  183. $mygraph = GD::Graph::pie->new(600, 400);
  184. }
  185. if($_opt_bars) {
  186. $mygraph = GD::Graph::bars->new(600, 400);
  187. }
  188. if(!$_opt_pie) {
  189. $mygraph->set_legend( @$legend_keys );
  190. }
  191. if($_opt_bars) {
  192. $mygraph->set(
  193. transparent => 1,
  194. overwrite => 0,
  195. fgclr => black ,
  196. labelclr => black,
  197. axislabelclr => black,
  198. legendclr => black,
  199. valuesclr => black,
  200. textclr => black,
  201. transparent => 1,
  202. overwrite => 0,
  203. bargroup_spacing => 10,
  204. # show the values for each bar in integer format separated 10 pixels from the top of the bar
  205. show_values => 1,
  206. values_format => sub { return sprintf("\%d", shift); } ,
  207. values_space => 10,
  208. x_label => $x_label,
  209. y_label => $y_label,
  210. title => $title,
  211. dclrs => [ qw(gold red green) ],
  212. ) or warn $mygraph->error;
  213. }
  214. if($_opt_pie) {
  215. $mygraph->set(
  216. transparent => 1,
  217. fgclr => black ,
  218. labelclr => black,
  219. axislabelclr => black,
  220. legendclr => black,
  221. valuesclr => black,
  222. textclr => black,
  223. transparent => 1,
  224. title => $title,
  225. dclrs => [ qw(gold red green) ],
  226. ) or warn $mygraph->error;
  227. }
  228. my $myimage = $mygraph->plot(\@data) or warn $mygraph->error;
  229. open (IMG, '>' , $fileName);
  230. binmode IMG;
  231. print IMG $myimage->png;
  232. close (IMG);
  233. }
  234. # plotToPng(FileName,dataX,dataY,x_label,y_label,title)
  235. # plotToPng(FileName,dataX,dataY,dataY2,dataY3,x_label,y_label,title)
  236. sub plotToPng {
  237. my $fileName = $_[0];
  238. my $dX = $_[1];
  239. my $dY = $_[2];
  240. if($_opt_allTogether) {
  241. $dY2 = $_[3];
  242. $dY3 = $_[4];
  243. $x_label = $_[5];
  244. $y_label = $_[6];
  245. $title = $_[7];
  246. } elsif($_opt_separated) {
  247. $x_label = $_[3];
  248. $y_label = $_[4];
  249. $title = $_[5];
  250. }
  251. my @data;
  252. push(@data,$dX);
  253. push(@data,$dY);
  254. if($_opt_allTogether) {
  255. push(@data,$dY2);
  256. push(@data,$dY3);
  257. }
  258. my $mygraph;
  259. if($_opt_pie) {
  260. $mygraph = GD::Graph::pie->new(600, 400);
  261. }
  262. if($_opt_bars) {
  263. $mygraph = GD::Graph::bars->new(600, 400);
  264. }
  265. if($_opt_allTogether && !$_opt_pie) {
  266. my @legend_keys = ("% of lines","% of files","% of comments");
  267. $mygraph->set_legend(@legend_keys);
  268. }
  269. if($_opt_pie) {
  270. $mygraph->set(
  271. fgclr => black ,
  272. labelclr => black,
  273. axislabelclr => black,
  274. legendclr => black,
  275. valuesclr => black,
  276. textclr => black,
  277. transparent => 1,
  278. title => $title,
  279. dclrs => [ qw(gold red green) ],
  280. ) or warn $mygraph->error;
  281. }
  282. if($_opt_bars) {
  283. $mygraph->set(
  284. fgclr => black ,
  285. labelclr => black,
  286. axislabelclr => black,
  287. legendclr => black,
  288. valuesclr => black,
  289. textclr => black,
  290. transparent => 1,
  291. overwrite => 0,
  292. bargroup_spacing => 10,
  293. # show the values for each bar in integer format separated 10 pixels from the top of the bar
  294. show_values => 1,
  295. values_format => sub { return sprintf("\%d", shift); } ,
  296. values_space => 10,
  297. x_label => $x_label,
  298. y_label => $y_label,
  299. title => $title,
  300. dclrs => [ qw(gold red green) ],
  301. ) or warn $mygraph->error;
  302. }
  303. my $myimage = $mygraph->plot(\@data) or warn $mygraph->error;
  304. open (IMG, '>' , $fileName);
  305. binmode IMG;
  306. print IMG $myimage->png;
  307. close (IMG);
  308. }
  309. # get all files recursively from a filePath ($path)
  310. sub getAllFiles {
  311. my $path = $_[0];
  312. opendir (DIR, $path) or warn "can't open $path\n";
  313. my @files =
  314. map { $path . '/' . $_ }
  315. grep { !/^\.{1,2}$/ }
  316. readdir (DIR);
  317. closedir(DIR);
  318. return
  319. map {
  320. if((-d $_) && (-r $_)) {
  321. getAllFiles ($_);
  322. } elsif((-r $_) && (-T $_)) {
  323. $_;
  324. }
  325. }
  326. @files;
  327. }
  328. # get all files with a certain extension ($ext)
  329. sub getFiles {
  330. my $ext = $_[0];
  331. return grep { /\.$ext$/ } @_files;
  332. }