python: Accept multiple forms of strings and lists when parsing JSON.
authorBen Pfaff <blp@nicira.com>
Fri, 16 Sep 2011 00:17:36 +0000 (17:17 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 23 Sep 2011 16:10:45 +0000 (09:10 -0700)
The JSON parser in OVS always yields unicode strings and lists, never
non-unicode strings or tuples, but it's easy to create them when building
JSON elsewhere, so accept both forms.

python/ovs/db/data.py
python/ovs/db/parser.py
python/ovs/db/schema.py
python/ovs/db/types.py
python/ovs/ovsuuid.py

index 334c261419f77e1313a245c386d043b972de4c70..f71def9dafff75ad16dd835a7686025c0268108e 100644 (file)
@@ -288,7 +288,8 @@ class Datum(object):
             else:
                 class_ = "set"
 
-            inner = ovs.db.parser.unwrap_json(json, class_, list)
+            inner = ovs.db.parser.unwrap_json(json, class_, [list, tuple],
+                                              "array")
             n = len(inner)
             if n < type_.n_min or n > type_.n_max:
                 raise error.Error("%s must have %d to %d members but %d are "
index 173922bab051add7e5e9275fa60ba2f7e0b0521a..7f0a6f0629eb337c65fffb47d6f5ddb7329cb9bf 100644 (file)
@@ -89,11 +89,10 @@ def json_type_to_string(type_):
     else:
         return "<invalid>"
 
-def unwrap_json(json, name, need_type):
-    if (type(json) != list or len(json) != 2 or json[0] != name or
-        type(json[1]) != need_type):
-        raise error.Error('expected ["%s", <%s>]'
-                          % (name, json_type_to_string(need_type)), json)
+def unwrap_json(json, name, types, desc):
+    if (type(json) not in (list, tuple) or len(json) != 2 or json[0] != name or
+        type(json[1]) not in types):
+        raise error.Error('expected ["%s", <%s>]' % (name, desc), json)
     return json[1]
 
 def parse_json_pair(json):
index 65ddca60042b615a70dd972a29352a87392e0be3..1c474a8a20e9e8a8962a5df451a5ba1598d92eae 100644 (file)
@@ -64,8 +64,8 @@ class DbSchema(object):
     def from_json(json):
         parser = ovs.db.parser.Parser(json, "database schema")
         name = parser.get("name", ['id'])
-        version = parser.get_optional("version", [unicode])
-        parser.get_optional("cksum", [unicode])
+        version = parser.get_optional("version", [str, unicode])
+        parser.get_optional("cksum", [str, unicode])
         tablesJson = parser.get("tables", [dict])
         parser.finish()
 
@@ -125,8 +125,8 @@ class IdlSchema(DbSchema):
     @staticmethod
     def from_json(json):
         parser = ovs.db.parser.Parser(json, "IDL schema")
-        idlPrefix = parser.get("idlPrefix", [unicode])
-        idlHeader = parser.get("idlHeader", [unicode])
+        idlPrefix = parser.get("idlPrefix", [str, unicode])
+        idlHeader = parser.get("idlHeader", [str, unicode])
 
         subjson = dict(json)
         del subjson["idlPrefix"]
@@ -249,7 +249,7 @@ class ColumnSchema(object):
         parser = ovs.db.parser.Parser(json, "schema for column %s" % name)
         mutable = parser.get_optional("mutable", [bool], True)
         ephemeral = parser.get_optional("ephemeral", [bool], False)
-        type_ = types.Type.from_json(parser.get("type", [dict, unicode]))
+        type_ = types.Type.from_json(parser.get("type", [dict, str, unicode]))
         parser.finish()
 
         return ColumnSchema(name, mutable, not ephemeral, type_)
index 08dfa0ae9a48bdc4245961e4f040502384f0ccf8..72ab41077be60a3a64a91b78d73090ffb797f28f 100644 (file)
@@ -150,7 +150,7 @@ class BaseType(object):
 
     @staticmethod
     def from_json(json):
-        if type(json) == unicode:
+        if type(json) in [str, unicode]:
             return BaseType(AtomicType.from_json(json))
 
         parser = ovs.db.parser.Parser(json, "ovsdb type")
@@ -437,8 +437,8 @@ class Type(object):
             return Type(BaseType.from_json(json))
 
         parser = ovs.db.parser.Parser(json, "ovsdb type")
-        key_json = parser.get("key", [dict, unicode])
-        value_json = parser.get_optional("value", [dict, unicode])
+        key_json = parser.get("key", [dict, str, unicode])
+        value_json = parser.get_optional("value", [dict, str, unicode])
         min_json = parser.get_optional("min", [int])
         max_json = parser.get_optional("max", [int, str, unicode])
         parser.finish()
index df4f1fd769644127513e1060ad226a1c8bb19917..8da36c6c355730b6bd1cddc73a41ca094472140d 100644 (file)
@@ -37,7 +37,7 @@ def from_string(s):
 
 def from_json(json, symtab=None):
     try:
-        s = ovs.db.parser.unwrap_json(json, "uuid", unicode)
+        s = ovs.db.parser.unwrap_json(json, "uuid", [str, unicode], "string")
         if not uuidRE.match(s):
             raise error.Error("\"%s\" is not a valid UUID" % s, json)
         return uuid.UUID(s)
@@ -45,7 +45,8 @@ def from_json(json, symtab=None):
         if not symtab:
             raise e
         try:
-            name = ovs.db.parser.unwrap_json(json, "named-uuid", unicode)
+            name = ovs.db.parser.unwrap_json(json, "named-uuid",
+                                             [str, unicode], "string")
         except error.Error:
             raise e