diff options
Diffstat (limited to 'cython')
-rw-r--r-- | cython/plist.pxd | 2 | ||||
-rw-r--r-- | cython/plist.pyx | 35 |
2 files changed, 37 insertions, 0 deletions
diff --git a/cython/plist.pxd b/cython/plist.pxd index 99dcca5..b11d80d 100644 --- a/cython/plist.pxd +++ b/cython/plist.pxd @@ -71,6 +71,8 @@ cpdef object from_bin(bytes bin) cpdef object load(fp, fmt=*, use_builtin_types=*, dict_type=*) cpdef object loads(data, fmt=*, use_builtin_types=*, dict_type=*) +cpdef object dump(value, fp, fmt=*, sort_keys=*, skipkeys=*) +cpdef object dumps(value, fmt=*, sort_keys=*, skipkeys=*) cdef object plist_t_to_node(plist_t c_plist, bint managed=*) cdef plist_t native_to_plist_t(object native) 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() |