lsst.obs.base  20.0.0-22-g8ce909b
packages.py
Go to the documentation of this file.
1 # This file is part of obs_base.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (http://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 
22 __all__ = ("PackagesFormatter", )
23 
24 import os.path
25 
26 from lsst.daf.butler.formatters.file import FileFormatter
27 
28 
29 class PackagesFormatter(FileFormatter):
30  """Interface for reading and writing objects that support the standard
31  afw I/O readFits/writeFits methods.
32  """
33  supportedWriteParameters = frozenset({"format"})
34  supportedExtensions = frozenset({".yaml", ".pickle", ".pkl"})
35 
36  @property
37  def extension(self) -> str:
38  # Default to YAML but allow configuration via write parameter
39  format = self.writeParameters.get("format", "yaml")
40  if format == "yaml":
41  return ".yaml"
42  elif format == "pickle":
43  return ".pickle"
44  raise RuntimeError(f"Requested file format '{format}' is not supported for Packages")
45 
46  def _readFile(self, path, pytype):
47  """Read a file from the path in FITS format.
48 
49  Parameters
50  ----------
51  path : `str`
52  Path to use to open the file.
53  pytype : `type`
54  Class to use to read the serialized file.
55 
56  Returns
57  -------
58  data : `object`
59  Instance of class ``pytype`` read from serialized file. None
60  if the file could not be opened.
61  """
62  if not os.path.exists(path):
63  return None
64 
65  return pytype.read(path)
66 
67  def _fromBytes(self, serializedDataset, pytype=None):
68  """Read the bytes object as a python object.
69 
70  Parameters
71  ----------
72  serializedDataset : `bytes`
73  Bytes object to unserialize.
74  pytype : `type`
75  The Python type to be instantiated. Required.
76 
77  Returns
78  -------
79  inMemoryDataset : `object`
80  The requested data as an object, or None if the string could
81  not be read.
82  """
83  # The format can not come from the formatter configuration
84  # because the current configuration has no connection to how
85  # the data were stored.
86  format = "yaml" if serializedDataset.startswith(b"!<lsst.base.Packages>") else "pickle"
87  return pytype.fromBytes(serializedDataset, format)
88 
89  def _writeFile(self, inMemoryDataset):
90  """Write the in memory dataset to file on disk.
91 
92  Parameters
93  ----------
94  inMemoryDataset : `object`
95  Object to serialize.
96 
97  Raises
98  ------
99  Exception
100  The file could not be written.
101  """
102  inMemoryDataset.write(self.fileDescriptor.location.path)
103 
104  def _toBytes(self, inMemoryDataset):
105  """Write the in memory dataset to a bytestring.
106 
107  Parameters
108  ----------
109  inMemoryDataset : `object`
110  Object to serialize
111 
112  Returns
113  -------
114  serializedDataset : `bytes`
115  YAML string encoded to bytes.
116 
117  Raises
118  ------
119  Exception
120  The object could not be serialized.
121  """
122  format = "yaml" if self.extension == ".yaml" else "pickle"
123  return inMemoryDataset.toBytes(format)
lsst.obs.base.formatters.packages.PackagesFormatter
Definition: packages.py:29
lsst.obs.base.formatters.packages.PackagesFormatter.extension
extension
Definition: packages.py:122