From: Ben Pfaff Date: Fri, 16 Sep 2011 00:17:36 +0000 (-0700) Subject: python: Accept multiple forms of strings and lists when parsing JSON. X-Git-Tag: v1.3.0~229 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=5c3a4660c0ab317f904446bef8cf1bcce439d754;p=sliver-openvswitch.git python: Accept multiple forms of strings and lists when parsing JSON. 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. --- diff --git a/python/ovs/db/data.py b/python/ovs/db/data.py index 334c26141..f71def9da 100644 --- a/python/ovs/db/data.py +++ b/python/ovs/db/data.py @@ -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 " diff --git a/python/ovs/db/parser.py b/python/ovs/db/parser.py index 173922bab..7f0a6f062 100644 --- a/python/ovs/db/parser.py +++ b/python/ovs/db/parser.py @@ -89,11 +89,10 @@ def json_type_to_string(type_): else: return "" -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): diff --git a/python/ovs/db/schema.py b/python/ovs/db/schema.py index 65ddca600..1c474a8a2 100644 --- a/python/ovs/db/schema.py +++ b/python/ovs/db/schema.py @@ -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_) diff --git a/python/ovs/db/types.py b/python/ovs/db/types.py index 08dfa0ae9..72ab41077 100644 --- a/python/ovs/db/types.py +++ b/python/ovs/db/types.py @@ -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() diff --git a/python/ovs/ovsuuid.py b/python/ovs/ovsuuid.py index df4f1fd76..8da36c6c3 100644 --- a/python/ovs/ovsuuid.py +++ b/python/ovs/ovsuuid.py @@ -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