# HG changeset patch # User Sean Farley # Date 1392657038 21600 # Node ID a9b6e38d6dc960fe33ad817223fc50d2cc876556 # Parent ff4e102932ed5559f931d273c05fe7d72f636099 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+. diff --git a/hgsubversion/util.py b/hgsubversion/util.py --- 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.