def _print_plugins_profiling_info(self, top_n: int) -> None: assert log is not None stats = Plugins.instance().get_stats() if stats is None: return items = list(stats.modules_import_time.items()) # hide anything that took less than 5ms filtered = filter(lambda x: x[1] > 0.0005, items) sorted_items = sorted(filtered, key=lambda x: x[1], reverse=True) top_n = max(len(sorted_items), top_n) box: List[List[str]] = [["Module", "Sec"]] for item in sorted_items[0:top_n]: box.append([item[0], f"{item[1]:.3f}"]) padding = get_column_widths(box) log.debug("") self._log_header(header="Profiling information", filler="*") self._log_header( header=f"Total plugins scan time : {stats.total_time:.3f} seconds", filler="-", ) header = f"| {box[0][0].ljust(padding[0])} | {box[0][1].ljust(padding[1])} |" self._log_header(header=header, filler="-") del box[0] for row in box: a = row[0].ljust(padding[0]) b = row[1].ljust(padding[1]) log.debug(f"| {a} | {b} |") self._log_footer(header=header, filler="-")
def _print_search_path(self, config_name: Optional[str], overrides: List[str]) -> None: assert log is not None log.debug("") self._log_header(header="Config search path", filler="*") box: List[List[str]] = [["Provider", "Search path"]] cfg = self.compose_config( config_name=config_name, overrides=overrides, run_mode=RunMode.RUN, with_log_configuration=False, ) HydraConfig.instance().set_config(cfg) cfg = self.get_sanitized_cfg(cfg, cfg_type="hydra") sources = cfg.hydra.runtime.config_sources for sp in sources: box.append([sp.provider, f"{sp.schema}://{sp.path}"]) provider_pad, search_path_pad = get_column_widths(box) header = "| {} | {} |".format("Provider".ljust(provider_pad), "Search path".ljust(search_path_pad)) self._log_header(header=header, filler="-") for source in sources: log.debug("| {} | {} |".format( source.provider.ljust(provider_pad), f"{source.schema}://{source.path}".ljust(search_path_pad), )) self._log_footer(header=header, filler="-")
def _print_search_path(self) -> None: assert log is not None log.debug("") self._log_header(header="Config search path", filler="*") box: List[List[str]] = [["Provider", "Search path"]] for sp in self.config_loader.get_sources(): box.append([sp.provider, sp.full_path()]) provider_pad, search_path_pad = get_column_widths(box) self._log_header( "| {} | {} |".format( "Provider".ljust(provider_pad), "Search path".ljust(search_path_pad) ), filler="-", ) for source in self.config_loader.get_sources(): log.debug( "| {} | {} |".format( source.provider.ljust(provider_pad), source.full_path().ljust(search_path_pad), ) )
def _print_defaults_list( self, config_name: Optional[str], overrides: List[str] ) -> None: assert log is not None defaults = self.config_loader.compute_defaults_list( config_name=config_name, overrides=overrides, run_mode=RunMode.RUN, ) box: List[List[str]] = [ [ "Config path", "Package", "_self_", "Parent", ] ] for d in defaults.defaults: row = [ d.config_path, d.package, "True" if d.is_self else "False", d.parent, ] row = [x if x is not None else "" for x in row] box.append(row) padding = get_column_widths(box) del box[0] log.debug("") self._log_header("Defaults List", filler="*") header = "| {} | {} | {} | {} | ".format( "Config path".ljust(padding[0]), "Package".ljust(padding[1]), "_self_".ljust(padding[2]), "Parent".ljust(padding[3]), ) self._log_header(header=header, filler="-") for row in box: log.debug( "| {} | {} | {} | {} |".format( row[0].ljust(padding[0]), row[1].ljust(padding[1]), row[2].ljust(padding[2]), row[3].ljust(padding[3]), ) ) self._log_footer(header=header, filler="-")
def _print_composition_trace(self, cfg: DictConfig) -> None: # Print configurations used to compose the config object assert log is not None log.debug("") self._log_header("Composition trace", filler="*") box: List[List[str]] = [[ "Config group", "Config name", "Search path", "Provider", "Schema provider", ]] composition_trace = [ LoadTrace(**x) for x in cfg.hydra.composition_trace ] for trace in composition_trace: box.append([ trace.config_group if trace.config_group is not None else "", trace.config_name if trace.config_name is not None else "", trace.search_path if trace.search_path is not None else "", trace.provider if trace.provider is not None else "", trace.schema_provider if trace.schema_provider is not None else "", ]) padding = get_column_widths(box) del box[0] header = "| {} | {} | {} | {} | {} |".format( "Config group".ljust(padding[0]), "Config name".ljust(padding[1]), "Search path".ljust(padding[2]), "Provider".ljust(padding[3]), "Schema provider".ljust(padding[4]), ) self._log_header(header=header, filler="-") for row in box: log.debug("| {} | {} | {} | {} | {} |".format( row[0].ljust(padding[0]), row[1].ljust(padding[1]), row[2].ljust(padding[2]), row[3].ljust(padding[3]), row[4].ljust(padding[4]), )) self._log_footer(header=header, filler="-")
def _print_composition_trace(self) -> None: # Print configurations used to compose the config object assert log is not None log.debug("") self._log_header("Composition trace", filler="*") box: List[List[str]] = [ ["Config name", "Search path", "Provider", "Schema provider"] ] for trace in self.config_loader.get_load_history(): box.append( [ trace.filename, trace.path if trace.path is not None else "", trace.provider if trace.provider is not None else "", trace.schema_provider if trace.schema_provider is not None else "", ] ) padding = get_column_widths(box) del box[0] self._log_header( "| {} | {} | {} | {} |".format( "Config name".ljust(padding[0]), "Search path".ljust(padding[1]), "Provider".ljust(padding[2]), "Schema provider".ljust(padding[3]), ), filler="-", ) for row in box: log.debug( "| {} | {} | {} | {} |".format( row[0].ljust(padding[0]), row[1].ljust(padding[1]), row[2].ljust(padding[2]), row[3].ljust(padding[3]), ) )
def test_get_column_widths(matrix: Any, expected: Any) -> None: assert utils.get_column_widths(matrix) == expected