Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix serialization of JSON-LD subarrays #2452

Merged
merged 1 commit into from
Dec 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion bookwyrm/activitypub/base_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ def serialize(self, **kwargs):
try:
if issubclass(type(v), ActivityObject):
data[k] = v.serialize()
elif isinstance(v, list):
data[k] = [
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Directly nested lists are not allowed in JSON-LD, so I think we should be alright!

e.serialize() if issubclass(type(e), ActivityObject) else e
for e in v
]
except TypeError:
pass
data = {k: v for (k, v) in data.items() if v is not None and k not in omit}
Expand Down Expand Up @@ -306,7 +311,9 @@ class Link(ActivityObject):

def serialize(self, **kwargs):
"""remove fields"""
omit = ("id", "type", "@context")
omit = ("id", "@context")
if self.type == "Link":
omit += ("type",)
return super().serialize(omit=omit)


Expand Down
34 changes: 17 additions & 17 deletions bookwyrm/tests/models/test_status_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,14 @@ def test_generated_note_to_pure_activity(self, *_):
self.assertEqual(activity["type"], "Note")
self.assertEqual(activity["sensitive"], False)
self.assertIsInstance(activity["attachment"], list)
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue(
re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
activity["attachment"][0].url,
activity["attachment"][0]["url"],
)
)
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_comment_to_activity(self, *_):
"""subclass of the base model version with a "pure" serializer"""
Expand All @@ -223,14 +223,14 @@ def test_comment_to_pure_activity(self, *_):
activity["content"],
f'test content<p>(comment on <a href="{self.book.remote_id}">"Test Edition"</a>)</p>',
)
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
# self.assertTrue(
# re.match(
# r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
# activity["attachment"][0].url,
# )
# )
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_quotation_to_activity(self, *_):
"""subclass of the base model version with a "pure" serializer"""
Expand Down Expand Up @@ -262,14 +262,14 @@ def test_quotation_to_pure_activity(self, *_):
activity["content"],
f'a sickening sense <p>-- <a href="{self.book.remote_id}">"Test Edition"</a></p>test content',
)
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue(
re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
activity["attachment"][0].url,
activity["attachment"][0]["url"],
)
)
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_review_to_activity(self, *_):
"""subclass of the base model version with a "pure" serializer"""
Expand Down Expand Up @@ -305,14 +305,14 @@ def test_review_to_pure_activity(self, *_):
f'Review of "{self.book.title}" (3 stars): Review\'s name',
)
self.assertEqual(activity["content"], "test content")
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue(
re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
activity["attachment"][0].url,
activity["attachment"][0]["url"],
)
)
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_review_to_pure_activity_no_rating(self, *_):
"""subclass of the base model version with a "pure" serializer"""
Expand All @@ -330,14 +330,14 @@ def test_review_to_pure_activity_no_rating(self, *_):
f'Review of "{self.book.title}": Review name',
)
self.assertEqual(activity["content"], "test content")
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue(
re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
activity["attachment"][0].url,
activity["attachment"][0]["url"],
)
)
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_reviewrating_to_pure_activity(self, *_):
"""subclass of the base model version with a "pure" serializer"""
Expand All @@ -353,14 +353,14 @@ def test_reviewrating_to_pure_activity(self, *_):
activity["content"],
f'rated <em><a href="{self.book.remote_id}">{self.book.title}</a></em>: 3 stars',
)
self.assertEqual(activity["attachment"][0].type, "Document")
self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue(
re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg",
activity["attachment"][0].url,
activity["attachment"][0]["url"],
)
)
self.assertEqual(activity["attachment"][0].name, "Test Edition")
self.assertEqual(activity["attachment"][0]["name"], "Test Edition")

def test_favorite(self, *_):
"""fav a status"""
Expand Down