Source code for pvl.pvl_translate

# -*- coding: utf-8 -*-
"""A program for converting PVL text to a specific PVL dialect.

The ``pvl_translate`` program will read a file with PVL text (any
of the kinds of files that :func:`pvl.load` reads) or STDIN and
will convert that PVL text to a particular PVL dialect.  It is not
particularly robust, and if it cannot make simple conversions, it
will raise errors.
"""

# Copyright 2020-2021, ``pvl`` library authors.
#
# Reuse is permitted under the terms of the license.
# The AUTHORS file and the LICENSE file are at the
# top level of this library.

import argparse
import json
import os
import sys

import pvl
from .encoder import PVLEncoder, ODLEncoder, ISISEncoder, PDSLabelEncoder


[docs]class Writer(object): """Base class for writers. Descendents must implement dump(). """
[docs] def dump(self, dictlike: dict, outfile: os.PathLike): raise Exception
[docs]class PVLWriter(Writer): def __init__(self, encoder): self.encoder = encoder
[docs] def dump(self, dictlike: dict, outfile: os.PathLike): return pvl.dump(dictlike, outfile, encoder=self.encoder)
[docs]class JSONWriter(Writer):
[docs] def dump(self, dictlike: dict, outfile: os.PathLike): return json.dump(dictlike, outfile)
formats = dict( PDS3=PVLWriter(PDSLabelEncoder()), ODL=PVLWriter(ODLEncoder()), ISIS=PVLWriter(ISISEncoder()), PVL=PVLWriter(PVLEncoder()), JSON=JSONWriter(), )
[docs]def arg_parser(formats): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "-of", "--output_format", required=True, choices=formats.keys(), help="Select the format to create the new file as.", ) parser.add_argument( "infile", nargs="?", type=argparse.FileType("r"), default=sys.stdin, help="file containing PVL text to translate, " "defaults to STDIN.", ) parser.add_argument( "outfile", nargs="?", type=argparse.FileType("w"), default=sys.stdout, help="file to write translated PVL to, defaults " "to STDOUT.", ) parser.add_argument("--version", action="version", version=pvl.__version__) return parser
[docs]def main(argv=None): args = arg_parser(formats).parse_args(argv) some_pvl = pvl.load(args.infile) formats[args.output_format].dump(some_pvl, args.outfile) return