Source code for vuegen.report_generator

"""Main API entry point for generating reports using VueGen."""

import logging
import shutil
import sys
from pathlib import Path

from .config_manager import ConfigManager
from .quarto_reportview import QuartoReportView
from .report import ReportType
from .streamlit_reportview import StreamlitReportView
from .utils import assert_enum_value, get_logger, load_yaml_config, write_yaml_config


[docs] def get_report( report_type: str, logger: logging.Logger = None, config_path: str = None, dir_path: str = None, streamlit_autorun: bool = False, quarto_checks: bool = False, output_dir: Path = None, max_depth: int = 2, # section and subsection folders ) -> tuple[str, str]: """ Generate and run a report based on the specified engine. Parameters ---------- report_type : str The report type. It should be one of the values of the ReportType Enum. logger : logging.Logger, optional A logger object to track warnings, errors, and info messages. If not provided, a default logger will be created. config_path : str, optional Path to the YAML configuration file. dir_path : str, optional Path to the directory from which to generate the configuration file. streamlit_autorun : bool, optional Whether to automatically run the Streamlit report after generation (default is False). quarto_checks : bool, optional Whether to perform checks for Quarto report generation for TeX and Chromium installation (default is False). output_dir : Path, optional The directory where the report folder will be generated. If not provided, the current directory will be used. max_depth : int, optional The maximum depth of the directory structure to consider when generating the report. The default is 2, which means it will include sections and subsections. The parater is only used when 'dir_path' is used. Raises ------ ValueError If neither 'config_path' nor 'directory' is provided. Returns ------- tuple[str, str] The path to the generated report and the path to the configuration file. """ if output_dir is None: output_dir = Path(".") else: output_dir = Path(output_dir) if output_dir.is_file(): raise ValueError( "The output_dir parameter should be a directory, not a file." ) if not output_dir.exists(): logger.info("Creating output directory: %s", output_dir) output_dir.mkdir(parents=True, exist_ok=True) # Initialize logger only if it's not provided if logger is None: _folder = "logs" if output_dir: _folder = output_dir / _folder logger, _ = get_logger("report", folder=_folder) # Create the config manager object config_manager = ConfigManager(logger, max_depth=max_depth) if dir_path: # Generate configuration from the provided directory yaml_data, _ = config_manager.create_yamlconfig_fromdir(dir_path) # yaml_data has under report a title created based on the directory name config_path = write_yaml_config(yaml_data, output_dir) logger.info("Configuration file generated at %s", config_path) # Load the YAML configuration file with the report metadata report_config = load_yaml_config(config_path) # Load report object and metadata report, _ = config_manager.initialize_report(report_config) # Validate and convert the report type to its enum value report_type = assert_enum_value(ReportType, report_type, logger) # Create and run ReportView object based on its type if report_type == ReportType.STREAMLIT: report_dir = output_dir / "streamlit_report" sections_dir = report_dir / "sections" static_files_dir = report_dir / "static" st_report = StreamlitReportView( report=report, report_type=report_type, streamlit_autorun=streamlit_autorun, static_dir=static_files_dir, sections_dir=sections_dir, ) st_report.generate_report() st_report.run_report() else: # Check if Quarto is installed if shutil.which("quarto") is None and not hasattr( sys, "_MEIPASS" ): # ? and not getattr(sys, "frozen", False) msg = ( "Quarto is not installed. Please install Quarto before generating this " "report type." ) logger.error(msg) raise RuntimeError(msg) report_dir = output_dir / "quarto_report" static_files_dir = report_dir / "static" quarto_report = QuartoReportView( report=report, report_type=report_type, quarto_checks=quarto_checks, output_dir=report_dir, static_dir=static_files_dir, ) quarto_report.generate_report() quarto_report.run_report() # ? Could be also the path to the report file for quarto based reports return report_dir, config_path