Compare commits

..

2 Enmetoj

Author SHA1 Message Date
Jaidyn Ann 86b8d0a514 Docstrings and package-renaming
No functional changes; simply adds a couple
docstrings and renames
…/ACTIVITY-VOCABULARY → [AS]/VOCAB/ACTIVITY
…/LITEPUB → ACTIVITYPUB-SERVIST/VOCAB/LITEPUB
2024-09-03 12:09:18 -05:00
Jaidyn Ann b15c138378 Add PUBLIC-KEY slot to Litepub’s PERSON 2024-09-03 11:33:55 -05:00
66 changed files with 73 additions and 47 deletions

View File

@ -9,31 +9,41 @@
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:in-order-to ((test-op (test-op "activitypub/tests")))
:depends-on ("activity-servist/signatures"
"alexandria" "clack" "dexador"
"local-time" "purl" "str" "webtentacle" "yason")
:depends-on (:activity-servist/signatures
:alexandria :clack :dexador
:local-time :purl :str :webtentacle :yason)
:components ((:file "src/activity-servist")))
(asdf:defsystem "activity-servist/activity-vocabulary"
(asdf:defsystem "activity-servist/vocab"
:version "0.0"
:license "AGPLv3"
:description "A-S subpackage providing a standard vocabulary for ActivityPub programs."
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:depends-on (:activity-servist/vocab/activity :activity-servist/vocab/litepub))
(asdf:defsystem "activity-servist/vocab/activity"
:version "0.0"
:license "AGPLv3"
:description "A-S subpackage containing ActivityVocabulary class-definitions."
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:depends-on ("activity-servist/json-ld")
:depends-on (:activity-servist/json-ld)
:components ((:file "src/activity-vocabulary")))
(asdf:defsystem "activity-servist/litepub"
(asdf:defsystem "activity-servist/vocab/litepub"
:version "0.0"
:license "AGPLv3"
:description "A-S subpackage providing an expanded vocabulary."
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:depends-on ("activity-servist/activity-vocabulary")
:depends-on (:activity-servist/vocab/activity)
:components ((:file "src/litepub")))
@ -44,7 +54,7 @@
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:depends-on ("alexandria" "dexador" "str" "yason")
:depends-on (:alexandria :dexador :str :yason)
:components ((:file "src/json-ld")))
@ -55,21 +65,22 @@
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:homepage "https://hak.xwx.moe/jadedctrl/activity-servist"
:depends-on ("cl-base64" "flexi-streams" "inferior-shell" "ironclad" "str")
:depends-on (:cl-base64 :flexi-streams :inferior-shell :ironclad :str)
:components ((:file "src/signatures")))
;;; Tests
;;; —————————————————————————————————————
(asdf:defsystem "activity-servist/tests/activity-vocabulary"
(asdf:defsystem "activity-servist/tests/vocab/activity"
:version "0.0"
:license "AGPLv3"
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:description "Tests the activity-servist/activity-vocabulary package, and indirectly /json-ld."
:description "Tests the activity-servist/vocab/activity package, and indirectly /json-ld."
:depends-on (:activity-servist/activity-vocabulary :alexandria :lisp-unit2)
:components ((:file "t/activity-vocabulary")))
:depends-on (:activity-servist/vocab/activity
:alexandria :lisp-unit2)
:components ((:file "t/vocab/activity")))
(asdf:defsystem "activity-servist/tests/signatures"
@ -78,7 +89,8 @@
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:description "Tests for the the activity-servist/signatures package."
:depends-on (:activity-servist/signatures :lisp-unit2)
:depends-on (:activity-servist/signatures
:lisp-unit2)
:components ((:file "t/signatures")))
@ -88,7 +100,7 @@
:author "Jaidyn Ann <jadedctrl@posteo.at>"
:description "Tests for all activity-servist subpacakges."
:depends-on (:activity-servist/tests/activity-vocabulary
:depends-on (:activity-servist/tests/vocab/activity
:activity-servist/tests/signatures
:alexandria :lisp-unit2)
:components ((:file "t/t")))
@ -100,6 +112,6 @@
`(defmethod asdf:perform ((o asdf:test-op) (c (eql (asdf:find-system ',package))))
(eval (read-from-string (format nil "(~A:run-with-summary)" ',package)))))
(define-asdf-testing activity-servist/tests/activity-vocabulary)
(define-asdf-testing activity-servist/tests/vocab/activity)
(define-asdf-testing activity-servist/tests/signatures)
(define-asdf-testing activity-servist/tests)

View File

@ -1,4 +1,4 @@
;;;; activity-vocabulary: Base classes for ActivityStreams.
;;;; activity-vocabulary: Base vocabulary classes for ActivityStreams.
;; Copyright © 2024 Jaidyn Ann <jadedctrl@posteo.at>
;;
@ -15,9 +15,9 @@
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(defpackage #:activity-servist/activity-vocabulary
(defpackage #:activity-servist/vocab/activity
(:use #:cl)
(:nicknames "AS/AV" "ACTIVITY-VOCABULARY")
(:nicknames "AS/V/A" "ACTIVITY-VOCABULARY")
(:shadow #:block #:delete #:ignore #:listen #:read #:remove)
;; One should never USE this package, since some class-names shadow
;; core Common Lisp symbols! Beware! :P
@ -53,7 +53,7 @@
:relationship-object :relationship-relationship :relationship-subject
:tombstone-former-type :tombstone-deleted))
(in-package #:activity-servist/activity-vocabulary)
(in-package #:activity-servist/vocab/activity)
(defmacro define-json-empty-types (superclass context &rest direct-children)
"For each list of DIRECT-CHILDREN, a hollow JSON subtype and CLOS subclass
@ -176,10 +176,10 @@ The notion of “context” used is intentionally vague. The intended function i
;; looking at Links properties), but its implied by the Mention example.
(json-ld:define-json-type (link "Link") ()
"https://www.w3.org/ns/activitystreams"
((@id
((json-ld:@id
"id"
:documentation "Provides the globally unique identifier for a Link.")
(@type
(json-ld:@type
"type"
:documentation "Identifies the Link type. Multiple values may be specified.")
(height

View File

@ -44,9 +44,19 @@ For example: “https://www.w3.org/ns/activitystreams#Object”
The default value * refers to the base JSON-LD-OBJECT type.")
(defvar *http-cache* (make-hash-table :test #'equal))
(defvar *json-types* (make-hash-table :test #'equal))
(defvar *class-defs* (make-hash-table))
(defvar *json-types* (make-hash-table :test #'equal)
"Stores descriptions of each JSON-type, mapping type-IRI to class-name and property-name to slot-name.
Used during encoding an object to JSON, for finding type/property-names from class/slot-names.
Keys are the type-IRI (e.g., (https://www.w3.org/ns/activitystreams#Accept), and values are an irregular association list, of the form:
((CLASS-NAME-SYMBOL . TYPE-NAME) (PROPERTY-IRI SLOT-NAME-SYMBOL . PROPERTY-NAME) )")
(defvar *class-defs* (make-hash-table)
"Stores the slot definitions of classes, stored directly from DEFINE-JSON-TYPE.
Used for the :UPDATE feature of DEFINE-JSON-TYPE, so you can add a slot to a pre-existing class without having to redefine the old slots.")
(defvar *http-cache* (make-hash-table :test #'equal)
"Caches context-texts fetched over HTTP.
Maps URLs to text-content, so we dont have to download the same context again and again.")

View File

@ -15,11 +15,11 @@
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(defpackage #:activity-servist/litepub
(defpackage #:activity-servist/vocab/litepub
(:use #:cl)
(:nicknames "AS/LP" "LITEPUB"))
(:nicknames "AS/V/LP" "LITEPUB"))
(in-package #:activity-servist/litepub)
(in-package #:activity-servist/vocab/litepub)
;;; Globals
@ -38,7 +38,7 @@ Defaults to a copy at jam.xwx.moe — because why not? ¯\_(ツ)_/¯")
()
(:documentation "The base class used for Litepub objects."))
(json-ld:define-json-type (as/av:object "Object") (as/jld::json-ld-object litepub-object) *litepub-uri*
(json-ld:define-json-type (as/v/a:object "Object") (as/jld::json-ld-object litepub-object) *litepub-uri*
((atom-uri
"atomUri"
:documentation "A string containing a URI to an Atom-feed alternative representation of an object.
@ -60,7 +60,7 @@ Seemingly may be set in the Activity modifying the Note, or the Note itself.")
(:update 't))
(json-ld:define-json-type (as/av:activity "Activity") (as/av:object) *litepub-uri*
(json-ld:define-json-type (as/v/a:activity "Activity") (as/v/a:object) *litepub-uri*
(;; https://blog.dereferenced.org/leveraging-json-ld-compound-typing-for-behavioural-hinting-in-activitypub
(invisible
"invisible"
@ -86,7 +86,7 @@ Potentially deprecated/very uncommon.")
;;; Extended Activity types
;;; ————————————————————————————————————————
(json-ld:define-json-type (as/av:update "Update") (as/av:activity) *litepub-uri*
(json-ld:define-json-type (as/v/a:update "Update") (as/v/a:activity) *litepub-uri*
(;; https://ostatus.github.io/spec/OStatus%201.0%20Draft%202.html#rfc.section.6
(conversation
"conversation"
@ -98,7 +98,7 @@ The target and origin typically have no defined meaning.")
;; https://codeberg.org/fediverse/fep/src/branch/main/fep/c0e0/fep-c0e0.md
(json-ld:define-json-type (emoji-react "EmojiReact") (as/av:like) *litepub-uri*
(json-ld:define-json-type (emoji-react "EmojiReact") (as/v/a:like) *litepub-uri*
()
(:documentation "This activity is similar to Like activity. In addition to standard properties of Like activity, EmojiReact activity MUST have a content property. Reaction content MUST be either a single unicode grapheme, or a shortcode of a custom emoji. If custom emoji is used, EmojiReact activity MUST have a tag property containing a single Emoji object."))
@ -106,8 +106,12 @@ The target and origin typically have no defined meaning.")
;;; Extended Actor types
;;; ————————————————————————————————————————
(json-ld:define-json-type (as/av:person "Person") (as/av:object) *litepub-uri*
(json-ld:define-json-type (as/v/a:person "Person") (as/v/a:object) *litepub-uri*
(;; https://docs.joinmastodon.org/spec/activitypub/#discoverable
(public-key
"publicKey"
:documentation "Contains an object representing a definition of the users public key, used for HTTP signatures.
Generally contains the properties id, owner, publicKeyPem.")
(discoverable
"discoverable"
:documentation "A boolean value reflecting whether or not a profile should be publically discoverable.")
@ -131,12 +135,12 @@ One known capabilitity-name is Pleromas “acceptsChatMessages”."))
;;; Extended Object types
;;; ————————————————————————————————————————
;; https://docs.joinmastodon.org/spec/activitypub/#Emoji
(json-ld:define-json-type (emoji "Emoji") (as/av:object) *litepub-uri*
(json-ld:define-json-type (emoji "Emoji") (as/v/a:object) *litepub-uri*
()
(:documentation "Represents a custom-emoji, with a shortcode (NAME), ID, and ICON (containing MEDIA-TYPE and URL)."))
(json-ld:define-json-type (as/av:note "Note") (as/av:object) *litepub-uri*
(json-ld:define-json-type (as/v/a:note "Note") (as/v/a:object) *litepub-uri*
(;; https://misskey-hub.net/ns#_misskey_quote
(quote-url
"quoteUrl"
@ -158,7 +162,7 @@ It is, however, unclear which one will win out in the end. The implementer prefe
;; https://docs-develop.pleroma.social/backend/development/ap_extensions/#chatmessages
(json-ld:define-json-type (chat-message "ChatMessage") (as/av:note) *litepub-uri*
(json-ld:define-json-type (chat-message "ChatMessage") (as/v/a:note) *litepub-uri*
()
(:documentation "Represents a private and one-on-one chat-message.
Similar to Notes in creation and use, but TO may contain only one recipient.
@ -170,12 +174,12 @@ Potentially very uncommon — it is used by at least Pleroma."))
Will set/get the value of either QUOTE-URL or QUOTE-URI, depending on which is currently in use.
In case of doubt, QUOTE-URL is preferred."))
(defmethod note-quote-url ((obj as/av:note))
(defmethod note-quote-url ((obj as/v/a:note))
(or (and (slot-boundp note 'quote-url) (slot-value note 'quote-url))
(and (slot-boundp note 'quote-uri) (slot-value note 'quote-uri))))
(defgeneric (setf note-quote-url) (obj value))
(defmethod (setf note-quote-url) ((obj as/av:note) value)
(defmethod (setf note-quote-url) ((obj as/v/a:note) value)
(if (slot-boundp note 'quote-uri)
(setf (slot-value note 'quote-uri) value)
(setf (slot-value note 'quote-url) value)))
@ -185,6 +189,6 @@ In case of doubt, QUOTE-URL is preferred."))
;;; Extended Link types
;;; ————————————————————————————————————————
;; https://docs.joinmastodon.org/spec/activitypub/#Hashtag
(json-ld:define-json-type (hashtag "Hashtag") (as/av:link litepub-object) *litepub-uri*
(json-ld:define-json-type (hashtag "Hashtag") (as/v/a:link litepub-object) *litepub-uri*
()
(:documentation "Similar to Mentions, a Hashtag is used to link a post to given topics. Should be stored in a TAG slot, and contain NAME (#hashtag) and HREF (link to a servers hashtag listing)."))

View File

@ -25,7 +25,7 @@
(defun run ()
"Run tests from all activity-servist subpackages."
(activity-servist/tests/signatures:run)
(activity-servist/tests/activity-vocabulary:run))
(activity-servist/tests/vocab/activity:run))
(defun run-with-summary ()
"Run tests with summary for all activity-servist subpackages."

View File

@ -1,4 +1,4 @@
;;;; activity-servist/tests/activity-vocabulary: Testing activity-vocabulary.
;;;; activity-servist/tests/vocab/activity: Testing activity-vocabulary.
;; Copyright © 2024 Jaidyn Levesque <jadedctrl@posteo.at>
;;
@ -15,17 +15,17 @@
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(defpackage :activity-servist/tests/activity-vocabulary
(defpackage :activity-servist/tests/vocab/activity
(:use :cl :lisp-unit2)
(:nicknames "AS/T/AV")
(:nicknames "AS/T/V/AV")
(:export :run :run-with-summary))
(in-package :activity-servist/tests/activity-vocabulary)
(in-package :activity-servist/tests/vocab/activity)
(defun run ()
"Run all ACTIVITY-VOCABULARY tests."
(let ((json-ld:*default-json-type* "https://www.w3.org/ns/activitystreams#Object"))
(lisp-unit2:run-tests :package :activity-servist/tests/activity-vocabulary)))
(lisp-unit2:run-tests :package :activity-servist/tests/vocab/activity)))
(defun run-with-summary ()
"Run tests with summary for ACTIVITY-VOCABULARY."
@ -38,7 +38,7 @@
;;; ————————————————————————————————————————
(defmacro relative-pathname (path)
"Return an absolute path adding the relative PATH to the systems path."
`(asdf:system-relative-pathname :activity-servist/tests/activity-vocabulary ,path))
`(asdf:system-relative-pathname :activity-servist/tests/vocab/activity ,path))
(defmacro define-json-test (path tags)
"Define a lisp-unit2 test for parsing of the given JSON file.
@ -92,4 +92,4 @@ Any nested hash-tables found as values are also sorted, recursively."
(mapcar (lambda (file)
(eval `(define-json-test ,file '(:activity-vocabulary))))
(uiop:directory-files
(relative-pathname "t/activity-vocabulary/")))
(relative-pathname "t/vocab/activity/")))