Now correctly using urlencode for query parameters. Also handling unicode by converting to utf-8.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index d9fd085..f00188c 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -27,6 +27,7 @@
import re
import simplejson
import uritemplate
+import urllib
import urlparse
@@ -93,10 +94,13 @@
return (headers, path_params, query, simplejson.dumps(model))
def build_query(self, params):
- query = '?alt=json&prettyprint=true'
- for key,value in params.iteritems():
- query += '&%s=%s' % (key, value)
- return query
+ params.update({'alt': 'json', 'prettyprint': 'true'})
+ astuples = []
+ for key, value in params.iteritems():
+ if getattr(value, 'encode', False) and callable(value.encode):
+ value = value.encode('utf-8')
+ astuples.append((key, value))
+ return '?' + urllib.urlencode(astuples)
def response(self, resp, content):
# Error handling is TBD, for example, do we retry
diff --git a/runtests.py b/runtests.py
index c66b728..d36dd93 100644
--- a/runtests.py
+++ b/runtests.py
@@ -1,5 +1,9 @@
#!/usr/bin/env python
-import glob, unittest, os, sys
+import glob
+import logging
+import os
+import sys
+import unittest
from trace import fullmodname
try:
@@ -10,6 +14,20 @@
sys.path.insert(0, os.getcwd())
+verbosity = 1
+if "-q" in sys.argv or '--quiet' in sys.argv:
+ verbosity = 0
+if "-v" in sys.argv or '--verbose' in sys.argv:
+ verbosity = 2
+
+if verbosity == 0:
+ logging.disable(logging.CRITICAL)
+elif verbosity == 1:
+ logging.disable(logging.ERROR)
+elif verbosity == 2:
+ logging.basicConfig(level=logging.DEBUG)
+
+
def build_suite(folder):
# find all of the test modules
modules = map(fullmodname, glob.glob(os.path.join(folder, 'test_*.py')))
@@ -25,12 +43,6 @@
__import__(module)
raise
-verbosity = 1
-if "-q" in sys.argv or '--quiet' in sys.argv:
- verbosity = 0
-if "-v" in sys.argv or '--verbose' in sys.argv:
- verbosity = 2
-
unit_tests = build_suite('tests')
functional_tests = build_suite('functional_tests')
diff --git a/tests/test_json_model.py b/tests/test_json_model.py
index 7af613f..3014ee4 100644
--- a/tests/test_json_model.py
+++ b/tests/test_json_model.py
@@ -24,6 +24,7 @@
from apiclient.discovery import JsonModel
import os
import unittest
+import urlparse
class Model(unittest.TestCase):
@@ -57,5 +58,24 @@
self.assertNotEqual(query, '')
self.assertEqual(body, '{"data": {}}')
+ def test_json_build_query(self):
+ model = JsonModel()
+
+ headers = {}
+ path_params = {}
+ query_params = {'foo': 1, 'bar': u'\N{COMET}'}
+ body = {}
+
+ headers, params, query, body = model.request(headers, path_params, query_params, body)
+
+ self.assertEqual(headers['accept'], 'application/json')
+ self.assertEqual(headers['content-type'], 'application/json')
+
+ query_dict = urlparse.parse_qs(query)
+ self.assertEqual(query_dict['foo'], ['1'])
+ self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
+ self.assertEqual(body, '{"data": {}}')
+
+
if __name__ == '__main__':
unittest.main()