diff --git a/capnp/capnp.pyx b/capnp/capnp.pyx index 23a4458..be014ed 100644 --- a/capnp/capnp.pyx +++ b/capnp/capnp.pyx @@ -542,29 +542,27 @@ cdef _setDynamicFieldPtr(_DynamicSetterClasses * thisptr, field, value, parent): else: raise ValueError("Non primitive type") -cdef _to_dict(msg): +cdef _to_dict(msg, bint verbose): msg_type = type(msg) if msg_type is _DynamicListBuilder or msg_type is _DynamicListReader or msg_type is _DynamicResizableListBuilder: - return [_to_dict(x) for x in msg] + return [_to_dict(x, verbose) for x in msg] if msg_type is _DynamicStructBuilder or msg_type is _DynamicStructReader: ret = {} try: which = msg.which() - ret['which'] = which - ret[which] = _to_dict(getattr(msg, which)) + ret[which] = _to_dict(getattr(msg, which), verbose) except ValueError: pass for field in msg.schema.non_union_fields: - if msg._has(field): - ret[field] = _to_dict(getattr(msg, field)) + if verbose or msg._has(field): + ret[field] = _to_dict(getattr(msg, field), verbose) return ret return msg -import collections as _collections cdef _from_dict_helper(msg, field, d): d_type = type(d) if d_type is dict: @@ -578,15 +576,13 @@ cdef _from_dict_helper(msg, field, d): else: raise for key, val in d.iteritems(): - if key != 'which': - _from_dict_helper(sub_msg, key, val) + _from_dict_helper(sub_msg, key, val) elif d_type is list and len(d) > 0: l = msg.init(field, len(d)) for i in range(len(d)): if isinstance(d[i], (dict, list)): for key, val in d[i].iteritems(): - if key != 'which': - _from_dict_helper(l[i], key, val) + _from_dict_helper(l[i], key, val) else: l[i] = d[i] else: @@ -661,8 +657,8 @@ cdef class _DynamicStructReader: def __repr__(self): return '<%s reader %s>' % (self.schema.node.displayName, strStructReader(self.thisptr).cStr()) - def to_dict(self): - return _to_dict(self) + def to_dict(self, verbose=False): + return _to_dict(self, verbose) cpdef as_builder(self): """A method for casting this Builder to a Reader @@ -883,8 +879,8 @@ cdef class _DynamicStructBuilder: def __repr__(self): return '<%s builder %s>' % (self.schema.node.displayName, strStructBuilder(self.thisptr).cStr()) - def to_dict(self): - return _to_dict(self) + def to_dict(self, verbose=False): + return _to_dict(self, verbose) cdef class _DynamicStructPipeline: """Reads Cap'n Proto structs @@ -930,8 +926,8 @@ cdef class _DynamicStructPipeline: # def __repr__(self): # return '<%s reader %s>' % (self.schema.node.displayName, strStructReader(self.thisptr).cStr()) - def to_dict(self): - return _to_dict(self) + def to_dict(self, verbose=False): + return _to_dict(self, verbose) cdef class _DynamicOrphan: cdef C_DynamicOrphan thisptr @@ -1148,8 +1144,8 @@ cdef class _RemotePromise: # def __repr__(self): # return '<%s reader %s>' % (self.schema.node.displayName, strStructReader(self.thisptr).cStr()) - def to_dict(self): - return _to_dict(self) + def to_dict(self, verbose=False): + return _to_dict(self, verbose) cdef class EventLoop: cdef SimpleEventLoop thisptr diff --git a/scripts/capnp-json.py b/scripts/capnp-json.py index ec4eb08..f41a05e 100644 --- a/scripts/capnp-json.py +++ b/scripts/capnp-json.py @@ -10,10 +10,11 @@ def parse_args(): parser.add_argument("command") parser.add_argument("schema_file") parser.add_argument("struct_name") + parser.add_argument("-d", "--defaults", help="include default values in json output", action="store_true") return parser.parse_args() -def encode(schema_file, struct_name): +def encode(schema_file, struct_name, **kwargs): schema = capnp.load(schema_file) struct_schema = getattr(schema, struct_name) @@ -23,13 +24,13 @@ def encode(schema_file, struct_name): struct.write(sys.stdout) -def decode(schema_file, struct_name): +def decode(schema_file, struct_name, defaults): schema = capnp.load(schema_file) struct_schema = getattr(schema, struct_name) struct = struct_schema.read(sys.stdin) - json.dump(struct.to_dict(), sys.stdout) + json.dump(struct.to_dict(defaults), sys.stdout) def main(): args = parse_args()