[WIP] Start an in-mem backend

This commit is contained in:
Thomas Sileo
2018-06-10 13:51:43 +02:00
parent f0880f0119
commit b75da521e4
4 changed files with 119 additions and 68 deletions

View File

@@ -1,5 +1,6 @@
"""Contains some ActivityPub related utils."""
from typing import Optional
from typing import Callable
from typing import Dict
from typing import List
from typing import Any
@@ -7,22 +8,24 @@ from typing import Any
from .errors import RecursionLimitExceededError
from .errors import UnexpectedActivityTypeError
from .remote_object import OBJECT_FETCHER
def parse_collection(
payload: Optional[Dict[str, Any]] = None,
url: Optional[str] = None,
level: int = 0,
fetcher: Optional[Callable[[str], Dict[str, Any]]] = None,
) -> List[Any]:
"""Resolve/fetch a `Collection`/`OrderedCollection`."""
if not fetcher:
raise Exception('must provide a fetcher')
if level > 3:
raise RecursionLimitExceededError('recursion limit exceeded')
# Go through all the pages
out: List[Any] = []
if url:
payload = OBJECT_FETCHER.fetch(url)
payload = fetcher(url)
if not payload:
raise ValueError('must at least prove a payload or an URL')
@@ -38,7 +41,7 @@ def parse_collection(
out.extend(payload['first']['items'])
n = payload['first'].get('next')
if n:
out.extend(parse_collection(url=n, level=level+1))
out.extend(parse_collection(url=n, level=level+1, fetcher=fetcher))
return out
while payload:
@@ -50,7 +53,7 @@ def parse_collection(
n = payload.get('next')
if n is None:
break
payload = OBJECT_FETCHER.fetch(n)
payload = fetcher(n)
else:
raise UnexpectedActivityTypeError('unexpected activity type {}'.format(payload['type']))