Skip to content

Commit 75f813a

Browse files
committed
Implement unarchiving of NSURL (closes #1)
1 parent f8cd397 commit 75f813a

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/typedstream/types/foundation.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,29 @@ def _init_from_unarchiver_(self, unarchiver: archiving.Unarchiver, class_version
167167
raise ValueError(f"Unsupported version: {class_version}")
168168

169169

170+
@archiving.archived_class
171+
class NSURL(NSObject):
172+
relative_to: "typing.Optional[NSURL]"
173+
value: str
174+
175+
def _init_from_unarchiver_(self, unarchiver: archiving.Unarchiver, class_version: int) -> None:
176+
if class_version != 0:
177+
raise ValueError(f"Unsupported version: {class_version}")
178+
179+
is_relative = unarchiver.decode_value_of_type(b"c")
180+
if is_relative == 0:
181+
self.relative_to = None
182+
elif is_relative == 1:
183+
self.relative_to = unarchiver.decode_value_of_type(NSURL)
184+
else:
185+
raise ValueError(f"Unexpected value for boolean: {is_relative}")
186+
187+
self.value = unarchiver.decode_value_of_type(NSString).value
188+
189+
def __repr__(self) -> str:
190+
return f"{type(self).__name__}({self.value!r})"
191+
192+
170193
@archiving.archived_class
171194
class NSValue(NSObject, advanced_repr.AsMultilineStringBase):
172195
detect_backreferences = False

tests/test_typedstream.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,21 @@ def test_read_file_unarchive(self) -> None:
7878
unarchiver.decode_all()
7979

8080

81+
class FoundationUnarchiveTests(unittest.TestCase):
82+
def test_unarchive_nsurl_absolute(self) -> None:
83+
url = typedstream.unarchive_from_data(b"\x04\x0bstreamtyped\x81\xe8\x03\x84\x01@\x84\x84\x84\x05NSURL\x00\x84\x84\x08NSObject\x00\x85\x84\x01c\x00\x92\x84\x84\x84\x08NSString\x01\x94\x84\x01+\x1ehttps://example.com/index.html\x86\x86")
84+
self.assertEqual(type(url), typedstream.types.foundation.NSURL)
85+
self.assertIs(url.relative_to, None)
86+
self.assertEqual(url.value, "https://example.com/index.html")
87+
88+
def test_unarchive_nsurl_relative(self) -> None:
89+
url = typedstream.unarchive_from_data(b"\x04\x0bstreamtyped\x81\xe8\x03\x84\x01@\x84\x84\x84\x05NSURL\x00\x84\x84\x08NSObject\x00\x85\x84\x01c\x01\x92\x84\x93\x95\x00\x92\x84\x84\x84\x08NSString\x01\x94\x84\x01+\x14https://example.com/\x86\x86\x92\x84\x97\x97\nindex.html\x86\x86")
90+
self.assertEqual(type(url), typedstream.types.foundation.NSURL)
91+
self.assertIsInstance(url.relative_to, typedstream.types.foundation.NSURL)
92+
self.assertIs(url.relative_to.relative_to, None)
93+
self.assertEqual(url.relative_to.value, "https://example.com/")
94+
self.assertEqual(url.value, "index.html")
95+
96+
8197
if __name__ == "__main__":
8298
unittest.main()

0 commit comments

Comments
 (0)