LSST Applications  21.0.0+75b29a8a7f,21.0.0+e70536a077,21.0.0-1-ga51b5d4+62c747d40b,21.0.0-10-gbfb87ad6+3307648ee3,21.0.0-15-gedb9d5423+47cba9fc36,21.0.0-2-g103fe59+fdf0863a2a,21.0.0-2-g1367e85+d38a93257c,21.0.0-2-g45278ab+e70536a077,21.0.0-2-g5242d73+d38a93257c,21.0.0-2-g7f82c8f+e682ffb718,21.0.0-2-g8dde007+d179fbfa6a,21.0.0-2-g8f08a60+9402881886,21.0.0-2-ga326454+e682ffb718,21.0.0-2-ga63a54e+08647d4b1b,21.0.0-2-gde069b7+26c92b3210,21.0.0-2-gecfae73+0445ed2f95,21.0.0-2-gfc62afb+d38a93257c,21.0.0-27-gbbd0d29+ae871e0f33,21.0.0-28-g5fc5e037+feb0e9397b,21.0.0-3-g21c7a62+f4b9c0ff5c,21.0.0-3-g357aad2+57b0bddf0b,21.0.0-3-g4be5c26+d38a93257c,21.0.0-3-g65f322c+3f454acf5d,21.0.0-3-g7d9da8d+75b29a8a7f,21.0.0-3-gaa929c8+9e4ef6332c,21.0.0-3-ge02ed75+4b120a55c4,21.0.0-4-g3300ddd+e70536a077,21.0.0-4-g591bb35+4b120a55c4,21.0.0-4-gc004bbf+4911b9cd27,21.0.0-4-gccdca77+f94adcd104,21.0.0-4-ge8fba5a+2b3a696ff9,21.0.0-5-gb155db7+2c5429117a,21.0.0-5-gdf36809+637e4641ee,21.0.0-6-g00874e7+c9fd7f7160,21.0.0-6-g4e60332+4b120a55c4,21.0.0-7-gc8ca178+40eb9cf840,21.0.0-8-gfbe0b4b+9e4ef6332c,21.0.0-9-g2fd488a+d83b7cd606,w.2021.05
LSST Data Management Base Package
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.extensionextensionextension == ".yaml" else "pickle"
123  return inMemoryDataset.toBytes(format)