Coverage for python/lsst/verify/metadata/eupsmanifest.py: 26%

41 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-10-30 02:08 -0700

1# This file is part of verify. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://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 <https://www.gnu.org/licenses/>. 

21"""API for parsing the manifest.txt file for EUPS packages found in lsstsw. 

22""" 

23 

24__all__ = ['Manifest'] 

25 

26from collections import OrderedDict, namedtuple 

27 

28 

29ManifestItem = namedtuple('ManifestItem', 

30 ['name', 'git_sha', 'version', 'dependencies']) 

31 

32 

33class Manifest(object): 

34 """Iterator over packages in lsstsw's manifest.txt dataset. 

35 

36 Parameters 

37 ---------- 

38 manifest_stream : file handle 

39 A file handle for `manifest.txt` (from `open`, for example). 

40 """ 

41 

42 def __init__(self, manifest_stream): 

43 self._build_id = None 

44 self._packages = OrderedDict() 

45 

46 self._parse_manifest_stream(manifest_stream) 

47 

48 def _parse_manifest_stream(self, manifest_stream): 

49 for manifest_line in manifest_stream.readlines(): 

50 manifest_line = manifest_line.strip() 

51 if manifest_line.startswith('#'): 

52 continue 

53 elif manifest_line.startswith('BUILD'): 

54 self._build_id = manifest_line.split('=')[-1] 

55 continue 

56 parts = manifest_line.split() 

57 package_name = parts[0] 

58 git_commit = parts[1] 

59 eups_version = parts[2] 

60 if len(parts) == 4: 

61 deps = parts[3].split(',') 

62 else: 

63 deps = list() 

64 

65 package = ManifestItem( 

66 name=package_name, 

67 git_sha=git_commit, 

68 version=eups_version, 

69 dependencies=deps) 

70 self._packages[package_name] = package 

71 

72 def __iter__(self): 

73 """Iterate over package names. 

74 

75 Yields 

76 ------ 

77 name : `str` 

78 Package name. 

79 """ 

80 for package in self._packages: 

81 yield package 

82 

83 def items(self): 

84 """Iterate over packages. 

85 

86 Yields 

87 ------ 

88 item : `tuple` 

89 Tuple of ``(name, manifest_item)``. ``manifest_item`` is a 

90 `ManifestItem` (namedtuple) type with fields: 

91 

92 - ``name`` 

93 - ``git_sha`` 

94 - ``version`` (EUPS version) 

95 - ``dependencies`` (list of EUPS package names) 

96 """ 

97 for item in self._packages.items(): 

98 yield item 

99 

100 def __len__(self): 

101 """Count number of packages in the manifest (`int`).""" 

102 return len(self._packages) 

103 

104 def __getitem__(self, package_name): 

105 """Get a package item from the manifest by name. 

106 

107 Parameters 

108 ---------- 

109 package_name : `str` 

110 EUPS package name. 

111 

112 Returns 

113 ------- 

114 item : `ManifestItem` 

115 `ManifestItem` is a `namedtuple` type with fields: 

116 

117 - ``name`` 

118 - ``git_sha`` 

119 - ``version`` (EUPS version) 

120 - ``dependencies`` (list of EUPS package names) 

121 """ 

122 return self._packages[package_name] 

123 

124 def __contains__(self, package_name): 

125 """Test if a package is in the manifest. 

126 

127 Parameters 

128 ---------- 

129 package_name : `str` 

130 EUPS package name. 

131 

132 Returns 

133 ------- 

134 contained : `bool` 

135 `True` if package is in the manifest. 

136 """ 

137 return package_name in self._packages 

138 

139 @property 

140 def build(self): 

141 """Build number, bNNNN (`str`).""" 

142 return self._build_id