plist.utf8 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +12 -0
- data/CHANGELOG +103 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +8 -0
- data/LICENSE +20 -0
- data/README.rdoc +158 -0
- data/Rakefile +154 -0
- data/lib/plist/generator.rb +222 -0
- data/lib/plist/parser.rb +225 -0
- data/lib/plist/version.rb +3 -0
- data/lib/plist.rb +18 -0
- data/plist.gemspec +23 -0
- data/test/assets/AlbumData.xml +203 -0
- data/test/assets/Cookies.plist +104 -0
- data/test/assets/commented.plist +9 -0
- data/test/assets/example_data.bin +0 -0
- data/test/assets/example_data.jpg +0 -0
- data/test/assets/example_data.plist +259 -0
- data/test/assets/test_data_elements.plist +24 -0
- data/test/assets/test_empty_key.plist +13 -0
- data/test/test_data_elements.rb +124 -0
- data/test/test_generator.rb +75 -0
- data/test/test_generator_basic_types.rb +53 -0
- data/test/test_generator_collections.rb +77 -0
- data/test/test_parser.rb +97 -0
- metadata +111 -0
@@ -0,0 +1,259 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>IMs</key>
|
6
|
+
<array>
|
7
|
+
<string>com.apple.syncservices:9583BE42-EC1A-4B3F-B248-7904BA60634B</string>
|
8
|
+
<string>com.apple.syncservices:2A222E96-4CC6-4320-BE0C-61D5F08C2E64</string>
|
9
|
+
<string>com.apple.syncservices:64DAA772-4558-49F8-9B87-C4A32D5E05C1</string>
|
10
|
+
<string>com.apple.syncservices:AF7C6884-B760-4E55-A4D5-B1B114C8A7DC</string>
|
11
|
+
<string>com.apple.syncservices:ECC7FAED-47D6-4DB9-8120-2F029C7D64C8</string>
|
12
|
+
<string>com.apple.syncservices:D704F079-F869-4613-9CFC-697C1976E8F4</string>
|
13
|
+
</array>
|
14
|
+
<key>URLs</key>
|
15
|
+
<array>
|
16
|
+
<string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
|
17
|
+
</array>
|
18
|
+
<key>com.apple.syncservices.RecordEntityName</key>
|
19
|
+
<string>com.apple.contacts.Contact</string>
|
20
|
+
<key>display as company</key>
|
21
|
+
<string>person</string>
|
22
|
+
<key>email addresses</key>
|
23
|
+
<array>
|
24
|
+
<string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
|
25
|
+
<string>com.apple.syncservices:E508D679-43E1-49E2-B5D7-F14A8E48C067</string>
|
26
|
+
<string>com.apple.syncservices:C6478063-34A5-4CCB-BD41-1F131D56F7BD</string>
|
27
|
+
<string>com.apple.syncservices:2B3E352C-7831-4349-9A87-0FA4BD290515</string>
|
28
|
+
</array>
|
29
|
+
<key>first name</key>
|
30
|
+
<string>Mat</string>
|
31
|
+
<key>image</key>
|
32
|
+
<data>
|
33
|
+
/9j/4AAQSkZJRgABAQAAAQABAAD/7QAcUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAD/
|
34
|
+
4g9ASUNDX1BST0ZJTEUAAQEAAA8wYXBwbAIAAABtbnRyUkdCIFhZWiAH1gAFABUAFAAg
|
35
|
+
AAZhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxx
|
36
|
+
EHyAeZ4fvAacU+DW7cbVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5yWFla
|
37
|
+
AAABLAAAABRnWFlaAAABQAAAABRiWFlaAAABVAAAABR3dHB0AAABaAAAABRjaGFkAAAB
|
38
|
+
fAAAACxyVFJDAAABqAAAAA5nVFJDAAABuAAAAA5iVFJDAAAByAAAAA52Y2d0AAAB2AAA
|
39
|
+
BhJuZGluAAAH7AAABj5kZXNjAAAOLAAAAGRkc2NtAAAOkAAAAEhtbW9kAAAO2AAAAChj
|
40
|
+
cHJ0AAAPAAAAAC1YWVogAAAAAAAAZwIAADyoAAAJjlhZWiAAAAAAAABowAAAq7QAAB5o
|
41
|
+
WFlaIAAAAAAAACcUAAAXvwAAqy9YWVogAAAAAAAA81IAAQAAAAEWz3NmMzIAAAAAAAEM
|
42
|
+
QgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsY3VydgAAAAAAAAABAc0AAGN1
|
43
|
+
cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNndAAAAAAAAAAAAAMBAAACAAAA
|
44
|
+
JwCJARYBsAJsA0kESAV0BsgIPAnXC5YNcA9oEX0ToxXSGAwaJRvMHW4fDSCbIi8jtSUy
|
45
|
+
JqooFil9KuEsOS2MLtwwLTF1Mr80CDVINmQ3cjh8OYs6nTuuPL890j7lP/hBCUIUQxtE
|
46
|
+
H0UdRhhHDkf9SOhJ30r0TBxNQE5iT4NQo1HEUudUDVUxVlZXhFizWeRbGlxSXY9e0mAU
|
47
|
+
YVtin2PhZSBmWmeWaMtp/WsybGJtkm7Gb/hxKnJhc5502HYYd1d4mHmyerx7wHzFfc9+
|
48
|
+
1n/egOmB94MHhBiFLIZCh1uIdomViraL2Yz+jiKPRZBokY+SrpPMlOWV/ZcVmCmZOJpG
|
49
|
+
m1ScX51onnCfdqB8oYGiiqORpJmlo6asp7yozancqumr9q0ArgWvBK/8sO+x2bK/s5q0
|
50
|
+
bLU7thK2/7f8uPu5+Lr0u+68573bvtS/0MDKwcnCzMPUxN/F88cLyCPJQMpFyyHL5cyq
|
51
|
+
zXHOOM79z8XQkdFe0izS/dPP1KbVf9Za1zjYF9j42dnamNtD2+TchN0i3cDeWt7z34zg
|
52
|
+
JuC/4Vjh8OKL4yfjxeRi5QHlouZN5wDnwOh76TPp5eqP6zPr0exj7PLtce3w7l/uzu8z
|
53
|
+
75Pv9PBK8KDw+/GN8iny2fOD9Cn0yfVp9gj2qfdM9/H4ovla+hr66vvN/MD9yf7Q//8A
|
54
|
+
AAAUAEYAkQD0AYQCNQMQBA0FPAaSCA8Jtgt1DUoPNBEtEy0VNhcUGJ0aIhujHRsekB/+
|
55
|
+
IWIixCQgJWwmuyf8KTcqcCumLNUuAy8vME0xXjJoM200cjV3Nnk3ejh6OXg6dDtwPGc9
|
56
|
+
Wz5NPzxAKEEUQf1C5EPRRM9F1kbcR+JI50nsSvBL9kz+TgNPB1ANURNSF1MdVCJVJ1Yv
|
57
|
+
VzNYOVk/WkZbTlxTXV9ebF95YIxhomK9Y+BlBWYuZ15ol2nQaw5sTG2NbqdvsXC1cbpy
|
58
|
+
xHPLdNN13nbsd/x5DXohezd8UH1rfop/q4DOgfODF4Q6hV2GhIejiMGJ2oryjAqNHo4t
|
59
|
+
jzuQSZFUkl2TZZRrlXGWdpd/mIWZi5qQm5Gcl52dnp6fnKCdoZiilaOMpICldKZjp1Go
|
60
|
+
PKkkqg2q9KvarL6tqK6Rr4Cwb7FgslOzSbRDtT+2PLc8uD25QLpFu0m8Tb1Qvk2/O8Ah
|
61
|
+
wQrB9sLiw83EusWrxprHich5yWjKVctDzC/NGs4DzurPz9DE0cPSvNOx1J/VhtZm10HY
|
62
|
+
F9jp2brahttT3CHc8N3F3prfdOBR4Svh+uLA44XkSeUO5dPml+db6B/o4+mm6mrrLuvz
|
63
|
+
7Lbteu4+7wPvx/CM8VDyFPLX8530YfUk9er2rfdx+DX4+vm9+oH7RfwK/M79kv5W/x7/
|
64
|
+
/wAAAAkAIABDAHAApwDoAVAB1gJ8Az4EHAUcBjUHXwiaCecLPAyVDekPExA2EVgSdBON
|
65
|
+
FKEVrxa6F7sYtRmoGpMbdxxWHTAeAh7QH5kgZCE6Ih8i/yPgJL0llyZvJ0UoGijpKbgq
|
66
|
+
hCtPLBcs3S2jLmgvLS/xMLQxdzI6MvYzrzRmNRo1yzZ8Ny432jiJOTk56jqdO1I8CjzF
|
67
|
+
PYQ+RD8IP8xAkUFVQhZC2UOZRFhFFkXQRopHQ0f0SKRJVEoBSqxLVUv5TJVNJ02tTjBO
|
68
|
+
tE85T75QRFDMUVZR41JyUwNTl1QtVMZVYVYAVqBXQlgDWO1Z81r7XANdCl4QXxpgKGE1
|
69
|
+
YkNjVGRqZYJmm2e4aNdp92sabEFtaW6Nb69wzXHrcwh0H3UwdkB3SXhQeVB6SntDfDV9
|
70
|
+
JX4Rfvp/44DPgciCx4PFhMCFuoauh5+IiYlyilqLPowfjQCN4I7Aj6GQg5FikkSTHpPt
|
71
|
+
lLWVgZZTlyeX/JjWmbaal5t6nGKdSZ4ynxygBqDvodeivqOjpJill6aSp4eoeKlkqkur
|
72
|
+
L6wTrPet3a7Gr7GwqLGgsqazr7S/tdu2+rgeuUS6aLuJvKu9yb7owATBIMI6w1TEb8WM
|
73
|
+
xqrHx8jpygjLLMxSzYHOxtAm0YvS/9SF1hTXstlr2zXdFt8M4SjjZOXI6G7rae7F8ur4
|
74
|
+
1P//AABuZGluAAAAAAAABjYAAJQXAABYjQAAUbUAAI5iAAAoWwAAFqgAAFANAABUOQAC
|
75
|
+
o9cAAkAAAAFKPQADAQAAAgAAABQALQBGAF8AdwCOAKUAvADTAOkA/wEWASwBQwFZAXAB
|
76
|
+
hgGdAbQBywHjAfsCEwIsAkcCYgKGAqoC0AL3Ax8DSgN1A6EDzwP/BDEEZASZBNEFCgVF
|
77
|
+
BYEFwQYCBkYGigbQBxkHYweuB/sISwimCQgJbwnVCjwKpQsQC3wL6gxZDMsNPw24DjQO
|
78
|
+
tA85D8EQTxDjEXwSChKIEwUThxQKFI8VFxWfFikWsxc9F8oYWBjjGW8Z/BqJGxUbohwu
|
79
|
+
HLkdRR3SHl4e7R99IBAgpSE+IdYiciMSI7MkVCT5JaAmRCbsJ5UoPyjnKY0qNyrfK4cs
|
80
|
+
MizZLZkuaS8/MBgw7jHGMqIzfDRWNS82CDbjN7w4ljluOkc7Hjv1PMw9pD58P1dAM0ER
|
81
|
+
QexCz0O0RJ9FjEZ5R2tIYkleSlxLW0xfTWdOcE99UIxRnVKsU75U0VXjVvhYCFkXWipb
|
82
|
+
QVxYXXRelV++YPNiLmN6ZM1mNmewaTVqkmvTbQ9uUm+WcOByLHOBdNJ2IHdyeL96CXtO
|
83
|
+
fJF9zH8CgDuBb4KjhBWF2oehiWOLLYz1jrSQdpIwk+yVnZdOmPiaopxKnfOf66JEpKen
|
84
|
+
FqmZrCGurbFCs8+2V7jhu2C9qr/JwfzESsa7yV/MRs+Y02vX2tzd39riV+T157bqg+1L
|
85
|
+
8AjykvT69yr5LfsI/L3+g///AAAAJwBHAGQAgACaALMAzADkAPwBEwErAUMBWwF0AYwB
|
86
|
+
pQG+AdgB8gIMAicCRQJkAooCsgLbAwUDMQNfA44DvgPxBCYEXASUBM4FDAVKBYsF0AYX
|
87
|
+
BmAGqgb4B0gHmgfuCEcIpgkKCXIJ3ApICrcLKQudDBQMjw0LDYwOEQ6ZDyYPthBJEOER
|
88
|
+
fBISEp4TLBO8FE8U4xV6FhMWrBdGF+UYhRklGcgabhsUG70caB0SHcEecB8hH9MghiE9
|
89
|
+
IfEipiNdJBEkxSV5Jikm2CeIKDYo4imKKjUq3iuHLDIs2S2ZLmkvPzAYMO4xxjKiM3w0
|
90
|
+
VjUvNgg24ze8OJY5bjpHOx479TzMPaQ+fD9XQDNBEUHsQs9DtESfRYxGeUdrSGJJXkpc
|
91
|
+
S1tMX01nTnBPfVCMUZ1SrFO/VNRV7FcKWCNZP1phW4hcrl3cXwpgQWF+YrxkBWVOZqFn
|
92
|
+
92lPaqxsD21qbslwIHF5ctB0KHV5dsl4GXloerV8An1Pfpp/6oE8go6D9IV1hveIc4nw
|
93
|
+
i3OM8o5tj+2Rb5LxlHmWApePmR+atpxRnfOffKD2onukCqWmp1GpEKrbrLSulLCBsmu0
|
94
|
+
WbY3uBe57bu7va2/vMHSw+nGBMghykHMZ86P0LfS4dUP1z/Zctum3dvgFuJV5I7m1ekU
|
95
|
+
617tqu/x8kT0lPbm+Tr7k/3w//8AAABVAIoAtwDhAQgBLgFUAXoBoAHGAe0CFQI+AmoC
|
96
|
+
ngLUAwwDRwOFA8UECQRQBJoE6gU+BZcF9wZcBscHOQexCDEIrAkhCZsKFwqZCyALqww6
|
97
|
+
DNANag4KDq8PWRAHELkRbxIqEugTsBSAFVoWOhcfGA0Y/BnsGtwbyxy3HaMejR96IGoh
|
98
|
+
YSJZI1skYCVvJoInpSjPKgArPSyHLf8vqzFXMwc0sTZUN/E5hjsVPJ4+JD9kQFtBUUJG
|
99
|
+
Qz9EOUU2Ri9HJ0giSR5KGEsPTAVM/U3zTuhP3lDUUclSu1OvVKdVoVaiV6NYpVmsWrtb
|
100
|
+
z1zlXgVfKGBVYYtixGQJZVBmomf3aU9qlWvTbRBuVW+ccOxyQ3OndQ52eXfveWl65nxo
|
101
|
+
feh/aYDxgnWEE4XQh4eJMIrbjICOGY+wkUaS1ZRolfiXipkdmrWcUZ3zn3yg9qJ5pAal
|
102
|
+
nac+qO2qoKxWrgmvubFlsv+0mbYct5+5GbqEu++9U761wBnBgcLvxFrFzMc+yLTKLMuo
|
103
|
+
zSbOpNAh0Z/TG9Sa1hTXlNkQ2oncAd1q3rvf+eE24m/jneTA5eDm/egT6STqJ+sm7CHt
|
104
|
+
E+4B7unv0PCp8X/yTfMZ8930m/VX9gT2svdW9+/4ifkZ+aL6K/qv+x37jPv6/Gj8tv0E
|
105
|
+
/VL9oP3v/jz+gf7G/wz/Uf+X/9z//wAAZGVzYwAAAAAAAAAKQ29sb3IgTENEAAAAAAAA
|
106
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
107
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAAgAAAAxlblVTAAAAEgAAAChq
|
108
|
+
YUpQAAAADgAAADoAQwBvAGwAbwByACAATABDAEQwqzDpMPwAIABMAEMARG1tb2QAAAAA
|
109
|
+
AAAGEAAAnF4AAAAAwEuKAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBB
|
110
|
+
cHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEB
|
111
|
+
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBD
|
112
|
+
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
|
113
|
+
AQEBAQEBAQEBAQEBAQH/wAARCAAwADADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
|
114
|
+
AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh
|
115
|
+
ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT
|
116
|
+
VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz
|
117
|
+
tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
|
118
|
+
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC
|
119
|
+
AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2
|
120
|
+
Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaX
|
121
|
+
mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0
|
122
|
+
9fb3+Pn6/9oADAMBAAIRAxEAPwDd+Bfxs/4J+ftC/EFPhp4M+LXjLQtVl8P6pr9trvxE
|
123
|
+
8L2/gfwldRaU9tHPYw6/rU6WZ1OcXJms7F3R7tLe5WItKio3+XePyHPcBh3icwwjwNNT
|
124
|
+
VOVarjcsqSVacJTUZ4bB47FV4RajJzqTgqaulKXPKKf9XVcGklKhWpYyV1y0cHDGynGH
|
125
|
+
M06inVwdOnJKTimoTlJ/yuKcl+c/7cf7TXw68GfEbWvg38B/HWtXuv8AgbxrbC88aeCN
|
126
|
+
O8KeNtJ8W+HU0e2uJrRxr+lR6Vosa63Pc6Zd3Ed3dfakshcWN7FHPiT6nhzheq8PLM8f
|
127
|
+
gMFjcur4R0qOIzXHV8DQp4uT9+pg/wCzpvE4yrQWigoToXlKUoylGy+SzDGqVaOFpYzE
|
128
|
+
4XE066nUw+Hw1PE1p0opcsayxEVRw8KjbV5WqWS5XGMtfCfCn/BSS1vtOvLddC0uw1zR
|
129
|
+
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
|
219
|
+
zSptxk21dX5pWbuo3SS//9k=
|
220
|
+
</data>
|
221
|
+
<key>last name</key>
|
222
|
+
<string>Schaffer</string>
|
223
|
+
<key>phone numbers</key>
|
224
|
+
<array>
|
225
|
+
<string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
|
226
|
+
<string>com.apple.syncservices:FB7585EB-A3DE-46D5-920C-DF8028689BC5</string>
|
227
|
+
<string>com.apple.syncservices:020036FD-22B3-41C9-BC3D-CDA6083582C6</string>
|
228
|
+
<string>com.apple.syncservices:C6661518-90CA-45C7-A988-02F73B958951</string>
|
229
|
+
</array>
|
230
|
+
<key>primary URL</key>
|
231
|
+
<array>
|
232
|
+
<string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
|
233
|
+
</array>
|
234
|
+
<key>primary email address</key>
|
235
|
+
<array>
|
236
|
+
<string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
|
237
|
+
</array>
|
238
|
+
<key>primary phone number</key>
|
239
|
+
<array>
|
240
|
+
<string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
|
241
|
+
</array>
|
242
|
+
<key>primary related name</key>
|
243
|
+
<array>
|
244
|
+
<string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
|
245
|
+
</array>
|
246
|
+
<key>primary street address</key>
|
247
|
+
<array>
|
248
|
+
<string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
|
249
|
+
</array>
|
250
|
+
<key>related names</key>
|
251
|
+
<array>
|
252
|
+
<string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
|
253
|
+
</array>
|
254
|
+
<key>street addresses</key>
|
255
|
+
<array>
|
256
|
+
<string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
|
257
|
+
</array>
|
258
|
+
</dict>
|
259
|
+
</plist>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>stringio</key>
|
6
|
+
<data>dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
|
7
|
+
</data>
|
8
|
+
<key>file</key>
|
9
|
+
<data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
10
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
11
|
+
AAAAAAAAAAAAAA==
|
12
|
+
</data>
|
13
|
+
<key>io</key>
|
14
|
+
<data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
15
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
16
|
+
AAAAAAAAAAAAAA==
|
17
|
+
</data>
|
18
|
+
<key>marshal</key>
|
19
|
+
<!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
|
20
|
+
<data>BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdh
|
21
|
+
cyBtYXJzaGFsZWQ=
|
22
|
+
</data>
|
23
|
+
</dict>
|
24
|
+
</plist>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>key</key>
|
6
|
+
<dict>
|
7
|
+
<key></key>
|
8
|
+
<string>1</string>
|
9
|
+
<key>subkey</key>
|
10
|
+
<string>2</string>
|
11
|
+
</dict>
|
12
|
+
</dict>
|
13
|
+
</plist>
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'plist'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
class MarshalableObject
|
8
|
+
attr_accessor :foo
|
9
|
+
|
10
|
+
def initialize(str)
|
11
|
+
@foo = str
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TestDataElements < Test::Unit::TestCase
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@result = Plist.parse_xml( 'test/assets/test_data_elements.plist' )
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_data_object_header
|
22
|
+
expected = <<END
|
23
|
+
<!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
|
24
|
+
<data>
|
25
|
+
BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdhcyBtYXJz
|
26
|
+
aGFsZWQ=
|
27
|
+
</data>
|
28
|
+
END
|
29
|
+
expected_elements = expected.chomp.split( "\n" )
|
30
|
+
|
31
|
+
actual = Plist::Emit.dump( Object.new, false )
|
32
|
+
actual_elements = actual.chomp.split( "\n" )
|
33
|
+
|
34
|
+
# check for header
|
35
|
+
assert_equal expected_elements.shift, actual_elements.shift
|
36
|
+
|
37
|
+
# check for opening and closing data tags
|
38
|
+
assert_equal expected_elements.shift, actual_elements.shift
|
39
|
+
assert_equal expected_elements.pop, actual_elements.pop
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_marshal_round_trip
|
43
|
+
expected = MarshalableObject.new('this object was marshaled')
|
44
|
+
actual = Plist.parse_xml( Plist::Emit.dump(expected, false) )
|
45
|
+
|
46
|
+
assert_kind_of expected.class, actual
|
47
|
+
assert_equal expected.foo, actual.foo
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_generator_io_and_file
|
51
|
+
expected = <<END
|
52
|
+
<data>
|
53
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
54
|
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
55
|
+
</data>
|
56
|
+
END
|
57
|
+
|
58
|
+
expected.chomp!
|
59
|
+
|
60
|
+
fd = IO.sysopen('test/assets/example_data.bin')
|
61
|
+
io = IO.open(fd, 'r')
|
62
|
+
|
63
|
+
# File is a subclass of IO, so catching IO in the dispatcher should work for File as well...
|
64
|
+
f = File.open('test/assets/example_data.bin')
|
65
|
+
|
66
|
+
assert_equal expected, Plist::Emit.dump(io, false).chomp
|
67
|
+
assert_equal expected, Plist::Emit.dump(f, false).chomp
|
68
|
+
|
69
|
+
assert_instance_of StringIO, @result['io']
|
70
|
+
assert_instance_of StringIO, @result['file']
|
71
|
+
|
72
|
+
io.rewind
|
73
|
+
f.rewind
|
74
|
+
|
75
|
+
assert_equal io.read, @result['io'].read
|
76
|
+
assert_equal f.read, @result['file'].read
|
77
|
+
|
78
|
+
io.close
|
79
|
+
f.close
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_generator_string_io
|
83
|
+
expected = <<END
|
84
|
+
<data>
|
85
|
+
dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
|
86
|
+
</data>
|
87
|
+
END
|
88
|
+
|
89
|
+
sio = StringIO.new('this is a stringio object')
|
90
|
+
|
91
|
+
assert_equal expected.chomp, Plist::Emit.dump(sio, false).chomp
|
92
|
+
|
93
|
+
assert_instance_of StringIO, @result['stringio']
|
94
|
+
|
95
|
+
sio.rewind
|
96
|
+
assert_equal sio.read, @result['stringio'].read
|
97
|
+
end
|
98
|
+
|
99
|
+
# this functionality is credited to Mat Schaffer,
|
100
|
+
# who discovered the plist with the data tag
|
101
|
+
# supplied the test data, and provided the parsing code.
|
102
|
+
def test_data
|
103
|
+
# test reading plist <data> elements
|
104
|
+
data = Plist::parse_xml("test/assets/example_data.plist");
|
105
|
+
assert_equal( File.open("test/assets/example_data.jpg"){|f| f.read }, data['image'].read )
|
106
|
+
|
107
|
+
# test writing data elements
|
108
|
+
expected = File.read("test/assets/example_data.plist")
|
109
|
+
result = data.to_plist
|
110
|
+
#File.open('result.plist', 'w') {|f|f.write(result)} # debug
|
111
|
+
assert_equal( expected, result )
|
112
|
+
|
113
|
+
# Test changing the <data> object in the plist to a StringIO and writing.
|
114
|
+
# This appears extraneous given that plist currently returns a StringIO,
|
115
|
+
# so the above writing test also flexes StringIO#to_plist_node.
|
116
|
+
# However, the interface promise is to return an IO, not a particular class.
|
117
|
+
# plist used to return Tempfiles, which was changed solely for performance reasons.
|
118
|
+
data['image'] = StringIO.new( File.read("test/assets/example_data.jpg"))
|
119
|
+
|
120
|
+
assert_equal(expected, data.to_plist )
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'plist'
|
5
|
+
|
6
|
+
class SerializableObject
|
7
|
+
attr_accessor :foo
|
8
|
+
|
9
|
+
def initialize(str)
|
10
|
+
@foo = str
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_plist_node
|
14
|
+
return "<string>#{CGI::escapeHTML @foo}</string>"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class TestGenerator < Test::Unit::TestCase
|
19
|
+
def test_to_plist_vs_plist_emit_dump_no_envelope
|
20
|
+
source = [1, :b, true]
|
21
|
+
|
22
|
+
to_plist = source.to_plist(false)
|
23
|
+
plist_emit_dump = Plist::Emit.dump(source, false)
|
24
|
+
|
25
|
+
assert_equal to_plist, plist_emit_dump
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_to_plist_vs_plist_emit_dump_with_envelope
|
29
|
+
source = [1, :b, true]
|
30
|
+
|
31
|
+
to_plist = source.to_plist
|
32
|
+
plist_emit_dump = Plist::Emit.dump(source)
|
33
|
+
|
34
|
+
assert_equal to_plist, plist_emit_dump
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_dumping_serializable_object
|
38
|
+
str = 'this object implements #to_plist_node'
|
39
|
+
so = SerializableObject.new(str)
|
40
|
+
|
41
|
+
assert_equal "<string>#{str}</string>", Plist::Emit.dump(so, false)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_write_plist
|
45
|
+
data = [1, :two, {:c => 'dee'}]
|
46
|
+
|
47
|
+
data.save_plist('test.plist')
|
48
|
+
file = File.open('test.plist') {|f| f.read}
|
49
|
+
|
50
|
+
assert_equal file, data.to_plist
|
51
|
+
|
52
|
+
File.unlink('test.plist')
|
53
|
+
end
|
54
|
+
|
55
|
+
# The hash in this test was failing with 'hsh.keys.sort',
|
56
|
+
# we are making sure it works with 'hsh.keys.sort_by'.
|
57
|
+
def test_sorting_keys
|
58
|
+
hsh = {:key1 => 1, :key4 => 4, 'key2' => 2, :key3 => 3}
|
59
|
+
output = Plist::Emit.plist_node(hsh)
|
60
|
+
expected = <<-STR
|
61
|
+
<dict>
|
62
|
+
<key>key1</key>
|
63
|
+
<integer>1</integer>
|
64
|
+
<key>key2</key>
|
65
|
+
<integer>2</integer>
|
66
|
+
<key>key3</key>
|
67
|
+
<integer>3</integer>
|
68
|
+
<key>key4</key>
|
69
|
+
<integer>4</integer>
|
70
|
+
</dict>
|
71
|
+
STR
|
72
|
+
|
73
|
+
assert_equal expected, output.gsub(/[\t]/, "\s\s")
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'plist'
|
5
|
+
|
6
|
+
class TestGeneratorBasicTypes < Test::Unit::TestCase
|
7
|
+
def wrap(tag, content)
|
8
|
+
return "<#{tag}>#{content}</#{tag}>"
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_strings
|
12
|
+
expected = wrap('string', 'testdata')
|
13
|
+
|
14
|
+
assert_equal expected, Plist::Emit.dump('testdata', false).chomp
|
15
|
+
assert_equal expected, Plist::Emit.dump(:testdata, false).chomp
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_strings_with_escaping
|
19
|
+
expected = wrap('string', "<Fish & Chips>")
|
20
|
+
|
21
|
+
assert_equal expected, Plist::Emit.dump('<Fish & Chips>', false).chomp
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_integers
|
25
|
+
[42, 2376239847623987623, -8192].each do |i|
|
26
|
+
assert_equal wrap('integer', i), Plist::Emit.dump(i, false).chomp
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_floats
|
31
|
+
[3.14159, -38.3897, 2398476293847.9823749872349980].each do |i|
|
32
|
+
assert_equal wrap('real', i), Plist::Emit.dump(i, false).chomp
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_booleans
|
37
|
+
assert_equal "<true/>", Plist::Emit.dump(true, false).chomp
|
38
|
+
assert_equal "<false/>", Plist::Emit.dump(false, false).chomp
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_time
|
42
|
+
test_time = Time.now
|
43
|
+
assert_equal wrap('date', test_time.utc.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_time, false).chomp
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_dates
|
47
|
+
test_date = Date.today
|
48
|
+
test_datetime = DateTime.now
|
49
|
+
|
50
|
+
assert_equal wrap('date', test_date.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_date, false).chomp
|
51
|
+
assert_equal wrap('date', test_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_datetime, false).chomp
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'plist'
|
5
|
+
|
6
|
+
class TestGeneratorCollections < Test::Unit::TestCase
|
7
|
+
def test_array
|
8
|
+
expected = <<END
|
9
|
+
<array>
|
10
|
+
<integer>1</integer>
|
11
|
+
<integer>2</integer>
|
12
|
+
<integer>3</integer>
|
13
|
+
</array>
|
14
|
+
END
|
15
|
+
|
16
|
+
assert_equal expected, [1,2,3].to_plist(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_empty_array
|
20
|
+
expected = <<END
|
21
|
+
<array/>
|
22
|
+
END
|
23
|
+
|
24
|
+
assert_equal expected, [].to_plist(false)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_hash
|
28
|
+
expected = <<END
|
29
|
+
<dict>
|
30
|
+
<key>abc</key>
|
31
|
+
<integer>123</integer>
|
32
|
+
<key>foo</key>
|
33
|
+
<string>bar</string>
|
34
|
+
</dict>
|
35
|
+
END
|
36
|
+
# thanks to recent changes in the generator code, hash keys are sorted before emission,
|
37
|
+
# so multi-element hash tests should be reliable. We're testing that here too.
|
38
|
+
assert_equal expected, {:foo => :bar, :abc => 123}.to_plist(false)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_empty_hash
|
42
|
+
expected = <<END
|
43
|
+
<dict/>
|
44
|
+
END
|
45
|
+
|
46
|
+
assert_equal expected, {}.to_plist(false)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_hash_with_array_element
|
50
|
+
expected = <<END
|
51
|
+
<dict>
|
52
|
+
<key>ary</key>
|
53
|
+
<array>
|
54
|
+
<integer>1</integer>
|
55
|
+
<string>b</string>
|
56
|
+
<string>3</string>
|
57
|
+
</array>
|
58
|
+
</dict>
|
59
|
+
END
|
60
|
+
assert_equal expected, {:ary => [1,:b,'3']}.to_plist(false)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_array_with_hash_element
|
64
|
+
expected = <<END
|
65
|
+
<array>
|
66
|
+
<dict>
|
67
|
+
<key>foo</key>
|
68
|
+
<string>bar</string>
|
69
|
+
</dict>
|
70
|
+
<string>b</string>
|
71
|
+
<integer>3</integer>
|
72
|
+
</array>
|
73
|
+
END
|
74
|
+
|
75
|
+
assert_equal expected, [{:foo => 'bar'}, :b, 3].to_plist(false)
|
76
|
+
end
|
77
|
+
end
|