report.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #
  2. # Metrix++, Copyright 2009-2019, Metrix++ Project
  3. # Link: https://github.com/metrixplusplus/metrixplusplus
  4. #
  5. # This file is a part of Metrix++ Tool.
  6. #
  7. import logging
  8. import re
  9. import os
  10. import pytablewriter
  11. import mpp.api
  12. import mpp.utils
  13. import mpp.cout
  14. DIGIT_COUNT = 8
  15. class Plugin(mpp.api.Plugin, mpp.api.IConfigurable, mpp.api.IRunable):
  16. def declare_configuration(self, parser):
  17. self.parser = parser
  18. parser.add_option("--output-dir", "--od", default='./metrixpp/',
  19. help="Set the output folder. [default: %default].")
  20. parser.add_option("--format", "--ft", default='txt', choices=['txt', 'md', 'html', 'rst', 'latex', 'xlsx', 'doxygen'],
  21. help="Format of the output data. "
  22. "Possible values are 'txt', 'md', 'html', 'rst', 'latex', 'xlsx' or 'doxygen' [default: %default]")
  23. def configure(self, options):
  24. self.out_dir = options.__dict__['output_dir']
  25. self.out_format = options.__dict__['format']
  26. def initialize(self):
  27. super(Plugin, self).initialize()
  28. def run(self, args):
  29. return main(self, args)
  30. def loadSubdirs(loader, path, subdirs, subfiles):
  31. aggregated_data = loader.load_aggregated_data(path)
  32. if not aggregated_data:
  33. return subdirs, subfiles
  34. for subfile in aggregated_data.get_subfiles():
  35. subfiles.append(aggregated_data.path + "/" + subfile)
  36. for subdir in aggregated_data.get_subdirs():
  37. subdir = aggregated_data.path + "/" + subdir
  38. subdirs.append(subdir)
  39. subdirs, subfiles = loadSubdirs(loader, subdir, subdirs, subfiles)
  40. return subdirs, subfiles
  41. def main(plugin, args):
  42. exit_code = 0
  43. data = {"fileMetrixList" : {},
  44. "regionMetrixList" : [],
  45. "files" : []}
  46. loader_prev = plugin.get_plugin('mpp.dbf').get_loader_prev()
  47. loader = plugin.get_plugin('mpp.dbf').get_loader()
  48. paths = None
  49. if len(args) == 0:
  50. subdirs, paths = loadSubdirs(loader, ".", [], [])
  51. else:
  52. paths = args
  53. for path in paths:
  54. path = mpp.utils.preprocess_path(path)
  55. aggregated_data = loader.load_aggregated_data(path)
  56. file_data = loader.load_file_data(path)
  57. for namespace in aggregated_data.iterate_namespaces():
  58. for field in aggregated_data.iterate_fields(namespace):
  59. print(field)
  60. for key in aggregated_data.data:
  61. if not key in data["fileMetrixList"]:
  62. metric = { "name" : key,
  63. "submetrics" : []}
  64. data["fileMetrixList"][key] = metric
  65. for subkey in aggregated_data.data[key]:
  66. if not subkey in data["fileMetrixList"][key]:
  67. data["fileMetrixList"][key]["submetrics"].append(subkey)
  68. file = {"path" : path,
  69. "file_id" : file_data.file_id,
  70. "regions" : [],
  71. "data" : aggregated_data.data}
  72. data["files"].append(file)
  73. for reg in file_data.iterate_regions():
  74. region = {"name" : reg.name,
  75. "region_id" : reg.region_id,
  76. "line_begin" : reg.line_begin,
  77. "data" : reg.get_data_tree()}
  78. file["regions"].append(region)
  79. for key in region["data"]:
  80. if not key in data["regionMetrixList"]:
  81. data["regionMetrixList"].append(key)
  82. for subkey in key:
  83. if not subkey in data["regionMetrixList"][key]:
  84. data["regionMetrixList"][key].append(subkey)
  85. writer = pytablewriter.ExcelXlsxTableWriter()
  86. writer.open("index.xlsx")
  87. writer.make_worksheet("files")
  88. writer.headers = ["file"] + data["fileMetrixList"]
  89. matrix = [];
  90. for file in data["files"]:
  91. line = []
  92. line.append("=HYPERLINK(\"#{0}!A1\",\"{0}\")".format(os.path.basename(file["path"])))
  93. for metric in data["fileMetrixList"]:
  94. if metric in file["data"]:
  95. for value in file["data"][metric].values():
  96. line.append(value["total"])
  97. break
  98. else:
  99. line.append("---")
  100. matrix.append(line)
  101. #writer.table_name = file["path"]
  102. #writer.value_matrix = matrix
  103. #writer.write_table()
  104. #writer = pytablewriter.ExcelXlsxTableWriter()
  105. writer.headers = ["file", "line", "name"] + data["regionMetrixList"]
  106. for file in data["files"]:
  107. writer.make_worksheet(os.path.basename(file["path"]))
  108. matrix = [];
  109. for region in file["regions"]:
  110. line = []
  111. line.append(file["path"])
  112. line.append(str(region["line_begin"]))
  113. line.append(region["name"])
  114. for metric in data["regionMetrixList"]:
  115. if metric in region["data"]:
  116. for value in region["data"][metric].values():
  117. line.append(str(value))
  118. break
  119. else:
  120. line.append("---")
  121. matrix.append(line)
  122. writer.table_name = file["path"]
  123. writer.value_matrix = matrix
  124. writer.write_table()
  125. writer.close()
  126. return exit_code