Christoph Schindler avatar Christoph Schindler committed 1f9b871

Add support for dicts with content.

Comments (0)

Files changed (3)

             object_ref = struct.pack('>B', len(self.offset_table)-1)
             object_refs.append(object_ref)
 
-        #import pdb; pdb.set_trace()
         return wrapper + ''.join(object_refs) + ''.join(objects)
     dispatch[ListType] = enc_list
 
     def enc_dict(self, obj):
-        count = 0
-        payload = ''
-        self.offset_table_offset += len(payload)
-        return self.enc_object_with_count(M_DICT, count) + payload
+        count = len(obj)
+        keys, key_refs = [], []
+        objects, object_refs = [], []
+        
+        wrapper = self.enc_object_with_count(M_DICT, count)
+        self.offset_table_offset += 2*count
+
+        for key in obj.keys():
+            keys.append(self.enc_object_table(str(key)))
+            key_ref = struct.pack('>B', len(self.offset_table)-1)
+            key_refs.append(key_ref)
+
+        for value in obj.values():
+            objects.append(self.enc_object_table(value))
+            object_ref = struct.pack('>B', len(self.offset_table)-1)
+            object_refs.append(object_ref)
+
+        return (wrapper + ''.join(key_refs) + ''.join(object_refs) +
+                ''.join(keys) + ''.join(objects))
     dispatch[DictType] = enc_dict
 

plist/tests/test_encode_dicts_binary.py

+from nose.tools import assert_equal
+
+import plist
+
+CASES = [
+    ({}, 'bplist00\xd0\x08\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'),
+    ({0: 1}, 'bplist00\xd1\x01\x02Q0\x10\x01\x08\x0b\r\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f'),
+    ({'foo': 'bar'}, 'bplist00\xd1\x01\x02SfooSbar\x08\x0b\x0f\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13'),
+]
+
+def test_encode_lists_binary():
+    for input, expect in CASES:
+        yield check_encoding, input, expect
+
+def check_encoding(input, expect):
+    output = plist.dumps(input, plist.BINARY_FORMAT)
+    assert_equal(output, expect,
+        "Failed to encode: %r\nexp: %r\nout: %r" % (input, expect, output))
+

plist/tests/test_encode_primitives_binary.py

     (None, 'bplist00\x00\x08\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'),
     (True, 'bplist00\t\x08\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'),
     (False, 'bplist00\x08\x08\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'),
-    ({}, 'bplist00\xd0\x08\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'),
 ]
 
 def test_encode_primitives_binary():
 def check_encoding(input, expect):
     output = plist.dumps(input, plist.BINARY_FORMAT)
     assert_equal(output, expect,
-        "Failed to encode: %r\nex: %r\nin: %r" % (input, expect, output))
+        "Failed to encode: %r\nexp: %r\nout: %r" % (input, expect, output))
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.