Source code for hepdata_converter

from io import StringIO
import argparse
import sys
from . import version
from hepdata_validator import LATEST_SCHEMA_VERSION
from .parsers import Parser
from .writers import Writer


[docs] def convert(input, output=None, options={}): """Converts a supported ``input_format`` (*oldhepdata*, *yaml*) to a supported ``output_format`` (*csv*, *root*, *yaml*, *yoda*, *yoda1*). :param input: location of input file for *oldhepdata* format or input directory for *yaml* format :param output: location of output directory to which converted files will be written :param options: additional options such as ``input_format`` and ``output_format`` used for conversion :type input: str :type output: str :type options: dict :raise ValueError: raised if no ``input_format`` or ``output_format`` is specified """ if 'input_format' not in options and 'output_format' not in options: raise ValueError("no input_format and output_format specified!") input_format = options.get('input_format', 'yaml') output_format = options.get('output_format', 'yaml') parser = Parser.get_concrete_class(input_format)(**options) writer = Writer.get_concrete_class(output_format)(**options) if not output and not writer.single_file_output: raise ValueError("this output_format requires specifying 'output' argument") # if no output was specified create proxy output to which writer can insert data _output = output if not _output: _output = StringIO() writer.write(parser.parse(input), _output) # if no output was specified return output if not output: return _output.getvalue()
def make_exit(message='', code=0): return code, message def generate_help_epilogue(): margin = ' ' r = 'Parsers:\n' r += '[use them as --input-format parameter]\n' r += '\n' for cls in Parser.get_all_subclasses(): r += cls.get_help(margin) r += '\nWriters:\n' r += '[use them as --output-format parameter]\n' r += '\n' for cls in Writer.get_all_subclasses(): r += cls.get_help(margin) return r def _main(arguments=sys.argv): # if version is specified ignore any other arguments if '--version' in arguments or '-v' in arguments: return make_exit(message="hepdata-converter version: %s" % version.__version__) parser = argparse.ArgumentParser(description="CLI tools for converting between HEP data formats", add_help=True, formatter_class=argparse.RawTextHelpFormatter, epilog=generate_help_epilogue()) parser.add_argument("--input-format", '-i', action='store', default='yaml', help='format of the input file/s (default: yaml) [choose one option from Parsers section below]') parser.add_argument("--output-format", '-o', action='store', default='yaml', help='format of the output file/s (default: yaml) [choose one option from Writers section below]') parser.add_argument("--version", '-v', action='store_const', const=True, default=False, help='Show hepdata-converter version') parser.add_argument("--hepdata-doi", '-d', action='store', default='', help='Pass HEPData DOI, e.g. "10.17182/hepdata.74247.v1"') parser.add_argument("--validator-schema-version", '-s', action='store', default=LATEST_SCHEMA_VERSION, help='hepdata_validator schema version (default: %s)' % LATEST_SCHEMA_VERSION) parser.add_argument("input") parser.add_argument("output") if arguments == sys.argv: arguments = sys.argv[1:] program_args = vars(parser.parse_known_args(arguments)[0]) input_format = program_args['input_format'] output_format = program_args['output_format'] Parser.get_concrete_class(input_format).register_cli_options(parser) Writer.get_concrete_class(output_format).register_cli_options(parser) # reparse arguments, now with added options from concrete parsers / writers program_args = vars(parser.parse_args(arguments)) try: convert(program_args['input'], program_args['output'], program_args) return make_exit() except ValueError as e: return make_exit(message="Options error: %s" % str(e), code=1) def main(arguments=sys.argv): r, message = _main(arguments) if r == 0: print(message) else: print((message, sys.stderr)) sys.exit(r)