aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/mastodon-http.el8
-rw-r--r--lisp/mastodon-iso.el246
-rw-r--r--lisp/mastodon-profile.el41
-rw-r--r--lisp/mastodon-tl.el24
-rw-r--r--lisp/mastodon-toot.el39
-rw-r--r--test/mastodon-profile-tests.el120
6 files changed, 396 insertions, 82 deletions
diff --git a/lisp/mastodon-http.el b/lisp/mastodon-http.el
index 6e7bfb3..37770ef 100644
--- a/lisp/mastodon-http.el
+++ b/lisp/mastodon-http.el
@@ -88,11 +88,13 @@ Message status and JSON error from RESPONSE if unsuccessful."
(mastodon-http--status))))
(if (string-prefix-p "2" status)
(funcall success)
- (switch-to-buffer response)
- ;; 404 returns http response not JSON:
+ ;; don't switch to buffer, just with-current-buffer the response:
+ ;; (switch-to-buffer response)
+ ;; 404 sometimes returns http response so --process-json fails:
(if (string-prefix-p "404" status)
(message "Error %s: page not found" status)
- (let ((json-response (mastodon-http--process-json)))
+ (let ((json-response (with-current-buffer response
+ (mastodon-http--process-json))))
(message "Error %s: %s" status (alist-get 'error json-response)))))))
(defun mastodon-http--read-file-as-string (filename)
diff --git a/lisp/mastodon-iso.el b/lisp/mastodon-iso.el
new file mode 100644
index 0000000..8baff3c
--- /dev/null
+++ b/lisp/mastodon-iso.el
@@ -0,0 +1,246 @@
+;;; mastodon-iso.el --- ISO language code lists for mastodon.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Marty Hiatt
+;; Author: Marty Hiatt <martianhiatus@riseup.net>
+;; Version: 1.0.0
+;; Package-Requires: ((emacs "27.1") (request "0.3.0"))
+;; Homepage: https://codeberg.org/martianh/mastodon.el
+
+;; This file is not part of GNU Emacs.
+
+;; This file is part of mastodon.el.
+
+;; mastodon.el is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; mastodon.el is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with mastodon.el. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+;; via
+;; https://github.com/VyrCossont/mastodon/blob/0836f4a656d5486784cadfd7d0cd717bb67ede4c/app/helpers/languages_helper.rb
+;; and
+;; https://github.com/Shinmera/language-codes/blob/master/data/iso-639-3.lisp
+
+(defvar mastodon-iso-639-1
+ '(("ab" "Abkhazian")
+ ("aa" "Afar")
+ ("af" "Afrikaans")
+ ("ak" "Akan")
+ ("sq" "Albanian")
+ ("am" "Amharic")
+ ("ar" "Arabic")
+ ("an" "Aragonese")
+ ("hy" "Armenian")
+ ("as" "Assamese")
+ ("av" "Avaric")
+ ("ae" "Avestan")
+ ("ay" "Aymara")
+ ("az" "Azerbaijani")
+ ("bm" "Bambara")
+ ("ba" "Bashkir")
+ ("eu" "Basque")
+ ("be" "Belarusian")
+ ("bn" "Bengali")
+ ("bh" "Bihari languages")
+ ("bi" "Bislama")
+ ("bs" "Bosnian")
+ ("br" "Breton")
+ ("bg" "Bulgarian")
+ ("my" "Burmese")
+ ("km" "Central Khmer")
+ ("ch" "Chamorro")
+ ("ce" "Chechen")
+ ("zh" "Chinese")
+ ("cv" "Chuvash")
+ ("kw" "Cornish")
+ ("co" "Corsican")
+ ("cr" "Cree")
+ ("hr" "Croatian")
+ ("cs" "Czech")
+ ("da" "Danish")
+ ("dz" "Dzongkha")
+ ("en" "English")
+ ("eo" "Esperanto")
+ ("et" "Estonian")
+ ("ee" "Ewe")
+ ("fo" "Faroese")
+ ("fj" "Fijian")
+ ("fi" "Finnish")
+ ("nl" "Dutch" "Flemish")
+ ("fr" "French")
+ ("ff" "Fulah")
+ ("gl" "Galician")
+ ("lg" "Ganda")
+ ("ka" "Georgian")
+ ("de" "German")
+ ("el" "Greek")
+ ("gn" "Guarani")
+ ("gu" "Gujarati")
+ ("ht" "Haitian" "Haitian Creole")
+ ("ha" "Hausa")
+ ("he" "Hebrew")
+ ("hz" "Herero")
+ ("hi" "Hindi")
+ ("ho" "Hiri Motu")
+ ("hu" "Hungarian")
+ ("is" "Icelandic")
+ ("io" "Ido")
+ ("ig" "Igbo")
+ ("id" "Indonesian")
+ ("ia" "Interlingua" "Interlingua (International Auxiliary Language Association)")
+ ("iu" "Inuktitut")
+ ("ik" "Inupiaq")
+ ("ga" "Irish")
+ ("it" "Italian")
+ ("ja" "Japanese")
+ ("jp" "Japanese")
+ ("jv" "Javanese")
+ ("kl" "Kalaallisut" "Greenlandic")
+ ("kn" "Kannada")
+ ("kr" "Kanuri")
+ ("ks" "Kashmiri")
+ ("kk" "Kazakh")
+ ("ki" "Kikuyu" "Gikuyu")
+ ("rw" "Kinyarwanda")
+ ("kv" "Komi")
+ ("kg" "Kongo")
+ ("ko" "Korean")
+ ("ku" "Kurdish")
+ ("kj" "Kuanyama" "Kwanyama")
+ ("ky" "Kirghiz" "Kyrgyz")
+ ("lo" "Lao")
+ ("la" "Latin")
+ ("lv" "Latvian")
+ ("li" "Limburgan" "Limburger" "Limburgish")
+ ("ln" "Lingala")
+ ("lt" "Lithuanian")
+ ("lu" "Luba-Katanga")
+ ("lb" "Luxembourgish" "Letzeburgesch")
+ ("mk" "Macedonian")
+ ("mg" "Malagasy")
+ ("ms" "Malay")
+ ("ml" "Malayalam")
+ ("dv" "Divehi" "Dhivehi" "Maldivian")
+ ("mt" "Maltese")
+ ("gv" "Manx")
+ ("mi" "Maori")
+ ("mr" "Marathi")
+ ("mh" "Marshallese")
+ ("mn" "Mongolian")
+ ("na" "Nauru")
+ ("nv" "Navajo" "Navaho")
+ ("ng" "Ndonga")
+ ("ne" "Nepali")
+ ("nd" "Ndebele, North" "North Ndebele")
+ ("se" "Northern Sami")
+ ("no" "Norwegian")
+ ("nb" "Bokmål, Norwegian" "Norwegian Bokmål")
+ ("ny" "Chichewa" "Chewa" "Nyanja")
+ ("nn" "Norwegian Nynorsk" "Nynorsk, Norwegian")
+ ("ie" "Interlingue" "Occidental")
+ ("oc" "Occitan")
+ ("oj" "Ojibwa")
+ ("cu" "Church Slavic" "Old Slavonic" "Church Slavonic" "Old Bulgarian" "Old Church Slavonic")
+ ("or" "Oriya")
+ ("om" "Oromo")
+ ("os" "Ossetian" "Ossetic")
+ ("pi" "Pali")
+ ("fa" "Persian")
+ ("pl" "Polish")
+ ("pt" "Portuguese")
+ ("pa" "Panjabi" "Punjabi")
+ ("ps" "Pushto" "Pashto")
+ ("qu" "Quechua")
+ ("ro" "Romanian" "Moldavian" "Moldovan")
+ ("rm" "Romansh")
+ ("rn" "Rundi")
+ ("ru" "Russian")
+ ("sm" "Samoan")
+ ("sg" "Sango")
+ ("sa" "Sanskrit")
+ ("sc" "Sardinian")
+ ("gd" "Gaelic" "Scottish Gaelic")
+ ("sr" "Serbian")
+ ("sn" "Shona")
+ ("ii" "Sichuan Yi" "Nuosu")
+ ("sd" "Sindhi")
+ ("si" "Sinhala" "Sinhalese")
+ ("sk" "Slovak")
+ ("sl" "Slovenian")
+ ("so" "Somali")
+ ("st" "Sotho, Southern")
+ ("nr" "Ndebele, South" "South Ndebele")
+ ("es" "Spanish" "Castilian")
+ ("su" "Sundanese")
+ ("sw" "Swahili")
+ ("ss" "Swati")
+ ("sv" "Swedish")
+ ("tl" "Tagalog")
+ ("ty" "Tahitian")
+ ("tg" "Tajik")
+ ("ta" "Tamil")
+ ("tt" "Tatar")
+ ("te" "Telugu")
+ ("th" "Thai")
+ ("bo" "Tibetan")
+ ("ti" "Tigrinya")
+ ("to" "Tonga (Tonga Islands)")
+ ("ts" "Tsonga")
+ ("tn" "Tswana")
+ ("tr" "Turkish")
+ ("tk" "Turkmen")
+ ("tw" "Twi")
+ ("uk" "Ukrainian")
+ ("ur" "Urdu")
+ ("ug" "Uighur" "Uyghur")
+ ("uz" "Uzbek")
+ ("ca" "Catalan" "Valencian")
+ ("ve" "Venda")
+ ("vi" "Vietnamese")
+ ("vo" "Volapük")
+ ("wa" "Walloon")
+ ("cy" "Welsh")
+ ("fy" "Western Frisian")
+ ("wo" "Wolof")
+ ("xh" "Xhosa")
+ ("yi" "Yiddish")
+ ("yo" "Yoruba")
+ ("za" "Zhuang" "Chuang")
+ ("zu" "Zulu")))
+
+;; web UI doesn't respect these for now
+(defvar mastodon-iso-639-regional
+ '(("es-AR" "Español (Argentina)")
+ ("es-MX" "Español (México)")
+ ("pt-BR" "Português (Brasil)")
+ ("pt-PT" "Português (Portugal)")
+ ("sr-Latn" "Srpski (latinica)")
+ ("zh-CN" "简体中文")
+ ("zh-HK" "繁體中文(香港)")
+ ("zh-TW" "繁體中文(臺灣)")))
+
+(defvar mastodon-iso-639-3
+ '(("ast" "Asturian" "Asturianu")
+ ("ckb" "Sorani (Kurdish)" "سۆرانی")
+ ("jbo" "Lojban" "la .lojban.")
+ ("kab" "Kabyle" "Taqbaylit")
+ ("kmr" "Kurmanji (Kurdish)" "Kurmancî")
+ ("ldn" "Láadan" "Láadan")
+ ("lfn" "Lingua Franca Nova" "lingua franca nova")
+ ("tok" "Toki Pona" "toki pona")
+ ("zba" "Balaibalan" "باليبلن")
+ ("zgh" "Standard Moroccan Tamazight" "ⵜⴰⵎⴰⵣⵉⵖⵜ")))
+
+(provide 'mastodon-iso)
+;;; mastodon-iso.el ends here
diff --git a/lisp/mastodon-profile.el b/lisp/mastodon-profile.el
index f81441e..3a869ed 100644
--- a/lisp/mastodon-profile.el
+++ b/lisp/mastodon-profile.el
@@ -150,10 +150,10 @@ contains")
;; or handle --property failing
(mastodon-tl--property 'toot-json))
-(defun mastodon-profile--make-author-buffer (account)
+(defun mastodon-profile--make-author-buffer (account &optional no-reblogs)
"Take an ACCOUNT json and insert a user account into a new buffer."
(mastodon-profile--make-profile-buffer-for
- account "statuses" #'mastodon-tl--timeline))
+ account "statuses" #'mastodon-tl--timeline no-reblogs))
;; TODO: we shd just load all views' data then switch coz this is slow af:
(defun mastodon-profile--account-view-cycle ()
@@ -164,9 +164,17 @@ contains")
(mastodon-profile--open-followers))
((string-suffix-p "followers" endpoint)
(mastodon-profile--open-following))
+ ((string-suffix-p "following" endpoint)
+ (mastodon-profile--open-statuses-no-reblogs))
(t
- (mastodon-profile--make-profile-buffer-for
- mastodon-profile--account "statuses" #'mastodon-tl--timeline)))))
+ (mastodon-profile--make-author-buffer mastodon-profile--account)))))
+
+(defun mastodon-profile--open-statuses-no-reblogs ()
+ "Open a profile buffer showing statuses without reblogs."
+ (interactive)
+ (if mastodon-profile--account
+ (mastodon-profile--make-author-buffer mastodon-profile--account :no-reblogs)
+ (error "Not in a mastodon profile")))
(defun mastodon-profile--open-following ()
"Open a profile buffer showing the accounts that current profile follows."
@@ -530,10 +538,14 @@ FIELDS means provide a fields vector fetched by other means."
(mastodon-tl--toot pinned-status))
pinned-statuses))
-(defun mastodon-profile--make-profile-buffer-for (account endpoint-type update-function)
+(defun mastodon-profile--make-profile-buffer-for (account endpoint-type update-function &optional no-reblogs)
"Display profile of ACCOUNT, using ENDPOINT-TYPE and UPDATE-FUNCTION."
(let* ((id (mastodon-profile--account-field account 'id))
- (url (mastodon-http--api (format "accounts/%s/%s" id endpoint-type)))
+ (args (when no-reblogs '(("exclude_reblogs" . "t"))))
+ (base-url (mastodon-http--api (format "accounts/%s/%s" id endpoint-type)))
+ (url (if no-reblogs
+ (concat base-url "?" (mastodon-http--build-query-string args))
+ base-url))
(acct (mastodon-profile--account-field account 'acct))
(buffer (concat "*mastodon-" acct "-" endpoint-type "*"))
(note (mastodon-profile--account-field account 'note))
@@ -555,7 +567,8 @@ FIELDS means provide a fields vector fetched by other means."
(alist-get 'followed_by relationships)))
(followsp (or (equal follows-you 't) (equal followed-by-you 't)))
(fields (mastodon-profile--fields-get account))
- (pinned (mastodon-profile--get-statuses-pinned account)))
+ (pinned (mastodon-profile--get-statuses-pinned account))
+ (joined (mastodon-profile--account-field account 'created_at)))
(with-output-to-temp-buffer buffer
(switch-to-buffer buffer)
(mastodon-mode)
@@ -600,7 +613,11 @@ FIELDS means provide a fields vector fetched by other means."
(mastodon-profile--fields-insert fields)
'success)
"\n")
- ""))
+ "")
+ (propertize
+ (mastodon-profile--format-joined-date-string joined)
+ 'face 'success)
+ "\n\n")
'profile-json account)
;; insert counts
(mastodon-tl--set-face
@@ -635,6 +652,14 @@ FIELDS means provide a fields vector fetched by other means."
(funcall update-function json)))
(goto-char (point-min))))
+(defun mastodon-profile--format-joined-date-string (joined)
+ "Format a Joined timestamp."
+ (let ((joined-ts (ts-parse joined)))
+ (format "Joined %s" (concat (ts-month-name joined-ts)
+ " "
+ (number-to-string
+ (ts-year joined-ts))))))
+
(defun mastodon-profile--get-toot-author ()
"Open profile of author of toot under point.
diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el
index aa58771..d8a5417 100644
--- a/lisp/mastodon-tl.el
+++ b/lisp/mastodon-tl.el
@@ -1493,7 +1493,7 @@ If ID is provided, use that list."
(interactive)
(let* ((list-names (unless id (mastodon-tl--get-lists-names)))
(name-old (if id
- (get-text-property (point) 'list-id)
+ (get-text-property (point) 'list-name)
(completing-read "Edit list: "
list-names)))
(id (or id (mastodon-tl--get-list-id name-old)))
@@ -1594,7 +1594,9 @@ If ID is provided, delete that list."
\n E - edit a list\n n/p - go to next/prev item]\n\n"
'font-lock-comment-face))
(mapc (lambda (x)
- (mastodon-tl--print-list-accounts x))
+ (mastodon-tl--print-list-accounts x)
+ (insert (propertize " ------------\n\n"
+ 'face 'success)))
lists-names)
(goto-char (point-min))))
;; (mastodon-tl--goto-next-item))) ; causes another request!
@@ -1609,8 +1611,17 @@ If ID is provided, delete that list."
'toot-id "0" ; so we nav here
'help-echo "RET: view list timeline, d: delete this list, \
a: add account to this list, r: remove account from this list"
- 'face 'link) ; '((:underline t :inherit success)))
- "\n\n"
+ 'list t
+ 'face 'link
+ 'keymap mastodon-tl--list-name-keymap
+ 'list-name list-name
+ 'list-id id)
+ (propertize
+ "\n\n"
+ 'list t
+ 'keymap mastodon-tl--list-name-keymap
+ 'list-name list-name
+ 'list-id id)
(propertize
(mapconcat #'mastodon-search--propertize-user accounts
" ")
@@ -1637,7 +1648,7 @@ a: add account to this list, r: remove account from this list"
If ID is provided, use that list."
(interactive)
(let* ((list-name (if id
- (get-text-property (point) 'list-id)
+ (get-text-property (point) 'list-name)
(completing-read "Add account to list: "
(mastodon-tl--get-lists-names) nil t)))
(list-id (or id (mastodon-tl--get-list-id list-name)))
@@ -1667,7 +1678,7 @@ If ID is provided, use that list."
If ID is provided, use that list."
(interactive)
(let* ((list-name (if id
- (get-text-property (point) 'list-id)
+ (get-text-property (point) 'list-name)
(completing-read "Remove account from list: "
(mastodon-tl--get-lists-names) nil t)))
(list-id (or id (mastodon-tl--get-list-id list-name)))
@@ -1903,6 +1914,7 @@ INSTANCE is an instance domain name."
(assoc 'rules response)
(assoc 'stats response))))
(mastodon-tl--print-json-keys response)
+ (mastodon-mode)
(goto-char (point-min)))))))))
(defun mastodon-tl--format-key (el pad)
diff --git a/lisp/mastodon-toot.el b/lisp/mastodon-toot.el
index 5a735dc..6162f52 100644
--- a/lisp/mastodon-toot.el
+++ b/lisp/mastodon-toot.el
@@ -47,6 +47,8 @@
(declare-function company-grab-symbol "company")
(defvar company-backends))
+(require 'mastodon-iso)
+
(defvar mastodon-instance-url)
(defvar mastodon-tl--buffer-spec)
(defvar mastodon-tl--enable-proportional-fonts)
@@ -169,6 +171,9 @@ change the setting on the server, see
(defvar-local mastodon-toot-poll nil
"A list of poll options for the toot being composed.")
+(defvar-local mastodon-toot--language nil
+ "The language of the toot being composed, in ISO 639 (two-letter).")
+
(defvar-local mastodon-toot--reply-to-id nil
"Buffer-local variable to hold the id of the toot being replied to.")
@@ -211,6 +216,7 @@ send.")
(define-key map (kbd "C-c C-a") #'mastodon-toot--attach-media)
(define-key map (kbd "C-c !") #'mastodon-toot--clear-all-attachments)
(define-key map (kbd "C-c C-p") #'mastodon-toot--create-poll)
+ (define-key map (kbd "C-c C-l") #'mastodon-toot--set-toot-lang)
map)
"Keymap for `mastodon-toot'.")
@@ -379,9 +385,12 @@ TYPE is a symbol, either 'favourite or 'boost."
(message (format "Nothing to %s here?!?" action)))))
(defun mastodon-toot--copy-toot-url ()
- "Copy URL of toot at point."
+ "Copy URL of toot at point.
+If the toot is a fave/boost notification, copy the URLof the
+base toot."
(interactive)
- (let* ((toot (mastodon-tl--property 'toot-json))
+ (let* ((toot (or (mastodon-tl--property 'base-toot)
+ (mastodon-tl--property 'toot-json)))
(url (if (mastodon-tl--field 'reblog toot)
(alist-get 'url (alist-get 'reblog toot))
(alist-get 'url toot))))
@@ -389,9 +398,12 @@ TYPE is a symbol, either 'favourite or 'boost."
(message "Toot URL copied to the clipboard.")))
(defun mastodon-toot--copy-toot-text ()
- "Copy text of toot at point."
+ "Copy text of toot at point.
+If the toot is a fave/boost notification, copy the text of the
+base toot."
(interactive)
- (let* ((toot (mastodon-tl--property 'toot-json)))
+ (let* ((toot (or (mastodon-tl--property 'base-toot)
+ (mastodon-tl--property 'toot-json))))
(kill-new (mastodon-tl--content toot))
(message "Toot content copied to the clipboard.")))
@@ -661,7 +673,8 @@ instance to edit a toot."
("visibility" . ,mastodon-toot--visibility)
("sensitive" . ,(when mastodon-toot--content-nsfw
(symbol-name t)))
- ("spoiler_text" . ,spoiler)))
+ ("spoiler_text" . ,spoiler)
+ ("language" . ,mastodon-toot--language)))
(args-media (when mastodon-toot--media-attachments
(mastodon-http--build-array-args-alist
"media_ids[]"
@@ -1141,6 +1154,18 @@ LENGTH is the maximum character length allowed for a poll option."
("14 days" . ,(number-to-string (* 60 60 24 14)))
("30 days" . ,(number-to-string (* 60 60 24 30)))))
+(defun mastodon-toot--set-toot-lang ()
+ "Prompt for a language and return its two letter ISO 639 1 code."
+ (interactive)
+ (let* ((langs (mapcar (lambda (x)
+ (cons (cadr x)
+ (car x)))
+ mastodon-iso-639-1))
+ (choice (completing-read "Language for this toot: "
+ langs)))
+ (setq mastodon-toot--language
+ (alist-get choice langs nil nil 'equal))))
+
;; we'll need to revisit this if the binds get
;; more diverse than two-chord bindings
(defun mastodon-toot--get-mode-kbinds ()
@@ -1329,7 +1354,6 @@ This is how mastodon does it."
(replace-match (match-string 2))) ; replace with handle only
(length (buffer-substring (point-min) (point-max)))))
-
(defun mastodon-toot--save-toot-text (&rest _args)
"Save the current toot text in `mastodon-toot-current-toot-text'.
Added to `after-change-functions' in new toot buffers."
@@ -1451,7 +1475,8 @@ a draft into the buffer."
(set (make-local-variable 'company-backends)
(add-to-list 'company-backends 'mastodon-toot-mentions))
(add-to-list 'company-backends 'mastodon-toot-tags))
- (company-mode-on))
+ (unless (bound-and-true-p corfu-mode) ; don't clash w corfu mode
+ (company-mode-on)))
(make-local-variable 'after-change-functions)
(push #'mastodon-toot--update-status-fields after-change-functions)
(mastodon-toot--refresh-attachments-display)
diff --git a/test/mastodon-profile-tests.el b/test/mastodon-profile-tests.el
index 9d1ec72..704f2ce 100644
--- a/test/mastodon-profile-tests.el
+++ b/test/mastodon-profile-tests.el
@@ -227,64 +227,68 @@ help identify when things change unexpectedly.
TODO: Consider separating the data retrieval and the actual
content generation in the function under test."
(with-mock
- ;; Don't start any image loading:
- (mock (mastodon-media--inline-images * *) => nil)
- (if (version< emacs-version "27.1")
- (mock (image-type-available-p 'imagemagick) => t)
- (mock (image-transforms-p) => t))
- (mock (mastodon-http--get-json "https://instance.url/api/v1/accounts/1/statuses")
- =>
- gargon-statuses-json)
- (mock (mastodon-profile--get-statuses-pinned *)
- =>
- [])
- (mock (mastodon-profile--relationships-get "1")
- =>
- '(((id . "1") (following . :json-false) (showing_reblogs . :json-false) (notifying . :json-false) (followed_by . :json-false) (blocking . :json-false) (blocked_by . :json-false) (muting . :json-false) (muting_notifications . :json-false) (requested . :json-false) (domain_blocking . :json-false) (endorsed . :json-false) (note . ""))))
- ;; Let's not do formatting as that makes it hard to not rely on
- ;; window width and reflowing the text.
- (mock (shr-render-region * *) => nil)
- ;; Don't perform the actual update call at the end.
- ;;(mock (mastodon-tl--timeline *))
- (mock (mastodon-profile--fetch-server-account-settings)
- => '(max_toot_chars 1312 privacy "public" display_name "Eugen" discoverable t locked :json-false bot :json-false sensitive :json-false language ""))
+ ;; Don't start any image loading:
+ (mock (mastodon-media--inline-images * *) => nil)
+ (if (version< emacs-version "27.1")
+ (mock (image-type-available-p 'imagemagick) => t)
+ (mock (image-transforms-p) => t))
+ (mock (mastodon-http--get-json "https://instance.url/api/v1/accounts/1/statuses")
+ =>
+ gargon-statuses-json)
+ (mock (mastodon-profile--get-statuses-pinned *)
+ =>
+ [])
+ (mock (mastodon-profile--relationships-get "1")
+ =>
+ '(((id . "1") (following . :json-false) (showing_reblogs . :json-false) (notifying . :json-false) (followed_by . :json-false) (blocking . :json-false) (blocked_by . :json-false) (muting . :json-false) (muting_notifications . :json-false) (requested . :json-false) (domain_blocking . :json-false) (endorsed . :json-false) (note . ""))))
+ ;; Let's not do formatting as that makes it hard to not rely on
+ ;; window width and reflowing the text.
+ (mock (shr-render-region * *) => nil)
+ ;; Don't perform the actual update call at the end.
+ ;;(mock (mastodon-tl--timeline *))
+ (mock (mastodon-profile--fetch-server-account-settings)
+ => '(max_toot_chars 1312 privacy "public" display_name "Eugen" discoverable t locked :json-false bot :json-false sensitive :json-false language ""))
+
+ (mock (mastodon-profile--format-joined-date-string *) => "Joined March 2016")
- (let ((mastodon-tl--show-avatars t)
- (mastodon-tl--display-media-p t)
- (mastodon-instance-url "https://instance.url"))
- (mastodon-profile--make-author-buffer gargron-profile-json)
+ (let ((mastodon-tl--show-avatars t)
+ (mastodon-tl--display-media-p t)
+ (mastodon-instance-url "https://instance.url"))
+ (mastodon-profile--make-author-buffer gargron-profile-json)
- (should
- (equal
- (buffer-substring-no-properties (point-min) (point-max))
- (concat
- "\n"
- "[img] [img] \n"
- "Eugen\n"
- "@Gargron\n"
- " ------------\n"
- "<p>Developer of Mastodon and administrator of mastodon.social. I post service announcements, development updates, and personal stuff.</p>\n"
- "_ Patreon __ :: <a href=\"https://www.patreon.com/mastodon\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"\">patreon.com/mastodon</span><span class=\"invisible\"></span></a>_ Homepage _ :: <a href=\"https://zeonfederated.com\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">zeonfederated.com</span><span class=\"invisible\"></span></a>\n"
- " ------------\n"
- " TOOTS: 70741 | FOLLOWERS: 470905 | FOLLOWING: 451\n"
- " ------------\n"
- "\n"
- " ------------\n"
- " TOOTS \n"
- " ------------\n"
- "\n"
- "<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.</p> \n"
- " Eugen (@Gargron) 2021-11-11 11:11:11\n"
- " ------------\n"
- "\n"
- "\n"
- "<p><span class=\"h-card\"><a href=\"https://social.bau-ha.us/@CCC\" class=\"u-url mention\">@<span>CCC</span></a></span> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p> \n"
- " Eugen (@Gargron) 2021-11-11 00:00:00\n"
- " ------------\n"
- "\n"
- )))
+ (should
+ (equal
+ (buffer-substring-no-properties (point-min) (point-max))
+ (concat
+ "\n"
+ "[img] [img] \n"
+ "Eugen\n"
+ "@Gargron\n"
+ " ------------\n"
+ "<p>Developer of Mastodon and administrator of mastodon.social. I post service announcements, development updates, and personal stuff.</p>\n"
+ "_ Patreon __ :: <a href=\"https://www.patreon.com/mastodon\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"\">patreon.com/mastodon</span><span class=\"invisible\"></span></a>_ Homepage _ :: <a href=\"https://zeonfederated.com\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">zeonfederated.com</span><span class=\"invisible\"></span></a>\n"
+ "Joined March 2016"
+ "\n\n"
+ " ------------\n"
+ " TOOTS: 70741 | FOLLOWERS: 470905 | FOLLOWING: 451\n"
+ " ------------\n"
+ "\n"
+ " ------------\n"
+ " TOOTS \n"
+ " ------------\n"
+ "\n"
+ "<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.</p> \n"
+ " Eugen (@Gargron) 2021-11-11 11:11:11\n"
+ " ------------\n"
+ "\n"
+ "\n"
+ "<p><span class=\"h-card\"><a href=\"https://social.bau-ha.us/@CCC\" class=\"u-url mention\">@<span>CCC</span></a></span> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p> \n"
+ " Eugen (@Gargron) 2021-11-11 00:00:00\n"
+ " ------------\n"
+ "\n"
+ )))
- ;; Until the function gets refactored this creates a non-temp
- ;; buffer with Gargron's statuses which we want to delete (if
- ;; the tests succeed).
- (kill-buffer))))
+ ;; Until the function gets refactored this creates a non-temp
+ ;; buffer with Gargron's statuses which we want to delete (if
+ ;; the tests succeed).
+ (kill-buffer))))