Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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 

24import os.path 

25 

26from lsst.daf.butler.formatters.file import FileFormatter 

27 

28 

29class 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": 40 ↛ 42line 40 didn't jump to line 42, because the condition on line 40 was never false

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): 62 ↛ 63line 62 didn't jump to line 63, because the condition on line 62 was never true

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)