chiark / gitweb /
in JSON metadata, convert unicode to str to match the internal format
authorHans-Christoph Steiner <hans@eds.org>
Wed, 22 Jul 2015 16:59:50 +0000 (09:59 -0700)
committerHans-Christoph Steiner <hans@eds.org>
Tue, 1 Sep 2015 09:39:51 +0000 (11:39 +0200)
fdroidserver currently uses plain python 2.x strings rather than unicode
strings, so the parsed JSON should produce the same format as the parsed
.txt metadata.

fdroidserver/metadata.py

index ac12599ddd832326cd3dbde4121a3af80ed8235b..58b774a3dc65e475a99d7b6a15d5e05127276018 100644 (file)
@@ -614,6 +614,36 @@ def post_metadata_parse(thisinfo):
 #
 
 
+def _decode_list(data):
+    '''convert items in a list from unicode to basestring'''
+    rv = []
+    for item in data:
+        if isinstance(item, unicode):
+            item = item.encode('utf-8')
+        elif isinstance(item, list):
+            item = _decode_list(item)
+        elif isinstance(item, dict):
+            item = _decode_dict(item)
+        rv.append(item)
+    return rv
+
+
+def _decode_dict(data):
+    '''convert items in a dict from unicode to basestring'''
+    rv = {}
+    for key, value in data.iteritems():
+        if isinstance(key, unicode):
+            key = key.encode('utf-8')
+        if isinstance(value, unicode):
+            value = value.encode('utf-8')
+        elif isinstance(value, list):
+            value = _decode_list(value)
+        elif isinstance(value, dict):
+            value = _decode_dict(value)
+        rv[key] = value
+    return rv
+
+
 def parse_json_metadata(metafile):
 
     appid = os.path.basename(metafile)[0:-5]  # strip path and .json
@@ -623,6 +653,7 @@ def parse_json_metadata(metafile):
     # fdroid metadata is only strings and booleans, no floats or ints. And
     # json returns unicode, and fdroidserver still uses plain python strings
     jsoninfo = json.load(open(metafile, 'r'),
+                         object_hook=_decode_dict,
                          parse_int=lambda s: s,
                          parse_float=lambda s: s)
     supported_metadata = app_defaults.keys() + ['builds', 'comments']