1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
"""
Contains commands for dealing with exploded and imploded forms.
"""
import os
import asdf
from .. import AsdfFile
from .main import Command
__all__ = ["implode", "explode"]
class Implode(Command):
@classmethod
def setup_arguments(cls, subparsers):
parser = subparsers.add_parser(
"implode",
help="Implode a ASDF file.",
description="""Combine a ASDF file, where the data may be
stored in multiple ASDF files, into a single ASDF
file.""",
)
parser.add_argument("filename", nargs=1, help="""The ASDF file to implode.""")
parser.add_argument(
"--output",
"-o",
type=str,
nargs="?",
help="""The name of the output file. If not provided, it
will be the name of the input file with "_all"
appended.""",
)
parser.add_argument(
"--resolve-references",
"-r",
action="store_true",
help="""Resolve all references and store them directly in
the output file.""",
)
parser.set_defaults(func=cls.run)
return parser
@classmethod
def run(cls, args):
return implode(args.filename[0], args.output, args.resolve_references)
def implode(input, output=None, resolve_references=False):
"""
Implode a given ASDF file, which may reference external data, back
into a single ASDF file.
Parameters
----------
input : str or file-like object
The input file.
output : str of file-like object
The output file.
resolve_references : bool, optional
If `True` resolve all external references before saving.
"""
if output is None:
base, ext = os.path.splitext(input)
output = base + "_all" + ".asdf"
with asdf.open(input) as ff:
ff2 = AsdfFile(ff)
if resolve_references:
ff2.resolve_references()
ff2.write_to(output, all_array_storage="internal")
class Explode(Command):
@classmethod
def setup_arguments(cls, subparsers):
parser = subparsers.add_parser(
"explode",
help="Explode a ASDF file.",
description="""From a single ASDF file, create a set of
ASDF files where each data block is stored in a separate
file.""",
)
parser.add_argument("filename", nargs=1, help="""The ASDF file to explode.""")
parser.add_argument(
"--output",
"-o",
type=str,
nargs="?",
help="""The name of the output file. If not provided, it
will be the name of the input file with "_exploded"
appended.""",
)
parser.set_defaults(func=cls.run)
return parser
@classmethod
def run(cls, args):
return explode(args.filename[0], args.output)
def explode(input, output=None):
"""
Explode a given ASDF file so each data block is in a separate
file.
Parameters
----------
input : str or file-like object
The input file.
output : str of file-like object
The output file.
"""
if output is None:
base, ext = os.path.splitext(input)
output = base + "_exploded" + ".asdf"
with asdf.open(input) as ff:
ff.write_to(output, all_array_storage="external")
|