Merge lp:~james-w/udd/binary-scanning-series into lp:udd

Proposed by James Westby on 2012-08-11
Status: Merged
Approved by: Jonathan Lange on 2012-08-17
Approved revision: 615
Merged at revision: 626
Proposed branch: lp:~james-w/udd/binary-scanning-series
Merge into: lp:udd
Diff against target: 141 lines (+57/-21)
2 files modified
udd/icommon.py (+39/-14)
udd/tests/test_icommon.py (+18/-7)
To merge this branch: bzr merge lp:~james-w/udd/binary-scanning-series
Reviewer Review Type Date Requested Status
Jonathan Lange (community) 2012-08-11 Approve on 2012-08-13
Review via email: mp+119248@code.launchpad.net

Commit Message

Fix the API expectations of iter_published_binaries to match the API that is passed from the caller.

Description of the Change

Hi,

We're getting crashes for list-packages in binary scanning mode, because
of an API mismatch.

This fixes that up, as well as tweaking the docstring to make it clear
what the API is.

Thanks,

James

To post a comment you must log in.
Jonathan Lange (jml) wrote :

LGTM. Thanks.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'udd/icommon.py'
2--- udd/icommon.py 2012-08-09 15:45:46 +0000
3+++ udd/icommon.py 2012-08-11 16:10:27 +0000
4@@ -395,6 +395,39 @@
5 distro_arch_series=distro_arch_series, **filters))
6
7
8+def _lp_get_series(distribution, name_or_version):
9+ return lpapi.lp_call(distribution.getSeries,
10+ name_or_version=name_or_version)
11+
12+
13+def _iter_published_binaries_for_series(distribution, series,
14+ status='Published', since=None):
15+ """Iterate over published binary packages for a particular series.
16+
17+ :param distribution: A Launchpad ``Distribution`` object. e.g. ubuntu.
18+ :param series: A Launchpad ``DistroSeries`` object, e.g. 'precise' in
19+ 'ubuntu.
20+ :param status: One of 'Pending', 'Published', 'Superseded', 'Deleted'
21+ or 'Obsolete'. Defaults to 'Published'.
22+ :param since: If provided, only find packages published since that date.
23+ :return: An iterator over source package publishing history objects.
24+ See https://launchpad.net/+apidoc/devel.html#binary_package_publishing_history
25+ for more details.
26+ """
27+ filters = {'status': status}
28+ if since:
29+ filters['created_since_date'] = since
30+ archive = distribution.main_archive
31+ collections = []
32+ # There's no way to query getPublishedBinaries by distro_series, so we
33+ # have to search by distro_arch_series and combine the results.
34+ # <https://bugs.launchpad.net/launchpad/+bug/904670>.
35+ for distro_arch_series in series.architectures:
36+ collections.append(
37+ _lp_get_published_binaries(archive, distro_arch_series, **filters))
38+ return chain(*collections)
39+
40+
41 def iter_published_binaries(distribution, status='Published', since=None,
42 series=None):
43 """Iterate over published binary packages.
44@@ -403,15 +436,12 @@
45 :param status: One of 'Pending', 'Published', 'Superseded', 'Deleted'
46 or 'Obsolete'. Defaults to 'Published'.
47 :param since: If provided, only find packages published since that date.
48- :param series: If provided, only find packages published to that series.
49+ :param series: The name or version of the distribution series to restrict
50+ the search to. e.g. 'oneiric'
51 :return: An iterator over source package publishing history objects.
52 See https://launchpad.net/+apidoc/devel.html#binary_package_publishing_history
53 for more details.
54 """
55- filters = {'status': status}
56- if since:
57- filters['created_since_date'] = since
58- archive = distribution.main_archive
59 if series is None:
60 # If series is None, then a single, unadorned getPublishedBinaries
61 # query will time out (bug #904344). Instead, break down the query
62@@ -419,16 +449,11 @@
63 collections = []
64 for s in distribution.series:
65 collections.append(
66- iter_published_binaries(distribution, status, since, s))
67+ _iter_published_binaries_for_series(distribution, s, status, since))
68 return chain(*collections)
69- collections = []
70- # There's no way to query getPublishedBinaries by distro_series, so we
71- # have to search by distro_arch_series and combine the results.
72- # <https://bugs.launchpad.net/launchpad/+bug/904670>.
73- for distro_arch_series in series.architectures:
74- collections.append(
75- _lp_get_published_binaries(archive, distro_arch_series, **filters))
76- return chain(*collections)
77+ lp_series = _lp_get_series(distribution, series)
78+ return _iter_published_binaries_for_series(distribution, lp_series,
79+ status=status, since=since)
80
81
82 class PackageStatus(object):
83
84=== modified file 'udd/tests/test_icommon.py'
85--- udd/tests/test_icommon.py 2011-12-15 12:42:59 +0000
86+++ udd/tests/test_icommon.py 2012-08-11 16:10:27 +0000
87@@ -1,4 +1,5 @@
88 from datetime import datetime, timedelta
89+import itertools
90
91 from bzrlib import tests
92
93@@ -77,6 +78,8 @@
94 super(TestIterPublishedBinaries, self).setUp()
95 self.patch(icommon, '_lp_get_published_binaries',
96 self._fake_get_published_binaries)
97+ self.patch(icommon, '_lp_get_series',
98+ self._fake_get_series)
99
100 def _fake_get_published_binaries(self, archive, distro_arch_series,
101 **filters):
102@@ -87,6 +90,16 @@
103 """
104 return iter([archive, distro_arch_series, filters])
105
106+ def _fake_get_series(self, distribution, name_or_version):
107+ """A fake version of _lp_get_series.
108+
109+ Returns an object with an architectures attribute that will be
110+ a list of architecture strings related to the series name.
111+ """
112+ archs = map(lambda x: name_or_version + 'arch' + x,
113+ map(str, range(3)))
114+ return Struct(architectures=archs)
115+
116 def test_series_provided(self):
117 # If a series is provided then iter_published_binaries will do one
118 # call per distro_arch_series and then merge the results.
119@@ -94,17 +107,15 @@
120 since = object()
121 archive = object()
122 distribution = Struct(main_archive=archive)
123- series = Struct(architectures=['foo', 'bar', 'baz'])
124+ series = 'series'
125 binaries = icommon.iter_published_binaries(
126 distribution, status=status, since=since, series=series)
127 # We expect multiple calls to _lp_get_published_binaries. The iterable
128 # results of these calls will be chained together.
129- self.assertEqual(
130- [archive, 'foo', {'status': status, 'created_since_date': since},
131- archive, 'bar', {'status': status, 'created_since_date': since},
132- archive, 'baz', {'status': status, 'created_since_date': since},
133- ],
134- list(binaries))
135+ def make_results(arch):
136+ return [archive, arch, {'status': status, 'created_since_date': since}]
137+ results = map(make_results, self._fake_get_series(distribution, series).architectures)
138+ self.assertEqual(list(itertools.chain(*results)), list(binaries))
139
140 def test_series_not_provided(self):
141 # If no series is provided, then iter_published_binaries will do one

Subscribers

People subscribed via source and target branches