Source code for standard_names.cmd.sndump

#! /usr/bin/env python
"""
Example usage:
    sndump -n -o -q -op --format=wiki > standard_names.wiki
"""
from __future__ import print_function

import os
import sys
import argparse

from ..registry import NamesRegistry
from ..utilities import FORMATTERS


_FORMATS = FORMATTERS.keys()


[docs]def sndump(file=None, format="plain", sorted=True, keys=None, newline=None): """Dump a registry to different formats. Parameters ---------- file : str, optional Name of a registry file of names. format : {'plain'}, optional Output format. sorted : bool, optional Sort results. keys : {'names, 'objects', 'quantities', 'operators'} or iterable Standard Name element or elements to print. newline : str, optional Specify the newline character to use for output. Examples -------- >>> from __future__ import print_function >>> import os >>> from six.moves import StringIO >>> import standard_names as csn >>> lines = os.linesep.join(['air__temperature', 'water__temperature']) >>> names = StringIO(lines) >>> print(csn.cmd.sndump.sndump(names, newline='\\n')) ... # doctest: +REPORT_NDIFF air__temperature water__temperature """ newline = newline or os.linesep keys = keys or ("names",) if file: args = (file,) else: args = () names = NamesRegistry(*args) lines = [] formatter = FORMATTERS[format] for key in keys: list_to_print = getattr(names, key) lines.append( formatter( list_to_print, sorted=sorted, heading=key, level=2, newline=newline ) ) return newline.join(lines)
[docs]class CustomAction(argparse.Action): """Keep track of the order of options are given on the command line.""" def __call__(self, parser, namespace, values, option_string=None): if not "ordered_args" in namespace: setattr(namespace, "ordered_args", []) previous = namespace.ordered_args previous.append(self.dest) setattr(namespace, "ordered_args", previous)
[docs]def main(args=None): """Dump a list of known standard names. Parameters ---------- args : iterable of str, optional Arguments to pass to *parse_args*. If not provided, use ``sys.argv``. Examples -------- >>> import os >>> import standard_names as csn >>> (fname, _) = csn.registry._get_latest_names_file() >>> registry = csn.NamesRegistry() >>> names = csn.cmd.sndump.main(['-n', fname]).split(os.linesep) >>> len(names) == len(registry) True >>> objects = csn.cmd.sndump.main(['-o', fname]).split(os.linesep) >>> len(objects) == len(registry.objects) True >>> names = csn.cmd.sndump.main(['-n', '-o', fname]).split(os.linesep) >>> len(names) == len(registry) + len(registry.objects) True """ parser = argparse.ArgumentParser("Dump known standard names") parser.add_argument( "-n", nargs=0, dest="names", help="Print standard names", action=CustomAction ) parser.add_argument( "-o", nargs=0, dest="objects", help="Print standard objects", action=CustomAction, ) parser.add_argument( "-q", nargs=0, dest="quantities", help="Print standard quantities", action=CustomAction, ) parser.add_argument( "-op", nargs=0, dest="operators", help="Print standard operators", action=CustomAction, ) parser.add_argument( "file", type=argparse.FileType("r"), default=None, help="Read names from a file" ) parser.add_argument( "--unsorted", action="store_true", default=False, help="Do not sort names" ) parser.add_argument( "--format", choices=_FORMATS, default="plain", help="Output format" ) if args is None: args = parser.parse_args() else: args = parser.parse_args(args) try: keys = args.ordered_args except AttributeError: keys = ["names"] return sndump( file=args.file, format=args.format, sorted=not args.unsorted, keys=keys )
[docs]def run(): print(main())