File: options.py

package info (click to toggle)
python-asdf 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,940 kB
  • sloc: python: 23,812; makefile: 123
file content (80 lines) | stat: -rw-r--r-- 2,782 bytes parent folder | download | duplicates (2)
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
from asdf import _compression as mcompression
from asdf.config import get_config


class Options:
    """
    Storage and compression options useful when reading or writing ASDF blocks.
    """

    def __init__(self, storage_type=None, compression_type=None, compression_kwargs=None, save_base=None):
        if storage_type is None:
            storage_type = get_config().all_array_storage or "internal"
        if save_base is None:
            save_base = get_config().default_array_save_base

        self._storage_type = None
        self._compression = None
        self._compression_kwargs = None

        # set via setters
        self.compression_kwargs = compression_kwargs
        self.compression = compression_type
        self.storage_type = storage_type
        self.save_base = save_base

    @property
    def storage_type(self):
        return self._storage_type

    @storage_type.setter
    def storage_type(self, storage_type):
        if storage_type not in ["internal", "external", "streamed", "inline"]:
            msg = "array_storage must be one of 'internal', 'external', 'streamed' or 'inline'"
            raise ValueError(msg)
        self._storage_type = storage_type

    @property
    def compression(self):
        return self._compression

    @compression.setter
    def compression(self, compression):
        msg = f"Invalid compression type: {compression}"
        if compression == "input":
            # "input" compression will validate as the ASDF compression module made
            # some assumptions about availability of information (that the input block
            # is known). The Options here do not have the same assumption.
            # For a block read from a file, it's options will be initialized with
            # the compression value read from the block header so we should never
            # see 'input' at this point.
            raise ValueError(msg)
        try:
            compression = mcompression.validate(compression)
        except ValueError:
            raise ValueError(msg)
        self._compression = compression

    @property
    def compression_kwargs(self):
        return self._compression_kwargs

    @compression_kwargs.setter
    def compression_kwargs(self, kwargs):
        if not kwargs:
            kwargs = {}
        self._compression_kwargs = kwargs

    @property
    def save_base(self):
        return self._save_base

    @save_base.setter
    def save_base(self, save_base):
        if not (isinstance(save_base, bool) or save_base is None):
            msg = "save_base must be a bool or None"
            raise ValueError(msg)
        self._save_base = save_base

    def __copy__(self):
        return type(self)(self._storage_type, self._compression, self._compression_kwargs)