В обычной ситуации мое приложение загрузит набор значений конфигурации в контекст, и они будут переданы подкомандам с pass_context
.Есть только одна ситуация, когда это не сработает - при первом запуске приложения и конфигурации не было настроено.
Моя цель - позволить пользователю запустить одну подкоманду и сгенерировать соответствующую конфигурацию, чтобы CLI работал в остальное время.
Мой cli.py
код:
import sys
import click
from ruamel.yaml import YAML
from pathlib import Path
from commands.config_cmds import configcmd
MYAPP = "AwesomeCLI"
@click.group()
@click.version_option()
@click.pass_context
def cli(ctx):
"""command line application"""
ctx.ensure_object(dict)
ctx.obj['APPLICATION_NAME'] = MYAPP
config_file = Path(click.get_app_dir(ctx.obj[MYAPP])) / "config.yml"
yaml = YAML(typ="safe")
try:
config_yml = yaml.load(config_file)
except FileNotFoundError:
click.secho("Run command: awesome-cli configcmd first-run", fg='red')
raise click.FileError(config_file.name, "Missing configuration file.")
ctx.obj['CONFIG'] = yaml.dump(config_yml)
cli.add_command(configcmd)
Мой configcmd
код:
@click.group()
def configcmd():
"""Manage configuration of this tool
\f
The configuration file is saved in $HOME/.config/awesome-cli
"""
@config.command()
@click.pass_context
def first_run(ctx):
"""
Set up CLI configuration.
"""
api_key = click.prompt("Your API Key")
# More stuff here about saving this file...
Если я запускаю python awesome-cli configcmd
, я получаю следующую ошибку (как и ожидалось):
Run command: awesome-cli configcmd first-run
Error: Could not open file config.yml: Missing configuration file.
Однако, если я запускаю этоКоманда python awesome-cli configcmd first-run
Я получаю ту же ошибку, которая не моя цель.Очевидно, я должен получить эту ошибку с этим кодом, но это потому, что я не знаю, как добавить исключение на основе вызываемой команды / подкоманды.
Что мне нужно добавить в мой cli
функция в cli.py
, чтобы я не пытался загрузить файл конфигурации, если (и только если), пользователь работает configcmd first-run
?Любая другая команда / подкоманда потребует, чтобы этот файл конфигурации существовал, поэтому я хочу, чтобы проверка оставалась для них.