def test_nondictroot(): test1 = "abc" test2 = [1, 2, 3, "abc"] result1 = plistlib.loads(plistlib.dumps(test1)) result2 = plistlib.loads(plistlib.dumps(test2)) assert test1 == result1 assert test2 == result2
def test_int(pl): data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert isinstance(pl2, Integral) assert pl == pl2 data2 = plistlib.dumps(pl2) assert data == data2
def test_bytes_data(DataClass, use_builtin_types): pl = DataClass(b"<binary gunk\0\1\2\3>") data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, bytes if use_builtin_types else plistlib.Data) assert pl2 == pl data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_keys_no_string(): pl = {42: "aNumber"} with pytest.raises(TypeError): plistlib.dumps(pl) b = BytesIO() with pytest.raises(TypeError): plistlib.dump(pl, b)
def test_bytearray(use_builtin_types): DataClass = bytes if use_builtin_types else plistlib.Data pl = DataClass(b"<binary gunk\0\1\2\3>") array = bytearray(pl) if use_builtin_types else bytearray(pl.data) data = plistlib.dumps(array) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, DataClass) assert pl2 == pl data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_readMetaInfo_errors(ufo_path): (ufo_path / "metainfo.plist").unlink() with pytest.raises(UFOLibError, match="'metainfo.plist' is missing"): UFOReader(ufo_path) (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps({})) with pytest.raises(UFOLibError, match="Missing required formatVersion"): UFOReader(ufo_path) (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps([])) with pytest.raises(UFOLibError, match="metainfo.plist is not properly formatted"): UFOReader(ufo_path)
def test_controlcharacters(): for i in range(128): c = chr(i) testString = "string containing %s" % c if i >= 32 or c in "\r\n\t": # \r, \n and \t are the only legal control chars in XML data = plistlib.dumps(testString) # the stdlib's plistlib writer, as well as the elementtree # parser, always replace \r with \n inside string values; # lxml doesn't (the ctrl character is escaped), so it roundtrips if c != "\r" or etree._have_lxml: assert plistlib.loads(data) == testString else: with pytest.raises(ValueError): plistlib.dumps(testString)
def test_list_members(): pl = {"first": [1, 2], "second": [1, 2], "third": [3, 4]} data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert pl2 == {"first": [1, 2], "second": [1, 2], "third": [3, 4]} assert pl2["first"] is not pl2["second"]
def test_dict_members(): pl = {"first": {"a": 1}, "second": {"a": 1}, "third": {"b": 2}} data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert pl2 == {"first": {"a": 1}, "second": {"a": 1}, "third": {"b": 2}} assert pl2["first"] is not pl2["second"]
def test_apple_formatting(parametrized_pl): # we also split base64 data into multiple lines differently: # both right-justify data to 76 chars, but Apple's treats tabs # as 8 spaces, whereas we use 2 spaces pl, use_builtin_types = parametrized_pl pl = plistlib.loads(TESTDATA, use_builtin_types=use_builtin_types) data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) assert data == TESTDATA
def pack(self): from fontTools.misc import plistlib data = {} if self.lib: data["lib"] = self.lib if self.color is not None: data["color"] = self.color return plistlib.dumps(data)
def test_no_pretty_print(use_builtin_types): data = plistlib.dumps( {"data": b"hello" if use_builtin_types else plistlib.Data(b"hello")}, pretty_print=False, use_builtin_types=use_builtin_types, ) assert data == (plistlib.XML_DECLARATION + plistlib.PLIST_DOCTYPE + b'<plist version="1.0">' b"<dict>" b"<key>data</key>" b"<data>aGVsbG8=</data>" b"</dict>" b"</plist>")
def test_skipkeys(): pl = {42: "aNumber", "snake": "aWord"} data = plistlib.dumps(pl, skipkeys=True, sort_keys=False) pl2 = plistlib.loads(data) assert pl2 == {"snake": "aWord"} fp = BytesIO() plistlib.dump(pl, fp, skipkeys=True, sort_keys=False) data = fp.getvalue() pl2 = plistlib.loads(fp.getvalue()) assert pl2 == {"snake": "aWord"}
def test_keysort(sort_keys): pl = collections.OrderedDict() pl["b"] = 1 pl["a"] = 2 pl["c"] = 3 data = plistlib.dumps(pl, sort_keys=sort_keys) pl2 = plistlib.loads(data, dict_type=collections.OrderedDict) assert dict(pl) == dict(pl2) if sort_keys: assert list(pl2.keys()) == ["a", "b", "c"] else: assert list(pl2.keys()) == ["b", "a", "c"]
def test_no_pretty_print(use_builtin_types): data = plistlib.dumps( {"data": b"hello" if use_builtin_types else plistlib.Data(b"hello")}, pretty_print=False, use_builtin_types=use_builtin_types, ) assert data == ( plistlib.XML_DECLARATION + plistlib.PLIST_DOCTYPE + b'<plist version="1.0">' b"<dict>" b"<key>data</key>" b"<data>aGVsbG8=</data>" b"</dict>" b"</plist>" )
def test_readMetaInfo_unsupported_format_version(ufo_path, caplog): metainfo = {"formatVersion": 10, "formatVersionMinor": 15} (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps(metainfo)) with pytest.raises(UnsupportedUFOFormat): UFOReader(ufo_path) # validate=True by default with pytest.raises(UnsupportedUFOFormat): UFOReader(ufo_path, validate=True) caplog.clear() with caplog.at_level(logging.WARNING, logger="fontTools.ufoLib"): UFOReader(ufo_path, validate=False) assert len(caplog.records) == 1 assert "Unsupported UFO format" in caplog.text assert "Assuming the latest supported version" in caplog.text
def test_indentation_dict(): data = { "1": { "2": { "3": { "4": { "5": { "6": { "7": { "8": { "9": "aaaaaa" } } } } } } } } } assert plistlib.loads(plistlib.dumps(data)) == data
def test_indentation_array(): data = [[[[[[[[{"test": "aaaaaa"}]]]]]]]] assert plistlib.loads(plistlib.dumps(data)) == data
def test_apple_roundtrips(use_builtin_types): pl = plistlib.loads(TESTDATA, use_builtin_types=use_builtin_types) data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_indentation_dict_mix(): data = {"1": {"2": [{"3": [[[[[{"test": "aaaaaa"}]]]]]}]}} assert plistlib.loads(plistlib.dumps(data)) == data
def test_dump_use_builtin_types_default(pl_no_builtin_types): data = plistlib.dumps(pl_no_builtin_types) pl2 = plistlib.loads(data) expected = plistlib.Data if PY2 else bytes assert isinstance(pl2["someData"], expected) assert pl2 == pl_no_builtin_types
def test_invalid_type(): pl = [object()] with pytest.raises(TypeError): plistlib.dumps(pl)
def test_int_overflow(pl): with pytest.raises(OverflowError): plistlib.dumps(pl)
def test_non_bmp_characters(): pl = {"python": "\U0001f40d"} data = plistlib.dumps(pl) assert plistlib.loads(data) == pl
def writePlistToString(value): return dumps(value, use_builtin_types=False)
def test_bytes_string(use_builtin_types): pl = b"some ASCII bytes" data = plistlib.dumps(pl, use_builtin_types=False) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, unicode) # it's always a <string> assert pl2 == pl.decode()
def test_dump_use_builtin_types_default(pl_no_builtin_types): data = plistlib.dumps(pl_no_builtin_types) pl2 = plistlib.loads(data) assert isinstance(pl2["someData"], bytes) assert pl2 == pl_no_builtin_types
def test_indentation_dict(): data = { "1": {"2": {"3": {"4": {"5": {"6": {"7": {"8": {"9": "aaaaaa"}}}}}}}} } assert plistlib.loads(plistlib.dumps(data)) == data
def test_custom_mapping(): test_mapping = CustomMapping() data = plistlib.dumps(test_mapping) assert plistlib.loads(data) == {"a": 1, "b": 2}
def test_non_ascii_bytes(): with pytest.raises(ValueError, match="invalid non-ASCII bytes"): plistlib.dumps("\U0001f40d".encode("utf-8"), use_builtin_types=False)