Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 31 additions & 7 deletions src/rompy/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,17 @@ def cli(ctx):
help="YAML/JSON file with backend configuration",
)
@click.option("--dry-run", is_flag=True, help="Generate inputs only, don't run")
@click.option(
"--skip-generate",
is_flag=True,
help="Skip generation step, use existing workspace (must already exist)",
)
@add_common_options
def run(
config,
backend_config,
dry_run,
skip_generate,
verbose,
log_dir,
show_warnings,
Expand All @@ -236,36 +242,54 @@ def run(

# Run with config from environment variable
rompy run --config-from-env --backend-config unified_local_single.yml

# Use pre-generated workspace (two-step workflow)
rompy generate config.yml
rompy run config.yml --backend-config backend.yml --skip-generate
"""
configure_logging(verbose, log_dir, simple_logs, ascii_only, show_warnings)

# Validate config source
if skip_generate and dry_run:
raise click.UsageError("Cannot use --skip-generate with --dry-run")

if config_from_env and config:
raise click.UsageError("Cannot specify both config file and --config-from-env")
if not config_from_env and not config:
raise click.UsageError("Must specify either config file or --config-from-env")

try:
# Load model configuration
config_data = load_config(config, from_env=config_from_env)
model_run = ModelRun(**config_data)

logger.info(f"Running model: {model_run.config.model_type}")
logger.info(f"Run ID: {model_run.run_id}")

# Load backend configuration
backend_cfg = _load_backend_config(backend_config)

# Generate inputs
start_time = datetime.now()
staging_dir = model_run.generate()
logger.info(f"Inputs generated in: {staging_dir}")

if skip_generate:
staging_dir = str(model_run.staging_dir)
staging_path = Path(staging_dir)
if not staging_path.exists():
raise click.UsageError(
f"Workspace does not exist: {staging_dir}\n"
f"Run 'rompy generate {config or '<config>'}' first or remove --skip-generate"
)
if not list(staging_path.glob("*")):
raise click.UsageError(
f"Workspace exists but is empty: {staging_dir}\n"
f"Run 'rompy generate {config or '<config>'}' first or remove --skip-generate"
)
logger.info(f"Using existing workspace: {staging_dir}")
else:
staging_dir = model_run.generate()
logger.info(f"Inputs generated in: {staging_dir}")

if dry_run:
logger.info("Dry run mode - skipping model execution")
return

# Execute model with workspace directory to avoid double generation
success = model_run.run(backend=backend_cfg, workspace_dir=staging_dir)

elapsed = datetime.now() - start_time
Expand Down