chiark / gitweb /
use OrderedDict for localization data in index-v1
authorMichael Pöhn <michael.poehn@fsfe.org>
Mon, 4 Sep 2017 00:23:17 +0000 (02:23 +0200)
committerMichael Pöhn <michael.poehn@fsfe.org>
Tue, 26 Sep 2017 12:15:48 +0000 (14:15 +0200)
fdroidserver/index.py
tests/repo/index-v1.json

index c5ed82e13a0765df85e8eab3b5b1617467d109aa..0e23060c9fde7fae7db9d9e110d6fbc8def7bc84 100644 (file)
@@ -169,6 +169,11 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_
             # Java prefers milliseconds
             # we also need to accound for time zone/daylight saving time
             return int(calendar.timegm(obj.timetuple()) * 1000)
+        if isinstance(obj, dict):
+            d = collections.OrderedDict()
+            for key in sorted(obj.keys()):
+                d[key] = obj[key]
+            return d
         raise TypeError(repr(obj) + " is not JSON serializable")
 
     output = collections.OrderedDict()
@@ -208,6 +213,17 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_
                 k = k[:1].lower() + k[1:]
             d[k] = v
 
+    # establish sort order in localized dicts
+    for app in output['apps']:
+        localized = app.get('localized')
+        if localized:
+            lordered = collections.OrderedDict()
+            for lkey, lvalue in sorted(localized.items()):
+                lordered[lkey] = collections.OrderedDict()
+                for ikey, iname in sorted(lvalue.items()):
+                    lordered[lkey][ikey] = iname
+            app['localized'] = lordered
+
     output_packages = collections.OrderedDict()
     output['packages'] = output_packages
     for package in packages:
index f3b304ab63e88c7cf7314eaf528a9227ca7ce9d4..b419f6df93d67cc4a8593d9a0bb5fda7518a1051 100644 (file)
       "lastUpdated": 1466640000000,
       "localized": {
         "en-US": {
-          "name": "title\n",
-          "summary": "short description\n",
-          "video": "video\n",
           "description": "full description\n",
           "featureGraphic": "featureGraphic.png",
-          "icon": "icon.png"
+          "icon": "icon.png",
+          "name": "title\n",
+          "summary": "short description\n",
+          "video": "video\n"
         }
       }
     }