Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python click help formatting newline

I am seeing that a newline is not being preserved in my EPILOG? I want to know why if I see that newline remains only when a line has 74 characters?

# http://click.pocoo.org/5/commands/

import click, sys

def main_caller(*args, **kwargs):
    print('act on arguments', args, kwargs)

EPILOG = '''
# oneline
# twoline

\n
# oneline with 74char                                                   x
# twoline with 74char                                                   x
'''

@click.group(help='wwwwwwwwww', epilog=EPILOG, invoke_without_command=True, chain=True)
@click.argument('start_or_stop')
@click.option('-v', '--verbose', default=False, help='Print Verbose messages')
@click.option('-l', '--logfile', help='Path to logfile to store log messages')
@click.option('-a', '--action', multiple=True, type=click.Choice(['act1', 'act2', 'act3']), default=['act1', 'act2'])
def cli(*args, **kwargs):
    '''foo bar'''
    pass

@cli.command()
@click.option('--debug/--no-debug', default=False)
def cmd1(*args, **kwargs):
    print('cmd1', args, kwargs)
    return 'cmd11111'

@cli.command()
@click.option('-x', '--xxx', default='x')
def cmd2(*args, **kwargs):
    print('cmd2', args, kwargs)
    return 'cmd22222'

@cli.resultcallback()
def process_pipeline(*args, **kwargs):
    print('process', args, kwargs)
    print('args', sys.argv[1:])     

if __name__ == '__main__':
    cli()

Output is:

/click_sandbox.py --help
2017/02/24 19:31:43 Platform overridden to 'RHEL5_64'
Usage: click_sandbox.py [OPTIONS] START_OR_STOP COMMAND1 [ARGS]... [COMMAND2
                        [ARGS]...]...

  wwwwwwwwww

Options:
  -v, --verbose TEXT             Print Verbose messages
  -l, --logfile TEXT             Path to logfile to store log messages
  -a, --action [act1|act2|act3]
  --help                         Show this message and exit.

Commands:
  cmd1
  cmd2

  # oneline # twoline

  # oneline with 74char                                                   x
  # twoline with 74char                                                   x
like image 535
amulllb Avatar asked Feb 24 '17 19:02

amulllb


People also ask

What is click echo in Python?

The echo() function supports ANSI colors and styles. On Windows this uses colorama. Primarily this means that: Click's echo() function will automatically strip ANSI color codes if the stream is not connected to a terminal.

What is click Pass_context?

This is a special attribute where commands are supposed to remember what they need to pass on to their children. In order for this to work, we need to mark our function with pass_context() , because otherwise, the context object would be entirely hidden from us.


2 Answers

In Click 7.0 you use the \b marker to indicate that the formatting is to be preserved e.g.:

This paragraph is formatted normally and Click does
not preserve new lines.

\b
This paragraph is formatted as it
appears in the source:
item 1
item 2

This paragraph is formatted normally and Click does
not preserve new lines.
like image 80
KevH Avatar answered Oct 22 '22 18:10

KevH


Your newlines are not being preserved because the epilog writer does word wrapping. This can be solved with a subclass to click.Group, by creating a format_epilog() which does not do word wrapping:

class SpecialEpilog(click.Group):
    def format_epilog(self, ctx, formatter):
        if self.epilog:
            formatter.write_paragraph()
            for line in self.epilog.split('\n'):
                formatter.write_text(line)

# Tell click to use our epilog formatter
@click.group(cls=SpecialEpilog,
    help='wwwwwwwwww', epilog=EPILOG, invoke_without_command=True, chain=True)
....
like image 5
Stephen Rauch Avatar answered Oct 22 '22 20:10

Stephen Rauch