diff options
Diffstat (limited to 'cython/plist.pyx')
-rw-r--r-- | cython/plist.pyx | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/cython/plist.pyx b/cython/plist.pyx index 573f17f..3c6389c 100644 --- a/cython/plist.pyx +++ b/cython/plist.pyx @@ -907,3 +907,38 @@ cpdef object loads(data, fmt=None, use_builtin_types=True, dict_type=dict): raise ValueError('Cannot parse XML property list as binary') return cb(data) + +cpdef object dump(value, fp, fmt=FMT_XML, sort_keys=True, skipkeys=False): + fp.write(dumps(value, fmt=fmt)) + +cpdef object dumps(value, fmt=FMT_XML, sort_keys=True, skipkeys=False): + if fmt not in (FMT_XML, FMT_BINARY): + raise ValueError('Format must be constant FMT_XML or FMT_BINARY') + + if check_datetime(value): + node = Date(value) + elif isinstance(value, unicode): + node = String(value) + elif PY_MAJOR_VERSION >= 3 and isinstance(value, bytes): + node = Data(value) + elif isinstance(value, str): + # See if this is binary + try: + node = String(value) + except ValueError: + node = Data(value) + elif isinstance(value, bool): + node = Bool(value) + elif isinstance(value, int): + node = Integer(value) + elif isinstance(value, float): + node = Real(value) + elif isinstance(value, dict): + node = Dict(value) + elif type(value) in (list, set, tuple): + node = Array(value) + + if fmt == FMT_XML: + return node.to_xml() + + return node.to_bin() |