report.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 loadSubdirs(self, loader, path, subdirs, subfiles):
  29. aggregated_data = loader.load_aggregated_data(path)
  30. if not aggregated_data:
  31. return subdirs, subfiles
  32. for subfile in aggregated_data.get_subfiles():
  33. subfiles.append(aggregated_data.path + "/" + subfile)
  34. for subdir in aggregated_data.get_subdirs():
  35. subdir = aggregated_data.path + "/" + subdir
  36. subdirs.append(subdir)
  37. subdirs, subfiles = self.loadSubdirs(loader, subdir, subdirs, subfiles)
  38. return subdirs, subfiles
  39. def create_doxygen_report(self, paths, output_dir, data, loader, loader_prev):
  40. exit_code = 1
  41. if output_dir:
  42. os.makedirs(output_dir, exist_ok=True)
  43. with open(os.path.join(output_dir, "metrixpp.dox"), mode="w+") as file:
  44. file.write("/* this file is autogenerated by metrixpp - changes will be overwritten */\n")
  45. file.write("/*!\n")
  46. for path in paths:
  47. for region in data[path]["matrix"]:
  48. if region[0] != "-" and region[0] != "__global__":
  49. region[0] = "#" + region[0]
  50. file.write("\\file {}\n".format(path))
  51. writer = pytablewriter.MarkdownTableWriter()
  52. writer.table_name = "metrics"
  53. writer.headers = data[path]["fields"]
  54. writer.value_matrix = data[path]["matrix"]
  55. writer.stream = file
  56. writer.write_table()
  57. file.write("\n\n")
  58. file.write("*/\n")
  59. exit_code = 0
  60. else:
  61. logging.error("no output directory set")
  62. return exit_code
  63. def run(self, args):
  64. exit_code = 0
  65. data = {}
  66. loader_prev = self.get_plugin('mpp.dbf').get_loader_prev()
  67. loader = self.get_plugin('mpp.dbf').get_loader()
  68. paths = None
  69. if len(args) == 0:
  70. subdirs, paths = self.loadSubdirs(loader, ".", [], [])
  71. else:
  72. paths = args
  73. for path in paths:
  74. path = mpp.utils.preprocess_path(path)
  75. fields = ["region"]
  76. data[path] = {}
  77. data[path]["matrix"] = [["-"]]
  78. for file_data in loader.iterate_file_data(path):
  79. file_data.load_regions()
  80. for region in file_data.regions:
  81. data[path]["matrix"].append([region.name])
  82. aggregated_data = loader.load_aggregated_data(path)
  83. file_data = loader.load_file_data(path)
  84. for (i, namespace) in enumerate(aggregated_data.iterate_namespaces()):
  85. for field in aggregated_data.iterate_fields(namespace):
  86. fields.append(namespace + "." + str(field[0]))
  87. selected_data = loader.load_selected_data(namespace,
  88. fields = [field[0]],
  89. path=path)
  90. # append file information - not in a region
  91. for select_data in selected_data:
  92. if not select_data.get_region():
  93. data[path]["matrix"][0].append(select_data.get_data(namespace, field[0]))
  94. break;
  95. else:
  96. data[path]["matrix"][0].append("-")
  97. # append region data if any
  98. for region in data[path]["matrix"][1:]:
  99. for select_data in selected_data:
  100. if region == select_data.get_region():
  101. data[path]["matrix"][select_data.get_region().get_id()].append(select_data.get_data(namespace, field[0]))
  102. break
  103. else:
  104. region.append("-")
  105. data[path]["fields"] = fields
  106. if self.out_format == "doxygen":
  107. exit_code = self.create_doxygen_report(paths,
  108. self.out_dir,
  109. data,
  110. loader,
  111. loader_prev)
  112. else:
  113. logging.error("unknown or no output format set")
  114. exit_code = 1
  115. # should default to simple text i guess
  116. return exit_code