Tiny ActivityPub framework written in Python, both database and server agnostic.
Go to file
Thomas Sileo 9724059d40 Fix tests 2019-04-24 00:46:12 +02:00
docs Fix typo in index.rst 2018-11-29 14:02:18 +01:00
little_boxes More HTTP sig tweaks 2019-04-24 00:38:17 +02:00
tests Fix tests 2019-04-24 00:46:12 +02:00
.drone.yml Tweak CI pipeline 2019-04-13 11:41:06 +02:00
.gitignore Start documention 2018-06-16 00:47:30 +02:00
.isort.cfg Add isort conf 2018-06-16 00:27:09 +02:00
.readthedocs.yml Add readthedocs conf 2018-06-16 00:55:22 +02:00
LICENSE Initial commit 2018-06-11 22:50:02 +02:00
MANIFEST.in Cleanup 2018-06-12 19:57:40 +02:00
README.md Also remove codecov 2019-04-11 21:58:00 +02:00
dev-requirements.txt More tests and cleanup 2018-06-15 23:53:25 +02:00
requirements.txt fix unicode hashtag 2019-02-24 21:36:06 +07:00
setup.cfg Initial commit 2018-06-11 22:50:02 +02:00
setup.py fix unicode hashtag 2019-02-24 21:36:06 +07:00

README.md

Little Boxes

Build Status License Code style: black

Tiny ActivityPub framework written in Python, both database and server agnostic.

Still in early development, and not published on PyPI yet.

Until a first version is released, the main goal of this framework is to power the microblog.pub microblog engine.

Features

  • Database and server agnostic
    • You need to implement a backend that respond to activity side-effects
    • This also mean you're responsible for serving the activities/collections and receiving them
  • ActivityStreams helper classes
    • with Outbox/Inbox abstractions
  • Content helper using Markdown
    • with helpers for parsing hashtags and linkify content
  • Key (RSA) helper
  • HTTP signature helper
  • JSON-LD signature helper
  • Webfinger helper

Getting Started

from little_boxes import activitypub as ap

from mydb import db_client


class MyBackend(ap.Backend):

    def __init__(self, db_connection):
        self.db_connection = db_connection    

    def inbox_new(self, as_actor: ap.Person, activity: ap.Activity) -> None:
        # Save activity as "as_actor"
        # [...]

    def post_to_remote_inbox(self, as_actor: ap.Person, payload: ap.ObjectType, recipient: str) -> None:
        # Send the activity to the remote actor
        # [...]


db_con = db_client()
my_backend = MyBackend(db_con)

ap.use_backend(my_backend)

me = ap.Person({})  # Init an actor
outbox = ap.Outbox(me)

follow = ap.Follow(actor=me.id, object='http://iri-i-want-follow')
outbox.post(follow)

Projects using Little Boxes

Contributions

TODO: document Mypy, flake8 and black.

PRs are welcome, please open an issue to start a discussion before your start any work.

License

ISC, see the LICENSE file.