Source code for rez.cli.interpret

# SPDX-License-Identifier: Apache-2.0
# Copyright Contributors to the Rez Project


'''
Execute some Rex code and print the interpreted result.
'''
from __future__ import print_function


[docs]def setup_parser(parser, completions=False): from rez.shells import get_shell_types from rez.system import system formats = get_shell_types() + ['dict', 'table'] parser.add_argument( "-f", "--format", type=str, choices=formats, help="print output in the given format. If None, the current shell " "language (%s) is used" % system.shell) parser.add_argument( "--no-env", dest="no_env", action="store_true", help="interpret the code in an empty environment") pv_action = parser.add_argument( "--pv", "--parent-variables", dest="parent_vars", type=str, metavar='VAR', nargs='+', help="environment variables to update rather than overwrite on first " "reference. If this is set to the special value 'all', all variables " "will be treated this way") FILE_action = parser.add_argument( "FILE", type=str, help='file containing rex code to execute') if completions: from rez.cli._complete_util import FilesCompleter from rez.vendor.argcomplete.completers import EnvironCompleter pv_action.completer = EnvironCompleter FILE_action.completer = FilesCompleter(dirs=False, file_patterns=["*.py", "*.rex"])
[docs]def command(opts, parser, extra_arg_groups=None): from rez.shells import create_shell from rez.utils.formatting import columnise from rez.rex import RexExecutor, Python from pprint import pformat with open(opts.FILE) as f: code = f.read() interp = None if opts.format is None: interp = create_shell() elif opts.format in ('dict', 'table'): interp = Python(passive=True) else: interp = create_shell(opts.format) parent_env = {} if opts.no_env else None if opts.parent_vars == "all": parent_vars = True else: parent_vars = opts.parent_vars ex = RexExecutor(interpreter=interp, parent_environ=parent_env, parent_variables=parent_vars) ex.execute_code(code, filename=opts.FILE) o = ex.get_output() if isinstance(o, dict): if opts.format == "table": rows = [x for x in sorted(o.items())] print('\n'.join(columnise(rows))) else: print(pformat(o)) else: print(o)