Coverage for python/lsst/daf/base/yaml.py: 58%

54 statements  

« prev     ^ index     » next       coverage.py v6.4.2, created at 2022-07-23 09:41 +0000

1# This file is part of daf_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"""This module defines YAML I/O for key lsst.daf.base classes.""" 

23 

24# If yaml package is not installed there is no reason to fail everywhere 

25try: 

26 import yaml 

27except ImportError: 

28 yaml = None 

29 

30from .dateTime import DateTime 

31from .propertyContainer import PropertyList, getPropertyListState, setPropertyListState, \ 

32 getPropertySetState, setPropertySetState, PropertySet 

33 

34# For YAML >= 5.1 need a different Loader for the constructor 

35loaderList = [] 

36if yaml: 36 ↛ 55line 36 didn't jump to line 55, because the condition on line 36 was never false

37 loaderList = [yaml.Loader, yaml.CLoader] 

38 try: 

39 loaderList.append(yaml.FullLoader) 

40 except AttributeError: 

41 pass 

42 try: 

43 loaderList.append(yaml.UnsafeLoader) 

44 except AttributeError: 

45 pass 

46 try: 

47 loaderList.append(yaml.SafeLoader) 

48 except AttributeError: 

49 pass 

50 

51 

52# YAML representers for key lsst.daf.base classes 

53 

54 

55def dt_representer(dumper, data): 

56 """Represent an lsst.daf.base.DateTime (as ISO8601-formatted string in TAI) 

57 """ 

58 return dumper.represent_scalar('lsst.daf.base.DateTime', 

59 data.toString(DateTime.TAI)) 

60 

61 

62if yaml: 62 ↛ 66line 62 didn't jump to line 66, because the condition on line 62 was never false

63 yaml.add_representer(DateTime, dt_representer) 

64 

65 

66def pl_representer(dumper, data): 

67 """Represent an lsst.daf.base.PropertyList as an ordered sequence of 

68 name/type/value/comment lists) 

69 """ 

70 # Turn the tuples into lists for cleaner representation in yaml 

71 result = getPropertyListState(data, asLists=True) 

72 return dumper.represent_sequence('lsst.daf.base.PropertyList', result, 

73 flow_style=None) 

74 

75 

76if yaml: 76 ↛ 80line 76 didn't jump to line 80, because the condition on line 76 was never false

77 yaml.add_representer(PropertyList, pl_representer) 

78 

79 

80def ps_representer(dumper, data): 

81 """Represent an lsst.daf.base.PropertySet as a mapping from names to 

82 type/value pairs. 

83 """ 

84 # Turn the tuples into lists for cleaner representation in yaml 

85 result = getPropertySetState(data, asLists=True) 

86 return dumper.represent_sequence('lsst.daf.base.PropertySet', result, 

87 flow_style=None) 

88 

89 

90if yaml: 90 ↛ 98line 90 didn't jump to line 98, because the condition on line 90 was never false

91 yaml.add_representer(PropertySet, ps_representer) 

92 

93############################################################################### 

94 

95# YAML constructors for key lsst.daf.base classes 

96 

97 

98def dt_constructor(loader, node): 

99 """Construct an lsst.daf.base.DateTime from an ISO8601-formatted string in 

100 TAI 

101 """ 

102 dt = loader.construct_scalar(node) 

103 return DateTime(str(dt), DateTime.TAI) 

104 

105 

106def pl_constructor(loader, node): 

107 """Construct an lsst.daf.base.PropertyList from a YAML pickle-like 

108 structure. 

109 """ 

110 pl = PropertyList() 

111 yield pl 

112 state = loader.construct_sequence(node, deep=True) 

113 setPropertyListState(pl, state) 

114 

115 

116def ps_constructor(loader, node): 

117 """Construct an lsst.daf.base.PropertyList from a YAML pickle-like 

118 structure. 

119 """ 

120 ps = PropertySet() 

121 yield ps 

122 state = loader.construct_sequence(node, deep=True) 

123 setPropertySetState(ps, state) 

124 

125 

126if yaml: 126 ↛ exitline 126 didn't jump to the function exit

127 for loader in loaderList: 

128 yaml.add_constructor('lsst.daf.base.PropertyList', pl_constructor, Loader=loader) 

129 yaml.add_constructor('lsst.daf.base.PropertySet', ps_constructor, Loader=loader) 

130 yaml.add_constructor('lsst.daf.base.DateTime', dt_constructor, Loader=loader)