blob: 7d6f4ebc6db0dd208a2700b292a95716eae64873 [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import print_function, unicode_literals
import textwrap
from mach.decorators import (
CommandArgument,
CommandProvider,
Command
)
from mozbuild.frontend.sandbox_symbols import (
FUNCTIONS,
SPECIAL_VARIABLES,
VARIABLES,
doc_to_paragraphs,
)
def get_doc(doc):
"""Split documentation into summary line and everything else."""
paragraphs = doc_to_paragraphs(doc)
summary = paragraphs[0]
extra = paragraphs[1:]
return summary, extra
def print_extra(extra):
"""Prints the 'everything else' part of documentation intelligently."""
for para in extra:
for line in textwrap.wrap(para):
print(line)
print('')
if not len(extra):
print('')
@CommandProvider
class MozbuildFileCommands(object):
@Command('mozbuild-reference', category='build-dev',
description='View reference documentation on mozbuild files.')
@CommandArgument('symbol', default=None, nargs='*',
help='Symbol to view help on. If not specified, all will be shown.')
@CommandArgument('--name-only', '-n', default=False, action='store_true',
help='Print symbol names only.')
def reference(self, symbol, name_only=False):
if name_only:
for s in sorted(VARIABLES.keys()):
print(s)
for s in sorted(FUNCTIONS.keys()):
print(s)
for s in sorted(SPECIAL_VARIABLES.keys()):
print(s)
return 0
if len(symbol):
for s in symbol:
if s in VARIABLES:
self.variable_reference(s)
continue
elif s in FUNCTIONS:
self.function_reference(s)
continue
elif s in SPECIAL_VARIABLES:
self.special_reference(s)
continue
print('Could not find symbol: %s' % s)
return 1
return 0
print('=========')
print('VARIABLES')
print('=========')
print('')
print('This section lists all the variables that may be set ')
print('in moz.build files.')
print('')
for v in sorted(VARIABLES.keys()):
self.variable_reference(v)
print('=========')
print('FUNCTIONS')
print('=========')
print('')
print('This section lists all the functions that may be called ')
print('in moz.build files.')
print('')
for f in sorted(FUNCTIONS.keys()):
self.function_reference(f)
print('=================')
print('SPECIAL VARIABLES')
print('=================')
print('')
for v in sorted(SPECIAL_VARIABLES.keys()):
self.special_reference(v)
return 0
def variable_reference(self, v):
st_typ, in_type, default, doc = VARIABLES[v]
print(v)
print('=' * len(v))
print('')
summary, extra = get_doc(doc)
print(summary)
print('')
print('Storage Type: %s' % st_typ.__name__)
print('Input Type: %s' % in_type.__name__)
print('Default Value: %s' % default)
print('')
print_extra(extra)
def function_reference(self, f):
attr, args, doc = FUNCTIONS[f]
print(f)
print('=' * len(f))
print('')
summary, extra = get_doc(doc)
print(summary)
print('')
arg_types = []
for t in args:
if isinstance(t, list):
inner_types = [t2.__name__ for t2 in t]
arg_types.append(' | ' .join(inner_types))
continue
arg_types.append(t.__name__)
arg_s = '(%s)' % ', '.join(arg_types)
print('Arguments: %s' % arg_s)
print('')
print_extra(extra)
def special_reference(self, v):
typ, doc = SPECIAL_VARIABLES[v]
print(v)
print('=' * len(v))
print('')
summary, extra = get_doc(doc)
print(summary)
print('')
print('Type: %s' % typ.__name__)
print('')
print_extra(extra)