Mercurial > hgsubversion
changeset 1134:a9b6e38d6dc9
util: add visitor pattern for scrubbing json
These functions are for future patches that will add safer serialization via
json. '_convert' is a visitor pattern that will be used for lists,
dictionaries, and strings for helping convert None to the empty string since
json forbids 'null' as a key for a dictionary.
None -> '' is a safe mapping because this is for the 'branch_info' variable
which already maps the empty string to None.
Note, also, that json is chosen instead of, say, csv because json has a concept
of 'null' and will better handle utf8 strings (which subversion supports).
Important: this changes the requirement of hgsubversion to python 2.6+.
author | Sean Farley <sean.michael.farley@gmail.com> |
---|---|
date | Mon, 17 Feb 2014 11:10:38 -0600 |
parents | ff4e102932ed |
children | 5a0da3bab8a2 |
files | hgsubversion/util.py |
diffstat | 1 files changed, 26 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/hgsubversion/util.py +++ b/hgsubversion/util.py @@ -142,6 +142,32 @@ def save_string(file_path, string): f.write(str(string)) f.close() +def _scrub(data): + if not data and not isinstance(data, list): + return '' + return data + +def _descrub(data): + if isinstance(data, list): + return tuple(data) + if data == '': + return None + return data + +def _convert(input, visitor): + if isinstance(input, dict): + scrubbed = {} + d = dict([(_convert(key, visitor), _convert(value, visitor)) + for key, value in input.iteritems()]) + for key, val in d.iteritems(): + scrubbed[visitor(key)] = visitor(val) + return scrubbed + elif isinstance(input, list): + return [_convert(element, visitor) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + return input + def dump(data, file_path): """pickle some data to a path atomically.