Merge lp:~michael.nelson/launchpad/distro-series-difference-basic-model into lp:launchpad/db-devel
- distro-series-difference-basic-model
- Merge into db-devel
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Michael Nelson | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 9724 | ||||
Proposed branch: | lp:~michael.nelson/launchpad/distro-series-difference-basic-model | ||||
Merge into: | lp:launchpad/db-devel | ||||
Prerequisite: | lp:~michael.nelson/launchpad/distro-series-difference-schema | ||||
Diff against target: |
531 lines (+462/-0) 7 files modified
lib/lp/registry/configure.zcml (+11/-0) lib/lp/registry/enum.py (+57/-0) lib/lp/registry/exceptions.py (+17/-0) lib/lp/registry/interfaces/distroseriesdifference.py (+108/-0) lib/lp/registry/model/distroseriesdifference.py (+117/-0) lib/lp/registry/tests/test_distroseriesdifference.py (+110/-0) lib/lp/testing/factory.py (+42/-0) |
||||
To merge this branch: | bzr merge lp:~michael.nelson/launchpad/distro-series-difference-basic-model | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Abel Deuring (community) | code | Approve | |
Review via email: mp+33885@code.launchpad.net |
Commit message
Adds basic model functionality for the DistroSeriesDif
Description of the change
Overview
========
This branch continues on from:
and implements the basic model, enums and tests for representing the distroseriesdif
Details
=======
I've set the status and activity_log fields as readonly as a following branch will adds more functionality to the model including security for the status and activity_log fields.
Test with:
bin/test -vvm lp.registry.
Michael Nelson (michael.nelson) wrote : | # |
On Fri, Aug 27, 2010 at 1:39 PM, Abel Deuring
<email address hidden> wrote:
> Review: Approve code
> Hi Michael,
>
> nice work! I have just two nitpicks:
Thanks Abel, incremental attached. In addition to the changes you
mentioned, I've switched the activity_log to be a property rather than
a db field due to a schema change.
Cheers,
Michael
1 | === modified file 'lib/lp/registry/interfaces/distroseriesdifference.py' | |||
2 | --- lib/lp/registry/interfaces/distroseriesdifference.py 2010-08-27 09:28:03 +0000 | |||
3 | +++ lib/lp/registry/interfaces/distroseriesdifference.py 2010-08-27 12:29:55 +0000 | |||
4 | @@ -54,7 +54,7 @@ | |||
5 | 54 | "The most recently generated package diff for this difference.")) | 54 | "The most recently generated package diff for this difference.")) |
6 | 55 | 55 | ||
7 | 56 | activity_log = Text( | 56 | activity_log = Text( |
9 | 57 | title=_('A log of activity and comments for this difference'), | 57 | title=_('A log of activity and comments for this difference.'), |
10 | 58 | required=False, readonly=True) | 58 | required=False, readonly=True) |
11 | 59 | 59 | ||
12 | 60 | status = Choice( | 60 | status = Choice( |
13 | 61 | 61 | ||
14 | === modified file 'lib/lp/registry/model/distroseriesdifference.py' | |||
15 | --- lib/lp/registry/model/distroseriesdifference.py 2010-08-27 09:02:40 +0000 | |||
16 | +++ lib/lp/registry/model/distroseriesdifference.py 2010-08-27 12:38:58 +0000 | |||
17 | @@ -56,7 +56,6 @@ | |||
18 | 56 | last_package_diff = Reference( | 56 | last_package_diff = Reference( |
19 | 57 | last_package_diff_id, 'PackageDiff.id') | 57 | last_package_diff_id, 'PackageDiff.id') |
20 | 58 | 58 | ||
21 | 59 | activity_log = Unicode(name='activity_log', allow_none=True) | ||
22 | 60 | status = DBEnum(name='status', allow_none=False, | 59 | status = DBEnum(name='status', allow_none=False, |
23 | 61 | enum=DistroSeriesDifferenceStatus) | 60 | enum=DistroSeriesDifferenceStatus) |
24 | 62 | difference_type = DBEnum(name='difference_type', allow_none=False, | 61 | difference_type = DBEnum(name='difference_type', allow_none=False, |
25 | @@ -88,6 +87,11 @@ | |||
26 | 88 | """See `IDistroSeriesDifference`.""" | 87 | """See `IDistroSeriesDifference`.""" |
27 | 89 | return self._getLatestSourcePub(for_parent=True) | 88 | return self._getLatestSourcePub(for_parent=True) |
28 | 90 | 89 | ||
29 | 90 | @property | ||
30 | 91 | def activity_log(self): | ||
31 | 92 | """See `IDistroSeriesDifference`.""" | ||
32 | 93 | return u"" | ||
33 | 94 | |||
34 | 91 | def _getLatestSourcePub(self, for_parent=False): | 95 | def _getLatestSourcePub(self, for_parent=False): |
35 | 92 | """Helper to keep source_pub/parent_source_pub DRY.""" | 96 | """Helper to keep source_pub/parent_source_pub DRY.""" |
36 | 93 | distro_series = self.derived_series | 97 | distro_series = self.derived_series |
37 | 94 | 98 | ||
38 | === modified file 'lib/lp/registry/tests/test_distroseriesdifference.py' | |||
39 | --- lib/lp/registry/tests/test_distroseriesdifference.py 2010-08-27 09:02:40 +0000 | |||
40 | +++ lib/lp/registry/tests/test_distroseriesdifference.py 2010-08-27 12:37:35 +0000 | |||
41 | @@ -44,10 +44,15 @@ | |||
42 | 44 | # A DistroSeriesDifference cannot be created with a non-derived | 44 | # A DistroSeriesDifference cannot be created with a non-derived |
43 | 45 | # series. | 45 | # series. |
44 | 46 | distro_series = self.factory.makeDistroSeries() | 46 | distro_series = self.factory.makeDistroSeries() |
45 | 47 | source_package_name = self.factory.makeSourcePackageName('myfoo') | ||
46 | 48 | distroseriesdifference_factory = getUtility( | ||
47 | 49 | IDistroSeriesDifferenceSource) | ||
48 | 50 | |||
49 | 47 | self.assertRaises( | 51 | self.assertRaises( |
53 | 48 | NotADerivedSeriesError, | 52 | NotADerivedSeriesError, distroseriesdifference_factory.new, |
54 | 49 | self.factory.makeDistroSeriesDifference, | 53 | distro_series, source_package_name, |
55 | 50 | derived_series=distro_series) | 54 | DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES |
56 | 55 | ) | ||
57 | 51 | 56 | ||
58 | 52 | def test_source_pub(self): | 57 | def test_source_pub(self): |
59 | 53 | # The related source pub is returned for the derived series. | 58 | # The related source pub is returned for the derived series. |
Preview Diff
1 | === modified file 'lib/lp/registry/configure.zcml' | |||
2 | --- lib/lp/registry/configure.zcml 2010-08-23 03:25:20 +0000 | |||
3 | +++ lib/lp/registry/configure.zcml 2010-08-31 07:47:46 +0000 | |||
4 | @@ -102,6 +102,17 @@ | |||
5 | 102 | date_last_modified | 102 | date_last_modified |
6 | 103 | person"/> | 103 | person"/> |
7 | 104 | </class> | 104 | </class> |
8 | 105 | |||
9 | 106 | <!-- DistroSeriesDifference --> | ||
10 | 107 | <securedutility | ||
11 | 108 | component="lp.registry.model.distroseriesdifference.DistroSeriesDifference" | ||
12 | 109 | provides="lp.registry.interfaces.distroseriesdifference.IDistroSeriesDifferenceSource"> | ||
13 | 110 | <allow interface="lp.registry.interfaces.distroseriesdifference.IDistroSeriesDifferenceSource"/> | ||
14 | 111 | </securedutility> | ||
15 | 112 | <class | ||
16 | 113 | class="lp.registry.model.distroseriesdifference.DistroSeriesDifference"> | ||
17 | 114 | <allow interface="lp.registry.interfaces.distroseriesdifference.IDistroSeriesDifference"/> | ||
18 | 115 | </class> | ||
19 | 105 | <class | 116 | <class |
20 | 106 | class="lp.registry.model.distroseries.DistroSeries"> | 117 | class="lp.registry.model.distroseries.DistroSeries"> |
21 | 107 | <allow | 118 | <allow |
22 | 108 | 119 | ||
23 | === modified file 'lib/lp/registry/enum.py' | |||
24 | --- lib/lp/registry/enum.py 2010-08-20 20:31:18 +0000 | |||
25 | +++ lib/lp/registry/enum.py 2010-08-31 07:47:46 +0000 | |||
26 | @@ -6,6 +6,8 @@ | |||
27 | 6 | __metaclass__ = type | 6 | __metaclass__ = type |
28 | 7 | __all__ = [ | 7 | __all__ = [ |
29 | 8 | 'BugNotificationLevel', | 8 | 'BugNotificationLevel', |
30 | 9 | 'DistroSeriesDifferenceStatus', | ||
31 | 10 | 'DistroSeriesDifferenceType', | ||
32 | 9 | ] | 11 | ] |
33 | 10 | 12 | ||
34 | 11 | from lazr.enum import ( | 13 | from lazr.enum import ( |
35 | @@ -47,3 +49,58 @@ | |||
36 | 47 | notifications about new events in the bugs's discussion, like new | 49 | notifications about new events in the bugs's discussion, like new |
37 | 48 | comments. | 50 | comments. |
38 | 49 | """) | 51 | """) |
39 | 52 | |||
40 | 53 | |||
41 | 54 | class DistroSeriesDifferenceStatus(DBEnumeratedType): | ||
42 | 55 | """Distribution series difference status. | ||
43 | 56 | |||
44 | 57 | The status of a package difference between two DistroSeries. | ||
45 | 58 | """ | ||
46 | 59 | |||
47 | 60 | NEEDS_ATTENTION = DBItem(1, """ | ||
48 | 61 | Needs attention | ||
49 | 62 | |||
50 | 63 | This difference is current and needs attention. | ||
51 | 64 | """) | ||
52 | 65 | |||
53 | 66 | IGNORED = DBItem(2, """ | ||
54 | 67 | Ignored | ||
55 | 68 | |||
56 | 69 | This difference is being ignored until a new package is uploaded | ||
57 | 70 | or the status is manually updated. | ||
58 | 71 | """) | ||
59 | 72 | |||
60 | 73 | IGNORED_ALWAYS = DBItem(3, """ | ||
61 | 74 | Ignored always | ||
62 | 75 | |||
63 | 76 | This difference should always be ignored. | ||
64 | 77 | """) | ||
65 | 78 | |||
66 | 79 | RESOLVED = DBItem(4, """ | ||
67 | 80 | Resolved | ||
68 | 81 | |||
69 | 82 | This difference has been resolved and versions are now equal. | ||
70 | 83 | """) | ||
71 | 84 | |||
72 | 85 | class DistroSeriesDifferenceType(DBEnumeratedType): | ||
73 | 86 | """Distribution series difference type.""" | ||
74 | 87 | |||
75 | 88 | UNIQUE_TO_DERIVED_SERIES = DBItem(1, """ | ||
76 | 89 | Unique to derived series | ||
77 | 90 | |||
78 | 91 | This package is present in the derived series but not the parent | ||
79 | 92 | series. | ||
80 | 93 | """) | ||
81 | 94 | |||
82 | 95 | MISSING_FROM_DERIVED_SERIES = DBItem(2, """ | ||
83 | 96 | Missing from derived series | ||
84 | 97 | |||
85 | 98 | This package is present in the parent series but missing from the | ||
86 | 99 | derived series. | ||
87 | 100 | """) | ||
88 | 101 | |||
89 | 102 | DIFFERENT_VERSIONS = DBItem(3, """ | ||
90 | 103 | Different versions | ||
91 | 104 | |||
92 | 105 | This package is present in both series with different versions. | ||
93 | 106 | """) | ||
94 | 50 | 107 | ||
95 | === added file 'lib/lp/registry/exceptions.py' | |||
96 | --- lib/lp/registry/exceptions.py 1970-01-01 00:00:00 +0000 | |||
97 | +++ lib/lp/registry/exceptions.py 2010-08-31 07:47:46 +0000 | |||
98 | @@ -0,0 +1,17 @@ | |||
99 | 1 | # Copyright 2010 Canonical Ltd. This software is licensed under the | ||
100 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
101 | 3 | |||
102 | 4 | """Exceptions for the Registry app.""" | ||
103 | 5 | |||
104 | 6 | __metaclass__ = type | ||
105 | 7 | __all__ = [ | ||
106 | 8 | 'NotADerivedSeriesError', | ||
107 | 9 | ] | ||
108 | 10 | |||
109 | 11 | |||
110 | 12 | class NotADerivedSeriesError(Exception): | ||
111 | 13 | """A distro series difference must be created with a derived series. | ||
112 | 14 | |||
113 | 15 | This is raised when a DistroSeriesDifference is created with a | ||
114 | 16 | non-derived series - that is, a distroseries with a null Parent.""" | ||
115 | 17 | |||
116 | 0 | 18 | ||
117 | === added file 'lib/lp/registry/interfaces/distroseriesdifference.py' | |||
118 | --- lib/lp/registry/interfaces/distroseriesdifference.py 1970-01-01 00:00:00 +0000 | |||
119 | +++ lib/lp/registry/interfaces/distroseriesdifference.py 2010-08-31 07:47:46 +0000 | |||
120 | @@ -0,0 +1,108 @@ | |||
121 | 1 | # Copyright 2010 Canonical Ltd. This software is licensed under the | ||
122 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
123 | 3 | |||
124 | 4 | """Interface classes for a difference between two distribution series.""" | ||
125 | 5 | |||
126 | 6 | __metaclass__ = type | ||
127 | 7 | |||
128 | 8 | |||
129 | 9 | __all__ = [ | ||
130 | 10 | 'IDistroSeriesDifference', | ||
131 | 11 | 'IDistroSeriesDifferenceSource', | ||
132 | 12 | ] | ||
133 | 13 | |||
134 | 14 | from lazr.restful.fields import Reference | ||
135 | 15 | from zope.interface import Interface | ||
136 | 16 | from zope.schema import ( | ||
137 | 17 | Choice, | ||
138 | 18 | Int, | ||
139 | 19 | Text, | ||
140 | 20 | ) | ||
141 | 21 | |||
142 | 22 | from canonical.launchpad import _ | ||
143 | 23 | from lp.registry.enum import ( | ||
144 | 24 | DistroSeriesDifferenceStatus, | ||
145 | 25 | DistroSeriesDifferenceType, | ||
146 | 26 | ) | ||
147 | 27 | from lp.registry.interfaces.distroseries import IDistroSeries | ||
148 | 28 | from lp.registry.interfaces.sourcepackagename import ISourcePackageName | ||
149 | 29 | from lp.soyuz.interfaces.packagediff import IPackageDiff | ||
150 | 30 | from lp.soyuz.interfaces.publishing import ISourcePackagePublishingHistory | ||
151 | 31 | |||
152 | 32 | |||
153 | 33 | class IDistroSeriesDifference(Interface): | ||
154 | 34 | """An interface for a package difference between two distroseries.""" | ||
155 | 35 | |||
156 | 36 | id = Int(title=_('ID'), required=True, readonly=True) | ||
157 | 37 | |||
158 | 38 | derived_series = Reference( | ||
159 | 39 | IDistroSeries, title=_("Derived series"), required=True, | ||
160 | 40 | readonly=True, description=_( | ||
161 | 41 | "The distribution series which, together with its parent, " | ||
162 | 42 | "identifies the two series with the difference.")) | ||
163 | 43 | |||
164 | 44 | source_package_name = Reference( | ||
165 | 45 | ISourcePackageName, | ||
166 | 46 | title=_("Source package name"), required=True, readonly=True, | ||
167 | 47 | description=_( | ||
168 | 48 | "The package with a difference between the derived series " | ||
169 | 49 | "and its parent.")) | ||
170 | 50 | |||
171 | 51 | package_diff = Reference( | ||
172 | 52 | IPackageDiff, title=_("Package diff"), required=False, | ||
173 | 53 | readonly=True, description=_( | ||
174 | 54 | "The most recently generated package diff for this difference.")) | ||
175 | 55 | |||
176 | 56 | activity_log = Text( | ||
177 | 57 | title=_('A log of activity and comments for this difference.'), | ||
178 | 58 | required=False, readonly=True) | ||
179 | 59 | |||
180 | 60 | status = Choice( | ||
181 | 61 | title=_('Distro series difference status.'), | ||
182 | 62 | description=_('The current status of this difference.'), | ||
183 | 63 | vocabulary=DistroSeriesDifferenceStatus, | ||
184 | 64 | required=True, readonly=True) | ||
185 | 65 | |||
186 | 66 | difference_type = Choice( | ||
187 | 67 | title=_('Difference type'), | ||
188 | 68 | description=_('The type of difference for this package.'), | ||
189 | 69 | vocabulary=DistroSeriesDifferenceType, | ||
190 | 70 | required=True, readonly=True) | ||
191 | 71 | |||
192 | 72 | source_pub = Reference( | ||
193 | 73 | ISourcePackagePublishingHistory, | ||
194 | 74 | title=_("Derived source pub"), readonly=True, | ||
195 | 75 | description=_( | ||
196 | 76 | "The most recent published version in the derived series.")) | ||
197 | 77 | |||
198 | 78 | parent_source_pub = Reference( | ||
199 | 79 | ISourcePackagePublishingHistory, | ||
200 | 80 | title=_("Parent source pub"), readonly=True, | ||
201 | 81 | description=_( | ||
202 | 82 | "The most recent published version in the parent series.")) | ||
203 | 83 | |||
204 | 84 | |||
205 | 85 | class IDistroSeriesDifferenceSource(Interface): | ||
206 | 86 | """A utility of this interface can be used to create differences.""" | ||
207 | 87 | |||
208 | 88 | def new(derived_series, source_package_name, difference_type, | ||
209 | 89 | status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION): | ||
210 | 90 | """Create an `IDistroSeriesDifference`. | ||
211 | 91 | |||
212 | 92 | :param derived_series: The distribution series which was derived | ||
213 | 93 | from a parent. If a series without a parent is passed an | ||
214 | 94 | exception is raised. | ||
215 | 95 | :type derived_series: `IDistroSeries`. | ||
216 | 96 | :param source_package_name: A source package name identifying the | ||
217 | 97 | package with a difference. | ||
218 | 98 | :type source_package_name: `ISourcePackageName`. | ||
219 | 99 | :param difference_type: Indicates the type of difference represented | ||
220 | 100 | by this record. | ||
221 | 101 | :type difference_type: `DistroSeriesDifferenceType`. | ||
222 | 102 | :param status: The current status of this difference. | ||
223 | 103 | :type status: `DistorSeriesDifferenceStatus`. | ||
224 | 104 | :raises NotADerivedSeriesError: When the passed distro series | ||
225 | 105 | is not a derived series. | ||
226 | 106 | :return: A new `DistroSeriesDifference` object. | ||
227 | 107 | """ | ||
228 | 108 | |||
229 | 0 | 109 | ||
230 | === added file 'lib/lp/registry/model/distroseriesdifference.py' | |||
231 | --- lib/lp/registry/model/distroseriesdifference.py 1970-01-01 00:00:00 +0000 | |||
232 | +++ lib/lp/registry/model/distroseriesdifference.py 2010-08-31 07:47:46 +0000 | |||
233 | @@ -0,0 +1,117 @@ | |||
234 | 1 | # Copyright 2010 Canonical Ltd. This software is licensed under the | ||
235 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
236 | 3 | |||
237 | 4 | """Database classes for a difference between two distribution series.""" | ||
238 | 5 | |||
239 | 6 | __metaclass__ = type | ||
240 | 7 | |||
241 | 8 | __all__ = [ | ||
242 | 9 | 'DistroSeriesDifference', | ||
243 | 10 | ] | ||
244 | 11 | |||
245 | 12 | |||
246 | 13 | from storm.locals import ( | ||
247 | 14 | Int, | ||
248 | 15 | Reference, | ||
249 | 16 | Storm, | ||
250 | 17 | Unicode, | ||
251 | 18 | ) | ||
252 | 19 | from zope.interface import ( | ||
253 | 20 | classProvides, | ||
254 | 21 | implements, | ||
255 | 22 | ) | ||
256 | 23 | |||
257 | 24 | from canonical.database.enumcol import DBEnum | ||
258 | 25 | from canonical.launchpad.interfaces.lpstorm import IMasterStore | ||
259 | 26 | from lp.registry.enum import ( | ||
260 | 27 | DistroSeriesDifferenceStatus, | ||
261 | 28 | DistroSeriesDifferenceType, | ||
262 | 29 | ) | ||
263 | 30 | from lp.registry.exceptions import NotADerivedSeriesError | ||
264 | 31 | from lp.registry.interfaces.distroseriesdifference import ( | ||
265 | 32 | IDistroSeriesDifference, | ||
266 | 33 | IDistroSeriesDifferenceSource, | ||
267 | 34 | ) | ||
268 | 35 | |||
269 | 36 | |||
270 | 37 | class DistroSeriesDifference(Storm): | ||
271 | 38 | """See `DistroSeriesDifference`.""" | ||
272 | 39 | implements(IDistroSeriesDifference) | ||
273 | 40 | classProvides(IDistroSeriesDifferenceSource) | ||
274 | 41 | __storm_table__ = 'DistroSeriesDifference' | ||
275 | 42 | |||
276 | 43 | id = Int(primary=True) | ||
277 | 44 | |||
278 | 45 | derived_series_id = Int(name='derived_series', allow_none=False) | ||
279 | 46 | derived_series = Reference( | ||
280 | 47 | derived_series_id, 'DistroSeries.id') | ||
281 | 48 | |||
282 | 49 | source_package_name_id = Int( | ||
283 | 50 | name='source_package_name', allow_none=False) | ||
284 | 51 | source_package_name = Reference( | ||
285 | 52 | source_package_name_id, 'SourcePackageName.id') | ||
286 | 53 | |||
287 | 54 | package_diff_id = Int( | ||
288 | 55 | name='package_diff', allow_none=True) | ||
289 | 56 | package_diff = Reference( | ||
290 | 57 | package_diff_id, 'PackageDiff.id') | ||
291 | 58 | |||
292 | 59 | status = DBEnum(name='status', allow_none=False, | ||
293 | 60 | enum=DistroSeriesDifferenceStatus) | ||
294 | 61 | difference_type = DBEnum(name='difference_type', allow_none=False, | ||
295 | 62 | enum=DistroSeriesDifferenceType) | ||
296 | 63 | |||
297 | 64 | @staticmethod | ||
298 | 65 | def new(derived_series, source_package_name, difference_type, | ||
299 | 66 | status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION): | ||
300 | 67 | """See `IDistroSeriesDifferenceSource`.""" | ||
301 | 68 | if derived_series.parent_series is None: | ||
302 | 69 | raise NotADerivedSeriesError() | ||
303 | 70 | |||
304 | 71 | store = IMasterStore(DistroSeriesDifference) | ||
305 | 72 | diff = DistroSeriesDifference() | ||
306 | 73 | diff.derived_series = derived_series | ||
307 | 74 | diff.source_package_name = source_package_name | ||
308 | 75 | diff.status = status | ||
309 | 76 | diff.difference_type = difference_type | ||
310 | 77 | |||
311 | 78 | return store.add(diff) | ||
312 | 79 | |||
313 | 80 | @property | ||
314 | 81 | def source_pub(self): | ||
315 | 82 | """See `IDistroSeriesDifference`.""" | ||
316 | 83 | return self._getLatestSourcePub() | ||
317 | 84 | |||
318 | 85 | @property | ||
319 | 86 | def parent_source_pub(self): | ||
320 | 87 | """See `IDistroSeriesDifference`.""" | ||
321 | 88 | return self._getLatestSourcePub(for_parent=True) | ||
322 | 89 | |||
323 | 90 | @property | ||
324 | 91 | def activity_log(self): | ||
325 | 92 | """See `IDistroSeriesDifference`.""" | ||
326 | 93 | return u"" | ||
327 | 94 | |||
328 | 95 | def _getLatestSourcePub(self, for_parent=False): | ||
329 | 96 | """Helper to keep source_pub/parent_source_pub DRY.""" | ||
330 | 97 | distro_series = self.derived_series | ||
331 | 98 | if for_parent: | ||
332 | 99 | distro_series = self.derived_series.parent_series | ||
333 | 100 | |||
334 | 101 | pubs = distro_series.getPublishedSources( | ||
335 | 102 | self.source_package_name, include_pending=True) | ||
336 | 103 | |||
337 | 104 | # The most recent published source is the first one. | ||
338 | 105 | if pubs: | ||
339 | 106 | return pubs[0] | ||
340 | 107 | else: | ||
341 | 108 | return None | ||
342 | 109 | |||
343 | 110 | def _getVersions(self): | ||
344 | 111 | """Helper method returning versions string.""" | ||
345 | 112 | src_pub_ver = parent_src_pub_ver = "-" | ||
346 | 113 | if self.source_pub: | ||
347 | 114 | src_pub_ver = self.source_pub.source_package_version | ||
348 | 115 | if self.parent_source_pub is not None: | ||
349 | 116 | parent_src_pub_ver = self.parent_source_pub.source_package_version | ||
350 | 117 | return parent_src_pub_ver + "/" + src_pub_ver | ||
351 | 0 | 118 | ||
352 | === added file 'lib/lp/registry/tests/test_distroseriesdifference.py' | |||
353 | --- lib/lp/registry/tests/test_distroseriesdifference.py 1970-01-01 00:00:00 +0000 | |||
354 | +++ lib/lp/registry/tests/test_distroseriesdifference.py 2010-08-31 07:47:46 +0000 | |||
355 | @@ -0,0 +1,110 @@ | |||
356 | 1 | # Copyright 2010 Canonical Ltd. This software is licensed under the | ||
357 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
358 | 3 | |||
359 | 4 | """Model tests for the DistroSeriesDifference class.""" | ||
360 | 5 | |||
361 | 6 | __metaclass__ = type | ||
362 | 7 | |||
363 | 8 | import unittest | ||
364 | 9 | |||
365 | 10 | from storm.store import Store | ||
366 | 11 | from zope.component import getUtility | ||
367 | 12 | |||
368 | 13 | from canonical.launchpad.webapp.testing import verifyObject | ||
369 | 14 | from canonical.testing import DatabaseFunctionalLayer | ||
370 | 15 | from lp.testing import TestCaseWithFactory | ||
371 | 16 | from lp.registry.enum import DistroSeriesDifferenceType | ||
372 | 17 | from lp.registry.exceptions import NotADerivedSeriesError | ||
373 | 18 | from lp.registry.interfaces.distroseriesdifference import ( | ||
374 | 19 | IDistroSeriesDifference, | ||
375 | 20 | IDistroSeriesDifferenceSource, | ||
376 | 21 | ) | ||
377 | 22 | from lp.soyuz.interfaces.publishing import PackagePublishingStatus | ||
378 | 23 | |||
379 | 24 | |||
380 | 25 | class DistroSeriesDifferenceTestCase(TestCaseWithFactory): | ||
381 | 26 | |||
382 | 27 | layer = DatabaseFunctionalLayer | ||
383 | 28 | |||
384 | 29 | def test_implements_interface(self): | ||
385 | 30 | # The implementation implements the interface correctly. | ||
386 | 31 | ds_diff = self.factory.makeDistroSeriesDifference() | ||
387 | 32 | # Flush the store to ensure db constraints are triggered. | ||
388 | 33 | Store.of(ds_diff).flush() | ||
389 | 34 | |||
390 | 35 | verifyObject(IDistroSeriesDifference, ds_diff) | ||
391 | 36 | |||
392 | 37 | def test_source_implements_interface(self): | ||
393 | 38 | # The utility for creating differences implements its interface. | ||
394 | 39 | utility = getUtility(IDistroSeriesDifferenceSource) | ||
395 | 40 | |||
396 | 41 | verifyObject(IDistroSeriesDifferenceSource, utility) | ||
397 | 42 | |||
398 | 43 | def test_new_non_derived_series(self): | ||
399 | 44 | # A DistroSeriesDifference cannot be created with a non-derived | ||
400 | 45 | # series. | ||
401 | 46 | distro_series = self.factory.makeDistroSeries() | ||
402 | 47 | source_package_name = self.factory.makeSourcePackageName('myfoo') | ||
403 | 48 | distroseriesdifference_factory = getUtility( | ||
404 | 49 | IDistroSeriesDifferenceSource) | ||
405 | 50 | |||
406 | 51 | self.assertRaises( | ||
407 | 52 | NotADerivedSeriesError, distroseriesdifference_factory.new, | ||
408 | 53 | distro_series, source_package_name, | ||
409 | 54 | DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES | ||
410 | 55 | ) | ||
411 | 56 | |||
412 | 57 | def test_source_pub(self): | ||
413 | 58 | # The related source pub is returned for the derived series. | ||
414 | 59 | ds_diff = self.factory.makeDistroSeriesDifference( | ||
415 | 60 | source_package_name_str="foonew") | ||
416 | 61 | |||
417 | 62 | self.assertEqual( | ||
418 | 63 | 'foonew', ds_diff.source_pub.source_package_name) | ||
419 | 64 | self.assertEqual( | ||
420 | 65 | ds_diff.derived_series, ds_diff.source_pub.distroseries) | ||
421 | 66 | |||
422 | 67 | def test_source_pub_gets_latest_pending(self): | ||
423 | 68 | # The most recent publication is always returned, even if its pending. | ||
424 | 69 | ds_diff = self.factory.makeDistroSeriesDifference( | ||
425 | 70 | source_package_name_str="foonew") | ||
426 | 71 | pending_pub = self.factory.makeSourcePackagePublishingHistory( | ||
427 | 72 | sourcepackagename=ds_diff.source_package_name, | ||
428 | 73 | distroseries=ds_diff.derived_series, | ||
429 | 74 | status=PackagePublishingStatus.PENDING) | ||
430 | 75 | |||
431 | 76 | self.assertEqual(pending_pub, ds_diff.source_pub) | ||
432 | 77 | |||
433 | 78 | def test_source_pub_returns_none(self): | ||
434 | 79 | # None is returned when there is no source pub. | ||
435 | 80 | ds_diff = self.factory.makeDistroSeriesDifference( | ||
436 | 81 | difference_type=( | ||
437 | 82 | DistroSeriesDifferenceType.MISSING_FROM_DERIVED_SERIES)) | ||
438 | 83 | |||
439 | 84 | self.assertIs(None, ds_diff.source_pub) | ||
440 | 85 | |||
441 | 86 | def test_parent_source_pub(self): | ||
442 | 87 | # The related source pub for the parent distro series is returned. | ||
443 | 88 | ds_diff = self.factory.makeDistroSeriesDifference( | ||
444 | 89 | source_package_name_str="foonew") | ||
445 | 90 | |||
446 | 91 | self.assertEqual( | ||
447 | 92 | 'foonew', ds_diff.parent_source_pub.source_package_name) | ||
448 | 93 | self.assertEqual( | ||
449 | 94 | ds_diff.derived_series.parent_series, | ||
450 | 95 | ds_diff.parent_source_pub.distroseries) | ||
451 | 96 | |||
452 | 97 | def test_paren_source_pub_gets_latest_pending(self): | ||
453 | 98 | # The most recent publication is always returned, even if its pending. | ||
454 | 99 | ds_diff = self.factory.makeDistroSeriesDifference( | ||
455 | 100 | source_package_name_str="foonew") | ||
456 | 101 | pending_pub = self.factory.makeSourcePackagePublishingHistory( | ||
457 | 102 | sourcepackagename=ds_diff.source_package_name, | ||
458 | 103 | distroseries=ds_diff.derived_series.parent_series, | ||
459 | 104 | status=PackagePublishingStatus.PENDING) | ||
460 | 105 | |||
461 | 106 | self.assertEqual(pending_pub, ds_diff.parent_source_pub) | ||
462 | 107 | |||
463 | 108 | |||
464 | 109 | def test_suite(): | ||
465 | 110 | return unittest.TestLoader().loadTestsFromName(__name__) | ||
466 | 0 | 111 | ||
467 | === modified file 'lib/lp/testing/factory.py' | |||
468 | --- lib/lp/testing/factory.py 2010-08-30 16:32:53 +0000 | |||
469 | +++ lib/lp/testing/factory.py 2010-08-31 07:47:46 +0000 | |||
470 | @@ -154,12 +154,16 @@ | |||
471 | 154 | IHWSubmissionDeviceSet, | 154 | IHWSubmissionDeviceSet, |
472 | 155 | IHWSubmissionSet, | 155 | IHWSubmissionSet, |
473 | 156 | ) | 156 | ) |
474 | 157 | from lp.registry.enum import DistroSeriesDifferenceType | ||
475 | 157 | from lp.registry.interfaces.distribution import IDistributionSet | 158 | from lp.registry.interfaces.distribution import IDistributionSet |
476 | 158 | from lp.registry.interfaces.distributionmirror import ( | 159 | from lp.registry.interfaces.distributionmirror import ( |
477 | 159 | MirrorContent, | 160 | MirrorContent, |
478 | 160 | MirrorSpeed, | 161 | MirrorSpeed, |
479 | 161 | ) | 162 | ) |
480 | 162 | from lp.registry.interfaces.distroseries import IDistroSeries | 163 | from lp.registry.interfaces.distroseries import IDistroSeries |
481 | 164 | from lp.registry.interfaces.distroseriesdifference import ( | ||
482 | 165 | IDistroSeriesDifferenceSource, | ||
483 | 166 | ) | ||
484 | 163 | from lp.registry.interfaces.gpg import ( | 167 | from lp.registry.interfaces.gpg import ( |
485 | 164 | GPGKeyAlgorithm, | 168 | GPGKeyAlgorithm, |
486 | 165 | IGPGKeySet, | 169 | IGPGKeySet, |
487 | @@ -1817,6 +1821,44 @@ | |||
488 | 1817 | # Most people think of distro releases as distro series. | 1821 | # Most people think of distro releases as distro series. |
489 | 1818 | makeDistroSeries = makeDistroRelease | 1822 | makeDistroSeries = makeDistroRelease |
490 | 1819 | 1823 | ||
491 | 1824 | def makeDistroSeriesDifference( | ||
492 | 1825 | self, derived_series=None, source_package_name_str=None, | ||
493 | 1826 | versions=None, | ||
494 | 1827 | difference_type=DistroSeriesDifferenceType.DIFFERENT_VERSIONS): | ||
495 | 1828 | """Create a new distro series source package difference.""" | ||
496 | 1829 | if derived_series is None: | ||
497 | 1830 | parent_series = self.makeDistroSeries() | ||
498 | 1831 | derived_series = self.makeDistroSeries( | ||
499 | 1832 | parent_series=parent_series) | ||
500 | 1833 | |||
501 | 1834 | if source_package_name_str is None: | ||
502 | 1835 | source_package_name_str = self.getUniqueString('src-name') | ||
503 | 1836 | |||
504 | 1837 | source_package_name = self.getOrMakeSourcePackageName( | ||
505 | 1838 | source_package_name_str) | ||
506 | 1839 | |||
507 | 1840 | if versions is None: | ||
508 | 1841 | versions = {} | ||
509 | 1842 | |||
510 | 1843 | if difference_type is not ( | ||
511 | 1844 | DistroSeriesDifferenceType.MISSING_FROM_DERIVED_SERIES): | ||
512 | 1845 | |||
513 | 1846 | source_pub = self.makeSourcePackagePublishingHistory( | ||
514 | 1847 | distroseries=derived_series, | ||
515 | 1848 | version=versions.get('derived'), | ||
516 | 1849 | sourcepackagename=source_package_name) | ||
517 | 1850 | |||
518 | 1851 | if difference_type is not ( | ||
519 | 1852 | DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES): | ||
520 | 1853 | |||
521 | 1854 | source_pub = self.makeSourcePackagePublishingHistory( | ||
522 | 1855 | distroseries=derived_series.parent_series, | ||
523 | 1856 | version=versions.get('parent'), | ||
524 | 1857 | sourcepackagename=source_package_name) | ||
525 | 1858 | |||
526 | 1859 | return getUtility(IDistroSeriesDifferenceSource).new( | ||
527 | 1860 | derived_series, source_package_name, difference_type) | ||
528 | 1861 | |||
529 | 1820 | def makeDistroArchSeries(self, distroseries=None, | 1862 | def makeDistroArchSeries(self, distroseries=None, |
530 | 1821 | architecturetag=None, processorfamily=None, | 1863 | architecturetag=None, processorfamily=None, |
531 | 1822 | official=True, owner=None, | 1864 | official=True, owner=None, |
Hi Michael,
nice work! I have just two nitpicks:
> === added file 'lib/lp/ registry/ interfaces/ distroseriesdif ference. py' registry/ interfaces/ distroseriesdif ference. py 1970-01-01 00:00:00 +0000 registry/ interfaces/ distroseriesdif ference. py 2010-08-27 09:31:04 +0000
> --- lib/lp/
> +++ lib/lp/
[...]
> + activity_log = Text(
> + title=_('A log of activity and comments for this difference'),
> + required=False, readonly=True)
s/difference/ difference. /
> === added file 'lib/lp/ registry/ tests/test_ distroseriesdif ference. py' registry/ tests/test_ distroseriesdif ference. py 1970-01-01 00:00:00 +0000 registry/ tests/test_ distroseriesdif ference. py 2010-08-27 09:31:04 +0000
> --- lib/lp/
> +++ lib/lp/
[...]
> + def test_new_ non_derived_ series( self): ference cannot be created with a non-derived makeDistroSerie s() esError, makeDistroSerie sDifference, series= distro_ series)
> + # A DistroSeriesDif
> + # series.
> + distro_series = self.factory.
> + self.assertRaises(
> + NotADerivedSeri
> + self.factory.
> + derived_
I would prefer something like
distroserie sdifferencesour ce_factory = getUtility( IDistroSeriesDi fferenceSource) assertRaises(
NotADerivedSer iesError, distroseriesdif ferencesource_ factory. new, ...)
self.
This makes it a bit more explicit which method is tested.