[ovs-dev] [python idl 14/16] python: Accept multiple forms of strings and lists when parsing JSON.
Ben Pfaff
blp at nicira.com
Mon Sep 19 18:18:20 UTC 2011
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 | 3 ++-
python/ovs/db/parser.py | 9 ++++-----
python/ovs/db/schema.py | 10 +++++-----
python/ovs/db/types.py | 6 +++---
python/ovs/ovsuuid.py | 5 +++--
5 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/python/ovs/db/data.py b/python/ovs/db/data.py
index 334c261..f71def9 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 173922b..7f0a6f0 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 "<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):
diff --git a/python/ovs/db/schema.py b/python/ovs/db/schema.py
index 65ddca6..1c474a8 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 08dfa0a..72ab410 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 0776dd5..9bd1392 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
--
1.7.4.4
More information about the dev
mailing list