From fe695fbaa4a7f29692989ec912c2601aba38db06 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Mon, 30 Aug 2010 12:04:04 -0400 Subject: [PATCH] Now correctly using urlencode for query parameters. Also handling unicode by converting to utf-8. --- apiclient/discovery.py | 12 ++++++++---- runtests.py | 26 +++++++++++++++++++------- tests/test_json_model.py | 20 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 11 deletions(-) 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 os import re import simplejson import uritemplate +import urllib import urlparse @@ -93,10 +94,13 @@ class JsonModel(object): 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 @@ except: 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 @@ def build_suite(folder): __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 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)' from apiclient.discovery import JsonModel import os import unittest +import urlparse class Model(unittest.TestCase): @@ -57,5 +58,24 @@ class Model(unittest.TestCase): 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()