Merge ~jugmac00/launchpad:archive.getPublishedBinaries-should-accept-component-name into launchpad:master

Proposed by Jürgen Gmach
Status: Merged
Approved by: Jürgen Gmach
Approved revision: e609232edb851776cac741c908092bce708d1ce9
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~jugmac00/launchpad:archive.getPublishedBinaries-should-accept-component-name
Merge into: launchpad:master
Diff against target: 113 lines (+37/-6)
3 files modified
lib/lp/soyuz/browser/tests/test_archive_webservice.py (+22/-0)
lib/lp/soyuz/interfaces/archive.py (+5/-2)
lib/lp/soyuz/model/archive.py (+10/-4)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+410072@code.launchpad.net

Commit message

Add component_name filter to getPublishedBinaries

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) wrote :

This is definitely along the right lines, but the test does need to be more robust.

review: Needs Fixing
Revision history for this message
Jürgen Gmach (jugmac00) wrote :

Ready for a new review.

Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/soyuz/browser/tests/test_archive_webservice.py b/lib/lp/soyuz/browser/tests/test_archive_webservice.py
2index f9e675b..87a33a2 100644
3--- a/lib/lp/soyuz/browser/tests/test_archive_webservice.py
4+++ b/lib/lp/soyuz/browser/tests/test_archive_webservice.py
5@@ -788,6 +788,28 @@ class TestGetPublishedBinaries(TestCaseWithFactory):
6 self.assertThat(
7 recorder2, HasQueryCount(Equals(recorder1.count + 3), recorder1))
8
9+ def test_getPublishedBinaries_filter_by_component(self):
10+ # self.archive cannot be used, as this is a PPA, which only
11+ # supports a single "main" component
12+ archive = self.factory.makeArchive(purpose=ArchivePurpose.PRIMARY)
13+ archive_url = api_url(archive)
14+ for component in ("main", "main", "universe"):
15+ self.factory.makeBinaryPackagePublishingHistory(
16+ archive=archive, component=component)
17+ ws = webservice_for_person(self.person, default_api_version="devel")
18+
19+ for component, expected_count in (
20+ ("main", 2), ("universe", 1), ("restricted", 0)):
21+ response = ws.named_get(
22+ archive_url, "getPublishedBinaries",
23+ component_name=component)
24+
25+ self.assertEqual(200, response.status)
26+ self.assertEqual(
27+ expected_count, response.jsonBody()["total_size"])
28+ for entry in response.jsonBody()["entries"]:
29+ self.assertEqual(component, entry["component_name"])
30+
31
32 class TestRemoveCopyNotification(TestCaseWithFactory):
33 """Test removeCopyNotification."""
34diff --git a/lib/lp/soyuz/interfaces/archive.py b/lib/lp/soyuz/interfaces/archive.py
35index 84d6932..f8f18f6 100644
36--- a/lib/lp/soyuz/interfaces/archive.py
37+++ b/lib/lp/soyuz/interfaces/archive.py
38@@ -628,7 +628,8 @@ class IArchiveSubscriberView(Interface):
39 "for applications that need to catch up with "
40 "publications since their last run."),
41 required=False),
42- )
43+ component_name=TextLine(title=_("Component name"), required=False),
44+ )
45 # Really returns IBinaryPackagePublishingHistory, see below for
46 # patch to avoid circular import.
47 @operation_returns_collection_of(Interface)
48@@ -639,7 +640,7 @@ class IArchiveSubscriberView(Interface):
49 exact_match=False, created_since_date=None,
50 ordered=True, order_by_date=False,
51 include_removed=True, only_unpublished=False,
52- eager_load=False):
53+ eager_load=False, component_name=None):
54 """All `IBinaryPackagePublishingHistory` target to this archive.
55
56 :param name: binary name filter (exact match or SQL LIKE controlled
57@@ -664,6 +665,8 @@ class IArchiveSubscriberView(Interface):
58 removed from disk as well as those that have not.
59 :param only_unpublished: If True, only include publications that
60 have never been published to disk.
61+ :param component_name: component filter. Only return binaries that are
62+ in this component.
63
64 :return: A collection containing `BinaryPackagePublishingHistory`.
65 """
66diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
67index 0feb787..3888a05 100644
68--- a/lib/lp/soyuz/model/archive.py
69+++ b/lib/lp/soyuz/model/archive.py
70@@ -790,7 +790,7 @@ class Archive(SQLBase):
71 self, name=None, version=None, status=None, distroarchseries=None,
72 pocket=None, exact_match=False, created_since_date=None,
73 ordered=True, order_by_date=False, include_removed=True,
74- only_unpublished=False, need_bpr=False):
75+ only_unpublished=False, need_bpr=False, component_name=None):
76 """Base clauses for binary publishing queries.
77
78 Returns a list of 'clauses' (to be joined in the callsite).
79@@ -873,6 +873,13 @@ class Archive(SQLBase):
80 clauses.append(
81 BinaryPackagePublishingHistory.datepublished == None)
82
83+ if component_name is not None:
84+ clauses.extend(
85+ [BinaryPackagePublishingHistory.componentID == Component.id,
86+ Component.name == component_name,
87+ ]
88+ )
89+
90 return clauses, order_by
91
92 def getAllPublishedBinaries(self, name=None, version=None, status=None,
93@@ -880,18 +887,17 @@ class Archive(SQLBase):
94 exact_match=False, created_since_date=None,
95 ordered=True, order_by_date=False,
96 include_removed=True, only_unpublished=False,
97- eager_load=False):
98+ eager_load=False, component_name=None):
99 """See `IArchive`."""
100 # Circular imports.
101 from lp.registry.model.distroseries import DistroSeries
102 from lp.soyuz.model.distroarchseries import DistroArchSeries
103-
104 clauses, order_by = self._getBinaryPublishingBaseClauses(
105 name=name, version=version, status=status, pocket=pocket,
106 distroarchseries=distroarchseries, exact_match=exact_match,
107 created_since_date=created_since_date, ordered=ordered,
108 order_by_date=order_by_date, include_removed=include_removed,
109- only_unpublished=only_unpublished)
110+ only_unpublished=only_unpublished, component_name=component_name)
111
112 result = Store.of(self).find(
113 BinaryPackagePublishingHistory, *clauses).order_by(*order_by)

Subscribers

People subscribed via source and target branches

to status/vote changes: