# -*- 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