>>> ktistec: Building community/ktistec 3.1.3-r0 (using abuild 3.16.0_rc4-r0) started Sat, 08 Nov 2025 17:58:10 +0000 >>> ktistec: Validating /home/buildozer/aports/community/ktistec/APKBUILD... >>> ktistec: Analyzing dependencies... >>> ktistec: Installing for build: build-base tzdata gc-dev git gmp-dev libxml2-dev musl-utils openssl-dev pcre2-dev sqlite-dev yaml-dev zlib-dev ( 1/30) Installing tzdata (2025b-r0) ( 2/30) Installing gc (8.2.8-r1) ( 3/30) Installing libgc++ (8.2.8-r1) ( 4/30) Installing gc-dev (8.2.8-r1) ( 5/30) Installing libgmpxx (6.3.0-r4) ( 6/30) Installing gmp-dev (6.3.0-r4) ( 7/30) Installing zlib-dev (1.3.1-r2) ( 8/30) Installing xz-libs (5.8.1-r0) ( 9/30) Installing xz (5.8.1-r0) (10/30) Installing xz-dev (5.8.1-r0) (11/30) Installing libxml2 (2.13.9-r0) (12/30) Installing libxml2-utils (2.13.9-r0) (13/30) Installing libxml2-dev (2.13.9-r0) (14/30) Installing openssl-dev (3.5.4-r0) (15/30) Installing bsd-compat-headers (0.7.2-r6) (16/30) Installing libformw (6.5_p20251010-r0) (17/30) Installing libmenuw (6.5_p20251010-r0) (18/30) Installing libpanelw (6.5_p20251010-r0) (19/30) Installing libncurses++ (6.5_p20251010-r0) (20/30) Installing ncurses-dev (6.5_p20251010-r0) (21/30) Installing libedit-dev (20251016.3.1-r0) (22/30) Installing libpcre2-16 (10.46-r0) (23/30) Installing libpcre2-32 (10.46-r0) (24/30) Installing pcre2-dev (10.46-r0) (25/30) Installing sqlite (3.51.0-r0) (26/30) Installing sqlite-libs (3.51.0-r0) (27/30) Installing sqlite-dev (3.51.0-r0) (28/30) Installing yaml (0.2.5-r2) (29/30) Installing yaml-dev (0.2.5-r2) (30/30) Installing .makedepends-ktistec (20251108.175811) busybox-1.37.0-r24.trigger: Executing script... OK: 452 MiB in 135 packages >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Cleaning up tmpdir >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/ktistec-3.1.3.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) wget: server returned error: HTTP/1.1 404 Not Found >>> ktistec: Fetching ktistec-3.1.3.tar.gz::https://github.com/toddsundsted/ktistec/archive/refs/tags/v3.1.3.tar.gz Connecting to github.com (140.82.121.3:443) Connecting to codeload.github.com (140.82.121.9:443) saving to '/var/cache/distfiles/v3.23/ktistec-3.1.3.tar.gz.part' ktistec-3.1.3.tar.gz 5634k --:--:-- ETA ktistec-3.1.3.tar.gz 100% |********************************| 6767k 0:00:00 ETA '/var/cache/distfiles/v3.23/ktistec-3.1.3.tar.gz.part' saved /var/cache/distfiles/v3.23/ktistec-3.1.3.tar.gz: OK /home/buildozer/aports/community/ktistec/ktistec.initd: OK /home/buildozer/aports/community/ktistec/ktistec.confd: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-x86_6 100% |********************************| 41.5M 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-aarch 14% |**** | 5727k 0:00:05 ETA crystal-1.16.3-aarch 100% |********************************| 38.2M 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz.part' crystal-1.16.3.tar.g 100% |********************************| 3633k 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk.part' shards-0.19.1-r0-x86 100% |********************************| 1211k 0:00:00 ETA '/var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk.part' saved /var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk.part' shards-0.19.1-r0-aar 100% |********************************| 1128k 0:00:00 ETA '/var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk.part' saved /var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/ktistec-3.1.3.tar.gz /var/cache/distfiles/v3.23/ktistec-3.1.3.tar.gz: OK /home/buildozer/aports/community/ktistec/ktistec.initd: OK /home/buildozer/aports/community/ktistec/ktistec.confd: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk /var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk /var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk: OK >>> ktistec: Unpacking /var/cache/distfiles/v3.23/ktistec-3.1.3.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz... Extracting ../shards-0.19.1-r0-x86_64.apk... 'usr/bin/shards' -> 'bin/shards' I: Resolving dependencies I: Fetching https://github.com/kemalcr/kemal.git I: Fetching https://github.com/toddsundsted/slang.git I: Fetching https://github.com/crystal-lang/crystal-sqlite3.git I: Fetching https://github.com/toddsundsted/libxml_ext.git I: Fetching https://github.com/toddsundsted/openssl_ext.git I: Fetching https://github.com/toddsundsted/host_meta.git I: Fetching https://github.com/toddsundsted/web_finger.git I: Fetching https://github.com/toddsundsted/school.git I: Fetching https://github.com/icyleaf/markd.git I: Fetching https://gitlab.com/arctic-fox/spectator.git I: Fetching https://github.com/luislavena/radix.git I: Fetching https://github.com/crystal-loot/exception_page.git I: Fetching https://github.com/sija/backtracer.cr.git I: Fetching https://github.com/crystal-lang/crystal-db.git I: Installing radix (0.4.1) I: Installing backtracer (1.2.4) I: Installing exception_page (0.4.1) I: Installing kemal (1.5.0) I: Installing slang (2.0.2) I: Installing db (0.14.0) I: Installing sqlite3 (0.22.0) I: Installing libxml_ext (0.1.2) I: Installing openssl_ext (0.1.6) I: Installing host_meta (0.2.4) I: Installing web_finger (0.2.6) I: Installing school (0.3.1) I: Installing markd (0.5.0) I: Installing spectator (0.12.2) SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:08:12.896765Z INFO - Updating database statistics: 0.224ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:08:54.125093Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:08:54.139808Z WARN - mcp: method not found: unknown/method 2025-11-08T18:08:54.440015Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:08:55.388186Z INFO - Ktistec is going to take a rest! 2025-11-08T18:08:59.872828Z INFO - Ktistec is going to take a rest! 2025-11-08T18:09:18.173666Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:09:18.187775Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:09:18.201364Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:09:18.214577Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:09:18.227802Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:09:18.946437Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/urxhdfqy published=false 2025-11-08T18:09:18.947352Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/qajeyvgn published=true 2025-11-08T18:09:18.948776Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/lhsxtfzq published=true 2025-11-08T18:09:18.949913Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/tczylwse published=false 2025-11-08T18:09:18.950359Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/brleqhuw 2025-11-08T18:09:18.951454Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/kiosuhvr 2025-11-08T18:09:18.952538Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/tywdumeb 2025-11-08T18:09:18.953620Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/pjuvydio 2025-11-08T18:09:19.052489Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/vrwedtia 2025-11-08T18:09:19.066826Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/gftupjnx 2025-11-08T18:09:19.081868Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/lcmuptqo 2025-11-08T18:09:19.101065Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.105968Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.105971Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.105977Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.106587Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.106589Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.107377Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.110203Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.110205Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.110208Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.110531Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.110535Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.110795Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.112561Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.112563Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.655232Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.658010Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.658011Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.658727Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.661537Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.661539Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.662906Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.665663Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.665665Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.665666Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.665976Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.665978Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.680171Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.683165Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.683167Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.697402Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.700221Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.700223Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.713882Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.716875Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.716877Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.717989Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.720766Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.720768Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.720769Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.721086Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.721088Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.735955Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.738941Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.738942Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.740092Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.742898Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.742900Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.742901Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.743242Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.743244Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.757603Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.760461Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.760463Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.761521Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.764344Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.764346Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.764348Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.764639Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.764641Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.779537Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.782395Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.782399Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.783452Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.786318Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.786320Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.786323Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.787012Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.787013Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.804654Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.807569Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.807571Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.808633Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.811474Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.811476Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.811477Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.811769Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.811771Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.826075Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.829041Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.829043Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.830092Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.832836Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.832838Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:09:19.832842Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:09:19.833136Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.833138Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:09:19.849714Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.852436Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.852438Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.854210Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.856966Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.856968Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:09:19.856970Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:09:19.857798Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:09:19.857799Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:09:19.859983Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.862638Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.862640Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.877466Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.880093Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.880095Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.894038Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.896784Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.896786Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:19.913718Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:19.916566Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:19.916568Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:09:20.518256Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:09:20.522219Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:09:20.522222Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:09:20.522226Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:09:20.548247Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:09:20.548253Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:09:20.572268Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-08T18:09:20.572272Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:09:20.596401Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-08T18:09:20.596405Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:09:20.620431Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-08T18:09:20.620436Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:09:20.644395Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-08T18:09:20.644399Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:09:20.668794Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-08T18:09:20.668798Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:09:20.692494Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-08T18:09:20.692502Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:09:20.716053Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-08T18:09:20.716057Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:09:20.739735Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-08T18:09:20.739739Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:09:20.763240Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-08T18:09:20.763244Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:09:21.273775Z INFO - Updating database statistics: 0.439ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:09:22.910328Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:09:22.925758Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:09:22.941488Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:09:22.956832Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:09:23.097798Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:09:23.115720Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:09:23.132697Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:09:23.148883Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz 2025-11-08T18:09:23.649580Z NOTICE - database: Slow query [ 60.775ms] -- SELECT "o"."type","o"."id","o"."blocked_at","o"."created_at","o"."updated_at","o"."deleted_at","o"."type","o"."iri","o"."visible","o"."sensitive","o"."published","o"."updated","o"."attributed_to_iri","o"."in_reply_to_iri","o"."replies_iri","o"."thread","o"."to","o"."cc","o"."audience","o"."name","o"."summary","o"."content","o"."media_type","o"."language","o"."source","o"."attachments","o"."urls" FROM objects AS o JOIN actors AS c ON c.iri = o.attributed_to_iri JOIN activities AS a ON a.object_iri = o.iri WHERE a.actor_iri = ? AND a.type = 'ActivityPub::Activity::Announce' AND "o".deleted_at IS NULL AND "o".blocked_at IS NULL AND "c".deleted_at IS NULL AND "c".blocked_at IS NULL AND "a".undone_at IS NULL ORDER BY o.id DESC LIMIT ? OFFSET ? -- args: ["https://test.test/rvsxudjq", 3, 2] 2025-11-08T18:09:23.649796Z NOTICE - database: [{0, "SEARCH a USING INDEX idx_activities_actor_iri (actor_iri=?)"}, {0, "SEARCH o USING INDEX idx_objects_iri (iri=?)"}, {0, "SEARCH c USING INDEX idx_actors_iri (iri=?)"}, {0, "USE TEMP B-TREE FOR ORDER BY"}] is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Retrying (1/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:13:15.462484Z INFO - Updating database statistics: 0.215ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:13:56.508485Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:13:56.521993Z WARN - mcp: method not found: unknown/method 2025-11-08T18:13:56.827795Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:13:57.767912Z INFO - Ktistec is going to take a rest! 2025-11-08T18:14:02.222343Z INFO - Ktistec is going to take a rest! 2025-11-08T18:14:20.754682Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:14:20.768178Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:14:20.781341Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:14:20.796720Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:14:20.812283Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:14:21.549013Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/gtejkzcb published=false 2025-11-08T18:14:21.549992Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/cgxfmsra published=true 2025-11-08T18:14:21.551506Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/esrjhqgc published=true 2025-11-08T18:14:21.552706Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/jthkweym published=false 2025-11-08T18:14:21.553195Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/eqbvcsiy 2025-11-08T18:14:21.554358Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/jfbgtvpa 2025-11-08T18:14:21.555525Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/dznwqxps 2025-11-08T18:14:21.556730Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/chjmuwdv 2025-11-08T18:14:21.658887Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/gfphdznv 2025-11-08T18:14:21.674408Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/bhvdnxtg 2025-11-08T18:14:21.689575Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/ifutnroy 2025-11-08T18:14:21.706478Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:21.711081Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:21.711083Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:21.711087Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:21.711730Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:21.711732Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:21.712533Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:21.715087Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:21.715089Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:21.715091Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:21.715410Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:21.715412Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:21.715681Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:21.717328Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:21.717330Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.278711Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.281334Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.281336Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.282073Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.284682Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.284684Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.285689Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.288302Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.288304Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.288306Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.288645Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.288647Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.303413Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.306079Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.306081Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.320262Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.322983Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.322985Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.337606Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.340282Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.340284Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.341455Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.344150Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.344152Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.344153Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.344504Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.344506Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.361178Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.363852Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.363854Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.365026Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.367772Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.367774Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.367776Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.368130Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.368132Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.383072Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.385768Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.385771Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.386892Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.389529Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.389531Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.389533Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.389857Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.389858Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.404426Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.407021Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.407023Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.408146Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.410810Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.410813Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.410816Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.411157Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.411159Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.426787Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.429475Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.429477Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.430676Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.433337Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.433340Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.433342Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.433674Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.433675Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.447826Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.450539Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.450541Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.451656Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.454170Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.454172Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:14:22.454180Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:14:22.454505Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.454507Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:14:22.469897Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.472444Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.472446Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.474348Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.476839Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.476842Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:14:22.476844Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:14:22.477787Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:14:22.477789Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:14:22.480041Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.482611Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.482613Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.499010Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.501553Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.501555Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.516308Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.518947Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.518949Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:22.533199Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:22.535956Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:22.535958Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:14:23.168280Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:14:23.172671Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:14:23.172673Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:14:23.172678Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:14:23.199713Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:14:23.199718Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:14:23.225331Z INFO - task.collect_garbage: Batch 2 completed in 0.03 seconds 2025-11-08T18:14:23.225335Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:14:23.250618Z INFO - task.collect_garbage: Batch 3 completed in 0.03 seconds 2025-11-08T18:14:23.250624Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:14:23.275956Z INFO - task.collect_garbage: Batch 4 completed in 0.03 seconds 2025-11-08T18:14:23.275960Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:14:23.301656Z INFO - task.collect_garbage: Batch 5 completed in 0.03 seconds 2025-11-08T18:14:23.301660Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:14:23.326899Z INFO - task.collect_garbage: Batch 6 completed in 0.03 seconds 2025-11-08T18:14:23.326906Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:14:23.352170Z INFO - task.collect_garbage: Batch 7 completed in 0.03 seconds 2025-11-08T18:14:23.352174Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:14:23.377421Z INFO - task.collect_garbage: Batch 8 completed in 0.03 seconds 2025-11-08T18:14:23.377425Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:14:23.402596Z INFO - task.collect_garbage: Batch 9 completed in 0.03 seconds 2025-11-08T18:14:23.402603Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:14:23.428296Z INFO - task.collect_garbage: Batch 10 completed in 0.03 seconds 2025-11-08T18:14:23.428299Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:14:23.936221Z INFO - Updating database statistics: 0.437ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:14:25.582493Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:14:25.596748Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:14:25.614461Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:14:25.629872Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:14:25.775500Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:14:25.791699Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:14:25.807731Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:14:25.822998Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Retrying (2/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:18:21.188207Z INFO - Updating database statistics: 0.232ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:19:02.631043Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:19:02.644925Z WARN - mcp: method not found: unknown/method 2025-11-08T18:19:02.942217Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:19:03.880638Z INFO - Ktistec is going to take a rest! 2025-11-08T18:19:08.334316Z INFO - Ktistec is going to take a rest! 2025-11-08T18:19:26.719486Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:19:26.732988Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:19:26.746974Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:19:26.760502Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:19:26.775282Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:19:27.509198Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/qkyxfumh published=false 2025-11-08T18:19:27.510142Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/taubzrxl published=true 2025-11-08T18:19:27.511579Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/jxpuhdgv published=true 2025-11-08T18:19:27.512725Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/lxtwdmsc published=false 2025-11-08T18:19:27.513216Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/hdmirebt 2025-11-08T18:19:27.514324Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/dznvapbg 2025-11-08T18:19:27.515422Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/hbjyomac 2025-11-08T18:19:27.516517Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/enylujpt 2025-11-08T18:19:27.615994Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/iaucrney 2025-11-08T18:19:27.630558Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/krwnegxd 2025-11-08T18:19:27.645229Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/wmrifkoh 2025-11-08T18:19:27.663241Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:27.667797Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:27.667799Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:27.667803Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:27.668405Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:27.668407Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:27.669185Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:27.671772Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:27.671774Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:27.671775Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:27.672073Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:27.672074Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:27.672344Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:27.674039Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:27.674041Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.219864Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.222585Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.222587Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.223292Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.225964Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.225966Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.226904Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.229616Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.229618Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.229619Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.229915Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.229916Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.246340Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.249194Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.249196Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.262797Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.265553Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.265555Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.279383Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.282222Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.282224Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.283335Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.286059Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.286061Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.286062Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.286370Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.286371Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.302319Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.305746Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.305748Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.306906Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.309674Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.309675Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.309677Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.309990Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.309991Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.324476Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.327296Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.327298Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.328378Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.331071Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.331073Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.331074Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.331373Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.331374Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.348042Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.350830Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.350832Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.351898Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.354678Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.354680Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.354684Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.354980Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.354981Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.370303Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.373066Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.373068Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.374149Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.376928Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.376930Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.376931Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.377245Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.377246Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.392347Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.395205Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.395207Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.396280Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.398974Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.398976Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:19:28.398979Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:19:28.399284Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.399286Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:19:28.414788Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.417513Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.417515Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.419288Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.421975Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.421977Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:19:28.421980Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:19:28.422823Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:19:28.422825Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:19:28.424991Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.427686Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.427688Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.441993Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.444665Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.444670Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.459138Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.461955Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.461957Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:28.477336Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:28.480169Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:28.480171Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:19:29.104875Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:19:29.108814Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:19:29.108816Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:19:29.108821Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:19:29.134513Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:19:29.134517Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:19:29.158637Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-08T18:19:29.158641Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:19:29.182828Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-08T18:19:29.182836Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:19:29.206550Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-08T18:19:29.206554Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:19:29.230269Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-08T18:19:29.230273Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:19:29.254080Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-08T18:19:29.254087Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:19:29.277855Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-08T18:19:29.277859Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:19:29.301597Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-08T18:19:29.301601Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:19:29.325648Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-08T18:19:29.325654Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:19:29.349528Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-08T18:19:29.349530Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:19:29.857091Z INFO - Updating database statistics: 0.433ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:19:31.496689Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:19:31.511596Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:19:31.527639Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:19:31.542883Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:19:31.686626Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:19:31.701111Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:19:31.717681Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:19:31.735778Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Retrying (3/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:23:34.817708Z INFO - Updating database statistics: 0.219ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:24:16.074136Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:24:16.088524Z WARN - mcp: method not found: unknown/method 2025-11-08T18:24:16.394073Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:24:17.335575Z INFO - Ktistec is going to take a rest! 2025-11-08T18:24:21.855548Z INFO - Ktistec is going to take a rest! 2025-11-08T18:24:40.145893Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:24:40.160538Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:24:40.174303Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:24:40.188283Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:24:40.201475Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:24:40.915331Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/vjlgeuti published=false 2025-11-08T18:24:40.916282Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/athsvgul published=true 2025-11-08T18:24:40.917687Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/wxfqrzld published=true 2025-11-08T18:24:40.918803Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/kztorgic published=false 2025-11-08T18:24:40.919239Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/zjltsukw 2025-11-08T18:24:40.920310Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/oekzwuhm 2025-11-08T18:24:40.921441Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ktwvxnhi 2025-11-08T18:24:40.922489Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/dtzosxrb 2025-11-08T18:24:41.017507Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/wztigxqv 2025-11-08T18:24:41.033789Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/vcmxjotu 2025-11-08T18:24:41.050675Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/tgasjbdl 2025-11-08T18:24:41.067863Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.072357Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.072360Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.072361Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.072884Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.072886Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.073643Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.076240Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.076242Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.076243Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.076523Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.076524Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.076785Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.078446Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.078448Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.642853Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.645576Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.645578Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.646269Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.648938Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.648940Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.649860Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.652553Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.652555Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.652557Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.652854Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.652856Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.666809Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.669729Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.669731Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.685026Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.688323Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.688325Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.704173Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.707001Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.707003Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.708085Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.710906Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.710910Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.710914Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.711217Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.711218Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.725951Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.728838Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.728840Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.730059Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.732862Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.732864Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.732865Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.733182Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.733184Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.748311Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.751071Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.751075Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.752108Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.754817Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.754819Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.754823Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.755102Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.755103Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.770671Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.773386Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.773388Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.774416Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.777212Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.777214Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.777216Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.777501Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.777503Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.791717Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.794480Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.794482Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.795528Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.798299Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.798301Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.798305Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.798588Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.798590Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.813473Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.816229Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.816231Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.817279Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.819964Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.819966Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:24:41.819968Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:24:41.820295Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.820297Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:24:41.835592Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.838251Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.838253Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.839974Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.842627Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.842629Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:24:41.842633Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:24:41.843436Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:24:41.843437Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:24:41.845551Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.848160Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.848162Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.861785Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.864500Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.864502Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.879826Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.882526Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.882528Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:41.899273Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:41.902109Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:41.902111Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:24:42.511093Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:24:42.515025Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:24:42.515027Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:24:42.515031Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:24:42.540094Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:24:42.540099Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:24:42.564377Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-08T18:24:42.564381Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:24:42.587861Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-08T18:24:42.587865Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:24:42.611214Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-08T18:24:42.611220Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:24:42.634571Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-08T18:24:42.634575Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:24:42.658004Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-08T18:24:42.658009Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:24:42.681435Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-08T18:24:42.681442Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:24:42.705276Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-08T18:24:42.705280Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:24:42.728486Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-08T18:24:42.728491Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:24:42.751669Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-08T18:24:42.751673Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:24:43.262089Z INFO - Updating database statistics: 0.426ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:24:44.903524Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:24:44.918625Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:24:44.933903Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:24:44.949844Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:24:45.093140Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:24:45.108844Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:24:45.124387Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:24:45.140048Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Retrying (4/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:28:39.067504Z INFO - Updating database statistics: 0.231ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:29:13.447093Z NOTICE - database: Slow query [ 54.134ms] -- SELECT "type","id","blocked_at","created_at","updated_at","deleted_at","type","iri","username","pem_public_key","pem_private_key","shared_inbox","inbox","outbox","following","followers","name","summary","icon","image","urls","attachments","down_at" FROM "actors" WHERE "iri" = ? AND "deleted_at" IS NULL -- args: ["https://remote/actors/wkfxcnyd"] 2025-11-08T18:29:13.447251Z NOTICE - database: [{0, "SEARCH actors USING INDEX idx_actors_iri (iri=?)"}] 2025-11-08T18:29:20.296102Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:29:20.309658Z WARN - mcp: method not found: unknown/method 2025-11-08T18:29:20.616475Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:29:21.571761Z INFO - Ktistec is going to take a rest! 2025-11-08T18:29:26.072618Z INFO - Ktistec is going to take a rest! 2025-11-08T18:29:44.584453Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:29:44.600333Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:29:44.614781Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:29:44.628956Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:29:44.642696Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:29:45.378120Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/nxablkdi published=false 2025-11-08T18:29:45.379053Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/hkepvyaj published=true 2025-11-08T18:29:45.380493Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/tuqjixse published=true 2025-11-08T18:29:45.381670Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/gepzadxr published=false 2025-11-08T18:29:45.382107Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/lndjyrps 2025-11-08T18:29:45.383198Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/hglbdxfi 2025-11-08T18:29:45.384283Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/tdcejlok 2025-11-08T18:29:45.385355Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/myxhsciv 2025-11-08T18:29:45.482399Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/xdkjucys 2025-11-08T18:29:45.497825Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/ivcxgsdp 2025-11-08T18:29:45.515779Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/yzxpmrbs 2025-11-08T18:29:45.532523Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:45.537230Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:45.537233Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:45.537237Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:45.537754Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:45.537756Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:45.538512Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:45.541136Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:45.541138Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:45.541142Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:45.541424Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:45.541425Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:45.541679Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:45.543422Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:45.543424Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.090487Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.093239Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.093241Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.093934Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.096680Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.096682Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.097607Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.100340Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.100344Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.100345Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.100635Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.100637Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.115424Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.118297Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.118299Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.132738Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.135524Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.135526Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.150145Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.153036Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.153038Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.154151Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.157008Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.157010Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.157011Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.157316Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.157318Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.172216Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.175221Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.175223Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.176360Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.179174Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.179177Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.179178Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.179484Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.179486Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.196222Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.199053Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.199055Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.200099Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.202843Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.202845Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.202847Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.203135Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.203136Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.216861Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.219609Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.219611Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.220656Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.223564Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.223566Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.223569Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.223856Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.223857Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.238720Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.241620Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.241622Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.242680Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.245514Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.245516Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.245518Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.245806Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.245807Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.262193Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.265008Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.265010Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.266068Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.268797Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.268799Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:29:46.268803Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:29:46.269085Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.269087Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:29:46.283928Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.286662Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.286664Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.288492Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.291216Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.291218Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:29:46.291220Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:29:46.292026Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:29:46.292028Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:29:46.294171Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.296947Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.296949Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.310913Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.313632Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.313634Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.328748Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.331567Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.331569Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.347074Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.350016Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.350018Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:29:46.938072Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:29:46.942205Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:29:46.942208Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:29:46.942212Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:29:46.967564Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:29:46.967571Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:29:46.991050Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-08T18:29:46.991054Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:29:47.014632Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-08T18:29:47.014636Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:29:47.037838Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-08T18:29:47.037844Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:29:47.060989Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-08T18:29:47.060993Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:29:47.084599Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-08T18:29:47.084603Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:29:47.108132Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-08T18:29:47.108138Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:29:47.131217Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-08T18:29:47.131224Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:29:47.154277Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-08T18:29:47.154281Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:29:47.177313Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-08T18:29:47.177317Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:29:47.679757Z INFO - Updating database statistics: 0.435ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:29:49.334514Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:29:49.350773Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:29:49.367045Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:29:49.383063Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:29:49.522874Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:29:49.538204Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:29:49.553753Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:29:49.569572Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz 2025-11-08T18:29:50.077921Z NOTICE - database: Slow query [ 62.956ms] -- SELECT "type","id","blocked_at","created_at","updated_at","deleted_at","type","iri","username","pem_public_key","pem_private_key","shared_inbox","inbox","outbox","following","followers","name","summary","icon","image","urls","attachments","down_at" FROM "actors" WHERE "iri" = ? AND "deleted_at" IS NULL -- args: ["https://test.test/tlchiqup"] 2025-11-08T18:29:50.078067Z NOTICE - database: [{0, "SEARCH actors USING INDEX idx_actors_iri (iri=?)"}] is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Retrying (5/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0007s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-08T18:33:41.575877Z INFO - Updating database statistics: 0.226ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects when authenticated returns visible objects returns nil for non-visible objects returns nil for draft objects returns nil for reply objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is a reply returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-08T18:34:22.821183Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-08T18:34:22.835048Z WARN - mcp: method not found: unknown/method 2025-11-08T18:34:23.145358Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-08T18:34:24.084812Z INFO - Ktistec is going to take a rest! 2025-11-08T18:34:28.592341Z INFO - Ktistec is going to take a rest! 2025-11-08T18:34:47.111361Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-08T18:34:47.125617Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:34:47.139107Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:34:47.152150Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-08T18:34:47.166547Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-08T18:34:47.906969Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/dbswjhck published=false 2025-11-08T18:34:47.907909Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/tdisayzn published=true 2025-11-08T18:34:47.909352Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/oilzurpb published=true 2025-11-08T18:34:47.910499Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/ldirxqhf published=false 2025-11-08T18:34:47.910933Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ayovpxul 2025-11-08T18:34:47.912038Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/otmhbgil 2025-11-08T18:34:47.913203Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/xcvnbqih 2025-11-08T18:34:47.914270Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/jqtpevik 2025-11-08T18:34:48.011871Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/wdpzgkfx 2025-11-08T18:34:48.027635Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/dlaynfqv 2025-11-08T18:34:48.043768Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/vrzyhcfg 2025-11-08T18:34:48.060916Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.065548Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.065550Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.065554Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.066088Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.066090Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.066863Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.069477Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.069479Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.069480Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.069766Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.069767Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.070031Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.071718Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.071720Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.623939Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.626662Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.626664Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.627378Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.630079Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.630081Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.631023Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.633699Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.633703Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.633704Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.633992Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.633994Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.648688Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.651559Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.651560Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.666950Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.669879Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.669881Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.685982Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.688851Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.688853Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.689961Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.692843Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.692845Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.692846Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.693160Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.693162Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.712260Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.715162Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.715164Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.716374Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.719225Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.719227Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.719229Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.719540Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.719541Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.734016Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.736823Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.736825Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.737974Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.740688Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.740690Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.740691Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.740977Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.740979Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.757591Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.760274Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.760276Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.761336Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.764148Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.764150Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.764155Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.764445Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.764446Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.779840Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.782681Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.782683Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.783808Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.786607Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.786609Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.786611Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.786904Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.786909Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.801916Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.804726Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.804728Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.805786Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.808491Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.808493Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-08T18:34:48.808497Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-08T18:34:48.808785Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.808786Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-08T18:34:48.822930Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.825612Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.825615Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.827459Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.830584Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.830586Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-08T18:34:48.830588Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-08T18:34:48.831423Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-08T18:34:48.831425Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-08T18:34:48.833571Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.836281Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.836283Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.850195Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.852856Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.852858Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.867091Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.869849Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.869851Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:48.885575Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:48.888462Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:48.888464Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-08T18:34:49.503959Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-08T18:34:49.507995Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-08T18:34:49.507997Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-08T18:34:49.508002Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-08T18:34:49.533779Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-08T18:34:49.533783Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-08T18:34:49.558188Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-08T18:34:49.558193Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-08T18:34:49.582753Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-08T18:34:49.582760Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-08T18:34:49.606750Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-08T18:34:49.606754Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-08T18:34:49.630700Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-08T18:34:49.630705Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-08T18:34:49.654718Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-08T18:34:49.654724Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-08T18:34:49.678753Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-08T18:34:49.678759Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-08T18:34:49.702651Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-08T18:34:49.702655Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-08T18:34:49.727004Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-08T18:34:49.727010Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-08T18:34:49.750872Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-08T18:34:49.750877Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-08T18:34:50.257248Z INFO - Updating database statistics: 0.461ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths given an actor only includes the subject and an approved object omits unapproved replies but includes their approved parents doesn't include the actor's unapproved replies #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-08T18:34:51.897513Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-08T18:34:51.913619Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:34:51.929585Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:34:51.946868Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-08T18:34:52.090025Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-08T18:34:52.105669Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-08T18:34:52.121739Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-08T18:34:52.137967Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_27765::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a reply in the notifications returns reply notification for valid request with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: prompts.size does not equal 2 actual: 1 expected: 2 # spec/models/prompt_spec.cr:56 Finished in 1:14 4922 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:47 # Prompt.all loads new prompts >>> ktistec: Entering fakeroot... created directory: '/home/buildozer/aports/community/ktistec/pkg/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/bin' 'server' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/bin/ktistec' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/ktistec' '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/ktistec/uploads' -> 'public/uploads' >>> ktistec-openrc*: Running split function openrc... 'etc/conf.d' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec-openrc/etc/conf.d' 'etc/init.d' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec-openrc/etc/init.d' >>> ktistec-openrc*: Preparing subpackage ktistec-openrc... >>> ktistec-openrc*: Running postcheck for ktistec-openrc >>> ktistec*: Running postcheck for ktistec >>> ktistec*: Preparing package ktistec... >>> ktistec*: Stripping binaries >>> ktistec*: Script found. /bin/sh added as a dependency for ktistec-3.1.3-r0.apk >>> ktistec*: Adding .pre-install >>> ktistec*: Scanning shared objects >>> ktistec-openrc*: Tracing dependencies... >>> ktistec-openrc*: Package size: 926.0 B >>> ktistec-openrc*: Compressing data... >>> ktistec-openrc*: Create checksum... >>> ktistec-openrc*: Create ktistec-openrc-3.1.3-r0.apk >>> ktistec*: Tracing dependencies... tzdata /bin/sh so:libc.musl-x86_64.so.1 so:libcrypto.so.3 so:libgc.so.1 so:libgcc_s.so.1 so:libgmp.so.10 so:libpcre2-8.so.0 so:libsqlite3.so.0 so:libssl.so.3 so:libxml2.so.2 so:libyaml-0.so.2 so:libz.so.1 >>> ktistec*: Package size: 18.1 MB >>> ktistec*: Compressing data... >>> ktistec*: Create checksum... >>> ktistec*: Create ktistec-3.1.3-r0.apk >>> ktistec: Build complete at Sat, 08 Nov 2025 18:35:02 +0000 elapsed time 0h 36m 52s >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Uninstalling dependencies... ( 1/30) Purging .makedepends-ktistec (20251108.175811) ( 2/30) Purging tzdata (2025b-r0) ( 3/30) Purging gc-dev (8.2.8-r1) ( 4/30) Purging libgc++ (8.2.8-r1) ( 5/30) Purging libxml2-dev (2.13.9-r0) ( 6/30) Purging libxml2-utils (2.13.9-r0) ( 7/30) Purging libxml2 (2.13.9-r0) ( 8/30) Purging sqlite-dev (3.51.0-r0) ( 9/30) Purging sqlite (3.51.0-r0) (10/30) Purging sqlite-libs (3.51.0-r0) (11/30) Purging yaml-dev (0.2.5-r2) (12/30) Purging yaml (0.2.5-r2) (13/30) Purging gc (8.2.8-r1) (14/30) Purging xz-dev (5.8.1-r0) (15/30) Purging xz (5.8.1-r0) (16/30) Purging xz-libs (5.8.1-r0) (17/30) Purging pcre2-dev (10.46-r0) (18/30) Purging zlib-dev (1.3.1-r2) (19/30) Purging libpcre2-16 (10.46-r0) (20/30) Purging libpcre2-32 (10.46-r0) (21/30) Purging libedit-dev (20251016.3.1-r0) (22/30) Purging bsd-compat-headers (0.7.2-r6) (23/30) Purging gmp-dev (6.3.0-r4) (24/30) Purging libgmpxx (6.3.0-r4) (25/30) Purging ncurses-dev (6.5_p20251010-r0) (26/30) Purging libncurses++ (6.5_p20251010-r0) (27/30) Purging libpanelw (6.5_p20251010-r0) (28/30) Purging libformw (6.5_p20251010-r0) (29/30) Purging libmenuw (6.5_p20251010-r0) (30/30) Purging openssl-dev (3.5.4-r0) busybox-1.37.0-r24.trigger: Executing script... OK: 440 MiB in 105 packages >>> ktistec: Updating the community/x86_64 repository index... >>> ktistec: Signing the index...