From f06202c382269ba69c2a40859b8f26f4d24a142f Mon Sep 17 00:00:00 2001 From: Thomas Sileo Date: Sat, 21 Jul 2018 00:43:34 +0200 Subject: [PATCH] Add support for Article --- little_boxes/activitypub.py | 24 ++++++++++++++++-------- tests/test_collection.py | 2 +- tests/test_content_helper.py | 1 + tests/test_httpsig.py | 4 ++-- tests/test_little_boxes.py | 1 + tests/test_urlutils.py | 1 - tests/test_webfinger.py | 4 ++-- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/little_boxes/activitypub.py b/little_boxes/activitypub.py index 051f402..aa4a369 100644 --- a/little_boxes/activitypub.py +++ b/little_boxes/activitypub.py @@ -97,6 +97,8 @@ ACTOR_TYPES = [ ActivityType.SERVICE, ] +CREATE_TYPES = [ActivityType.NOTE, ActivityType.ARTICLE] + COLLECTION_TYPES = [ActivityType.COLLECTION, ActivityType.ORDERED_COLLECTION] @@ -224,7 +226,7 @@ class BaseActivity(object, metaclass=_ActivityMeta): kwargs.pop("actor") actor = self._validate_actor(actor) self._data["actor"] = actor - elif self.ACTIVITY_TYPE == ActivityType.NOTE: + elif self.ACTIVITY_TYPE in CREATE_TYPES: if "attributedTo" not in kwargs: raise BadActivityError(f"Note is missing attributedTo") else: @@ -445,7 +447,7 @@ class BaseActivity(object, metaclass=_ActivityMeta): actor = self._data.get("actor") if not actor and self.ACTOR_REQUIRED: # Quick hack for Note objects - if self.ACTIVITY_TYPE == ActivityType.NOTE: + if self.ACTIVITY_TYPE in CREATE_TYPES: actor = str(self._data.get("attributedTo")) else: raise BadActivityError(f"failed to fetch actor: {self._data!r}") @@ -834,7 +836,7 @@ class Undo(BaseActivity): class Like(BaseActivity): ACTIVITY_TYPE = ActivityType.LIKE - ALLOWED_OBJECT_TYPES = [ActivityType.NOTE, ActivityType.ARTICLE] + ALLOWED_OBJECT_TYPES = CREATE_TYPES OBJECT_REQUIRED = True ACTOR_REQUIRED = True @@ -880,7 +882,7 @@ class Like(BaseActivity): class Announce(BaseActivity): ACTIVITY_TYPE = ActivityType.ANNOUNCE - ALLOWED_OBJECT_TYPES = [ActivityType.NOTE, ActivityType.ARTICLE] + ALLOWED_OBJECT_TYPES = CREATE_TYPES OBJECT_REQUIRED = True ACTOR_REQUIRED = True @@ -939,7 +941,7 @@ class Announce(BaseActivity): class Delete(BaseActivity): ACTIVITY_TYPE = ActivityType.DELETE - ALLOWED_OBJECT_TYPES = [ActivityType.NOTE, ActivityType.TOMBSTONE] + ALLOWED_OBJECT_TYPES = CREATE_TYPES + [ActivityType.TOMBSTONE] OBJECT_REQUIRED = True def _get_actual_object(self) -> BaseActivity: @@ -1008,7 +1010,7 @@ class Delete(BaseActivity): class Update(BaseActivity): ACTIVITY_TYPE = ActivityType.UPDATE - ALLOWED_OBJECT_TYPES = [ActivityType.NOTE, ActivityType.PERSON] + ALLOWED_OBJECT_TYPES = CREATE_TYPES + [ActivityType.PERSON] OBJECT_REQUIRED = True ACTOR_REQUIRED = True @@ -1047,7 +1049,7 @@ class Update(BaseActivity): class Create(BaseActivity): ACTIVITY_TYPE = ActivityType.CREATE - ALLOWED_OBJECT_TYPES = [ActivityType.NOTE] + ALLOWED_OBJECT_TYPES = CREATE_TYPES OBJECT_REQUIRED = True ACTOR_REQUIRED = True @@ -1196,6 +1198,12 @@ class Note(BaseActivity): return False +class Article(Note): + ACTIVITY_TYPE = ActivityType.ARTICLE + ACTOR_REQUIRED = True + OBJECT_REQURIED = False + + def fetch_remote_activity( iri: str, expected: Optional[ActivityType] = None ) -> BaseActivity: @@ -1214,7 +1222,7 @@ class Outbox(Box): f"{activity.get_actor()!r} cannot post into {self.actor!r} outbox" ) - if activity.ACTIVITY_TYPE == ActivityType.NOTE: + if activity.ACTIVITY_TYPE in CREATE_TYPES: activity = activity.build_create() activity.post_to_outbox() diff --git a/tests/test_collection.py b/tests/test_collection.py index 9f3dc17..8d03eee 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -1,11 +1,11 @@ import logging import pytest - from little_boxes import activitypub as ap from little_boxes.collection import parse_collection from little_boxes.errors import RecursionLimitExceededError from little_boxes.errors import UnexpectedActivityTypeError + from test_backend import InMemBackend logging.basicConfig(level=logging.DEBUG) diff --git a/tests/test_content_helper.py b/tests/test_content_helper.py index bb333a7..71f8519 100644 --- a/tests/test_content_helper.py +++ b/tests/test_content_helper.py @@ -3,6 +3,7 @@ from unittest import mock from little_boxes import activitypub as ap from little_boxes import content_helper + from test_backend import InMemBackend logging.basicConfig(level=logging.DEBUG) diff --git a/tests/test_httpsig.py b/tests/test_httpsig.py index ffab6e8..47e46b7 100644 --- a/tests/test_httpsig.py +++ b/tests/test_httpsig.py @@ -1,11 +1,11 @@ import logging -import httpretty import requests - from little_boxes import activitypub as ap from little_boxes import httpsig from little_boxes.key import Key + +import httpretty from test_backend import InMemBackend logging.basicConfig(level=logging.DEBUG) diff --git a/tests/test_little_boxes.py b/tests/test_little_boxes.py index 79eb997..1eadee9 100644 --- a/tests/test_little_boxes.py +++ b/tests/test_little_boxes.py @@ -1,6 +1,7 @@ import logging from little_boxes import activitypub as ap + from test_backend import InMemBackend logging.basicConfig(level=logging.DEBUG) diff --git a/tests/test_urlutils.py b/tests/test_urlutils.py index 1171d1b..ac5bab8 100644 --- a/tests/test_urlutils.py +++ b/tests/test_urlutils.py @@ -1,7 +1,6 @@ from unittest import mock import pytest - from little_boxes import urlutils diff --git a/tests/test_webfinger.py b/tests/test_webfinger.py index 61cf451..b0f1106 100644 --- a/tests/test_webfinger.py +++ b/tests/test_webfinger.py @@ -2,12 +2,12 @@ import json import logging from unittest import mock -import httpretty import pytest - from little_boxes import urlutils from little_boxes import webfinger +import httpretty + logging.basicConfig(level=logging.DEBUG)