152 lines
3.5 KiB
Python
152 lines
3.5 KiB
Python
"""CLI interface for EnvSchema."""
|
|
|
|
import sys
|
|
|
|
import click
|
|
|
|
from envschema import __version__
|
|
from envschema.schema import load_schema_from_file
|
|
from envschema.core import validate_environment
|
|
from envschema.generator import generate_env_example_to_file
|
|
from envschema.formatters import format_result
|
|
|
|
|
|
@click.group()
|
|
@click.version_option(version=__version__)
|
|
def cli():
|
|
"""EnvSchema - Validate environment variables against a schema."""
|
|
pass
|
|
|
|
|
|
@cli.command()
|
|
@click.argument("schema", type=click.Path(exists=True))
|
|
@click.option(
|
|
"--file",
|
|
"-f",
|
|
"env_file",
|
|
type=click.Path(),
|
|
help="Path to .env file to validate",
|
|
)
|
|
@click.option(
|
|
"--env/--no-env",
|
|
default=True,
|
|
help="Include os.environ in validation",
|
|
)
|
|
@click.option(
|
|
"--format",
|
|
"-o",
|
|
"output_format",
|
|
type=click.Choice(["text", "json"]),
|
|
default="text",
|
|
help="Output format",
|
|
)
|
|
@click.option(
|
|
"--ci",
|
|
is_flag=True,
|
|
help="CI mode (cleaner output)",
|
|
)
|
|
@click.option(
|
|
"--strict",
|
|
is_flag=True,
|
|
help="Fail on warnings",
|
|
)
|
|
def validate(schema, env_file, env, output_format, ci, strict):
|
|
"""Validate environment variables against a schema.
|
|
|
|
SCHEMA is the path to the schema file (JSON or YAML).
|
|
"""
|
|
try:
|
|
result = validate_environment(
|
|
schema_path=schema,
|
|
env_file=env_file,
|
|
use_environment=env,
|
|
)
|
|
|
|
output = format_result(
|
|
result,
|
|
output_format=output_format,
|
|
color=not ci,
|
|
ci_mode=ci,
|
|
)
|
|
click.echo(output)
|
|
|
|
if not result.is_valid:
|
|
sys.exit(1)
|
|
|
|
if strict and result.warnings:
|
|
click.echo("Warnings found in strict mode", err=True)
|
|
sys.exit(1)
|
|
|
|
sys.exit(0)
|
|
|
|
except FileNotFoundError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
except ValueError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
|
|
|
|
@cli.command()
|
|
@click.argument("schema", type=click.Path(exists=True))
|
|
@click.option(
|
|
"--output",
|
|
"-o",
|
|
"output_file",
|
|
type=click.Path(),
|
|
help="Output file path (default: .env.example)",
|
|
)
|
|
@click.option(
|
|
"--no-comments",
|
|
is_flag=True,
|
|
help="Don't include description comments",
|
|
)
|
|
def generate(schema, output_file, no_comments):
|
|
"""Generate .env.example from a schema.
|
|
|
|
SCHEMA is the path to the schema file (JSON or YAML).
|
|
"""
|
|
try:
|
|
schema_obj = load_schema_from_file(schema)
|
|
|
|
output_path = output_file or ".env.example"
|
|
|
|
generate_env_example_to_file(
|
|
schema_obj,
|
|
output_path,
|
|
include_descriptions=not no_comments,
|
|
)
|
|
|
|
click.echo(f"Generated {output_path}")
|
|
|
|
except FileNotFoundError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
except ValueError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
|
|
|
|
@cli.command()
|
|
@click.argument("schema", type=click.Path(exists=True))
|
|
def check(schema):
|
|
"""Check if a schema file is valid.
|
|
|
|
SCHEMA is the path to the schema file (JSON or YAML).
|
|
"""
|
|
try:
|
|
schema_obj = load_schema_from_file(schema)
|
|
click.echo(f"Schema is valid (version: {schema_obj.version})")
|
|
click.echo(f"Found {len(schema_obj.envvars)} environment variables")
|
|
sys.exit(0)
|
|
except FileNotFoundError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
except ValueError as e:
|
|
click.echo(f"Error: {e}", err=True)
|
|
sys.exit(2)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
cli()
|