Merge lp:~verterok/unity-scope-ebay/missing-attributes into lp:unity-scope-ebay

Proposed by Guillermo Gonzalez
Status: Merged
Approved by: Guillermo Gonzalez
Approved revision: 13
Merged at revision: 13
Proposed branch: lp:~verterok/unity-scope-ebay/missing-attributes
Merge into: lp:unity-scope-ebay
Diff against target: 112 lines (+55/-7)
2 files modified
src/unity_ebay_daemon.py (+19/-4)
tests/test_ebay.py (+36/-3)
To merge this branch: bzr merge lp:~verterok/unity-scope-ebay/missing-attributes
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Facundo Batista (community) Approve
Review via email: mp+188715@code.launchpad.net

Commit message

Quote search string and handle missing searchResult and condition in the response.

Description of the change

Two fixes:
- quote search string
- handle missing searchResult and condition in the results

To post a comment you must log in.
Revision history for this message
Facundo Batista (facundo) :
review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/unity_ebay_daemon.py'
--- src/unity_ebay_daemon.py 2013-09-24 18:29:34 +0000
+++ src/unity_ebay_daemon.py 2013-10-01 21:04:21 +0000
@@ -78,16 +78,26 @@
78 Search the server for eBay items78 Search the server for eBay items
79 '''79 '''
80 results = []80 results = []
81 search_url = SEARCH_URI % (API_KEY, search.replace(" ", "%20"))81 result = None
82 search_url = SEARCH_URI % (API_KEY, urllib.parse.quote(search))
82 try:83 try:
83 logger.debug("Request: %s", search_url)84 logger.debug("Request: %s", search_url)
84 response = urllib.request.urlopen(search_url).read()85 response = urllib.request.urlopen(search_url).read()
85 response = response.decode('utf8')86 response = response.decode('utf8')
86 json_response = json.loads(response)87 json_response = json.loads(response)
87 result = json_response["findItemsByKeywordsResponse"][0]['searchResult'][0]['item']88 search_result = json_response["findItemsByKeywordsResponse"][0].get('searchResult')
89 if search_result:
90 count = int(search_result[0]['@count'])
91 # if we got a searchResult and count > 0
92 if count > 0:
93 result = search_result[0]['item']
94 else:
95 # if there is not searchResult, we want to know what's in
96 # the response body
97 logger.warning("Missing searchResult key: %r", json_response)
88 except:98 except:
89 logger.exception("Error while fetching data.")99 logger.exception("Error while fetching data.")
90 result = {}100 result = []
91 if result:101 if result:
92 for item in result:102 for item in result:
93 icon_hint = Unity.AnnotatedIcon.new(Gio.ThemedIcon.new(item['galleryURL'][0]))103 icon_hint = Unity.AnnotatedIcon.new(Gio.ThemedIcon.new(item['galleryURL'][0]))
@@ -104,7 +114,10 @@
104114
105 title = item['title'][0]115 title = item['title'][0]
106 uri = item['viewItemURL'][0]116 uri = item['viewItemURL'][0]
107 condition = item['condition'][0]['conditionDisplayName'][0]117 if 'condition' in item:
118 condition = item['condition'][0]['conditionDisplayName'][0]
119 else:
120 condition = None
108 shipping_to = ', '.join(item['shippingInfo'][0]['shipToLocations'])121 shipping_to = ', '.join(item['shippingInfo'][0]['shipToLocations'])
109 payment_method = ', '.join(item['paymentMethod'])122 payment_method = ', '.join(item['paymentMethod'])
110 currency_code = item['sellingStatus'][0]['currentPrice'][0]['@currencyId']123 currency_code = item['sellingStatus'][0]['currentPrice'][0]['@currencyId']
@@ -178,6 +191,8 @@
178 currency_code = self.result.metadata['currency_code']191 currency_code = self.result.metadata['currency_code']
179 price = self.result.metadata['price']192 price = self.result.metadata['price']
180 preview.props.subtitle = "%s %s" % (currency_code.unpack(), price.unpack())193 preview.props.subtitle = "%s %s" % (currency_code.unpack(), price.unpack())
194 if self.result.metadata['condition']:
195 preview.add_info(Unity.InfoHint.new("condition", _("Condition"), None, self.result.metadata['condition'].unpack()))
181 preview.add_info(Unity.InfoHint.new("condition", _("Condition"), None, self.result.metadata['condition'].unpack()))196 preview.add_info(Unity.InfoHint.new("condition", _("Condition"), None, self.result.metadata['condition'].unpack()))
182 preview.add_info(Unity.InfoHint.new("payment_methods", _("Payment method:"), None, self.result.metadata['payment_methods'].unpack()))197 preview.add_info(Unity.InfoHint.new("payment_methods", _("Payment method:"), None, self.result.metadata['payment_methods'].unpack()))
183 preview.add_info(Unity.InfoHint.new("shipping_to", _("Shipping locations:"), None, self.result.metadata['shipping_to'].unpack()))198 preview.add_info(Unity.InfoHint.new("shipping_to", _("Shipping locations:"), None, self.result.metadata['shipping_to'].unpack()))
184199
=== modified file 'tests/test_ebay.py'
--- tests/test_ebay.py 2013-09-20 22:02:28 +0000
+++ tests/test_ebay.py 2013-10-01 21:04:21 +0000
@@ -1,8 +1,14 @@
1#! /usr/bin/python31#! /usr/bin/python3
2# -*- coding: utf-8 -*-2# -*- coding: utf-8 -*-
3
4import imp
5import json
6import urllib
7
8from io import BytesIO, StringIO
9from unittest import TestCase, mock
3from gi.repository import Unity10from gi.repository import Unity
4from unittest import TestCase11
5import imp
612
7class ResultSet(Unity.ResultSet):13class ResultSet(Unity.ResultSet):
8 def __init__(self):14 def __init__(self):
@@ -57,8 +63,35 @@
57 self.scope_module.SEARCH_URI = 'file:tests/data/mock_ebay_fail#'63 self.scope_module.SEARCH_URI = 'file:tests/data/mock_ebay_fail#'
58 for s in ['iphone']:64 for s in ['iphone']:
59 result_set = self.perform_query(s)65 result_set = self.perform_query(s)
60 print(result_set)
61 self.assertEqual(len(result_set.results), 0)66 self.assertEqual(len(result_set.results), 0)
6267
68 def test_search_missing_condition(self):
69 query = "foo"
70 called = []
71 urlopen = urllib.request.urlopen
72 def fake_urlopen(req):
73 data = urlopen("file:tests/data/mock_ebay_pass").read()
74 # remove condition values from the result
75 result = json.loads(data.decode("utf-8"))
76 sresult = result['findItemsByKeywordsResponse'][0]['searchResult']
77 for i in sresult[0]['item']:
78 i.pop('condition')
79 return BytesIO(json.dumps(result).encode('utf-8'))
80 with mock.patch('urllib.request.urlopen', new=fake_urlopen):
81 result_set = self.perform_query(query)
82 self.assertEqual(len(result_set.results), 3)
83
84 def test_search_unicode(self):
85 query = "Święty Patryk"
86 called = []
87 urlopen = urllib.request.urlopen
88 self.scope_module.SEARCH_URI = '%s#%s'
89 def fake_urlopen(req):
90 called.append(req)
91 return urlopen("file:tests/data/mock_ebay_pass")
92 with mock.patch('urllib.request.urlopen', new=fake_urlopen):
93 self.perform_query(query)
94 self.assertEqual(urllib.parse.quote(query), called[0].split("#")[1])
95
63if __name__ == '__main__':96if __name__ == '__main__':
64 unittest.main()97 unittest.main()

Subscribers

People subscribed via source and target branches