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
1=== modified file 'lib/lp/registry/interfaces/distroseriesdifference.py'
2--- lib/lp/registry/interfaces/distroseriesdifference.py 2010-08-30 15:11:26 +0000
3+++ lib/lp/registry/interfaces/distroseriesdifference.py 2010-09-01 14:55:33 +0000
4@@ -152,3 +152,21 @@
5 is not a derived series.
6 :return: A new `DistroSeriesDifference` object.
7 """
8+
9+ def getForDistroSeries(
10+ distro_series,
11+ difference_type=DistroSeriesDifferenceType.DIFFERENT_VERSIONS,
12+ status=None):
13+ """Return differences for the derived distro series.
14+
15+ :param distro_series: The derived distribution series which is to be
16+ searched for differences.
17+ :type distro_series: `IDistroSeries`.
18+ :param difference_type: The type of difference to include in the
19+ results.
20+ :type difference_type: `DistroSeriesDifferenceType`.
21+ :param status: Only differences matching the status(es) will be
22+ included.
23+ :type status: `DistroSeriesDifferenceStatus`.
24+ :return: A result set of differences.
25+ """
26
27=== modified file 'lib/lp/registry/model/distroseriesdifference.py'
28--- lib/lp/registry/model/distroseriesdifference.py 2010-08-31 15:56:29 +0000
29+++ lib/lp/registry/model/distroseriesdifference.py 2010-09-01 14:55:33 +0000
30@@ -9,6 +9,7 @@
31 'DistroSeriesDifference',
32 ]
33
34+from lazr.enum import DBItem
35 from storm.locals import (
36 Int,
37 Reference,
38@@ -84,6 +85,25 @@
39
40 return store.add(diff)
41
42+ @staticmethod
43+ def getForDistroSeries(
44+ distro_series,
45+ difference_type=DistroSeriesDifferenceType.DIFFERENT_VERSIONS,
46+ status=None):
47+ """See `IDistroSeriesDifferenceSource`."""
48+ if status is None:
49+ status = (
50+ DistroSeriesDifferenceStatus.NEEDS_ATTENTION,
51+ )
52+ elif isinstance(status, DBItem):
53+ status = (status, )
54+
55+ return IStore(DistroSeriesDifference).find(
56+ DistroSeriesDifference,
57+ DistroSeriesDifference.derived_series == distro_series,
58+ DistroSeriesDifference.difference_type == difference_type,
59+ DistroSeriesDifference.status.is_in(status))
60+
61 @property
62 def source_pub(self):
63 """See `IDistroSeriesDifference`."""
64
65=== modified file 'lib/lp/registry/tests/test_distroseriesdifference.py'
66--- lib/lp/registry/tests/test_distroseriesdifference.py 2010-08-31 07:39:49 +0000
67+++ lib/lp/registry/tests/test_distroseriesdifference.py 2010-09-01 14:55:33 +0000
68@@ -287,5 +287,100 @@
69 ds_diff.derived_series.owner, "Boo")
70
71
72+class DistroSeriesDifferenceSourceTestCase(TestCaseWithFactory):
73+
74+ layer = DatabaseFunctionalLayer
75+
76+ def test_implements_interface(self):
77+ # The implementation implements the interface correctly.
78+ dsd_source = getUtility(IDistroSeriesDifferenceSource)
79+
80+ verifyObject(IDistroSeriesDifferenceSource, dsd_source)
81+
82+ def makeDiffsForDistroSeries(self, derived_series):
83+ # Helper that creates a range of differences for a derived
84+ # series.
85+ diffs = {
86+ 'normal': [],
87+ 'unique': [],
88+ 'ignored': [],
89+ }
90+ diffs['normal'].append(
91+ self.factory.makeDistroSeriesDifference(
92+ derived_series=derived_series))
93+ diffs['unique'].append(
94+ self.factory.makeDistroSeriesDifference(
95+ derived_series=derived_series,
96+ difference_type=(
97+ DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES)))
98+ diffs['ignored'].append(
99+ self.factory.makeDistroSeriesDifference(
100+ derived_series=derived_series,
101+ status=DistroSeriesDifferenceStatus.IGNORED))
102+ return diffs
103+
104+ def makeDerivedSeries(self):
105+ # Keep tests DRY.
106+ return self.factory.makeDistroSeries(
107+ parent_series=self.factory.makeDistroSeries())
108+
109+ def test_getForDistroSeries_default(self):
110+ # By default all differences needing attention for the given
111+ # series are returned.
112+ derived_series = self.makeDerivedSeries()
113+ diffs = self.makeDiffsForDistroSeries(derived_series)
114+
115+ result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
116+ derived_series)
117+
118+ self.assertContentEqual(
119+ diffs['normal'], result)
120+
121+ def test_getForDistroSeries_filters_by_distroseries(self):
122+ # Differences for other series are not included.
123+ derived_series = self.makeDerivedSeries()
124+ diffs = self.makeDiffsForDistroSeries(derived_series)
125+ diff_for_other_series = self.factory.makeDistroSeriesDifference()
126+
127+ result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
128+ derived_series)
129+
130+ self.assertFalse(diff_for_other_series in result)
131+
132+ def test_getForDistroSeries_filters_by_type(self):
133+ # Only differences for the specified types are returned.
134+ derived_series = self.makeDerivedSeries()
135+ diffs = self.makeDiffsForDistroSeries(derived_series)
136+
137+ result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
138+ derived_series,
139+ DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES)
140+
141+ def test_getForDistroSeries_filters_by_status(self):
142+ # A single status can be used to filter results.
143+ derived_series = self.makeDerivedSeries()
144+ diffs = self.makeDiffsForDistroSeries(derived_series)
145+
146+ result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
147+ derived_series,
148+ status=DistroSeriesDifferenceStatus.IGNORED)
149+
150+ self.assertContentEqual(diffs['ignored'], result)
151+
152+ def test_getForDistroSeries_filters_by_multiple_statuses(self):
153+ # Multiple statuses can be passed for filtering.
154+ derived_series = self.makeDerivedSeries()
155+ diffs = self.makeDiffsForDistroSeries(derived_series)
156+
157+ result = getUtility(IDistroSeriesDifferenceSource).getForDistroSeries(
158+ derived_series,
159+ status=(
160+ DistroSeriesDifferenceStatus.IGNORED,
161+ DistroSeriesDifferenceStatus.NEEDS_ATTENTION,
162+ ))
163+
164+ self.assertContentEqual(diffs['normal'] + diffs['ignored'], result)
165+
166+
167 def test_suite():
168 return unittest.TestLoader().loadTestsFromName(__name__)

Subscribers

People subscribed via source and target branches

to status/vote changes: