Merge ~ilasc/launchpad:add-properties-column-to-revisionstatusreport into launchpad:master

Proposed by Ioana Lasc
Status: Merged
Approved by: Ioana Lasc
Approved revision: 31ad39a0ebf1b6bc1b65493013c8077b84bfbc82
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~ilasc/launchpad:add-properties-column-to-revisionstatusreport
Merge into: launchpad:master
Diff against target: 224 lines (+69/-5)
4 files modified
lib/lp/code/interfaces/revisionstatus.py (+18/-2)
lib/lp/code/model/revisionstatus.py (+17/-1)
lib/lp/code/model/tests/test_revisionstatus.py (+32/-2)
lib/lp/testing/factory.py (+2/-0)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+427821@code.launchpad.net

Commit message

Add a properties attribute to RevisionStatusReport

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

(Can't land until the corresponding DB patch is deployed, of course.)

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/code/interfaces/revisionstatus.py b/lib/lp/code/interfaces/revisionstatus.py
2index 37da501..7c05797 100644
3--- a/lib/lp/code/interfaces/revisionstatus.py
4+++ b/lib/lp/code/interfaces/revisionstatus.py
5@@ -28,7 +28,7 @@ from lazr.restful.declarations import (
6 from lazr.restful.fields import Reference
7 from lazr.restful.interface import copy_field
8 from zope.interface import Attribute, Interface
9-from zope.schema import Bytes, Choice, Datetime, Int, TextLine
10+from zope.schema import Bytes, Choice, Datetime, Dict, Int, TextLine
11 from zope.security.interfaces import Unauthorized
12
13 from lp import _
14@@ -160,6 +160,15 @@ class IRevisionStatusReportEditableAttributes(Interface):
15 )
16 )
17
18+ properties = exported(
19+ Dict(
20+ title=_("Metadata for artifacts attached to this report"),
21+ key_type=TextLine(),
22+ required=False,
23+ readonly=True,
24+ )
25+ )
26+
27 @mutator_for(result)
28 @operation_parameters(result=copy_field(result))
29 @export_write_operation()
30@@ -223,17 +232,24 @@ class IRevisionStatusReportEdit(Interface):
31 title=_("A short summary of the result."), required=False
32 ),
33 result=Choice(vocabulary=RevisionStatusResult, required=False),
34+ properties=Dict(
35+ title=_("Properties dictionary"),
36+ required=False,
37+ ),
38 )
39 @scoped(AccessTokenScope.REPOSITORY_BUILD_STATUS.title)
40 @export_write_operation()
41 @operation_for_version("devel")
42- def update(title, url, result_summary, result):
43+ def update(
44+ title=None, url=None, result_summary=None, result=None, properties=None
45+ ):
46 """Updates a status report.
47
48 :param title: A short title for the report.
49 :param url: The external url of the report.
50 :param result_summary: A short summary of the result.
51 :param result: The result of the report.
52+ :param properties: A dictionary of general-purpose metadata.
53 """
54
55
56diff --git a/lib/lp/code/model/revisionstatus.py b/lib/lp/code/model/revisionstatus.py
57index bcbca59..ebc5914 100644
58--- a/lib/lp/code/model/revisionstatus.py
59+++ b/lib/lp/code/model/revisionstatus.py
60@@ -11,6 +11,7 @@ import io
61 import os
62
63 import pytz
64+from storm.databases.postgres import JSON
65 from storm.expr import Desc
66 from storm.locals import And, DateTime, Int, Reference, Unicode
67 from zope.component import getUtility
68@@ -70,6 +71,8 @@ class RevisionStatusReport(StormBase):
69 name="date_finished", tzinfo=pytz.UTC, allow_none=True
70 )
71
72+ properties = JSON("properties", allow_none=True)
73+
74 def __init__(
75 self,
76 git_repository,
77@@ -80,6 +83,7 @@ class RevisionStatusReport(StormBase):
78 result_summary,
79 result,
80 ci_build=None,
81+ properties=None,
82 ):
83 super().__init__()
84 self.creator = user
85@@ -91,6 +95,7 @@ class RevisionStatusReport(StormBase):
86 self.ci_build = ci_build
87 self.date_created = UTC_NOW
88 self.transitionToNewResult(result)
89+ self.properties = properties
90
91 def setLog(self, log_data):
92 filename = "%s-%s.txt" % (self.title, self.commit_sha1)
93@@ -147,7 +152,14 @@ class RevisionStatusReport(StormBase):
94 self.date_finished = UTC_NOW
95 self.result = result
96
97- def update(self, title=None, url=None, result_summary=None, result=None):
98+ def update(
99+ self,
100+ title=None,
101+ url=None,
102+ result_summary=None,
103+ result=None,
104+ properties=None,
105+ ):
106 if title is not None:
107 self.title = title
108 if url is not None:
109@@ -156,6 +168,8 @@ class RevisionStatusReport(StormBase):
110 self.result_summary = result_summary
111 if result is not None:
112 self.transitionToNewResult(result)
113+ if properties is not None:
114+ self.properties = properties
115
116 def getArtifactURLs(self, artifact_type):
117 clauses = [
118@@ -200,6 +214,7 @@ class RevisionStatusReportSet:
119 date_finished=None,
120 log=None,
121 ci_build=None,
122+ properties=None,
123 ):
124 """See `IRevisionStatusReportSet`."""
125 store = IStore(RevisionStatusReport)
126@@ -212,6 +227,7 @@ class RevisionStatusReportSet:
127 result_summary,
128 result,
129 ci_build=ci_build,
130+ properties=properties,
131 )
132 store.add(report)
133 return report
134diff --git a/lib/lp/code/model/tests/test_revisionstatus.py b/lib/lp/code/model/tests/test_revisionstatus.py
135index 3c42053..fa292a9 100644
136--- a/lib/lp/code/model/tests/test_revisionstatus.py
137+++ b/lib/lp/code/model/tests/test_revisionstatus.py
138@@ -150,6 +150,19 @@ class TestRevisionStatusReport(TestCaseWithFactory):
139 )
140 self.assertEqual("test", report.title)
141
142+ def test_properties(self):
143+ test_properties = {
144+ "launchpad.source-name": "go-module",
145+ "launchpad.source-version": "v0.0.1",
146+ "soss.source_url": "some url",
147+ "soss.commit_id": "some commit id",
148+ }
149+ repo = self.factory.makeGitRepository()
150+ report = self.factory.makeRevisionStatusReport(
151+ git_repository=repo, commit_sha1="123", properties=test_properties
152+ )
153+ self.assertEqual(test_properties, report.properties)
154+
155 def test_latest_log(self):
156 report = self.factory.makeRevisionStatusReport()
157 self.makeRevisionStatusArtifact(report=report)
158@@ -331,8 +344,14 @@ class TestRevisionStatusReportWebservice(TestCaseWithFactory):
159 )
160
161 def test_update(self):
162+ test_properties = {
163+ "launchpad.source-name": "go-module",
164+ "launchpad.source-version": "v0.0.1",
165+ "soss.source_url": "some url",
166+ "soss.commit_id": "some commit id",
167+ }
168 report = self.factory.makeRevisionStatusReport(
169- result=RevisionStatusResult.FAILED
170+ result=RevisionStatusResult.FAILED, properties=test_properties
171 )
172 requester = report.creator
173 repository = report.git_repository
174@@ -352,11 +371,21 @@ class TestRevisionStatusReportWebservice(TestCaseWithFactory):
175 commit_sha1=initial_commit_sha1,
176 result_summary=initial_result_summary,
177 result=RevisionStatusResult.FAILED,
178+ properties=test_properties,
179 ),
180 )
181 date_finished_before_update = report.date_finished
182+ new_properties = {
183+ "launchpad.source-name": "new-go-module",
184+ "launchpad.source-version": "v2.2.1",
185+ "soss.source_url": "new url",
186+ "soss.commit_id": "new commit id",
187+ }
188 response = webservice.named_post(
189- report_url, "update", result="Succeeded"
190+ report_url,
191+ "update",
192+ result="Succeeded",
193+ properties=new_properties,
194 )
195 self.assertEqual(200, response.status)
196 with person_logged_in(requester):
197@@ -368,6 +397,7 @@ class TestRevisionStatusReportWebservice(TestCaseWithFactory):
198 result_summary=Equals(initial_result_summary),
199 result=Equals(RevisionStatusResult.SUCCEEDED),
200 date_finished=GreaterThan(date_finished_before_update),
201+ properties=Equals(new_properties),
202 ),
203 )
204
205diff --git a/lib/lp/testing/factory.py b/lib/lp/testing/factory.py
206index ac56caf..b28bd26 100644
207--- a/lib/lp/testing/factory.py
208+++ b/lib/lp/testing/factory.py
209@@ -2180,6 +2180,7 @@ class LaunchpadObjectFactory(ObjectFactory):
210 url=None,
211 result=None,
212 ci_build=None,
213+ properties=None,
214 ):
215 """Create a new RevisionStatusReport."""
216 if title is None:
217@@ -2207,6 +2208,7 @@ class LaunchpadObjectFactory(ObjectFactory):
218 result_summary,
219 result,
220 ci_build=ci_build,
221+ properties=properties,
222 )
223
224 def makeRevisionStatusArtifact(

Subscribers

People subscribed via source and target branches

to status/vote changes: