# # Metrix++, Copyright 2009-2019, Metrix++ Project # Link: https://github.com/metrixplusplus/metrixplusplus # # This file is a part of Metrix++ Tool. # import logging import re import os import pytablewriter import mpp.api import mpp.utils import mpp.cout DIGIT_COUNT = 8 class Plugin(mpp.api.Plugin, mpp.api.IConfigurable, mpp.api.IRunable): def declare_configuration(self, parser): self.parser = parser parser.add_option("--output-dir", "--od", default='./metrixpp/', help="Set the output folder. [default: %default].") parser.add_option("--format", "--ft", default='txt', choices=['txt', 'md', 'html', 'rst', 'latex', 'xlsx', 'doxygen'], help="Format of the output data. " "Possible values are 'txt', 'md', 'html', 'rst', 'latex', 'xlsx' or 'doxygen' [default: %default]") def configure(self, options): self.out_dir = options.__dict__['output_dir'] self.out_format = options.__dict__['format'] def initialize(self): super(Plugin, self).initialize() def loadSubdirs(self, loader, path, subdirs, subfiles): aggregated_data = loader.load_aggregated_data(path) if not aggregated_data: return subdirs, subfiles for subfile in aggregated_data.get_subfiles(): subfiles.append(aggregated_data.path + "/" + subfile) for subdir in aggregated_data.get_subdirs(): subdir = aggregated_data.path + "/" + subdir subdirs.append(subdir) subdirs, subfiles = self.loadSubdirs(loader, subdir, subdirs, subfiles) return subdirs, subfiles def create_doxygen_report(self, paths, output_dir, data, loader, loader_prev): exit_code = 1 if output_dir: os.makedirs(output_dir, exist_ok=True) with open(os.path.join(output_dir, "metrixpp.dox"), mode="w+") as file: file.write("/* this file is autogenerated by metrixpp - changes will be overwritten */\n") file.write("/*!\n") for path in paths: for region in data[path]["matrix"]: if region[0] != "-" and region[0] != "__global__": region[0] = "#" + region[0] file.write("\\file {}\n".format(path)) writer = pytablewriter.MarkdownTableWriter() writer.table_name = "metrics" writer.headers = data[path]["fields"] writer.value_matrix = data[path]["matrix"] writer.stream = file writer.write_table() file.write("\n\n") file.write("*/\n") exit_code = 0 else: logging.error("no output directory set") return exit_code def run(self, args): exit_code = 0 data = {} loader_prev = self.get_plugin('mpp.dbf').get_loader_prev() loader = self.get_plugin('mpp.dbf').get_loader() paths = None if len(args) == 0: subdirs, paths = self.loadSubdirs(loader, ".", [], []) else: paths = args for path in paths: path = mpp.utils.preprocess_path(path) fields = ["region"] data[path] = {} data[path]["matrix"] = [["-"]] for file_data in loader.iterate_file_data(path): file_data.load_regions() for region in file_data.regions: data[path]["matrix"].append([region.name]) aggregated_data = loader.load_aggregated_data(path) file_data = loader.load_file_data(path) for (i, namespace) in enumerate(aggregated_data.iterate_namespaces()): for field in aggregated_data.iterate_fields(namespace): fields.append(namespace + "." + str(field[0])) selected_data = loader.load_selected_data(namespace, fields = [field[0]], path=path) # append file information - not in a region for select_data in selected_data: if not select_data.get_region(): data[path]["matrix"][0].append(select_data.get_data(namespace, field[0])) break; else: data[path]["matrix"][0].append("-") # append region data if any for region in data[path]["matrix"][1:]: for select_data in selected_data: if region == select_data.get_region(): data[path]["matrix"][select_data.get_region().get_id()].append(select_data.get_data(namespace, field[0])) break else: region.append("-") data[path]["fields"] = fields if self.out_format == "doxygen": exit_code = self.create_doxygen_report(paths, self.out_dir, data, loader, loader_prev) else: logging.error("unknown or no output format set") exit_code = 1 # should default to simple text i guess return exit_code