dump-command-help 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python
  2. import os
  3. import click
  4. from click.formatting import join_options
  5. from sentry.runner import cli as root_command
  6. def get_opts(param):
  7. any_prefix_is_slash = []
  8. def _write(opts):
  9. rv, any_slashes = join_options(opts)
  10. if any_slashes:
  11. any_prefix_is_slash[:] = [True]
  12. if not param.is_flag and not param.count:
  13. rv += ' ' + param.make_metavar()
  14. return rv
  15. rv = [_write(param.opts)]
  16. if param.secondary_opts:
  17. rv.append(_write(param.secondary_opts))
  18. return (any_prefix_is_slash and '; ' or ' / ').join(rv)
  19. def write_page(out, data):
  20. path = data['path']
  21. filename = os.path.join(out, *path[1:]) + '/index.rst'
  22. if len(path) == 1:
  23. filename += '.inc'
  24. dirname = os.path.dirname(filename)
  25. try:
  26. os.makedirs(dirname)
  27. except OSError:
  28. pass
  29. args = [x['metavar'] for x in data['arguments']]
  30. title = '`%s`' % ' '.join(data['path'] + args)
  31. body = [
  32. title,
  33. '-' * len(title),
  34. '',
  35. data['help'] or '',
  36. ]
  37. body.append('')
  38. body.append('Options')
  39. body.append('```````')
  40. body.append('')
  41. for opt in data['options']:
  42. prefix = '- ``%s``: ' % opt['opt_string']
  43. for line in click.wrap_text(
  44. opt['help'], 74, prefix, ' ').splitlines() or ['']:
  45. body.append(line)
  46. body.append('- ``--help``: print this help page.')
  47. if data['subcommands']:
  48. body.append('')
  49. body.append('Subcommands')
  50. body.append('```````````')
  51. body.append('')
  52. body.append('.. toctree::')
  53. body.append(' :maxdepth: 1')
  54. body.append('')
  55. for subcmd in data['subcommands']:
  56. body.append(' %s <%s/index>' % (subcmd, subcmd))
  57. body.append('')
  58. with open(filename, 'w') as f:
  59. for line in body:
  60. f.write('%s\n' % line.encode('utf-8'))
  61. def dump_command(out, cmd, path):
  62. data = {
  63. 'path': path,
  64. 'help': cmd.help.replace('\b', ''),
  65. 'options': [],
  66. 'arguments': [],
  67. 'subcommands': [],
  68. }
  69. for param in cmd.params:
  70. if isinstance(param, click.Option):
  71. help_text = param.help or ''
  72. if param.show_default:
  73. help_text += ' [default: %s]' % (
  74. ', '.join('%s' % d for d in param.default)
  75. if isinstance(param.default, (list, tuple))
  76. else (param.default,))
  77. data['options'].append({
  78. 'opt_string': get_opts(param),
  79. 'help': help_text,
  80. })
  81. else:
  82. data['arguments'].append({
  83. 'metavar': param.make_metavar(),
  84. })
  85. if isinstance(cmd, click.Group):
  86. for child_name, child_cmd in cmd.commands.iteritems():
  87. dump_command(out, child_cmd, path + [child_name])
  88. data['subcommands'].append(child_name)
  89. write_page(out, data)
  90. @click.command()
  91. @click.option('--output-path', 'out', type=click.Path(),
  92. default='build/cli-help')
  93. def cli(out):
  94. dump_command(out, root_command, ['sentry'])
  95. if __name__ == '__main__':
  96. cli()