Skip to content
Snippets Groups Projects
base.py 1.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • import click
    import functools
    
    
    @click.group()
    def cli():
        pass
    
    
    def confirm_action(f, id_var, message_template="Do you want to proceed?"):
        @functools.wraps(f)
        def action(*args, **kwargs):
            if id_var:
                id_value = kwargs[id_var]
                message = message_template.format(len(id_value))
            else:
                message = message_template
            if not kwargs.pop("no_input", False) and not click.confirm(message, abort=True):
                return
    
            return f(*args, **kwargs)
    
        return action
    
    
    def delete_command(
        group,
        id_var="id",
        name="rm",
        message_template="Do you want to delete {} objects? This action is irreversible.",
    ):
        """
        Wrap a command to ensure it asks for confirmation before deletion, unless the --no-input
        flag is provided
        """
    
        def decorator(f):
            decorated = click.option("--no-input", is_flag=True)(f)
            decorated = confirm_action(
                decorated, id_var=id_var, message_template=message_template
            )
            return group.command(name)(decorated)
    
        return decorator
    
    
    def update_command(
        group,
        id_var="id",
        name="set",
        message_template="Do you want to update {} objects? This action may have irreversible consequnces.",
    ):
        """
        Wrap a command to ensure it asks for confirmation before deletion, unless the --no-input
        flag is provided
        """
    
        def decorator(f):
            decorated = click.option("--no-input", is_flag=True)(f)
            decorated = confirm_action(
                decorated, id_var=id_var, message_template=message_template
            )
            return group.command(name)(decorated)
    
        return decorator