File: defragment.py

package info (click to toggle)
python-asdf 2.14.3-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 2,280 kB
  • sloc: python: 16,612; makefile: 124
file content (71 lines) | stat: -rw-r--r-- 1,950 bytes parent folder | download
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
"""
Defragment command.
"""

import asdf

from .. import AsdfFile
from .main import Command

__all__ = ["defragment"]


class Defragment(Command):
    @classmethod
    def setup_arguments(cls, subparsers):
        parser = subparsers.add_parser(
            "defragment",
            help="Defragment an ASDF file..",
            description="""Removes any unused blocks and unused space.""",
        )

        parser.add_argument("filename", nargs=1, help="""The ASDF file to collect.""")
        parser.add_argument("--output", "-o", type=str, nargs="?", help="""The name of the output file.""")
        parser.add_argument(
            "--resolve-references",
            "-r",
            action="store_true",
            help="""Resolve all references and store them directly in
            the output file.""",
        )
        parser.add_argument(
            "--compress",
            "-c",
            type=str,
            nargs="?",
            choices=["zlib", "bzp2", "lz4"],
            help="""Compress blocks using one of "zlib", "bzp2" or "lz4".""",
        )

        parser.set_defaults(func=cls.run)

        return parser

    @classmethod
    def run(cls, args):
        return defragment(args.filename[0], args.output, args.resolve_references, args.compress)


def defragment(input, output=None, resolve_references=False, compress=None):
    """
    Defragment a given 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.

    compress : str, optional
        Compression to use.
    """
    with asdf.open(input) as ff:
        ff2 = AsdfFile(ff)
        if resolve_references:
            ff2.resolve_references()
        ff2.write_to(output, all_array_storage="internal", all_array_compression=compress)