Merge lp:~jelmer/launchpad/bug113563 into lp:launchpad

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Eleanor Berger
Approved revision: no longer in the source branch.
Merged at revision: 11042
Proposed branch: lp:~jelmer/launchpad/bug113563
Merge into: lp:launchpad
Diff against target: 196 lines (+74/-39)
4 files modified
lib/lp/registry/interfaces/distribution.py (+7/-0)
lib/lp/registry/model/distribution.py (+13/-8)
lib/lp/registry/tests/test_distribution.py (+44/-1)
lib/lp/soyuz/scripts/ftpmaster.py (+10/-30)
To merge this branch: bzr merge lp:~jelmer/launchpad/bug113563
Reviewer Review Type Date Requested Status
Gavin Panella (community) Abstain
Eleanor Berger (community) code Approve
Review via email: mp+23232@code.launchpad.net

Commit message

ADd IDistribution.getSeriesByStatus()

Description of the change

This fixes an old tech-debt bug (bug 113563) about having a IDistribution.getSeriesByStatus() method.

To post a comment you must log in.
Revision history for this message
Henning Eggers (henninge) wrote :

Just a quick look before I turn to your other proposal ;-)

 - Please use storm for queries, not SQLobject (DistroSeries.selectBy is not storm).
 - Please test None explicitely, as per our style guide.

No review yet, so somebody else can pick it up later, as I won't be around too long.

Revision history for this message
Jelmer Vernooij (jelmer) wrote :

Thanks, I've fixed those issues at least.

Revision history for this message
Gavin Panella (allenap) wrote :

Looking at the diff I saw a problem; getSeriesByStatus() calls distro.getSeries() with no arguments, but arguments are required. Weird. Then I realised that SeriesByStatusTests was never being run because it hadn't been added to test_suite(). Sadly, but not unexpectedly, it doesn't pass :) I'm sure it's not much work to sort out though.

review: Needs Fixing
Revision history for this message
Eleanor Berger (intellectronica) :
review: Approve (code)
Revision history for this message
Gavin Panella (allenap) wrote :

Ah, I see Tom's reviewed it. Sorry for not getting to this sooner Jelmer.

review: Abstain

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/interfaces/distribution.py'
2--- lib/lp/registry/interfaces/distribution.py 2010-05-27 11:06:25 +0000
3+++ lib/lp/registry/interfaces/distribution.py 2010-06-21 13:37:31 +0000
4@@ -385,6 +385,13 @@
5 """Return a (distroseries,pocket) tuple which is the given textual
6 distroseriesname in this distribution."""
7
8+ def getSeriesByStatus(status):
9+ """Query context distribution for distroseries with a given status.
10+
11+ :param status: Series status to look for
12+ :return: list of `IDistroSeries`
13+ """
14+
15 def getSourcePackageCaches(archive=None):
16 """The set of all source package info caches for this distribution.
17
18
19=== modified file 'lib/lp/registry/model/distribution.py'
20--- lib/lp/registry/model/distribution.py 2010-06-21 07:26:51 +0000
21+++ lib/lp/registry/model/distribution.py 2010-06-21 13:37:31 +0000
22@@ -13,7 +13,7 @@
23
24 from sqlobject import BoolCol, ForeignKey, SQLObjectNotFound, StringCol
25 from sqlobject.sqlbuilder import SQLConstant
26-from storm.locals import Desc, In, Int, Join, SQL
27+from storm.locals import Desc, In, Int, Join, Or, SQL
28 from storm.store import Store
29 from zope.component import getUtility
30 from zope.interface import alsoProvides, implements
31@@ -524,13 +524,12 @@
32
33 def getSeries(self, name_or_version):
34 """See `IDistribution`."""
35- distroseries = DistroSeries.selectOneBy(
36- distribution=self, name=name_or_version)
37- if distroseries is None:
38- distroseries = DistroSeries.selectOneBy(
39- distribution=self, version=name_or_version)
40- if distroseries is None:
41- raise NoSuchDistroSeries(name_or_version)
42+ distroseries = Store.of(self).find(DistroSeries,
43+ Or(DistroSeries.name == name_or_version,
44+ DistroSeries.version == name_or_version),
45+ DistroSeries.distribution == self).one()
46+ if not distroseries:
47+ raise NoSuchDistroSeries(name_or_version)
48 return distroseries
49
50 def getDevelopmentSeries(self):
51@@ -773,6 +772,12 @@
52
53 raise NotFoundError(distroseries_name)
54
55+ def getSeriesByStatus(self, status):
56+ """See `IDistribution`."""
57+ return Store.of(self).find(DistroSeries,
58+ DistroSeries.distribution == self,
59+ DistroSeries.status == status)
60+
61 def getFileByName(self, filename, archive=None, source=True, binary=True):
62 """See `IDistribution`."""
63 assert (source or binary), "searching in an explicitly empty " \
64
65=== modified file 'lib/lp/registry/tests/test_distribution.py'
66--- lib/lp/registry/tests/test_distribution.py 2010-05-12 18:03:14 +0000
67+++ lib/lp/registry/tests/test_distribution.py 2010-06-21 13:37:31 +0000
68@@ -11,9 +11,10 @@
69
70 from lp.registry.tests.test_distroseries import (
71 TestDistroSeriesCurrentSourceReleases)
72+from lp.registry.interfaces.distroseries import NoSuchDistroSeries
73+from lp.registry.interfaces.series import SeriesStatus
74 from lp.soyuz.interfaces.distributionsourcepackagerelease import (
75 IDistributionSourcePackageRelease)
76-from lp.registry.interfaces.series import SeriesStatus
77 from lp.testing import TestCaseWithFactory
78 from canonical.testing.layers import (
79 DatabaseFunctionalLayer, LaunchpadFunctionalLayer)
80@@ -101,5 +102,47 @@
81 self.assertTrue(series is distribution._cached_series)
82
83
84+class SeriesByStatusTests(TestCaseWithFactory):
85+ """Test IDistribution.getSeriesByStatus().
86+ """
87+
88+ layer = LaunchpadFunctionalLayer
89+
90+ def test_get_none(self):
91+ distro = self.factory.makeDistribution()
92+ self.assertEquals([],
93+ list(distro.getSeriesByStatus(SeriesStatus.FROZEN)))
94+
95+ def test_get_current(self):
96+ distro = self.factory.makeDistribution()
97+ series = self.factory.makeDistroSeries(distribution=distro,
98+ status=SeriesStatus.CURRENT)
99+ self.assertEquals([series],
100+ list(distro.getSeriesByStatus(SeriesStatus.CURRENT)))
101+
102+
103+class SeriesTests(TestCaseWithFactory):
104+ """Test IDistribution.getSeries().
105+ """
106+
107+ layer = LaunchpadFunctionalLayer
108+
109+ def test_get_none(self):
110+ distro = self.factory.makeDistribution()
111+ self.assertRaises(NoSuchDistroSeries, distro.getSeries, "astronomy")
112+
113+ def test_get_by_name(self):
114+ distro = self.factory.makeDistribution()
115+ series = self.factory.makeDistroSeries(distribution=distro,
116+ name="dappere")
117+ self.assertEquals(series, distro.getSeries("dappere"))
118+
119+ def test_get_by_version(self):
120+ distro = self.factory.makeDistribution()
121+ series = self.factory.makeDistroSeries(distribution=distro,
122+ name="dappere", version="42.6")
123+ self.assertEquals(series, distro.getSeries("42.6"))
124+
125+
126 def test_suite():
127 return unittest.TestLoader().loadTestsFromName(__name__)
128
129=== modified file 'lib/lp/soyuz/scripts/ftpmaster.py'
130--- lib/lp/soyuz/scripts/ftpmaster.py 2010-02-15 12:59:55 +0000
131+++ lib/lp/soyuz/scripts/ftpmaster.py 2010-06-21 13:37:31 +0000
132@@ -1036,23 +1036,6 @@
133 raise LaunchpadScriptFailure(
134 "Action does not accept defined suite.")
135
136- # XXX cprov 2007-04-20 bug=113563.: Should be implemented in
137- # IDistribution.
138- def getSeriesByStatus(self, status):
139- """Query context distribution for a distroseries in a given status.
140-
141- I may raise LaunchpadScriptError if no suitable distroseries in a
142- given status was found.
143- """
144- # XXX sabdfl 2007-05-27: Isn't this a bit risky, if there are
145- # multiple series with the desired status?
146- for series in self.location.distribution.series:
147- if series.status == status:
148- return series
149- raise NotFoundError(
150- "Could not find a %s distroseries in %s"
151- % (status.name, self.location.distribution.name))
152-
153 @property
154 def current(self):
155 """Return the name of the CURRENT distroseries.
156@@ -1063,12 +1046,12 @@
157 command-line or if not CURRENT distroseries was found.
158 """
159 self.checkNoSuiteDefined()
160- try:
161- series = self.getSeriesByStatus(SeriesStatus.CURRENT)
162- except NotFoundError, err:
163- raise LaunchpadScriptFailure(err)
164+ series = self.location.distribution.getSeriesByStatus(
165+ SeriesStatus.CURRENT)
166+ if not series:
167+ raise LaunchpadScriptFailure("No CURRENT series.")
168
169- return series.name
170+ return series[0].name
171
172 @property
173 def development(self):
174@@ -1090,17 +1073,14 @@
175 wanted_status = (SeriesStatus.DEVELOPMENT,
176 SeriesStatus.FROZEN)
177 for status in wanted_status:
178- try:
179- series = self.getSeriesByStatus(status)
180- except NotFoundError:
181- pass
182-
183- if series is None:
184+ series = self.location.distribution.getSeriesByStatus(status)
185+ if series.count() > 0:
186+ break
187+ else:
188 raise LaunchpadScriptFailure(
189 'There is no DEVELOPMENT distroseries for %s' %
190 self.location.distribution.name)
191-
192- return series.name
193+ return series[0].name
194
195 @property
196 def supported(self):