chiark / gitweb /
except named exception handling
[fdroidserver.git] / fdroidserver / metadata.py
index 9a82cc595e9b5151f669c29cf24dd715aa8501ea..e42ca169f88a19e343a0a37035ca27ad70677a39 100644 (file)
@@ -466,7 +466,8 @@ valuetypes = {
                    []),
 
     FieldValidator("Anti-Feature",
-                   ["Ads", "Tracking", "NonFreeNet", "NonFreeDep", "NonFreeAdd", "UpstreamNonFree"], ',',
+                   ["Ads", "Tracking", "NonFreeNet", "NonFreeDep", "NonFreeAdd",
+                       "UpstreamNonFree", "NonFreeAssets"], ',',
                    ["AntiFeatures"],
                    []),
 
@@ -799,7 +800,7 @@ def read_metadata(xref=True):
         for appid, app in apps.iteritems():
             try:
                 description_html(app.Description, linkres)
-            except MetaDataException, e:
+            except MetaDataException as e:
                 raise MetaDataException("Problem with description of " + appid +
                                         " - " + str(e))
 
@@ -952,34 +953,34 @@ def parse_metadata(metadatapath):
         raise MetaDataException('"%s" is not an accepted format, convert to: %s' % (
             metadatapath, ', '.join(accepted)))
 
-    app = None
-    if ext == 'txt':
-        app = parse_txt_metadata(metadatapath)
-    elif ext == 'json':
-        app = parse_json_metadata(metadatapath)
-    elif ext == 'xml':
-        app = parse_xml_metadata(metadatapath)
-    elif ext == 'yaml':
-        app = parse_yaml_metadata(metadatapath)
-    else:
-        raise MetaDataException('Unknown metadata format: %s' % metadatapath)
+    app = App()
+    app.metadatapath = metadatapath
+    app.id, _ = common.get_extension(os.path.basename(metadatapath))
+
+    with open(metadatapath, 'r') as mf:
+        if ext == 'txt':
+            parse_txt_metadata(mf, app)
+        elif ext == 'json':
+            parse_json_metadata(mf, app)
+        elif ext == 'xml':
+            parse_xml_metadata(mf, app)
+        elif ext == 'yaml':
+            parse_yaml_metadata(mf, app)
+        else:
+            raise MetaDataException('Unknown metadata format: %s' % metadatapath)
 
     post_metadata_parse(app)
     return app
 
 
-def parse_json_metadata(metadatapath):
-
-    app = get_default_app_info(metadatapath)
+def parse_json_metadata(mf, app):
 
     # fdroid metadata is only strings and booleans, no floats or ints. And
     # json returns unicode, and fdroidserver still uses plain python strings
     # TODO create schema using https://pypi.python.org/pypi/jsonschema
-    jsoninfo = None
-    with open(metadatapath, 'r') as f:
-        jsoninfo = json.load(f, object_hook=_decode_dict,
-                             parse_int=lambda s: s,
-                             parse_float=lambda s: s)
+    jsoninfo = json.load(mf, object_hook=_decode_dict,
+                         parse_int=lambda s: s,
+                         parse_float=lambda s: s)
     app.update_fields(jsoninfo)
     for f in ['Description', 'Maintainer Notes']:
         v = app.get_field(f)
@@ -987,15 +988,13 @@ def parse_json_metadata(metadatapath):
     return app
 
 
-def parse_xml_metadata(metadatapath):
-
-    app = get_default_app_info(metadatapath)
+def parse_xml_metadata(mf, app):
 
-    tree = ElementTree.ElementTree(file=metadatapath)
+    tree = ElementTree.ElementTree(file=mf)
     root = tree.getroot()
 
     if root.tag != 'resources':
-        raise MetaDataException('%s does not have root as <resources></resources>!' % metadatapath)
+        raise MetaDataException('resources file does not have root element <resources/>')
 
     for child in root:
         if child.tag != 'builds':
@@ -1021,13 +1020,9 @@ def parse_xml_metadata(metadatapath):
     return app
 
 
-def parse_yaml_metadata(metadatapath):
+def parse_yaml_metadata(mf, app):
 
-    app = get_default_app_info(metadatapath)
-
-    yamlinfo = None
-    with open(metadatapath, 'r') as f:
-        yamlinfo = yaml.load(f, Loader=YamlLoader)
+    yamlinfo = yaml.load(mf, Loader=YamlLoader)
     app.update_fields(yamlinfo)
     return app
 
@@ -1036,7 +1031,7 @@ build_line_sep = re.compile(r'(?<!\\),')
 build_cont = re.compile(r'^[ \t]')
 
 
-def parse_txt_metadata(metadatapath):
+def parse_txt_metadata(mf, app):
 
     linedesc = None
 
@@ -1064,9 +1059,8 @@ def parse_txt_metadata(metadatapath):
         v = "".join(lines)
         parts = [p.replace("\\,", ",") for p in re.split(build_line_sep, v)]
         if len(parts) < 3:
-            raise MetaDataException("Invalid build format: " + v + " in " + metafile.name)
+            raise MetaDataException("Invalid build format: " + v + " in " + mf.name)
         build = Build()
-        build.origlines = lines
         build.version = parts[0]
         build.vercode = parts[1]
         if parts[2].startswith('!'):
@@ -1093,9 +1087,6 @@ def parse_txt_metadata(metadatapath):
         app.comments[key] = list(curcomments)
         del curcomments[:]
 
-    app = get_default_app_info(metadatapath)
-    metafile = open(metadatapath, "r")
-
     mode = 0
     buildlines = []
     multiline_lines = []
@@ -1104,9 +1095,9 @@ def parse_txt_metadata(metadatapath):
     vc_seen = set()
 
     c = 0
-    for line in metafile:
+    for line in mf:
         c += 1
-        linedesc = "%s:%d" % (metafile.name, c)
+        linedesc = "%s:%d" % (mf.name, c)
         line = line.rstrip('\r\n')
         if mode == 3:
             if build_cont.match(line):
@@ -1198,15 +1189,14 @@ def parse_txt_metadata(metadatapath):
                 add_comments('build:' + app.builds[-1].vercode)
                 mode = 0
     add_comments(None)
-    metafile.close()
 
     # Mode at end of file should always be 0
     if mode == 1:
-        raise MetaDataException(f + " not terminated in " + metafile.name)
+        raise MetaDataException(f + " not terminated in " + mf.name)
     if mode == 2:
-        raise MetaDataException("Unterminated continuation in " + metafile.name)
+        raise MetaDataException("Unterminated continuation in " + mf.name)
     if mode == 3:
-        raise MetaDataException("Unterminated build in " + metafile.name)
+        raise MetaDataException("Unterminated build in " + mf.name)
 
     return app