Merge ~cjwatson/launchpad:charmrecipebuild-getFileUrls into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: f365f7bca0bbf37d40d13e66b115f603ea3a0309
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:charmrecipebuild-getFileUrls
Merge into: launchpad:master
Diff against target: 88 lines (+37/-0)
3 files modified
lib/lp/charms/interfaces/charmrecipebuild.py (+8/-0)
lib/lp/charms/model/charmrecipebuild.py (+8/-0)
lib/lp/charms/tests/test_charmrecipebuild.py (+21/-0)
Reviewer Review Type Date Requested Status
Ines Almeida Approve
Review via email: mp+447547@code.launchpad.net

Commit message

Add and export CharmRecipeBuild.getFileUrls

Description of the change

This is directly analogous to methods on other similar build types, such as `SnapBuild.getFileUrls`.

To post a comment you must log in.
Revision history for this message
Ines Almeida (ines-almeida) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/charms/interfaces/charmrecipebuild.py b/lib/lp/charms/interfaces/charmrecipebuild.py
2index b3bfd33..78cec6b 100644
3--- a/lib/lp/charms/interfaces/charmrecipebuild.py
4+++ b/lib/lp/charms/interfaces/charmrecipebuild.py
5@@ -16,6 +16,7 @@ import http.client
6 from lazr.enum import EnumeratedType, Item
7 from lazr.restful.declarations import (
8 error_status,
9+ export_read_operation,
10 export_write_operation,
11 exported,
12 exported_as_webservice_entry,
13@@ -264,6 +265,13 @@ class ICharmRecipeBuildView(IPackageBuildView):
14 :return: The corresponding `ILibraryFileAlias`.
15 """
16
17+ @export_read_operation()
18+ @operation_for_version("devel")
19+ def getFileUrls():
20+ """URLs for all the files produced by this build.
21+
22+ :return: A collection of URLs for this build."""
23+
24
25 class ICharmRecipeBuildEdit(IBuildFarmJobEdit):
26 """`ICharmRecipeBuild` methods that require launchpad.Edit."""
27diff --git a/lib/lp/charms/model/charmrecipebuild.py b/lib/lp/charms/model/charmrecipebuild.py
28index b5e4fe6..083c7ac 100644
29--- a/lib/lp/charms/model/charmrecipebuild.py
30+++ b/lib/lp/charms/model/charmrecipebuild.py
31@@ -68,6 +68,7 @@ from lp.services.database.interfaces import IPrimaryStore, IStore
32 from lp.services.database.stormbase import StormBase
33 from lp.services.job.interfaces.job import JobStatus
34 from lp.services.job.model.job import Job
35+from lp.services.librarian.browser import ProxiedLibraryFileAlias
36 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
37 from lp.services.propertycache import cachedproperty, get_property_cache
38 from lp.services.webapp.snapshot import notify_modified
39@@ -403,6 +404,13 @@ class CharmRecipeBuild(PackageBuildMixin, StormBase):
40
41 raise NotFoundError(filename)
42
43+ def getFileUrls(self):
44+ """See `ICharmRecipeBuild`."""
45+ return [
46+ ProxiedLibraryFileAlias(lfa, self).http_url
47+ for _, lfa, _ in self.getFiles()
48+ ]
49+
50 def addFile(self, lfa):
51 """See `ICharmRecipeBuild`."""
52 charm_file = CharmFile(build=self, library_file=lfa)
53diff --git a/lib/lp/charms/tests/test_charmrecipebuild.py b/lib/lp/charms/tests/test_charmrecipebuild.py
54index e3816fe..c5903fa 100644
55--- a/lib/lp/charms/tests/test_charmrecipebuild.py
56+++ b/lib/lp/charms/tests/test_charmrecipebuild.py
57@@ -45,6 +45,7 @@ from lp.services.config import config
58 from lp.services.crypto.interfaces import IEncryptedContainer
59 from lp.services.features.testing import FeatureFixture
60 from lp.services.job.interfaces.job import JobStatus
61+from lp.services.librarian.browser import ProxiedLibraryFileAlias
62 from lp.services.propertycache import clear_property_cache
63 from lp.services.webapp.interfaces import OAuthPermission
64 from lp.services.webapp.publisher import canonical_url
65@@ -998,3 +999,23 @@ class TestCharmRecipeBuildWebservice(TestCaseWithFactory):
66 self.assertCanOpenRedirectedUrl(browser, build["build_log_url"])
67 self.assertIsNotNone(build["upload_log_url"])
68 self.assertCanOpenRedirectedUrl(browser, build["upload_log_url"])
69+
70+ def test_getFileUrls(self):
71+ # API clients can fetch files attached to builds.
72+ db_build = self.factory.makeCharmRecipeBuild(requester=self.person)
73+ db_files = [
74+ self.factory.makeCharmFile(build=db_build) for i in range(2)
75+ ]
76+ build_url = api_url(db_build)
77+ file_urls = [
78+ ProxiedLibraryFileAlias(file.library_file, db_build).http_url
79+ for file in db_files
80+ ]
81+ logout()
82+ response = self.webservice.named_get(build_url, "getFileUrls")
83+ self.assertEqual(200, response.status)
84+ self.assertContentEqual(file_urls, response.jsonBody())
85+ browser = self.getNonRedirectingBrowser(user=self.person)
86+ browser.raiseHttpErrors = False
87+ for file_url in file_urls:
88+ self.assertCanOpenRedirectedUrl(browser, file_url)

Subscribers

People subscribed via source and target branches

to status/vote changes: