Spaces:
Sleeping
Sleeping
| # Copyright (c) Meta Platforms, Inc. and affiliates. | |
| # All rights reserved. | |
| # | |
| # This source code is licensed under the BSD-style license found in the | |
| # LICENSE file in the root directory of this source tree. | |
| """ | |
| OpenEnv validate command. | |
| This module provides the 'openenv validate' command to check if environments | |
| are properly configured for multi-mode deployment. | |
| """ | |
| from pathlib import Path | |
| import typer | |
| from openenv.cli._validation import ( | |
| format_validation_report, | |
| get_deployment_modes, | |
| validate_multi_mode_deployment, | |
| ) | |
| def validate( | |
| env_path: str | None = typer.Argument( | |
| None, help="Path to the environment directory (default: current directory)" | |
| ), | |
| verbose: bool = typer.Option( | |
| False, "--verbose", "-v", help="Show detailed information" | |
| ), | |
| ) -> None: | |
| """ | |
| Validate an environment for standardized structure and deployment readiness. | |
| This command checks if an environment is properly configured with: | |
| - Required files (pyproject.toml, openenv.yaml, server/app.py, etc.) | |
| - Docker deployment support | |
| - uv run server capability | |
| - python -m module execution | |
| Examples: | |
| # Validate current directory (recommended) | |
| $ cd my_env | |
| $ openenv validate | |
| # Validate with detailed output | |
| $ openenv validate --verbose | |
| # Validate specific environment | |
| $ openenv validate envs/echo_env | |
| """ | |
| # Determine environment path (default to current directory) | |
| if env_path is None: | |
| env_path_obj = Path.cwd() | |
| else: | |
| env_path_obj = Path(env_path) | |
| if not env_path_obj.exists(): | |
| typer.echo(f"Error: Path does not exist: {env_path_obj}", err=True) | |
| raise typer.Exit(1) | |
| if not env_path_obj.is_dir(): | |
| typer.echo(f"Error: Path is not a directory: {env_path_obj}", err=True) | |
| raise typer.Exit(1) | |
| # Check for openenv.yaml to confirm this is an environment directory | |
| openenv_yaml = env_path_obj / "openenv.yaml" | |
| if not openenv_yaml.exists(): | |
| typer.echo( | |
| f"Error: Not an OpenEnv environment directory (missing openenv.yaml): {env_path_obj}", | |
| err=True, | |
| ) | |
| typer.echo( | |
| "Hint: Run this command from the environment root directory or specify the path", | |
| err=True, | |
| ) | |
| raise typer.Exit(1) | |
| env_name = env_path_obj.name | |
| if env_name.endswith("_env"): | |
| base_name = env_name[:-4] | |
| else: | |
| base_name = env_name | |
| # Run validation | |
| is_valid, issues = validate_multi_mode_deployment(env_path_obj) | |
| # Show validation report | |
| report = format_validation_report(base_name, is_valid, issues) | |
| typer.echo(report) | |
| # Show deployment modes if verbose | |
| if verbose: | |
| typer.echo("\nSupported deployment modes:") | |
| modes = get_deployment_modes(env_path_obj) | |
| for mode, supported in modes.items(): | |
| status = "[YES]" if supported else "[NO]" | |
| typer.echo(f" {status} {mode}") | |
| if is_valid: | |
| typer.echo("\nUsage examples:") | |
| typer.echo(f" cd {env_path_obj.name} && uv run server") | |
| typer.echo(f" cd {env_path_obj.name} && openenv build") | |
| typer.echo(f" cd {env_path_obj.name} && openenv push") | |
| if not is_valid: | |
| raise typer.Exit(1) | |