Coverage for python/lsst/verify/metadata/eupsmanifest.py: 26%
41 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-01 10:20 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-01 10:20 +0000
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"""
24__all__ = ['Manifest']
26from collections import OrderedDict, namedtuple
29ManifestItem = namedtuple('ManifestItem',
30 ['name', 'git_sha', 'version', 'dependencies'])
33class Manifest(object):
34 """Iterator over packages in lsstsw's manifest.txt dataset.
36 Parameters
37 ----------
38 manifest_stream : file handle
39 A file handle for `manifest.txt` (from `open`, for example).
40 """
42 def __init__(self, manifest_stream):
43 self._build_id = None
44 self._packages = OrderedDict()
46 self._parse_manifest_stream(manifest_stream)
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()
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
72 def __iter__(self):
73 """Iterate over package names.
75 Yields
76 ------
77 name : `str`
78 Package name.
79 """
80 for package in self._packages:
81 yield package
83 def items(self):
84 """Iterate over packages.
86 Yields
87 ------
88 item : `tuple`
89 Tuple of ``(name, manifest_item)``. ``manifest_item`` is a
90 `ManifestItem` (namedtuple) type with fields:
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
100 def __len__(self):
101 """Count number of packages in the manifest (`int`)."""
102 return len(self._packages)
104 def __getitem__(self, package_name):
105 """Get a package item from the manifest by name.
107 Parameters
108 ----------
109 package_name : `str`
110 EUPS package name.
112 Returns
113 -------
114 item : `ManifestItem`
115 `ManifestItem` is a `namedtuple` type with fields:
117 - ``name``
118 - ``git_sha``
119 - ``version`` (EUPS version)
120 - ``dependencies`` (list of EUPS package names)
121 """
122 return self._packages[package_name]
124 def __contains__(self, package_name):
125 """Test if a package is in the manifest.
127 Parameters
128 ----------
129 package_name : `str`
130 EUPS package name.
132 Returns
133 -------
134 contained : `bool`
135 `True` if package is in the manifest.
136 """
137 return package_name in self._packages
139 @property
140 def build(self):
141 """Build number, bNNNN (`str`)."""
142 return self._build_id