diff --git a/main.py b/main.py index 87f489c4..7598e75c 100644 --- a/main.py +++ b/main.py @@ -28,6 +28,15 @@ "ignore", category=UserWarning, message=".*Connecting to.*verify_certs=False.*" ) + +def build_viz_output_file( + output_base_path: str, test_name: str, run_type: str = "" +) -> str: + """Build the output path for a visualization HTML file.""" + suffix = f"_{run_type}" if run_type else "" + return f"{output_base_path}_{test_name}{suffix}_viz.html" + + class Dictionary(click.ParamType): """Class to define a custom click type for dictionaries @@ -277,9 +286,17 @@ def main(**kwargs): if kwargs.get("viz"): try: output_base_path = str(Path(kwargs['save_output_path']).with_suffix('')) - all_viz_data = results.viz_data - for viz_data in all_viz_data: - generate_test_html(viz_data, output_base_path) + for viz_data in results.viz_data: + run_type = "periodic" if is_pull else "" + output_file = build_viz_output_file( + output_base_path, viz_data.test_name, run_type + ) + generate_test_html(viz_data, output_file) + for viz_data in results_pull.viz_data: + output_file = build_viz_output_file( + output_base_path, viz_data.test_name, "pull" + ) + generate_test_html(viz_data, output_file) except Exception as e: # pylint: disable=broad-except logger.warning("Visualization generation failed: %s", e) diff --git a/orion/run_test.py b/orion/run_test.py index f8a8d1f3..03dd28ca 100644 --- a/orion/run_test.py +++ b/orion/run_test.py @@ -83,6 +83,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: result_output_pull, regression_flag_pull, regression_data_pull = {}, False, [] average_values_df_pull, average_values_df = "", "" all_viz_data = [] + all_viz_data_pull = [] pr = 0 for test in config["tests"]: # Create fingerprint Matcher @@ -114,7 +115,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: regression_data = periodic_result.regression_data average_values_df = periodic_result.average_values if pull_result.viz_data is not None: - all_viz_data.append(pull_result.viz_data) + all_viz_data_pull.append(pull_result.viz_data) if periodic_result.viz_data is not None: all_viz_data.append(periodic_result.viz_data) else: @@ -129,7 +130,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: regression_data=regression_data_pull, average_values=average_values_df_pull, pr=pr, - viz_data=[], + viz_data=all_viz_data_pull, ) results = TestResults( output=result_output, diff --git a/orion/visualization.py b/orion/visualization.py index 714ed75d..510531fe 100644 --- a/orion/visualization.py +++ b/orion/visualization.py @@ -14,7 +14,7 @@ from orion.logger import SingletonLogger -class VizData: # pylint: disable=too-few-public-methods +class VizData: # pylint: disable=too-few-public-methods,too-many-instance-attributes """Container for all data needed to visualize one test's results.""" def __init__( @@ -386,12 +386,12 @@ def _sort_key(m): return fig -def generate_test_html(viz_data: VizData, output_base_path: str) -> str: +def generate_test_html(viz_data: VizData, output_file: str) -> str: """Generate a self-contained HTML file for one test. Args: viz_data: VizData container with all needed data. - output_base_path: Base path for output files (without extension). + output_file: Full output path for the generated HTML file. Returns: str: Path to the generated HTML file. @@ -399,7 +399,6 @@ def generate_test_html(viz_data: VizData, output_base_path: str) -> str: logger = SingletonLogger.get_logger("Orion") fig = _build_test_figure(viz_data) - output_file = f"{output_base_path}_{viz_data.test_name}_viz.html" fig.write_html( output_file, include_plotlyjs="cdn", full_html=True, default_width="100%",