Merge lp:~jcsackett/charmworld/keyerror-promulgated into lp:~juju-jitsu/charmworld/trunk

Proposed by j.c.sackett
Status: Merged
Approved by: j.c.sackett
Approved revision: 406
Merged at revision: 403
Proposed branch: lp:~jcsackett/charmworld/keyerror-promulgated
Merge into: lp:~juju-jitsu/charmworld/trunk
Diff against target: 223 lines (+10/-124)
6 files modified
charmworld/routes.py (+1/-1)
charmworld/views/api.py (+1/-0)
charmworld/views/helpers.py (+0/-14)
charmworld/views/search.py (+0/-50)
charmworld/views/tests/test_helpers.py (+0/-13)
charmworld/views/tests/test_search.py (+8/-46)
To merge this branch: bzr merge lp:~jcsackett/charmworld/keyerror-promulgated
Reviewer Review Type Date Requested Status
Juju Gui Bot continuous-integration Approve
Curtis Hovey (community) code Approve
Review via email: mp+188858@code.launchpad.net

Commit message

Removes old search_json view and related items.

Description of the change

charmworld/views/search.py
--------------------------
`search_json` is removed--it is no longer used by any clients, in favor of the
API search endpoint. Use of this method by bots was the cause of the error in
the linked bug.

charmworld/views/helper.py
--------------------------
The `result_sorter` function is deleted; it was only used by search_json.

Misc
----
Tests for deleted code removed.
Route for deleted code removed.

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

If we changed route to
    config.add_route("search-json-obsolete", "/search/json")
then added it to the obsolete view in charmworld/views/api.py
    @view_config(route_name="search-json-obsolete")
    @view_config(route_name="api-obsolete-0")
    @view_config(route_name="api-obsolete-1")
    def obsolete(request):
        ....
We could clearly state the feature is 410 Gone. It wont show up in a list of 404s. Is there any reason that 410 is wrong? Do we want old clients to see 404?

review: Needs Information (code)
Revision history for this message
j.c.sackett (jcsackett) wrote :

No, I think that's fine. I've pushed up changes to that effect.

406. By j.c.sackett

Obsolete url rather than 404.

Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)
Revision history for this message
Juju Gui Bot (juju-gui-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmworld/routes.py'
2--- charmworld/routes.py 2013-09-30 15:20:32 +0000
3+++ charmworld/routes.py 2013-10-02 15:48:32 +0000
4@@ -91,7 +91,7 @@
5
6 # Search
7 config.add_route("search", "/search")
8- config.add_route("search-json", "/search/json")
9+ config.add_route("search-json-obsolete", "/search/json")
10
11 # Home page
12 config.add_route("home", "/")
13
14=== modified file 'charmworld/views/api.py'
15--- charmworld/views/api.py 2013-09-30 14:16:56 +0000
16+++ charmworld/views/api.py 2013-10-02 15:48:32 +0000
17@@ -73,6 +73,7 @@
18 status_code=status)
19
20
21+@view_config(route_name="search-json-obsolete")
22 @view_config(route_name="api-obsolete-0")
23 @view_config(route_name="api-obsolete-1")
24 def obsolete(request):
25
26=== modified file 'charmworld/views/helpers.py'
27--- charmworld/views/helpers.py 2013-09-04 14:48:30 +0000
28+++ charmworld/views/helpers.py 2013-10-02 15:48:32 +0000
29@@ -99,20 +99,6 @@
30 return n.split("<", 1)[0].strip()
31
32
33-def result_sorter(a, b):
34- review_cmp = cmp(b['promulgated'], a['promulgated'])
35- if review_cmp != 0:
36- return review_cmp
37-
38- from charmworld.views import SERIES_SORT
39- series = cmp(SERIES_SORT.index(a['series']),
40- SERIES_SORT.index(b['series']))
41- if series != 0:
42- return series
43-
44- return cmp(b['relevance'], a['relevance'])
45-
46-
47 def sub_filter(d, req):
48 if req.GET.get('sub'):
49 d['subordinate'] = True
50
51=== modified file 'charmworld/views/search.py'
52--- charmworld/views/search.py 2013-08-01 20:07:38 +0000
53+++ charmworld/views/search.py 2013-10-02 15:48:32 +0000
54@@ -1,21 +1,14 @@
55 # Copyright 2012, 2013 Canonical Ltd. This software is licensed under the
56 # GNU Affero General Public License version 3 (see the file LICENSE).
57-
58-import json
59 from pyramid.httpexceptions import HTTPFound
60 from pyramid.renderers import render_to_response
61 from pyramid.view import view_config
62-from webob import Response
63
64 from charmworld.search import (
65- CHARM,
66 IndexNotReady,
67 SearchServiceNotAvailable,
68 )
69
70-from charmworld.views.api import json_response
71-from charmworld.views.helpers import result_sorter
72-
73
74 def do_search(request):
75 return request.index_client.search(request.params["search_text"])
76@@ -37,46 +30,3 @@
77 return response
78 return dict((key, value) for key, value in search.items()
79 if key != 'matches')
80-
81-
82-@view_config(
83- route_name="search-json")
84-def search_json(request):
85- try:
86- data = do_search(request)
87- except (IndexNotReady, SearchServiceNotAvailable):
88- return json_response(503, {'type': 'search_not_ready'})
89- data['charm_total'] = data.pop('result_total')
90- results = data['results'][CHARM]
91- charms = []
92- for r in results:
93- charm = r['data']
94- if charm.store_url == '':
95- continue
96-
97- charms.append({
98- 'store_url': charm.store_url,
99- 'name': charm.name,
100- 'summary': charm.summary,
101- 'series': charm.series,
102- 'owner': charm.owner,
103- 'data_url': '%s/json' % (
104- # request.host_url,
105- charm.short_url),
106- 'relevance': r['weight'],
107- })
108-
109- if 'subordinate' in data:
110- charms[-1]['subordinate'] = True
111-
112- charms.sort(result_sorter)
113-
114- data.update({"results": charms,
115- "results_size": len(charms)})
116-
117- return Response(
118- json.dumps(data, indent=2),
119- headerlist=[
120- ("Access-Control-Allow-Origin", "*"),
121- ("Access-Control-Allow-Headers", "X-Requested-With")],
122- content_type=u"application/json")
123
124=== modified file 'charmworld/views/tests/test_helpers.py'
125--- charmworld/views/tests/test_helpers.py 2013-07-31 14:45:14 +0000
126+++ charmworld/views/tests/test_helpers.py 2013-10-02 15:48:32 +0000
127@@ -5,7 +5,6 @@
128 from charmworld.views.helpers import (
129 format_change,
130 interfaces,
131- result_sorter,
132 )
133 from charmworld.testing import factory
134 from charmworld.testing import MongoTestBase
135@@ -119,18 +118,6 @@
136 ]
137 self.assertEqual(expected, result)
138
139- def test_result_sorter_raring(self):
140- charm_a = factory.get_charm_json(series='precise')
141- charm_b = factory.get_charm_json(series='raring')
142- with self.assertNoException():
143- result_sorter(charm_a, charm_b)
144-
145- def test_result_sorter_saucy(self):
146- charm_a = factory.get_charm_json(series='saucy')
147- charm_b = factory.get_charm_json(series='raring')
148- with self.assertNoException():
149- result_sorter(charm_a, charm_b)
150-
151 def test_format_change(self):
152 charm = Charm(factory.get_charm_json())
153 result = format_change(charm.last_change)
154
155=== modified file 'charmworld/views/tests/test_search.py'
156--- charmworld/views/tests/test_search.py 2013-08-01 20:07:38 +0000
157+++ charmworld/views/tests/test_search.py 2013-10-02 15:48:32 +0000
158@@ -9,8 +9,8 @@
159 IndexNotReady,
160 )
161 from charmworld.testing import (
162- factory,
163 ViewTestBase,
164+ WebTestBase,
165 )
166 from charmworld.views import search
167
168@@ -65,48 +65,10 @@
169 request=request)
170 self.assertEqual(503, response.status_code)
171
172- def test_search_json(self):
173- # The search json view substitutes the search result object with the
174- # charms and adds some metadata.
175- charm = factory.makeCharm(self.db, name='foo')[1]
176- factory.makeCharm(self.db)
177- self.use_index_client()
178- self.index_client.index_charm(charm)
179- terms = {"search_text": 'foo'}
180- request = self.getRequest(params=terms)
181- keys = sorted([
182- 'charm_total',
183- 'matches',
184- 'matches_human_readable_estimate',
185- 'results',
186- 'results_size',
187- 'search_time'])
188- json = search.search_json(request).json
189- self.assertEqual(keys, sorted(json.keys()))
190- self.assertEqual(1, json['charm_total'])
191- self.assertEqual(1, json['matches'])
192- self.assertEqual('1', json['matches_human_readable_estimate'])
193- self.assertEqual(1, json['results_size'])
194- self.assertEqual(1, len(json['results']))
195- found = json['results'][0]
196- self.assertEqual('foo', found['name'])
197- self.assertEqual(charm['series'], found['series'])
198- self.assertEqual(charm['owner'], found['owner'])
199-
200- @patch('charmworld.views.search.do_search',
201- autospec=True, side_effect=IndexNotReady)
202- def test_search_json_503(self, mock):
203- terms = {"search_text": 'foo'}
204- request = self.getRequest(params=terms)
205- response = search.search_json(request)
206- self.assertEqual(503, response.status_code)
207- self.assertEqual({'type': 'search_not_ready'}, response.json)
208-
209- def test_search_json_503_on_connection_error(self):
210- terms = {"search_text": 'foo'}
211- request = self.getRequest(params=terms)
212- request.index_client = ElasticSearchClient(
213- ElasticSearch(['http://localhost:70']), 'foo')
214- response = search.search_json(request)
215- self.assertEqual(503, response.status_code)
216- self.assertEqual({'type': 'search_not_ready'}, response.json)
217+
218+class SearchJSONTests(WebTestBase):
219+
220+ def test_search_json_obsolete(self):
221+ obsolete_message = 'no longer supported'
222+ resp = self.app.get('/search/json', status=410)
223+ self.assertIn(obsolete_message, resp.body)

Subscribers

People subscribed via source and target branches