Compare commits

...

2 Enmetoj

Author SHA1 Message Date
Jaidyn Ann 16613eba51 ActivityVocabulary class and example-test tweaks 2024-06-23 22:49:11 -05:00
Jaidyn Ann bb361465c3 Parse even unknown ActivityStreams classes
By means of a *default-class* that is a catch-all.
2024-06-23 22:47:55 -05:00
3 changed files with 32 additions and 12 deletions

View File

@ -23,7 +23,7 @@
:parse :encode
:define-class-encoders
;; Globals
:*ap-packages*
:*ap-packages* :*default-class*
;; Classes
:object
;; Slots
@ -41,6 +41,12 @@ during JSON parsing. The class-name searched for is simply the value of the JSON
objects type key. The package first in the list to export such a symbol
is the winner.")
(defparameter *default-class* 'activity-servist/activity-streams:object
"The class used for ActivityStreams objects found during parsing that dont
have a corresponding class defined. Notably, all keys and values without
corresponding slots are placed in the MISC slot.
The class you choose should inherit ACTIVITY-SERVIST/ACTIVITY-STREAMS:OBJECT.")
;; Private, internal variable.
(defparameter *@context* nil
"Used in YASON:ENCODE to ensure that a single top-level @context can be
@ -96,7 +102,8 @@ again and again, by YASON:ENCODE-SLOTS."
(defun parse-table (table)
"Parse a hash-table corresponding to YASON-parsed JSON into an ActivityPub object."
(let* ((class (car (find-registered-classes (param-case (gethash "type" table)))))
(let* ((found-class (car (find-registered-classes (param-case (gethash "type" table)))))
(class (or found-class (find-class *default-class*)))
(obj (make-instance class)))
(loop for key being each hash-key of table
for val being each hash-value of table
@ -232,7 +239,11 @@ items in each will be contained in the resultant list."
*ap-packages* list."
(remove-if
#'not
(mapcar (lambda (package) (find-symbol (string-upcase str) package))
(mapcar (lambda (package)
(multiple-value-bind (sym context)
(find-symbol (string-upcase str) package)
(unless (eq context :inherited)
sym)))
*ap-packages*)))
(defun find-registered-classes (str)

View File

@ -18,12 +18,12 @@
(defpackage #:activity-servist/activity-vocabulary
(:use #:cl)
(:nicknames "AS/AV" "ACTIVITY-VOCABULARY")
(:shadow #:delete #:ignore #:listen #:read #:remove)
(:shadow #:block #:delete #:ignore #:listen #:read #:remove)
;; One should never USE this package, since some class-names shadow
;; core Common Lisp symbols! Beware! :P
(:export
;; Classes
:accept :activity :add :announce :application :arrive :article :audio
:accept :activity :add :announce :application :arrive :article :audio :block
:collection :collection-page :create :delete :dislike :document :event :flag
:follow :group :ignore :ignore :image :intransitive-activity :invite :join
:leave :like :link :listen :move :note :object :offer :ordered-collection
@ -37,7 +37,7 @@
:collection-total-items
:collection-page-next :collection-page-part-of :collection-page-prev
:link-height :link-href :link-hreflang :link-media-type :link-name
:link-preview :link-rel :link-width
:link-preview :link-rel :link-summary :link-width
:object-attachment :object-attributed-to :object-audience :object-bcc
:object-bto :object-cc :object-content :object-context :object-duration
:object-end-time :object-generator :object-icon :object-image
@ -45,15 +45,18 @@
:object-preview :object-published :object-replies :object-start-time
:object-summary :object-tag :object-to :object-type :object-updated
:object-url
:ordered-collection-page-start-index
:ordered-collection-page-start-index ordered-collection-ordered-items
:place-accuracy :place-altitude :place-latitude :place-longitude
:place-radius :place-units
:question-all-of :question-closed :question-one-of
:profile-describes
:relationship-object :relationship-relationship :relationship-subject
:tombstone-former-type :tombstone-deleted))
(in-package #:activity-servist/activity-vocabulary)
(setq activity-servist/activity-streams:*default-class*
'activity-servist/activity-vocabulary:object)
;;; Macros
@ -103,8 +106,10 @@ of NAME."
tag to updated url))
;; https://www.w3.org/ns/activitystreams#Link
;; “summary” here isnt real! Its not a property Link should have (just
;; looking at Links properties), but its implied by the Mention example.
(defclass-w-accessors link (activity-servist/activity-streams:object)
(height href hreflang media-type name preview rel width))
(height href hreflang media-type name preview rel summary width))
;; https://www.w3.org/ns/activitystreams#Activity
(defclass-w-accessors activity (object)
@ -137,7 +142,7 @@ of NAME."
;;; Extended Activity types
;;; ————————————————————————————————————————
(defclass-empty-children activity
(accept add announce create delete dislike flag follow ignore join leave
(accept add announce block create delete dislike flag follow ignore join leave
like listen move offer read reject remove travel undo update view))
(defclass arrive (intransitive-activity) ())
@ -147,6 +152,9 @@ of NAME."
(defclass tentative-accept (accept) ())
(defclass tentative-reject (reject) ())
(defclass-w-accessors question (intransitive-activity)
(any-of closed one-of))
;;; Extended Actor types
@ -195,4 +203,4 @@ of NAME."
(as/as:define-class-encoders
(mapcar #'find-class
'(object link activity collection collection-page ordered-collection
ordered-collection-page place profile relationship tombstone)))
ordered-collection-page place profile question relationship tombstone)))

View File

@ -1,4 +1,5 @@
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "OrderedCollection",
"totalItems": 3,
"name": "Vacation photos 2016",