Repository navigation
Expand file tree
/
Copy pathgenerate.py
More file actions
131 lines (104 loc) · 3.77 KB
/
Copy pathgenerate.py
File metadata and controls
131 lines (104 loc) · 3.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
'''
Generate CLI reference ReST for Sphinx. Write the file cli/reference.rst
Ideally, this would be more tightly integrated with Sphinx (as an extension),
but this 'works' for now.
'''
import click
from planet import scripts
from planet.scripts.types import metavar_docs
from os import path
import re
root = path.dirname(__file__)
dest = path.join(root, 'cli')
def h(text, type='-'):
return '%s\n%s\n' % (text, type * len(text))
def cmd_ref(cmd):
return 'cli-command-%s' % cmd.name
def help_block(e, cmd):
ctx = scripts.click.Context(cmd)
e.e('.. code-block:: none')
e.write(' ' + ctx.get_help().replace('\n', '\n '))
e.e('')
def list_row(e, row):
e.write(' * - %s\n' % row[0])
for r in row[1:]:
parts = [''] if not r else r.split('\n')
e.write(' - %s\n' % parts[0])
for p in parts[1:]:
e.write('\n ' + p)
e.write('\n')
def param_block(e, cmd):
params = [p for p in cmd.params
if isinstance(p, click.core.Option)]
if not params:
return
e.write('.. list-table:: Options\n')
e.write(' :widths: 10 80 10\n')
e.write(' :header-rows: 1\n\n')
list_row(e, ('Name', 'Description', 'Format'))
for p in params:
metavar = p.make_metavar()
# @todo enable once metavar target generation in place
if metavar in metavar_docs:
target = metavar.replace(' ', '-').replace('...', '')
link = ':ref:`cli-metavar-%s`' % (target.lower())
else:
link = metavar
desc = p.help
if p.default:
desc = desc + '\nDEFAULT: `%s`' % p.default
flag = p.name.replace('_', '-')
list_row(e, (flag, desc, link))
def generate_cli_reference(e):
e.e('.. THIS IS A GENERATED FILE')
e.e(h('CLI Reference', '='))
e.e('.. include:: _reference_forward.rst')
general = [cmd for cmd in scripts.main.commands.values()
if not hasattr(cmd, 'commands')]
groups = [cmd for cmd in scripts.main.commands.values()
if hasattr(cmd, 'commands')]
e.e(h('Option Types Formatting'))
seen = set()
# hack - we only have one group
for cmd in groups[0].commands.values():
params = [p for p in cmd.params
if isinstance(p, click.core.Option)]
for p in params:
metavar = p.make_metavar()
if metavar in metavar_docs and metavar not in seen:
target = metavar.replace(' ', '-').replace('...', '')
e.e('.. _cli-metavar-%s:\n' % target)
e.e(h(metavar, '.'))
cleaned, _ = re.subn(' +', '', metavar_docs[metavar])
e.e(cleaned)
seen.add(metavar)
e.e(h('General Options'))
for p in scripts.main.params:
flag = p.name.replace('_', '-')
e.e('``--%s``\n %s\n\n' % (flag, p.help))
generate_command_section(e, 'General Commands', general)
generate_command_section(e, 'Data API', groups[0].commands.values())
def generate_command_section(e, title, commands):
e.e(h(title))
commands = list(sorted(commands, key=lambda a: a.name))
for cmd in commands:
e.e(':ref:`%s` %s\n\n' % (cmd_ref(cmd), cmd.short_help))
for cmd in commands:
e.e('.. index:: %s' % cmd.name)
e.e('.. _%s:\n' % cmd_ref(cmd))
e.e(h(cmd.name, '.'))
e.e(cmd.help)
ctx = click.Context(cmd)
ctx.info_name = cmd.name
e.e(ctx.get_usage())
param_block(e, cmd)
class E(object):
def __init__(self, fp):
self.fp = fp
def write(self, t):
self.fp.write(t)
def e(self, l):
self.fp.write('%s\n\n' % l)
if __name__ == '__main__':
with open(path.join(dest, 'reference.rst'), 'w') as fp:
generate_cli_reference(E(fp))