Merge lp:~michael.nelson/launchpad/distro-series-difference-getByDistroSeries into lp:launchpad/db-devel

Proposed by Michael Nelson
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merged at revision: 9735
Proposed branch: lp:~michael.nelson/launchpad/distro-series-difference-getByDistroSeries
Merge into: lp:launchpad/db-devel
Diff against target: 168 lines (+133/-0)
3 files modified
lib/lp/registry/interfaces/distroseriesdifference.py (+18/-0)
lib/lp/registry/model/distroseriesdifference.py (+20/-0)
lib/lp/registry/tests/test_distroseriesdifference.py (+95/-0)
To merge this branch: bzr merge lp:~michael.nelson/launchpad/distro-series-difference-getByDistroSeries
Reviewer Review Type Date Requested Status
Jelmer Vernooij (community) code Approve
Review via email: mp+34289@code.launchpad.net

Commit message

Add IDistroSeriesDifferenceSource.getForDistroSeries() for retrieving differences for a derived series.

Description of the change

Overview
========
This branch adds a method for getting all DistroSeriesDifferences for a particular derived distro series.

Details
=======
This is part of a feature for:

https://dev.launchpad.net/LEP/DerivativeDistributions

In particular, I've working on another branch with browser code which needs this.

Test:
bin/test -vvm test_distroseriesdifference -t DistroSeriesDifferenceSourceTestCase

No lint.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

This looks great, nice to have it well tested.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/registry/interfaces/distroseriesdifference.py'
--- lib/lp/registry/interfaces/distroseriesdifference.py 2010-08-30 15:11:26 +0000
+++ lib/lp/registry/interfaces/distroseriesdifference.py 2010-09-01 14:55:33 +0000
@@ -152,3 +152,21 @@
152 is not a derived series.152 is not a derived series.
153 :return: A new `DistroSeriesDifference` object.153 :return: A new `DistroSeriesDifference` object.
154 """154 """
155
156 def getForDistroSeries(
157 distro_series,
158 difference_type=DistroSeriesDifferenceType.DIFFERENT_VERSIONS,
159 status=None):
160 """Return differences for the derived distro series.
161
162 :param distro_series: The derived distribution series which is to be
163 searched for differences.
164 :type distro_series: `IDistroSeries`.
165 :param difference_type: The type of difference to include in the
166 results.
167 :type difference_type: `DistroSeriesDifferenceType`.
168 :param status: Only differences matching the status(es) will be
169 included.
170 :type status: `DistroSeriesDifferenceStatus`.
171 :return: A result set of differences.
172 """
155173
=== modified file 'lib/lp/registry/model/distroseriesdifference.py'
--- lib/lp/registry/model/distroseriesdifference.py 2010-08-31 15:56:29 +0000
+++ lib/lp/registry/model/distroseriesdifference.py 2010-09-01 14:55:33 +0000
@@ -9,6 +9,7 @@
9 'DistroSeriesDifference',9 'DistroSeriesDifference',
10 ]10 ]
1111
12from lazr.enum import DBItem
12from storm.locals import (13from storm.locals import (
13 Int,14 Int,
14 Reference,15 Reference,
@@ -84,6 +85,25 @@
8485
85 return store.add(diff)86 return store.add(diff)
8687
88 @staticmethod
89 def getForDistroSeries(
90 distro_series,
91 difference_type=DistroSeriesDifferenceType.DIFFERENT_VERSIONS,
92 status=None):
93 """See `IDistroSeriesDifferenceSource`."""
94 if status is None:
95 status = (
96 DistroSeriesDifferenceStatus.NEEDS_ATTENTION,
97 )
98 elif isinstance(status, DBItem):
99 status = (status, )
100
101 return IStore(DistroSeriesDifference).find(
102 DistroSeriesDifference,
103 DistroSeriesDifference.derived_series == distro_series,
104 DistroSeriesDifference.difference_type == difference_type,
105 DistroSeriesDifference.status.is_in(status))
106
87 @property107 @property
88 def source_pub(self):108 def source_pub(self):
89 """See `IDistroSeriesDifference`."""109 """See `IDistroSeriesDifference`."""
90110
=== modified file 'lib/lp/registry/tests/test_distroseriesdifference.py'
--- lib/lp/registry/tests/test_distroseriesdifference.py 2010-08-31 07:39:49 +0000
+++ lib/lp/registry/tests/test_distroseriesdifference.py 2010-09-01 14:55:33 +0000
@@ -287,5 +287,100 @@
287 ds_diff.derived_series.owner, "Boo")287 ds_diff.derived_series.owner, "Boo")
288288
289289
290class DistroSeriesDifferenceSourceTestCase(TestCaseWithFactory):
291
292 layer = DatabaseFunctionalLayer
293
294 def test_implements_interface(self):
295 # The implementation implements the interface correctly.
296 dsd_source = getUtility(IDistroSeriesDifferenceSource)
297
298 verifyObject(IDistroSeriesDifferenceSource, dsd_source)
299
300 def makeDiffsForDistroSeries(self, derived_series):
301 # Helper that creates a range of differences for a derived
302 # series.
303 diffs = {
304 'normal': [],
305 'unique': [],
306 'ignored': [],
307 }
308 diffs['normal'].append(
309 self.factory.makeDistroSeriesDifference(
310 derived_series=derived_series))
311 diffs['unique'].append(
312 self.factory.makeDistroSeriesDifference(
313 derived_series=derived_series,
314 difference_type=(
315 DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES)))
316 diffs['ignored'].append(
317 self.factory.makeDistroSeriesDifference(
318 derived_series=derived_series,
319 status=DistroSeriesDifferenceStatus.IGNORED))
320 return diffs
321
322 def makeDerivedSeries(self):
323 # Keep tests DRY.
324 return self.factory.makeDistroSeries(
325 parent_series=self.factory.makeDistroSeries())
326
327 def test_getForDistroSeries_default(self):
328 # By default all differences needing attention for the given
329 # series are returned.
330 derived_series = self.makeDerivedSeries()
331 diffs = self.makeDiffsForDistroSeries(derived_series)
332
333 result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
334 derived_series)
335
336 self.assertContentEqual(
337 diffs['normal'], result)
338
339 def test_getForDistroSeries_filters_by_distroseries(self):
340 # Differences for other series are not included.
341 derived_series = self.makeDerivedSeries()
342 diffs = self.makeDiffsForDistroSeries(derived_series)
343 diff_for_other_series = self.factory.makeDistroSeriesDifference()
344
345 result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
346 derived_series)
347
348 self.assertFalse(diff_for_other_series in result)
349
350 def test_getForDistroSeries_filters_by_type(self):
351 # Only differences for the specified types are returned.
352 derived_series = self.makeDerivedSeries()
353 diffs = self.makeDiffsForDistroSeries(derived_series)
354
355 result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
356 derived_series,
357 DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES)
358
359 def test_getForDistroSeries_filters_by_status(self):
360 # A single status can be used to filter results.
361 derived_series = self.makeDerivedSeries()
362 diffs = self.makeDiffsForDistroSeries(derived_series)
363
364 result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
365 derived_series,
366 status=DistroSeriesDifferenceStatus.IGNORED)
367
368 self.assertContentEqual(diffs['ignored'], result)
369
370 def test_getForDistroSeries_filters_by_multiple_statuses(self):
371 # Multiple statuses can be passed for filtering.
372 derived_series = self.makeDerivedSeries()
373 diffs = self.makeDiffsForDistroSeries(derived_series)
374
375 result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
376 derived_series,
377 status=(
378 DistroSeriesDifferenceStatus.IGNORED,
379 DistroSeriesDifferenceStatus.NEEDS_ATTENTION,
380 ))
381
382 self.assertContentEqual(diffs['normal'] + diffs['ignored'], result)
383
384
290def test_suite():385def test_suite():
291 return unittest.TestLoader().loadTestsFromName(__name__)386 return unittest.TestLoader().loadTestsFromName(__name__)

Subscribers

People subscribed via source and target branches

to status/vote changes: