"""Command line interface."""
import argparse
import os
import shutil
import sys
import tactus
from tactus.__main__ import main
from tactus.logs import logger
import surfexp
[docs]def pysfxexp(argv=None):
"""Set up surfExp configuration.
Args:
argv (list, optional): Command arguments. Defaults to None.
"""
if argv is None:
argv = sys.argv[1:]
parser = argparse.ArgumentParser()
parser.add_argument(
"-o", "--output", dest="output", help="Output configuration file", required=True
)
parser.add_argument(
"--case-name",
dest="case_name",
help="Name of case/suite you want to run",
required=True,
)
parser.add_argument(
"--plugin-home",
dest="plugin_home",
help="Path to plugin home directory where surfexp is located",
required=True,
)
parser.add_argument(
"--start-time",
dest="start_time",
type=str,
help="ISO start time",
default=None,
required=False,
)
parser.add_argument(
"--end-time",
dest="end_time",
type=str,
help="ISO end time",
default=None,
required=False,
)
parser.add_argument(
"--troika-command",
dest="troika_command",
type=str,
help="Troika command",
default=None,
required=False,
)
parser.add_argument(
"--start-suite",
dest="start_suite",
action="store_true",
help="Start suite",
default=False,
required=False,
)
parser.add_argument(
"--continue",
dest="continue_mode",
action="store_true",
help="Disable prep and continue run",
default=False,
required=False,
)
parser.add_argument(
"args", help="Optional extra input configuration files", nargs="*"
)
args = parser.parse_args(argv)
output = args.output
case_name = args.case_name
plugin_home = args.plugin_home
start_time = args.start_time
end_time = args.end_time
start_suite = args.start_suite
continue_mode = args.continue_mode
troika_command = args.troika_command
args = args.args
tactus_path = tactus.__path__[0]
surfexp_path = surfexp.__path__[0]
tmp_output = f"{output}.tmp.{os.getpid()}.toml"
tmp_mods_output = f"{output}.mods.tmp.{os.getpid()}.toml"
argv = [
"case",
"--case-name",
case_name,
"--config-file",
f"{tactus_path}/data/config_files/config.toml",
"--config-data-dir",
f"{surfexp_path}/data/config/",
"--output",
tmp_output,
f"{surfexp_path}/data/surfexp.toml",
]
if troika_command is None:
troika_command = shutil.which("troika")
with open(tmp_mods_output, mode="w", encoding="utf8") as fhandler:
if start_time is not None or end_time is not None:
fhandler.write("[general.times]\n")
if start_time is not None:
fhandler.write(f' start = "{start_time}"\n')
if end_time is not None:
fhandler.write(f' end = "{end_time}"\n')
if troika_command != "":
fhandler.write("[troika]\n")
fhandler.write(f" troika = '{troika_command}'\n")
if continue_mode:
fhandler.write("[suite_control]\n")
fhandler.write(" do_prep = false\n")
argv += args
argv.append(tmp_mods_output)
cmd = " ".join(argv)
logger.info("tactus case command: tactus {}", cmd)
main(argv=argv)
with open(tmp_output, mode="r", encoding="utf8") as fhandler_in, open(
output, mode="w", encoding="utf8"
) as fhandler_out:
for lline in fhandler_in.readlines():
line = lline.replace("@PLUGIN_HOME@", plugin_home)
fhandler_out.write(line)
os.remove(tmp_output)
if os.path.exists(tmp_mods_output):
os.remove(tmp_mods_output)
if start_suite:
argv = ["start", "suite", "--config-file", output]
cmd = " ".join(argv)
main(argv=argv)