From c6879d4aec56a56186c4d75c618367d2c47c6260 Mon Sep 17 00:00:00 2001 From: lucaeg Date: Wed, 8 Oct 2025 18:42:59 +0200 Subject: [PATCH 1/6] Rewrite --help message --- src/semeio/fmudesign/fmudesignrunner.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/semeio/fmudesign/fmudesignrunner.py b/src/semeio/fmudesign/fmudesignrunner.py index b612074e4..4fcdc47ea 100644 --- a/src/semeio/fmudesign/fmudesignrunner.py +++ b/src/semeio/fmudesign/fmudesignrunner.py @@ -10,36 +10,47 @@ def get_parser() -> ArgumentParser: parser = argparse.ArgumentParser( - description="Generate design matrix to be used with ert DESIGN2PARAMS", - formatter_class=argparse.ArgumentDefaultsHelpFormatter, + description="Generate design matrix to be used with ERT", + epilog=( + "Example usage:\n" + " fmudesign input_config_example.xlsx \n" + " fmudesign input_config_example.xlsx output_example.xlsx \n\n" + "For more information, refer to the documentation at https://equinor.github.io/fmu-tools/fmudesign.html." + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + add_help=False, ) parser.add_argument( - "config", type=str, help="Input design config filename in Excel format" + "-h", "--help", action="help", help="Show this help message and exit" + ) + + parser.add_argument( + "config", type=str, help="Input design matrix filename in Excel format" ) parser.add_argument( "destination", type=str, nargs="?", - help="Destination filename for design matrix", + help="Destination filename for design matrix (default: generateddesignmatrix.xlsx)", default="generateddesignmatrix.xlsx", ) parser.add_argument( "--designinput", type=str, - help="Alternative sheetname for the worksheet designinput", + help="Alternative sheetname for the worksheet designinput (default: designinput)", default="designinput", ) parser.add_argument( "--defaultvalues", type=str, - help="Alternative sheetname for worksheet defaultvalues", + help="Alternative sheetname for worksheet defaultvalues (default: defaultvalues)", default="defaultvalues", ) parser.add_argument( "--general_input", type=str, - help="Alternative sheetname for the worksheet general_input", + help="Alternative sheetname for the worksheet general_input (default: general_input)", default="general_input", ) From 200a373f85332e6f39ce4a2bead0fd3e1fac0091 Mon Sep 17 00:00:00 2001 From: lucaeg Date: Wed, 8 Oct 2025 18:45:17 +0200 Subject: [PATCH 2/6] Refactor main function --- src/semeio/fmudesign/fmudesignrunner.py | 47 +++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/semeio/fmudesign/fmudesignrunner.py b/src/semeio/fmudesign/fmudesignrunner.py index 4fcdc47ea..570fd692e 100644 --- a/src/semeio/fmudesign/fmudesignrunner.py +++ b/src/semeio/fmudesign/fmudesignrunner.py @@ -2,7 +2,7 @@ import argparse import warnings -from argparse import ArgumentParser +from argparse import ArgumentParser, Namespace from pathlib import Path from semeio.fmudesign import DesignMatrix, excel2dict_design @@ -58,23 +58,15 @@ def get_parser() -> ArgumentParser: "-v", "--verbose", action="count", + help="Verbosity of terminal output and plotting", default=0, - help="Verbosity of terminal output and plotting.", ) return parser -def main() -> None: - """semeio.fmudesign is a command line utility for generating design matrices - - Wrapper for the the semeio.fmudesign module""" - warnings.filterwarnings("ignore", category=DeprecationWarning) - warnings.filterwarnings("ignore", category=FutureWarning) - - parser = get_parser() +def validate_args(parser: ArgumentParser) -> None: args = parser.parse_args() - for sheet in ["designinput", "defaultvalues", "general_input"]: default = parser.get_default(sheet) custom = getattr(args, sheet) @@ -83,7 +75,14 @@ def main() -> None: if not Path(args.config).is_file(): raise OSError(f"Input file {args.config} does not exist") + if args.config == args.destination: + raise OSError( + f'Identical name "{args.config}" have been provided for the input' + "file and the output file" + ) + +def generate_design_matrix(args: Namespace) -> None: input_dict = excel2dict_design( args.config, gen_input_sheet=args.general_input, @@ -91,21 +90,33 @@ def main() -> None: default_val_sheet=args.defaultvalues, ) - if args.config == args.destination: - raise OSError( - f'Identical name "{args.config}" have been provided for the input' - "file and the output file. " - ) - # If destination is 'analysis/generateddesignmatrix.xlsx', then plots # will be saved to 'analysis/generateddesignmatrix//.png' output_dir = Path(args.destination).parent / Path(args.destination).stem design = DesignMatrix(verbosity=args.verbose, output_dir=output_dir) design.generate(input_dict) - design.to_xlsx(args.destination) +def main() -> None: + """semeio.fmudesign is a command line utility for generating design matrices + + Wrapper for the the semeio.fmudesign module""" + warnings.filterwarnings("ignore", category=DeprecationWarning) + warnings.filterwarnings("ignore", category=FutureWarning) + + parser = get_parser() + args = parser.parse_args() + + validate_args(parser) + generate_design_matrix(args) + + print( + "Thank you for using fmudesign, if you find any bugs or have any feature requests, please create an issue at " + "https://github.com/equinor/semeio/issues" + ) + + if __name__ == "__main__": main() From a756cbd2014c8ba0a7e13c01de76df98103b0fbb Mon Sep 17 00:00:00 2001 From: lucaeg Date: Wed, 8 Oct 2025 18:46:17 +0200 Subject: [PATCH 3/6] Edit test function Edit test_designmatrix to be compatible with the new output format. --- tests/fmudesign/test_designmatrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fmudesign/test_designmatrix.py b/tests/fmudesign/test_designmatrix.py index dfd0c3239..501725ac2 100644 --- a/tests/fmudesign/test_designmatrix.py +++ b/tests/fmudesign/test_designmatrix.py @@ -115,7 +115,8 @@ def test_endpoint(tmpdir, monkeypatch): Provided number of background values (11) is smaller than number of realisations for sensitivity ('sens7', 'p10_p90') and parameter PARAM15. Will be filled with default values. Provided number of background values (11) is smaller than number of realisations for sensitivity ('sens7', 'p10_p90') and parameter PARAM16. Will be filled with default values. A total of 91 realizations were generated - Designmatrix written to generateddesignmatrix.xlsx""" + Designmatrix written to generateddesignmatrix.xlsx + Thank you for using fmudesign, if you find any bugs or have any feature requests, please create an issue at https://github.com/equinor/semeio/issues""" assert result.stdout.split() == expected_output.split() assert Path("generateddesignmatrix.xlsx").exists # Default output file From 11c03b9c7531b10a99e5b2eb96da27521986ae9e Mon Sep 17 00:00:00 2001 From: lucaeg Date: Wed, 8 Oct 2025 17:27:35 +0200 Subject: [PATCH 4/6] Add error message when run fails --- src/semeio/fmudesign/fmudesignrunner.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/semeio/fmudesign/fmudesignrunner.py b/src/semeio/fmudesign/fmudesignrunner.py index 570fd692e..9ef192ed2 100644 --- a/src/semeio/fmudesign/fmudesignrunner.py +++ b/src/semeio/fmudesign/fmudesignrunner.py @@ -1,6 +1,7 @@ """Script for generating a design matrix from config input""" import argparse +import traceback import warnings from argparse import ArgumentParser, Namespace from pathlib import Path @@ -108,10 +109,16 @@ def main() -> None: parser = get_parser() args = parser.parse_args() - validate_args(parser) - generate_design_matrix(args) - + try: + generate_design_matrix(args) + except Exception: + traceback.print_exc() + print( + "\n \n", + "If you think this is a bug, or have any feature requests, please create an issue at https://github.com/equinor/semeio/issues \n", + ) + return print( "Thank you for using fmudesign, if you find any bugs or have any feature requests, please create an issue at " "https://github.com/equinor/semeio/issues" From d68a33e240c39869cfa4a8e785d56e313ecf233c Mon Sep 17 00:00:00 2001 From: lucaeg Date: Thu, 9 Oct 2025 10:28:41 +0200 Subject: [PATCH 5/6] Improve messages --- src/semeio/fmudesign/fmudesignrunner.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/semeio/fmudesign/fmudesignrunner.py b/src/semeio/fmudesign/fmudesignrunner.py index 9ef192ed2..d4073661c 100644 --- a/src/semeio/fmudesign/fmudesignrunner.py +++ b/src/semeio/fmudesign/fmudesignrunner.py @@ -6,6 +6,9 @@ from argparse import ArgumentParser, Namespace from pathlib import Path +from packaging.version import Version + +import semeio from semeio.fmudesign import DesignMatrix, excel2dict_design @@ -16,7 +19,7 @@ def get_parser() -> ArgumentParser: "Example usage:\n" " fmudesign input_config_example.xlsx \n" " fmudesign input_config_example.xlsx output_example.xlsx \n\n" - "For more information, refer to the documentation at https://equinor.github.io/fmu-tools/fmudesign.html." + "For more information, refer to the documentation at https://equinor.github.io/fmu-tools/fmudesign.html" ), formatter_class=argparse.RawDescriptionHelpFormatter, add_help=False, @@ -116,12 +119,17 @@ def main() -> None: traceback.print_exc() print( "\n \n", - "If you think this is a bug, or have any feature requests, please create an issue at https://github.com/equinor/semeio/issues \n", + "fmudesign failed. Read the error message above and fix the input file. \n", + "Documentation: https://equinor.github.io/fmu-tools/fmudesign.html \n", + "Issue tracker: https://github.com/equinor/semeio/issues \n", + "If you believe this error is a bug or are unable to fix it, create an issue or contact the scout team \n", ) return print( - "Thank you for using fmudesign, if you find any bugs or have any feature requests, please create an issue at " - "https://github.com/equinor/semeio/issues" + "\n", + f"Thank you for using fmudesign {Version(semeio.__version__).base_version} \n", + "Documentation: https://equinor.github.io/fmu-tools/fmudesign.html \n", + "Issues/bugs/feature requests: https://github.com/equinor/semeio/issues \n", ) From c80a1a120f5996c20a1a92cf42bbaa1e5565adec Mon Sep 17 00:00:00 2001 From: lucaeg Date: Thu, 9 Oct 2025 10:44:51 +0200 Subject: [PATCH 6/6] Fix test_designmatrix --- tests/fmudesign/test_designmatrix.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/fmudesign/test_designmatrix.py b/tests/fmudesign/test_designmatrix.py index 501725ac2..e88fe2d9b 100644 --- a/tests/fmudesign/test_designmatrix.py +++ b/tests/fmudesign/test_designmatrix.py @@ -5,7 +5,9 @@ from pathlib import Path import pandas as pd +from packaging.version import Version +import semeio from semeio.fmudesign import DesignMatrix TESTDATA = Path(__file__).parent / "data" @@ -72,7 +74,7 @@ def test_endpoint(tmpdir, monkeypatch): ["fmudesign", str(designfile)], check=True, capture_output=True, text=True ) - expected_output = """Generating sensitivity : seed + expected_output = f"""Generating sensitivity : seed Added sensitivity : seed Generating sensitivity : faults Added sensitivity : faults @@ -116,7 +118,9 @@ def test_endpoint(tmpdir, monkeypatch): Provided number of background values (11) is smaller than number of realisations for sensitivity ('sens7', 'p10_p90') and parameter PARAM16. Will be filled with default values. A total of 91 realizations were generated Designmatrix written to generateddesignmatrix.xlsx - Thank you for using fmudesign, if you find any bugs or have any feature requests, please create an issue at https://github.com/equinor/semeio/issues""" + Thank you for using fmudesign {Version(semeio.__version__).base_version} + Documentation: https://equinor.github.io/fmu-tools/fmudesign.html + Issues/bugs/feature requests: https://github.com/equinor/semeio/issues""" assert result.stdout.split() == expected_output.split() assert Path("generateddesignmatrix.xlsx").exists # Default output file