chiark / gitweb /
make Build class act more like a dict
authorHans-Christoph Steiner <hans@eds.org>
Fri, 18 Nov 2016 08:56:37 +0000 (09:56 +0100)
committerHans-Christoph Steiner <hans@eds.org>
Fri, 24 Feb 2017 10:01:01 +0000 (11:01 +0100)
This makes it a lot easier to work with Build instances with parsing and
dumping libraries, since they expect only core Python types (dict, list,
tuple, str, etc)

fdroidserver/metadata.py

index 9af8a10713ace643d3a840f3b6095d418fd536d2..6fb69a481f02df5125a3b784ce7063605a6aa251 100644 (file)
@@ -25,6 +25,7 @@ import cgi
 import logging
 import textwrap
 import io
+import pprint
 
 import yaml
 # use libyaml if it is available
@@ -309,7 +310,7 @@ build_flags = set(build_flags_order + ['version', 'vercode'])
 
 class Build():
 
-    def __init__(self):
+    def __init__(self, copydict=None):
         self.disable = False
         self.commit = None
         self.subdir = None
@@ -342,6 +343,16 @@ class Build():
 
         self._modified = set()
 
+        if copydict:
+            for k, v in copydict.items():
+                self.set_flag(k, v)
+
+    def __str__(self):
+        return pprint.pformat(self.__dict__)
+
+    def __repr__(self):
+        return self.__str__()
+
     def get_flag(self, f):
         if f not in build_flags:
             warn_or_exception('Unrecognised build flag: ' + f)
@@ -893,7 +904,12 @@ def post_metadata_parse(app):
         if type(v) in (float, int):
             app.__dict__[k] = str(v)
 
+    builds = []
     for build in app.builds:
+        if not isinstance(build, Build):
+            build = Build(build)
+        builds.append(build)
+
         for k in build._modified:
             v = build.__dict__[k]
             if type(v) in (float, int):
@@ -919,7 +935,7 @@ def post_metadata_parse(app):
     if not app.Description:
         app.Description = 'No description available'
 
-    app.builds = sorted_builds(app.builds)
+    app.builds = sorted_builds(builds)
 
 
 # Parse metadata for a single application.