This is an automated email from the ASF dual-hosted git repository. dill0wn pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/allura.git
commit 14a622a6c050ddf5913794fc5cb7343001f8a1cc Author: Dave Brondsema <[email protected]> AuthorDate: Thu Dec 31 16:47:52 2020 -0500 [#8382] simpler version of smart_str, handles already encoded/binary better too --- Allura/allura/lib/utils.py | 38 +++++++++++--------------------------- Allura/allura/tests/test_utils.py | 8 ++++++++ 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py index 9dd2a75..dca2d3b 100644 --- a/Allura/allura/lib/utils.py +++ b/Allura/allura/lib/utils.py @@ -783,38 +783,22 @@ def is_nofollow_url(url): return url_domain and url_domain not in ok_domains -def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'): - """ - Returns a bytestring version of 's', encoded as specified in 'encoding'. - - If strings_only is True, don't convert (some) non-string-like objects. - - This function was borrowed from Django - """ - if strings_only and isinstance(s, (type(None), int)): +def smart_str(s): + ''' + Returns a bytestring version of 's' from any type + ''' + if isinstance(s, six.binary_type): return s - elif not isinstance(s, six.string_types): - try: - return str(s) - except UnicodeEncodeError: - if isinstance(s, Exception): - # An Exception subclass containing non-ASCII data that doesn't - # know how to print itself properly. We shouldn't raise a - # further exception. - return ' '.join([smart_str(arg, encoding, strings_only, - errors) for arg in s]) - return six.text_type(s).encode(encoding, errors) - elif isinstance(s, six.text_type): - r = s.encode(encoding, errors) - return r - elif s and encoding != 'utf-8': - return s.decode('utf-8', errors).encode(encoding, errors) else: - return s + return six.text_type(s).encode('utf-8') def generate_smart_str(params): - for (key, value) in six.iteritems(params): + if isinstance(params, collections.Mapping): + params_list = six.iteritems(params) + else: + params_list = params + for key, value in params_list: yield smart_str(key), smart_str(value) diff --git a/Allura/allura/tests/test_utils.py b/Allura/allura/tests/test_utils.py index cff7a5d..98f5b12 100644 --- a/Allura/allura/tests/test_utils.py +++ b/Allura/allura/tests/test_utils.py @@ -421,3 +421,11 @@ def test_close_ipv4_addrs(): assert utils.close_ipv4_addrs('1.2.3.4', '1.2.3.255') assert not utils.close_ipv4_addrs('1.2.3.4', '1.2.4.4') + +def test_urlencode(): + # dict - a simple one so arbitrary ordering doesn't cause problems on py2 + assert_equal(utils.urlencode({'a': 'hello'}), + 'a=hello') + # list of pairs - including unicode and bytes + assert_equal(utils.urlencode([('a', 1), ('b', 'ƒ'), ('c', 'ƒ'.encode('utf8'))]), + 'a=1&b=%C6%92&c=%C6%92')
