from pydantic_cli import run_and_exit, DefaultConfig log = logging.getLogger(__name__) class Options(BaseModel): """For cases where you want a global configuration file that is completely ignored if not found, you can set CLI_JSON_VALIDATE_PATH = False. """ class Config(DefaultConfig): CLI_JSON_ENABLE = True CLI_JSON_CONFIG_PATH = "/path/to/file/that/does/not/exist/simple_schema.json" CLI_JSON_VALIDATE_PATH = False input_file: str max_records: int = 10 def example_runner(opts: Options) -> int: log.info(f"Mock example running with options {opts}") return 0 if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) run_and_exit(Options, example_runner, description="Description", version="0.1.0")
log = logging.getLogger(__name__) class Opts(BaseModel): class Config(DefaultConfig): CLI_JSON_KEY = "json-training" CLI_JSON_ENABLE = True hdf_file: str max_records: int = 10 min_filter_score: float alpha: float beta: float def runner(opts: Opts) -> int: print(f"Running with opts:{opts}") return 0 if __name__ == "__main__": run_and_exit( Opts, runner, description="My Tool Description", version="0.1.0", prologue_handler=prologue_handler, epilogue_handler=epilogue_handler, )
# https: // pydantic - docs.helpmanual.io / usage / models / # required-optional-fields enable_gamma: Optional[ bool] # ... Don't use ellipsis in Pydantic with mypy. This is a really fundamental problem. enable_delta: Optional[bool] = None enable_epsilon: Optional[ bool] = True # this a bit of a contradiction from the commandline perspective. class Config(DefaultConfig): CLI_EXTRA_OPTIONS = { "enable_alpha": _to_opt("alpha"), "enable_beta": ("--yes-beta", "--no-beta"), "enable_gamma": _to_opt("gamma"), "enable_delta": _to_opt("delta"), "enable_epsilon": _to_opt("epsilon"), } def example_runner(opts: Options) -> int: print(f"Mock example running with {opts}") return 0 if __name__ == "__main__": logging.basicConfig(level="DEBUG") run_and_exit( Options, example_runner, exception_handler=default_minimal_exception_handler, prologue_handler=setup_logger, )
""" Simple Example of using Pydantic to generate a CLI This example will generate a CLI tool with 1 required argument and one optional boolean arg. Note the optional boolean value must be supplied as `--run_training False` """ from pydantic import BaseModel from pydantic_cli import run_and_exit, DefaultConfig class Options(BaseModel): class Config(DefaultConfig): CLI_BOOL_PREFIX = ("--yes-", "--no-") input_file: str run_training: bool = True dry_run: bool = False def example_runner(opts: Options) -> int: print(f"Mock example running with {opts}") return 0 if __name__ == "__main__": run_and_exit(Options, example_runner, description=__doc__, version="0.1.0")
) logging.basicConfig(level=opts.log_level.upper(), stream=sys.stdout, format=format_str) log.info(f"Set up log with level {opts.log_level}") log.info(f"Running {__file__}") def epilogue_handler(exit_code: int, run_time_sec: float): log.info( f"Completed running {__file__} with exit code {exit_code} in {run_time_sec} sec." ) def example_runner(opts: Options) -> int: log.info( f"pydantic_cli version={__version__} Mock example running with options {opts}" ) return 0 if __name__ == "__main__": run_and_exit( Options, example_runner, description=__doc__, version="0.1.0", prologue_handler=prologue_handler, epilogue_handler=epilogue_handler, )