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 :parse :encode
:define-class-encoders :define-class-encoders
;; Globals ;; Globals
:*ap-packages* :*ap-packages* :*default-class*
;; Classes ;; Classes
:object :object
;; Slots ;; 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 objects type key. The package first in the list to export such a symbol
is the winner.") 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. ;; Private, internal variable.
(defparameter *@context* nil (defparameter *@context* nil
"Used in YASON:ENCODE to ensure that a single top-level @context can be "Used in YASON:ENCODE to ensure that a single top-level @context can be
@ -96,8 +102,9 @@ again and again, by YASON:ENCODE-SLOTS."
(defun parse-table (table) (defun parse-table (table)
"Parse a hash-table corresponding to YASON-parsed JSON into an ActivityPub object." "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)))))
(obj (make-instance class))) (class (or found-class (find-class *default-class*)))
(obj (make-instance class)))
(loop for key being each hash-key of table (loop for key being each hash-key of table
for val being each hash-value of table for val being each hash-value of table
do (let ((slot-sym (car (find-registered-symbols (param-case key)))) do (let ((slot-sym (car (find-registered-symbols (param-case key))))
@ -232,7 +239,11 @@ items in each will be contained in the resultant list."
*ap-packages* list." *ap-packages* list."
(remove-if (remove-if
#'not #'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*))) *ap-packages*)))
(defun find-registered-classes (str) (defun find-registered-classes (str)

View File

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