>>> ktistec: Building community/ktistec 2.4.16-r0 (using abuild 3.15.0-r6) started Tue, 14 Oct 2025 05:18:42 +0000 >>> ktistec: Validating /home/buildozer/aports/community/ktistec/APKBUILD... >>> ktistec: Analyzing dependencies... >>> ktistec: Installing for build: build-base tzdata libxml2-dev musl-utils openssl-dev sqlite-dev zlib-dev gc-dev git gmp-dev pcre2-dev yaml yaml-dev ( 1/30) Installing tzdata (2025b-r0) ( 2/30) Installing zlib-dev (1.3.1-r2) ( 3/30) Installing xz-libs (5.8.1-r0) ( 4/30) Installing xz (5.8.1-r0) ( 5/30) Installing xz-dev (5.8.1-r0) ( 6/30) Installing libxml2 (2.13.9-r0) ( 7/30) Installing libxml2-utils (2.13.9-r0) ( 8/30) Installing libxml2-dev (2.13.9-r0) ( 9/30) Installing openssl-dev (3.5.4-r0) (10/30) Installing sqlite (3.50.4-r1) (11/30) Installing sqlite-libs (3.50.4-r1) (12/30) Installing sqlite-dev (3.50.4-r1) (13/30) Installing gc (8.2.8-r1) (14/30) Installing libgc++ (8.2.8-r1) (15/30) Installing gc-dev (8.2.8-r1) (16/30) Installing libgmpxx (6.3.0-r4) (17/30) Installing gmp-dev (6.3.0-r4) (18/30) Installing bsd-compat-headers (0.7.2-r6) (19/30) Installing libformw (6.5_p20250816-r0) (20/30) Installing libmenuw (6.5_p20250816-r0) (21/30) Installing libpanelw (6.5_p20250816-r0) (22/30) Installing libncurses++ (6.5_p20250816-r0) (23/30) Installing ncurses-dev (6.5_p20250816-r0) (24/30) Installing libedit-dev (20250104.3.1-r2) (25/30) Installing libpcre2-16 (10.46-r0) (26/30) Installing libpcre2-32 (10.46-r0) (27/30) Installing pcre2-dev (10.46-r0) (28/30) Installing yaml (0.2.5-r2) (29/30) Installing yaml-dev (0.2.5-r2) (30/30) Installing .makedepends-ktistec (20251014.051843) busybox-1.37.0-r24.trigger: Executing script... usr_merge_nag.sh: * WARNING: The current system is not /usr-merged. You are encouraged to usr_merge_nag.sh: * migrate manually to ensure the best-possible support. See usr_merge_nag.sh: * https://alpinelinux.org/posts/2025-10-01-usr-merge.html for more details OK: 452 MiB in 137 packages >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Cleaning up tmpdir >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/ktistec-2.4.16.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-2.4.16.tar.gz::https://github.com/toddsundsted/ktistec/archive/refs/tags/v2.4.16.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/edge/ktistec-2.4.16.tar.gz.part' ktistec-2.4.16.tar.g 100% |********************************| 6458k 0:00:00 ETA '/var/cache/distfiles/edge/ktistec-2.4.16.tar.gz.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/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/edge/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-x86_6 33% |********** | 13.8M 0:00:01 ETA crystal-1.16.3-x86_6 100% |********************************| 41.5M 0:00:00 ETA '/var/cache/distfiles/edge/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/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/edge/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-aarch 100% |********************************| 38.2M 0:00:00 ETA '/var/cache/distfiles/edge/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/crystal-1.16.3.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/edge/crystal-1.16.3.tar.gz.part' crystal-1.16.3.tar.g 100% |********************************| 3633k 0:00:00 ETA '/var/cache/distfiles/edge/crystal-1.16.3.tar.gz.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/shards-0.19.1-r0-x86_64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) wget: server returned error: HTTP/1.1 404 Not Found >>> ktistec: Fetching shards-0.19.1-r0-x86_64.apk::https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/shards-0.19.1-r0.apk Connecting to dl-cdn.alpinelinux.org (151.101.66.132:443) saving to '/var/cache/distfiles/edge/shards-0.19.1-r0-x86_64.apk.part' shards-0.19.1-r0-x86 80% |************************* | 972k 0:00:00 ETA shards-0.19.1-r0-x86 100% |********************************| 1211k 0:00:00 ETA '/var/cache/distfiles/edge/shards-0.19.1-r0-x86_64.apk.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/shards-0.19.1-r0-aarch64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) wget: server returned error: HTTP/1.1 404 Not Found >>> ktistec: Fetching shards-0.19.1-r0-aarch64.apk::https://dl-cdn.alpinelinux.org/alpine/v3.22/community/aarch64/shards-0.19.1-r0.apk Connecting to dl-cdn.alpinelinux.org (151.101.66.132:443) saving to '/var/cache/distfiles/edge/shards-0.19.1-r0-aarch64.apk.part' shards-0.19.1-r0-aar 100% |********************************| 1128k 0:00:00 ETA '/var/cache/distfiles/edge/shards-0.19.1-r0-aarch64.apk.part' saved >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/ktistec-2.4.16.tar.gz >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/crystal-1.16.3.tar.gz >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/shards-0.19.1-r0-x86_64.apk >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/edge/shards-0.19.1-r0-aarch64.apk >>> ktistec: Checking sha512sums... ktistec-2.4.16.tar.gz: OK ktistec.initd: OK ktistec.confd: OK crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz: OK crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz: OK crystal-1.16.3.tar.gz: OK shards-0.19.1-r0-x86_64.apk: OK shards-0.19.1-r0-aarch64.apk: OK >>> ktistec: Unpacking /var/cache/distfiles/edge/ktistec-2.4.16.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/edge/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/edge/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/edge/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.50.4 add-foreign-key-indexes: applied in 0.0017s add-actors-username-index: applied in 0.0006s add-sensitive-to-objects: applied in 0.0011s add-updated-to-objects: applied in 0.0008s TaskWorker .stop signals the worker to stop given a scheduled task 2025-10-14T05:27:48.780503Z INFO - Updating database statistics: 0.788ms 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 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 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 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 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 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 400 if the path contains invalid characters returns 403 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 400 if the path contains invalid characters returns 403 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 FiltersController 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 403 if term does not belong to the actor returns 403 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 RelationshipsController 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 (cc) the actor's followers collection addresses (cc) 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 (cc) the actor's followers collection addresses (cc) 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 (to) all mentioned actors addresses (to) all mentioned actors addresses (to) the specified actor and all mentioned actors addresses (to) the specified actor and 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 (cc) the actor's followers collection addresses (cc) the actor's followers collection 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 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 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 a draft 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 a draft 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 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 a draft 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 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 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 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 /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 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 daily granularity returns the summated data at weekly granularity returns the summated data at monthly granularity returns the summated data at yearly granularity returns the averaged data at daily granularity returns the averaged data at weekly granularity returns the averaged data at monthly 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 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 RelationshipsController 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 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 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 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 /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 403 if different account returns 403 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 403 if different account returns 403 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 403 if different account returns 403 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 403 if different account returns 403 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 RelationshipsController GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist returns 401 if relationship type is not supported returns 401 if relationship type is not supported 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::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 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-10-14T05:28:24.402367Z 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 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 and a translation renders the translation of the summary 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 .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 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 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 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 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 .schedule_unless_exists 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::Singleton .instance returns the singleton instance .schedule_unless_exists creates a new instance when an instance exists does not create a new instance 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 given only two errors within the last ten days does not mark the recipient as down when the recipient is down does not send the activity to the recipient 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 .schedule_unless_exists 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 sets the last_id Task::CollectGarbage .schedule_unless_exists 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 .schedule_unless_exists 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::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-10-14T05:28:26.190209Z INFO - Ktistec is going to take a rest! 2025-10-14T05:28:30.608222Z INFO - Ktistec is going to take a rest! 2025-10-14T05:28:49.223111Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/cneajhyw published=false 2025-10-14T05:28:49.224059Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/hljcdvzf published=true 2025-10-14T05:28:49.225528Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/prnovzbq published=true 2025-10-14T05:28:49.226720Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/sahovfbp published=false 2025-10-14T05:28:49.227202Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/tcrnjmgh 2025-10-14T05:28:49.228331Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/vuwmxypa 2025-10-14T05:28:49.229467Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/mjbiedyv 2025-10-14T05:28:49.230571Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/gpyxbscl 2025-10-14T05:28:49.331151Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:49.335727Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:49.335729Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:49.335732Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:49.336221Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:49.336223Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:49.337010Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:49.339678Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:49.339680Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:49.339681Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:49.339966Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:49.339968Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:49.340179Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:49.341856Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:49.341858Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.291726Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.294440Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.294442Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.295176Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.297592Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.297594Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.298554Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.300894Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.300896Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.300900Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.301213Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.301215Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.315074Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.317827Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.317829Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.334845Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.337301Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.337303Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.351468Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.353904Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.353908Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.355058Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.357481Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.357483Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.357484Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.357806Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.357807Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.372543Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.375045Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.375047Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.376220Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.378644Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.378645Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.378649Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.378972Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.378973Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.394094Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.396562Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.396563Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.397654Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.399988Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.399990Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.399991Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.400287Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.400288Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.416458Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.418780Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.418782Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.419869Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.422228Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.422230Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.422232Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.422530Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.422531Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.436761Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.439115Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.439118Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.440228Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.443051Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.443053Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.443054Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.443351Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.443352Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.457284Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.459638Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.459640Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.460735Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.462979Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.462980Z INFO - task.collect_garbage: Found 1 objects to delete 2025-10-14T05:28:50.462982Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-10-14T05:28:50.463276Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.463277Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-10-14T05:28:50.477472Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.479767Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.479769Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.481540Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.483809Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.483811Z INFO - task.collect_garbage: Found 3 objects to delete 2025-10-14T05:28:50.483812Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-10-14T05:28:50.484667Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-10-14T05:28:50.484668Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-10-14T05:28:50.486847Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.489100Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.489102Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.503438Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.505668Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.505670Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.520889Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.523226Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.523228Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.538643Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.541102Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.541104Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-10-14T05:28:50.918924Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-10-14T05:28:50.923861Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-10-14T05:28:50.923863Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-10-14T05:28:50.923869Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-10-14T05:28:50.949351Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-10-14T05:28:50.949356Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-10-14T05:28:50.973034Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-10-14T05:28:50.973039Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-10-14T05:28:50.996592Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-10-14T05:28:50.996596Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-10-14T05:28:51.020098Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-10-14T05:28:51.020102Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-10-14T05:28:51.043589Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-10-14T05:28:51.043594Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-10-14T05:28:51.067489Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-10-14T05:28:51.067493Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-10-14T05:28:51.090909Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-10-14T05:28:51.090913Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-10-14T05:28:51.114394Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-10-14T05:28:51.114399Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-10-14T05:28:51.137713Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-10-14T05:28:51.137717Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-10-14T05:28:51.160916Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-10-14T05:28:51.160919Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-10-14T05:28:51.668975Z INFO - Updating database statistics: 1.034ms notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up documents the error if fetch fails Task::Performance .schedule_unless_exists 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 #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 (to) replaces mentions 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 .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 .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 doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes #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 #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 #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given an array of attachments renders the array of attachments, with html links #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 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 #announces 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 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 announcements by default includes announcements filters out announcements 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::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .schedule_unless_exists 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 #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_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_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-10-14T05:28:53.050939Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-10-14T05:28:53.066063Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-10-14T05:28:53.081158Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::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-10-14T05:28:53.095858Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-10-14T05:28:53.235127Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-10-14T05:28:53.249692Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-10-14T05:28:53.264189Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::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-10-14T05:28:53.279775Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_24780::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 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 Finished in 1:06 4290 examples, 0 failures >>> 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-2.4.16-r0.apk >>> ktistec*: Adding .pre-install >>> ktistec-openrc*: Scanning shared objects >>> 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-2.4.16-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:libz.so.1 >>> ktistec*: Package size: 16.4 MB >>> ktistec*: Compressing data... >>> ktistec*: Create checksum... >>> ktistec*: Create ktistec-2.4.16-r0.apk >>> ktistec: Build complete at Tue, 14 Oct 2025 05:28:56 +0000 elapsed time 0h 10m 14s >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Uninstalling dependencies... ( 1/30) Purging .makedepends-ktistec (20251014.051843) ( 2/30) Purging tzdata (2025b-r0) ( 3/30) Purging libxml2-dev (2.13.9-r0) ( 4/30) Purging libxml2-utils (2.13.9-r0) ( 5/30) Purging libxml2 (2.13.9-r0) ( 6/30) Purging openssl-dev (3.5.4-r0) ( 7/30) Purging sqlite-dev (3.50.4-r1) ( 8/30) Purging sqlite (3.50.4-r1) ( 9/30) Purging sqlite-libs (3.50.4-r1) (10/30) Purging gc-dev (8.2.8-r1) (11/30) Purging libgc++ (8.2.8-r1) (12/30) Purging gmp-dev (6.3.0-r4) (13/30) Purging libgmpxx (6.3.0-r4) (14/30) Purging pcre2-dev (10.46-r0) (15/30) Purging libedit-dev (20250104.3.1-r2) (16/30) Purging bsd-compat-headers (0.7.2-r6) (17/30) Purging ncurses-dev (6.5_p20250816-r0) (18/30) Purging libncurses++ (6.5_p20250816-r0) (19/30) Purging libpanelw (6.5_p20250816-r0) (20/30) Purging zlib-dev (1.3.1-r2) (21/30) Purging libpcre2-16 (10.46-r0) (22/30) Purging libpcre2-32 (10.46-r0) (23/30) Purging yaml-dev (0.2.5-r2) (24/30) Purging yaml (0.2.5-r2) (25/30) Purging gc (8.2.8-r1) (26/30) Purging libformw (6.5_p20250816-r0) (27/30) Purging libmenuw (6.5_p20250816-r0) (28/30) Purging xz-dev (5.8.1-r0) (29/30) Purging xz (5.8.1-r0) (30/30) Purging xz-libs (5.8.1-r0) busybox-1.37.0-r24.trigger: Executing script... usr_merge_nag.sh: * WARNING: The current system is not /usr-merged. You are encouraged to usr_merge_nag.sh: * migrate manually to ensure the best-possible support. See usr_merge_nag.sh: * https://alpinelinux.org/posts/2025-10-01-usr-merge.html for more details OK: 441 MiB in 107 packages >>> ktistec: Updating the community/x86_64 repository index... >>> ktistec: Signing the index...