Merge lp:~abentley/charmworld/use-latest-charm into lp:~juju-jitsu/charmworld/trunk

Proposed by Aaron Bentley
Status: Merged
Approved by: Aaron Bentley
Approved revision: 376
Merged at revision: 377
Proposed branch: lp:~abentley/charmworld/use-latest-charm
Merge into: lp:~juju-jitsu/charmworld/trunk
Diff against target: 111 lines (+41/-4)
5 files modified
charmworld/testing/factory.py (+1/-1)
charmworld/views/api.py (+2/-2)
charmworld/views/charms.py (+2/-1)
charmworld/views/tests/test_api.py (+20/-0)
charmworld/views/tests/test_charms.py (+16/-0)
To merge this branch: bzr merge lp:~abentley/charmworld/use-latest-charm
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+183661@code.launchpad.net

Commit message

Ensure latest version of charm is shown.

Description of the change

On API 2, on the old JSON API and on charm pages, the latest version of the charm was not being selected. (Bugs 1219061, 1219062, 1219064). This branch fixes it by sorting by revision.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmworld/testing/factory.py'
2--- charmworld/testing/factory.py 2013-08-27 14:39:13 +0000
3+++ charmworld/testing/factory.py 2013-09-03 13:32:38 +0000
4@@ -146,7 +146,7 @@
5
6 def add_store_data(charm, promulgated=False, charm_error=False, revision=1):
7 address = get_address(charm, promulgated)
8- charm["store_url"] = make_store_url(1, address)
9+ charm["store_url"] = make_store_url(revision, address)
10 store_data = {
11 "store_checked": "Thu Dec 6 17:42:05 2012"
12 }
13
14=== modified file 'charmworld/views/api.py'
15--- charmworld/views/api.py 2013-08-29 18:42:06 +0000
16+++ charmworld/views/api.py 2013-09-03 13:32:38 +0000
17@@ -591,13 +591,13 @@
18 'promulgated': True,
19 'series': series,
20 'name': name,
21- })
22+ }, sort=[('store_data.revision', pymongo.DESCENDING)])
23 else:
24 charm = self.request.db.charms.find_one({
25 'owner': owner,
26 'series': series,
27 'name': name,
28- })
29+ }, sort=[('store_data.revision', pymongo.DESCENDING)])
30 if charm is not None:
31 api_id = self._get_api_id(Charm(charm))
32 # Charm ID should match up to, but not including the revision.
33
34=== modified file 'charmworld/views/charms.py'
35--- charmworld/views/charms.py 2013-08-28 21:53:44 +0000
36+++ charmworld/views/charms.py 2013-09-03 13:32:38 +0000
37@@ -287,7 +287,8 @@
38 spec["promulgated"] = True
39 else:
40 spec["owner"] = request.matchdict['owner']
41- charm_data = found(request.db.charms.find_one(spec))
42+ charm_data = found(request.db.charms.find_one(
43+ spec, sort=[('store_data.revision', pymongo.DESCENDING)]))
44 # We are phasing out is_featured from the charm data, so remove it if this
45 # is an old charm record that still has it.
46 charm_data.pop('is_featured', None)
47
48=== modified file 'charmworld/views/tests/test_api.py'
49--- charmworld/views/tests/test_api.py 2013-08-30 13:29:38 +0000
50+++ charmworld/views/tests/test_api.py 2013-09-03 13:32:38 +0000
51@@ -1553,6 +1553,26 @@
52 self.assertEqual(200, response.status_code)
53 self.assertEqual(charm, response.json_body)
54
55+ def test_latest_revision_unpromulgated(self):
56+ # API2 should always return the latest revision, even if the charm_id
57+ # specifies a newer one.
58+ kwargs = dict(owner='foo', series='bar', name='baz', promulgated=False)
59+ self.use_index_client()
60+ old_id, old_charm = self.make_charm(store_revision=1, **kwargs)
61+ new_id, new_charm = self.make_charm(store_revision=2, **kwargs)
62+ response = self.get_response('charm', remainder=old_id)
63+ self.assertEqual(response.json['charm']['id'], new_id)
64+
65+ def test_latest_revision_promulgated(self):
66+ # API2 should always return the latest revision, even if the charm_id
67+ # specifies a newer one.
68+ kwargs = dict(owner='foo', series='bar', name='baz', promulgated=True)
69+ self.use_index_client()
70+ old_id, old_charm = self.make_charm(store_revision=1, **kwargs)
71+ new_id, new_charm = self.make_charm(store_revision=2, **kwargs)
72+ response = self.get_response('charm', remainder=old_id)
73+ self.assertEqual(response.json['charm']['id'], new_id)
74+
75 def test_charms_interesting_only_contain_charms(self):
76 self.use_index_client()
77 bundle = self.make_indexed_bundle()
78
79=== modified file 'charmworld/views/tests/test_charms.py'
80--- charmworld/views/tests/test_charms.py 2013-08-29 18:36:12 +0000
81+++ charmworld/views/tests/test_charms.py 2013-09-03 13:32:38 +0000
82@@ -33,6 +33,7 @@
83 config,
84 distro_charm,
85 distro_charm_json,
86+ find_charm,
87 found_charm_collection,
88 hook,
89 interface,
90@@ -476,6 +477,21 @@
91 self.assertEqual(expect, response['icon_path'])
92
93
94+class TestFindCharm(ViewTestBase):
95+
96+ def test_find_charm_selects_latest_revision(self):
97+ kwargs = dict(owner='foo', series='bar', name='baz')
98+ old_id, old_charm = factory.makeCharm(self.db, store_revision=1,
99+ **kwargs)
100+ new_id, new_charm = factory.makeCharm(self.db, store_revision=2,
101+ **kwargs)
102+ request = self.getRequest()
103+ request.matchdict.update(kwargs)
104+ request.matchdict['charm'] = kwargs['name']
105+ charm_data = find_charm(request)
106+ self.assertEqual(new_id, charm_data['_id'])
107+
108+
109 class CharmsViewHelpersTestCase(ViewTestBase):
110
111 def test_reconcile_revision_with_dashed_name(self):

Subscribers

People subscribed via source and target branches