diff --git a/.devcontainer/compose.yaml b/.devcontainer/compose.yaml index 1e2e1ba7de..f87082013c 100644 --- a/.devcontainer/compose.yaml +++ b/.devcontainer/compose.yaml @@ -69,7 +69,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.7 + image: libretranslate/libretranslate:v1.6.0 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local diff --git a/Gemfile b/Gemfile index 3fcde202ad..af05ec8402 100644 --- a/Gemfile +++ b/Gemfile @@ -149,7 +149,7 @@ group :test do gem 'rails-controller-testing', '~> 1.0' # Validate schemas in specs - gem 'json-schema', '~> 4.0' + gem 'json-schema', '~> 5.0' # Test harness fo rack components gem 'rack-test', '~> 2.1' @@ -210,7 +210,7 @@ group :development, :test do gem 'test-prof' # RSpec runner for rails - gem 'rspec-rails', '~> 6.0' + gem 'rspec-rails', '~> 7.0' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 11e8aee83b..6d13efdb66 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -347,7 +347,7 @@ GEM rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) idn-ruby (0.1.5) - inline_svg (1.9.0) + inline_svg (1.10.0) activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.7.2) @@ -373,8 +373,8 @@ GEM json-ld-preloaded (3.3.0) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (4.3.1) - addressable (>= 2.8) + json-schema (5.0.0) + addressable (~> 2.8) jsonapi-renderer (0.2.2) jwt (2.7.1) kaminari (1.2.2) @@ -724,10 +724,10 @@ GEM rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.4) - actionpack (>= 6.1) - activesupport (>= 6.1) - railties (>= 6.1) + rspec-rails (7.0.0) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) rspec-core (~> 3.13) rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) @@ -906,7 +906,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.17) + zeitwerk (2.6.18) PLATFORMS ruby @@ -965,7 +965,7 @@ DEPENDENCIES irb (~> 1.8) json-ld json-ld-preloaded (~> 3.2) - json-schema (~> 4.0) + json-schema (~> 5.0) kaminari (~> 1.2) kt-paperclip (~> 7.2) letter_opener (~> 1.8) @@ -1024,7 +1024,7 @@ DEPENDENCIES redis-namespace (~> 1.10) rqrcode (~> 2.2) rspec-github (~> 2.4) - rspec-rails (~> 6.0) + rspec-rails (~> 7.0) rspec-sidekiq (~> 5.0) rubocop rubocop-capybara diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 932a3420db..ba096427cf 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -200,14 +200,6 @@ module JsonLdHelper nil end - def merge_context(context, new_context) - if context.is_a?(Array) - context << new_context - else - [context, new_context] - end - end - def response_successful?(response) (200...300).cover?(response.code) end diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 0a985a0310..bb409b63c1 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -11,6 +11,7 @@ "about.not_available": "Dizze ynformaasje is troch dizze server net iepenbier makke.", "about.powered_by": "Desintralisearre sosjale media, mooglik makke troch {mastodon}", "about.rules": "Serverrigels", + "account.account_note_header": "Persoanlike opmerking", "account.add_or_remove_from_list": "Tafoegje oan of fuortsmite út listen", "account.badges.bot": "Automatisearre", "account.badges.group": "Groep", @@ -96,6 +97,8 @@ "block_modal.title": "Brûker blokkearje?", "block_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.", "boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan", + "boost_modal.reblog": "Berjocht booste?", + "boost_modal.undo_reblog": "Berjocht net langer booste?", "bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje", "bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.", "bundle_column_error.error.title": "Oh nee!", @@ -169,21 +172,30 @@ "confirmations.block.confirm": "Blokkearje", "confirmations.delete.confirm": "Fuortsmite", "confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?", + "confirmations.delete.title": "Berjocht fuortsmite?", "confirmations.delete_list.confirm": "Fuortsmite", "confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?", + "confirmations.delete_list.title": "List fuortsmite?", "confirmations.discard_edit_media.confirm": "Fuortsmite", "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?", "confirmations.edit.confirm": "Bewurkje", "confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", + "confirmations.edit.title": "Berjocht oerskriuwe?", "confirmations.logout.confirm": "Ofmelde", "confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?", + "confirmations.logout.title": "Ofmelde?", "confirmations.mute.confirm": "Negearje", "confirmations.redraft.confirm": "Fuortsmite en opnij opstelle", "confirmations.redraft.message": "Binne jo wis dat jo dit berjocht fuortsmite en opnij opstelle wolle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht reitsje jo kwyt.", + "confirmations.redraft.title": "Berjocht fuortsmite en opnij opstelle?", "confirmations.reply.confirm": "Reagearje", "confirmations.reply.message": "Troch no te reagearjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", + "confirmations.reply.title": "Berjocht oerskriuwe?", "confirmations.unfollow.confirm": "Net mear folgje", "confirmations.unfollow.message": "Binne jo wis dat jo {name} net mear folgje wolle?", + "confirmations.unfollow.title": "Brûker net mear folgje?", + "content_warning.hide": "Berjocht ferstopje", + "content_warning.show": "Dochs toane", "conversation.delete": "Petear fuortsmite", "conversation.mark_as_read": "As lêzen markearje", "conversation.open": "Petear toane", @@ -220,7 +232,9 @@ "domain_pill.username": "Brûkersnamme", "domain_pill.whats_in_a_handle": "Wat is in fediverse-adres?", "domain_pill.who_they_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t ien hjit en op hokker server dy sit, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.", + "domain_pill.who_you_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t jo hjitte en op hokker server jo sitte, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.", "domain_pill.your_handle": "Jo fediverse-adres:", + "domain_pill.your_server": "Jo digitale thús, wer't al jo berjochten stean. Is dizze server dochs net nei jo winsk? Dan kinne jo op elk momint nei in oare server ferhúzje en ek jo folgers oerbringe.", "domain_pill.your_username": "Jo unike identifikaasje-adres op dizze server. It is mooglik dat der brûkers mei deselde brûkersnamme op ferskate servers te finen binne.", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Sa komt it der út te sjen:", @@ -258,6 +272,7 @@ "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.lists": "Jo hawwe noch gjin inkelde list. Wannear’t jo der ien oanmakke hawwe, falt dat hjir te sjen.", "empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.", + "empty_column.notification_requests": "Hielendal leech! Der is hjir neat. Wannear’t jo nije meldingen ûntfange, ferskine dizze hjir neffens jo ynstellingen.", "empty_column.notifications": "Jo hawwe noch gjin meldingen. Ynteraksjes mei oare minsken sjogge jo hjir.", "empty_column.public": "Der is hjir neat! Skriuw eat publyklik, of folgje sels brûkers fan oare servers om it hjir te foljen", "error.unexpected_crash.explanation": "Troch in bug in ús koade of in probleem mei de komptabiliteit fan jo browser, koe dizze side net toand wurde.", @@ -288,6 +303,8 @@ "filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje", "filter_modal.select_filter.title": "Dit berjocht filterje", "filter_modal.title.status": "In berjocht filterje", + "filter_warning.matches_filter": "Komt oerien mei filter ‘{title}’", + "filtered_notifications_banner.pending_requests": "Fan {count, plural, =0 {net ien} one {ien persoan} other {# persoanen}} dy’t jo mooglik kinne", "filtered_notifications_banner.title": "Filtere meldingen", "firehose.all": "Alles", "firehose.local": "Dizze server", @@ -336,6 +353,14 @@ "hashtag.follow": "Hashtag folgje", "hashtag.unfollow": "Hashtag ûntfolgje", "hashtags.and_other": "…en {count, plural, one {}other {# mear}}", + "hints.profiles.followers_may_be_missing": "Folgers foar dit profyl kinne ûntbrekke.", + "hints.profiles.follows_may_be_missing": "De folgers foar dit profyl kinne ûntbrekke.", + "hints.profiles.posts_may_be_missing": "Der ûntbrekke mooglik berjochten fan dit profyl.", + "hints.profiles.see_more_followers": "Besjoch mear folgers op {domain}", + "hints.profiles.see_more_follows": "Besjoch mear folge accounts op {domain}", + "hints.profiles.see_more_posts": "Besjoch mear berjochten op {domain}", + "hints.threads.replies_may_be_missing": "Antwurden fan oare servers kinne ûntbrekke.", + "hints.threads.see_more": "Besjoch mear reaksjes op {domain}", "home.column_settings.show_reblogs": "Boosts toane", "home.column_settings.show_replies": "Reaksjes toane", "home.hide_announcements": "Meidielingen ferstopje", @@ -343,6 +368,17 @@ "home.pending_critical_update.link": "Fernijingen besjen", "home.pending_critical_update.title": "Kritike befeiligingsfernijing beskikber!", "home.show_announcements": "Meidielingen toane", + "ignore_notifications_modal.disclaimer": "Mastodon kin brûkers net ynformearje dat jo harren meldingen negearre hawwe. Meldingen negearje sil net foarkomme dat de berjochten sels ferstjoerd wurde.", + "ignore_notifications_modal.filter_instead": "Yn stee derfan filterje", + "ignore_notifications_modal.filter_to_act_users": "Jo binne noch hieltyd yn steat om folchfersiken goed- of ôf te karren en om brûkers te rapportearjen", + "ignore_notifications_modal.filter_to_avoid_confusion": "Filterjen foarkomt potinsjele betizing", + "ignore_notifications_modal.filter_to_review_separately": "Jo kinne filtere meldingen ôfsûnderlik beoardiele", + "ignore_notifications_modal.ignore": "Meldingen negearje", + "ignore_notifications_modal.limited_accounts_title": "Meldingen fan beheinde accounts negearje?", + "ignore_notifications_modal.new_accounts_title": "Meldingen fan nije accounts negearje?", + "ignore_notifications_modal.not_followers_title": "Meldingen negearje fan minsken dy’t jo net folgje?", + "ignore_notifications_modal.not_following_title": "Meldingen negearje fan minsken dy’t josels net folgje?", + "ignore_notifications_modal.private_mentions_title": "Meldingen negearje fan net frege priveeberjochten?", "interaction_modal.description.favourite": "Jo kinne mei in Mastodon-account dit berjocht as favoryt markearje, om dy brûker witte te litten dat jo it berjocht wurdearje en om it te bewarjen.", "interaction_modal.description.follow": "Jo kinne mei in Mastodon-account {name} folgje, om sa harren berjochten op jo starttiidline te ûntfangen.", "interaction_modal.description.reblog": "Jo kinne mei in Mastodon-account dit berjocht booste, om it sa mei jo folgers te dielen.", @@ -433,6 +469,7 @@ "mute_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.", "mute_modal.you_wont_see_posts": "De persoan kin jo berjochten noch hieltyd sjen, mar jo sjogge harren berjochten net mear.", "navigation_bar.about": "Oer", + "navigation_bar.administration": "Behear", "navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje", "navigation_bar.blocks": "Blokkearre brûkers", "navigation_bar.bookmarks": "Blêdwizers", @@ -449,6 +486,7 @@ "navigation_bar.follows_and_followers": "Folgers en folgjenden", "navigation_bar.lists": "Listen", "navigation_bar.logout": "Ofmelde", + "navigation_bar.moderation": "Moderaasje", "navigation_bar.mutes": "Negearre brûkers", "navigation_bar.opened_in_classic_interface": "Berjochten, accounts en oare spesifike siden, wurde standert iepene yn de klassike webinterface.", "navigation_bar.personal": "Persoanlik", @@ -464,9 +502,18 @@ "notification.admin.report_statuses": "{name} rapportearre {target} foar {category}", "notification.admin.report_statuses_other": "{name} hat {target} rapportearre", "notification.admin.sign_up": "{name} hat harren registrearre", + "notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe harren registrearre", "notification.favourite": "{name} hat jo berjocht as favoryt markearre", + "notification.favourite.name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo berjocht as favoryt markearre", "notification.follow": "{name} folget dy", + "notification.follow.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo folge", "notification.follow_request": "{name} hat dy in folchfersyk stjoerd", + "notification.follow_request.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe frege om jo te folgjen", + "notification.label.mention": "Fermelding", + "notification.label.private_mention": "Priveeberjocht", + "notification.label.private_reply": "Priveereaksje", + "notification.label.reply": "Beäntwurdzje", + "notification.mention": "Fermelding", "notification.moderation-warning.learn_more": "Mear ynfo", "notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen", "notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.", @@ -479,23 +526,44 @@ "notification.own_poll": "Jo poll is beëinige", "notification.poll": "In enkête dêr’t jo oan meidien hawwe is beëinige", "notification.reblog": "{name} hat jo berjocht boost", + "notification.reblog.name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe jo berjocht boost", "notification.relationships_severance_event": "Ferlerne ferbiningen mei {name}", "notification.relationships_severance_event.account_suspension": "In behearder fan {from} hat {target} útsteld, wat betsjut dat jo gjin updates mear fan harren ûntfange kinne of mei harren kommunisearje kinne.", "notification.relationships_severance_event.domain_block": "In behearder fan {from} hat {target} blokkearre, ynklusyf {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje.", "notification.relationships_severance_event.learn_more": "Mear ynfo", + "notification.relationships_severance_event.user_domain_block": "Jo hawwe {target} blokkearre, wêrmei’t jo {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje ferlern binne.", "notification.status": "{name} hat in berjocht pleatst", "notification.update": "{name} hat in berjocht bewurke", "notification_requests.accept": "Akseptearje", + "notification_requests.accept_multiple": "{count, plural, one {# fersyk akseptearje…} other {# fersiken akseptearje…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Fersyk akseptearje} other {Fersiken akseptearje}}", + "notification_requests.confirm_accept_multiple.message": "Jo steane op it punt om {count, plural, one {ien meldingsfersyk} other {# meldingsfersiken}} te akseptearjen. Binne jo wis dat jo trochgean wolle?", + "notification_requests.confirm_accept_multiple.title": "Meldingsfersiken akseptearje?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Fersyk ôfwize} other {Fersiken ôfwize}}", + "notification_requests.confirm_dismiss_multiple.message": "Jo steane op it punt om {count, plural, one {ien meldingsfersyk} other {# meldingsfersiken}} ôf te wizen. Jo sille net yn steat wêze om {count, plural, one {hier} other {hier}} wer maklik tagong ta te krijen. Wolle jo trochgean?", + "notification_requests.confirm_dismiss_multiple.title": "Meldingsfersiken ôfwize?", "notification_requests.dismiss": "Ofwize", + "notification_requests.dismiss_multiple": "{count, plural, one {# fersyk ôfwize…} other {# fersiken ôfwize…}}", + "notification_requests.edit_selection": "Bewurkje", + "notification_requests.exit_selection": "Klear", + "notification_requests.explainer_for_limited_account": "Meldingen fan dizze account binne filtere, omdat dizze account troch in moderator beheind is.", + "notification_requests.explainer_for_limited_remote_account": "Meldingen fan dizze account binne filtere, omdat dizze account of harren server troch in moderator beheind is.", + "notification_requests.maximize": "Maksimalisearje", + "notification_requests.minimize_banner": "Banner mei filtere meldingen minimalisearje", "notification_requests.notifications_from": "Meldingen fan {name}", "notification_requests.title": "Filtere meldingen", + "notification_requests.view": "Meldingen besjen", "notifications.clear": "Meldingen wiskje", "notifications.clear_confirmation": "Binne jo wis dat jo al jo meldingen permanint fuortsmite wolle?", + "notifications.clear_title": "Meldingen fuortsmite?", "notifications.column_settings.admin.report": "Nije rapportaazjes:", "notifications.column_settings.admin.sign_up": "Nije registraasjes:", "notifications.column_settings.alert": "Desktopmeldingen", + "notifications.column_settings.beta.category": "Eksperimintele funksjes", + "notifications.column_settings.beta.grouping": "Notifikaasjes groepearje", "notifications.column_settings.favourite": "Favoriten:", "notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane", + "notifications.column_settings.filter_bar.category": "Flugge filterbalke", "notifications.column_settings.follow": "Nije folgers:", "notifications.column_settings.follow_request": "Nij folchfersyk:", "notifications.column_settings.mention": "Fermeldingen:", @@ -521,6 +589,23 @@ "notifications.permission_denied": "Desktopmeldingen binne net beskikber, omdat in eardere browsertastimming wegere waard", "notifications.permission_denied_alert": "Desktopmeldingen kinne net ynskeakele wurde, omdat in eardere browsertastimming wegere waard", "notifications.permission_required": "Desktopmeldingen binne net beskikber, omdat de nedige tastimming net ferliend is.", + "notifications.policy.accept": "Akseptearje", + "notifications.policy.accept_hint": "Yn meldingen toane", + "notifications.policy.drop": "Negearje", + "notifications.policy.drop_hint": "Permanint fuortsmite", + "notifications.policy.filter": "Filter", + "notifications.policy.filter_hint": "Nei filtere ynboks foar meldingen ferstjoere", + "notifications.policy.filter_limited_accounts_hint": "Beheind troch servermoderatoren", + "notifications.policy.filter_limited_accounts_title": "Moderearre accounts", + "notifications.policy.filter_new_accounts.hint": "Yn de ôfrûne {days, plural, one {dei} other {# dagen}} registrearre", + "notifications.policy.filter_new_accounts_title": "Nije accounts", + "notifications.policy.filter_not_followers_hint": "Ynklusyf minsken dy’t jo koarter as {days, plural, one {dei} other {# dagen}} folgje", + "notifications.policy.filter_not_followers_title": "Minsken dy’t jo net folgje", + "notifications.policy.filter_not_following_hint": "Oant jo se hânmjittich goedkarre", + "notifications.policy.filter_not_following_title": "Minsken dy’t josels net folgje", + "notifications.policy.filter_private_mentions_hint": "Unsichtber útsein it in antwurd is op in priveeberjocht fan jo of wannear’t jo de ôfstjoerder folgje", + "notifications.policy.filter_private_mentions_title": "Net frege priveeberjochten", + "notifications.policy.title": "Meldingen beheare fan…", "notifications_permission_banner.enable": "Desktopmeldingen ynskeakelje", "notifications_permission_banner.how_to_control": "Om meldingen te ûntfangen wannear’t Mastodon net iepen stiet. Jo kinne krekt bepale hokker soarte fan ynteraksjes wol of gjin desktopmeldingen jouwe fia de boppesteande {icon} knop.", "notifications_permission_banner.title": "Mis neat", @@ -647,6 +732,7 @@ "report.unfollow_explanation": "Jo folgje dizze account. Om harren berjochten net mear op jo starttiidline te sjen, kinne jo dyjinge ûntfolgje.", "report_notification.attached_statuses": "{count, plural, one {{count} berjocht} other {{count} berjochten}} tafoege", "report_notification.categories.legal": "Juridysk", + "report_notification.categories.legal_sentence": "yllegale ynhâld", "report_notification.categories.other": "Oars", "report_notification.categories.other_sentence": "oars", "report_notification.categories.spam": "Spam", @@ -680,8 +766,11 @@ "server_banner.about_active_users": "Oantal brûkers yn de ôfrûne 30 dagen (MAU)", "server_banner.active_users": "warbere brûkers", "server_banner.administered_by": "Beheard troch:", + "server_banner.is_one_of_many": "{domain} is ien fan de protte ôfhinklike Mastodon-servers dy’t jo brûke kinne om diel te nimmen oan de fediverse.", "server_banner.server_stats": "Serverstatistiken:", "sign_in_banner.create_account": "Account registrearje", + "sign_in_banner.follow_anyone": "Folgje elkenien yn de fediverse en sjoch it allegearre yn gronologyske folchoarder. Gjin algoritmen, advertinsjes of clickbaits.", + "sign_in_banner.mastodon_is": "Mastodon is de beste manier om wat der bart by te hâlden.", "sign_in_banner.sign_in": "Oanmelde", "sign_in_banner.sso_redirect": "Oanmelde of Registrearje", "status.admin_account": "Moderaasje-omjouwing fan @{name} iepenje", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 9bf89ce716..f575c005d8 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -98,6 +98,7 @@ "block_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.", "boost_modal.combo": "Tu pote premer {combo} pro saltar isto le proxime vice", "boost_modal.reblog": "Impulsar le message?", + "boost_modal.undo_reblog": "Cessar de impulsar le message?", "bundle_column_error.copy_stacktrace": "Copiar reporto de error", "bundle_column_error.error.body": "Le pagina requestate non pote esser visualisate. Pote esser a causa de un defecto in nostre codice o de un problema de compatibilitate del navigator.", "bundle_column_error.error.title": "Oh, no!", diff --git a/app/javascript/mastodon/reducers/notification_groups.ts b/app/javascript/mastodon/reducers/notification_groups.ts index b3535d7b67..f3c83ccd8d 100644 --- a/app/javascript/mastodon/reducers/notification_groups.ts +++ b/app/javascript/mastodon/reducers/notification_groups.ts @@ -248,8 +248,9 @@ function processNewNotification( } function trimNotifications(state: NotificationGroupsState) { - if (state.scrolledToTop) { + if (state.scrolledToTop && state.groups.length > NOTIFICATIONS_TRIM_LIMIT) { state.groups.splice(NOTIFICATIONS_TRIM_LIMIT); + ensureTrailingGap(state.groups); } } @@ -400,6 +401,28 @@ function ensureLeadingGap( } } +// Ensure the groups list ends with a gap suitable for loading more, mutating it to append one if needed +function ensureTrailingGap( + groups: NotificationGroupsState['groups'], +): NotificationGap { + const groupOrGap = groups.at(-1); + + if (groupOrGap?.type === 'gap') { + // We're expecting older notifications, so discard sinceId if it's set + groupOrGap.sinceId = undefined; + + return groupOrGap; + } else { + const gap: NotificationGap = { + type: 'gap', + maxId: groupOrGap?.page_min_id, + }; + + groups.push(gap); + return gap; + } +} + export const notificationGroupsReducer = createReducer( initialState, (builder) => { diff --git a/app/models/mention.rb b/app/models/mention.rb index af9bb7378b..a508ed630e 100644 --- a/app/models/mention.rb +++ b/app/models/mention.rb @@ -29,8 +29,4 @@ class Mention < ApplicationRecord to: :account, prefix: true ) - - def active? - !silent? - end end diff --git a/app/models/user.rb b/app/models/user.rb index b33d7dcae0..df8444e2d3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -246,10 +246,6 @@ class User < ApplicationRecord unconfirmed? || pending? end - def inactive_message - approved? ? super : :pending - end - def approve! return if approved? diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 77b8483ba4..427137545f 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -150,7 +150,7 @@ class PostStatusService < BaseService @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)) - not_found_ids = @options[:media_ids] - @media.map(&:id) + not_found_ids = @options[:media_ids].map(&:to_i) - @media.map(&:id) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any? raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?) diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index ced876c5a3..5ae53751e9 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -74,7 +74,7 @@ class UpdateStatusService < BaseService media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)).to_a - not_found_ids = @options[:media_ids] - media_attachments.map(&:id) + not_found_ids = @options[:media_ids].map(&:to_i) - media_attachments.map(&:id) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any? raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?) diff --git a/config/locales/ca.yml b/config/locales/ca.yml index d8de84c283..9a8f32117e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1412,6 +1412,7 @@ ca: media_attachments: validations: images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges + not_found: No s'ha trobat el contingut multimèdia %{ids} o ja s'ha adjuntat a una altra publicació not_ready: No es poden adjuntar fitxers que no s'hagin acabat de processar. Torna-ho a provar en un moment! too_many: No es poden adjuntar més de 4 fitxers migrations: diff --git a/config/locales/da.yml b/config/locales/da.yml index 94f2369f8e..1366370eb0 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1454,6 +1454,7 @@ da: media_attachments: validations: images_and_video: En video kan ikke vedhæftes et indlæg med billedindhold + not_found: Mediet %{ids} ikke fundet eller allerede vedhæftet andet indlæg not_ready: Filer under behandling kan ikke vedhæftes. Forsøg igen senere! too_many: Maks. 4 filer kan vedhæftes migrations: diff --git a/config/locales/de.yml b/config/locales/de.yml index a852c736cf..e5e3f37a36 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1454,6 +1454,7 @@ de: media_attachments: validations: images_and_video: Es kann kein Video an einen Beitrag angehängt werden, der bereits Bilder enthält + not_found: Medien %{ids} nicht verfügbar oder bereits an einen anderen Beitrag angehängt not_ready: Dateien, die noch nicht verarbeitet wurden, können nicht angehängt werden. Versuche es gleich noch einmal! too_many: Mehr als vier Dateien können nicht angehängt werden migrations: diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml index 1cf2d32212..f15389faf9 100644 --- a/config/locales/doorkeeper.fy.yml +++ b/config/locales/doorkeeper.fy.yml @@ -83,6 +83,7 @@ fy: access_denied: De boarne-eigener of autorisaasjeserver hat it fersyk wegere. credential_flow_not_configured: De wachtwurdgegevens-flow fan de boarne-eigener is mislearre, omdat Doorkeeper.configure.resource_owner_from_credentials net ynsteld is. invalid_client: Clientferifikaasje is mislearre troch in ûnbekende client, ûntbrekkende client-autentikaasje of in net stipe autentikaasjemetoade. + invalid_code_challenge_method: De koadechallengemetoade moat S256 wezen, plain wurdt net stipe. invalid_grant: De opjûne autorisaasje is ûnjildich, ferrûn, ynlutsen, komt net oerien mei de redirect-URI dy’t opjûn is of útjûn waard oan in oere client. invalid_redirect_uri: De opjûne redirect-URI is ûnjildich. invalid_request: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index b0882e0a27..ab0dcb58fa 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1454,6 +1454,7 @@ es-AR: media_attachments: validations: images_and_video: No se puede adjuntar un video a un mensaje que ya contenga imágenes + not_found: Medios %{ids} no encontrados o ya adjuntados a otro mensaje not_ready: No se pueden adjuntar archivos que no se han terminado de procesar. ¡Intentá de nuevo en un rato! too_many: No se pueden adjuntar más de 4 archivos migrations: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 95190d8846..42d1977662 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1454,6 +1454,7 @@ fi: media_attachments: validations: images_and_video: Videota ei voi liittää tilapäivitykseen, jossa on jo kuvia + not_found: Mediaa %{ids} ei löytynyt, tai se on jo liitetty toiseen julkaisuun not_ready: Ei voi liittää tiedostoja, joiden käsittely on kesken. Yritä hetken kuluttua uudelleen! too_many: Tiedostoja voi liittää enintään 4 migrations: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index b2309694b1..0c3620ad42 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1454,6 +1454,7 @@ fo: media_attachments: validations: images_and_video: Kann ikki viðfesta sjónfílu til ein post, sum longu inniheldur myndir + not_found: Miðilin %{ids} ikki funnin ella longu knýttur at øðrum posti not_ready: Kann ikki viðfesta fílur, sum ikki eru liðugt viðgjørdar. Roynd aftur um eina løtu! too_many: Kann ikki viðfest fleiri enn 4 fílur migrations: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 62889c0b28..d0127f77b1 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -31,6 +31,7 @@ fy: created_msg: Oanmeitsjen fan opmerking foar moderatoaren slagge! destroyed_msg: Fuortsmiten fan opmerking foar moderatoaren slagge! accounts: + add_email_domain_block: E-maildomein blokkearje approve: Goedkarre approved_msg: It goedkarren fan de account fan %{username} is slagge are_you_sure: Binne jo wis? @@ -57,6 +58,7 @@ fy: demote: Degradearje destroyed_msg: It fuortsmiten fan de gegevens fan %{username} stiet no yn de wachtrige disable: Befrieze + disable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mail útskeakelje disable_two_factor_authentication: 2FA útskeakelje disabled: Beferzen display_name: Werjeftenamme @@ -65,6 +67,7 @@ fy: email: E-mailadres email_status: E-mailsteat enable: Untteie + enable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mail ynskeakelje enabled: Ynskeakele enabled_msg: It ûntteie fan de account fan %{username} is slagge followers: Folgers @@ -129,6 +132,7 @@ fy: resubscribe: Opnij abonnearje role: Rol search: Sykje + search_same_email_domain: Oare brûkers mei itselde e-maildomein search_same_ip: Oare brûkers mei itselde IP-adres security: Befeiliging security_measures: @@ -169,21 +173,26 @@ fy: approve_appeal: Beswier goedkarre approve_user: Brûker goedkarre assigned_to_self_report: Rapportaazje tawize + change_email_user: E-mailadres fan brûker wizigje change_role_user: Brûkersrol wizigje confirm_user: Brûker befêstigje create_account_warning: Warskôging oanmeitsje create_announcement: Meidieling oanmeitsje + create_canonical_email_block: E-mailblokkade oanmeitsje create_custom_emoji: Lokale emoji oanmeitsje create_domain_allow: Domeingoedkarring oanmeitsje create_domain_block: Domeinblokkade oanmeitsje + create_email_domain_block: E-maildomeinblokkade oanmeitsje create_ip_block: IP-rigel oanmeitsje create_unavailable_domain: Net beskikber domein oanmeitsje create_user_role: Rol oanmeitsje demote_user: Brûker degradearje destroy_announcement: Meidieling fuortsmite + destroy_canonical_email_block: E-mailblokkade fuortsmite destroy_custom_emoji: Lokale emoji fuortsmite destroy_domain_allow: Domeingoedkarring fuortsmite destroy_domain_block: Domeinblokkade fuortsmite + destroy_email_domain_block: E-maildomeinblokkade fuortsmite destroy_instance: Domein folslein fuortsmite destroy_ip_block: IP-rigel fuortsmite destroy_status: Toot fuortsmite @@ -191,8 +200,10 @@ fy: destroy_user_role: Rol permanint fuortsmite disable_2fa_user: Twa-stapsferifikaasje útskeakelje disable_custom_emoji: Lokale emoji útskeakelje + disable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mail foar de brûker útskeakelje disable_user: Brûker útskeakelje enable_custom_emoji: Lokale emoji ynskeakelje + enable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mail foar de brûker ynskeakelje enable_user: Brûker ynskeakelje memorialize_account: De account yn in Yn memoriam wizigje promote_user: Brûker promovearje @@ -222,20 +233,26 @@ fy: approve_appeal_html: "%{name} hat it beswier tsjin de moderaasjemaatregel fan %{target} goedkard" approve_user_html: "%{name} hat de registraasje fan %{target} goedkard" assigned_to_self_report_html: "%{name} hat rapportaazje %{target} oan harrensels tawiisd" + change_email_user_html: "%{name} hat it e-mailadres fan brûker %{target} wizige" change_role_user_html: "%{name} hat de rol fan %{target} wizige" + confirm_user_html: E-mailadres fan brûker %{target} is troch %{name} befêstige create_account_warning_html: "%{name} hat in warskôging nei %{target} ferstjoerd" create_announcement_html: "%{name} hat de nije meidieling %{target} oanmakke" + create_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} blokkearre" create_custom_emoji_html: Nije emoji %{target} is troch %{name} opladen create_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} goedkard" create_domain_block_html: Domein %{target} is troch %{name} blokkearre + create_email_domain_block_html: "%{name} hat it e-maildomein %{target} blokkearre" create_ip_block_html: "%{name} hat de rigel foar IP %{target} oanmakke" create_unavailable_domain_html: "%{name} hat de besoarging foar domein %{target} beëinige" create_user_role_html: "%{name} hat de rol %{target} oanmakke" demote_user_html: Brûker %{target} is troch %{name} degradearre destroy_announcement_html: "%{name} hat de meidieling %{target} fuortsmiten" + destroy_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} deblokkearre" destroy_custom_emoji_html: Emoji %{target} is troch %{name} fuortsmiten destroy_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} ôfkard" destroy_domain_block_html: Domein %{target} is troch %{name} deblokkearre + destroy_email_domain_block_html: "%{name} hat it e-maildomein %{target} deblokkearre" destroy_instance_html: "%{name} hat it domein %{target} folslein fuortsmiten" destroy_ip_block_html: "%{name} hat de rigel foar IP %{target} fuortsmiten" destroy_status_html: Berjocht fan %{target} is troch %{name} fuortsmiten @@ -243,8 +260,10 @@ fy: destroy_user_role_html: "%{name} hat de rol %{target} fuortsmiten" disable_2fa_user_html: De fereaske twa-stapsferifikaasje foar %{target} is troch %{name} útskeakele disable_custom_emoji_html: Emoji %{target} is troch %{name} útskeakele + disable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mail útskeakele foar %{target}" disable_user_html: Oanmelden foar %{target} is troch %{name} útskeakele enable_custom_emoji_html: Emoji %{target} is troch %{name} ynskeakele + enable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mail ynskeakele foar %{target}" enable_user_html: Oanmelden foar %{target} is troch %{name} ynskeakele memorialize_account_html: De account %{target} is troch %{name} yn in Yn memoriam wizige promote_user_html: Brûker %{target} is troch %{name} promovearre @@ -252,6 +271,7 @@ fy: reject_user_html: "%{name} hat de registraasje fan %{target} ôfwêzen" remove_avatar_user_html: "%{name} hat de profylfoto fan %{target} fuortsmiten" reopen_report_html: "%{name} hat rapportaazje %{target} opnij iepene" + resend_user_html: "%{name} hat it befêstigings-e-mailberjocht foar %{target} opnij ferstjoerd" reset_password_user_html: Wachtwurd fan brûker %{target} is troch %{name} opnij ynsteld resolve_report_html: "%{name} hat rapportaazje %{target} oplost" sensitive_account_html: "%{name} markearre de media fan %{target} as gefoelich" @@ -412,6 +432,7 @@ fy: attempts_over_week: one: "%{count} registraasjebesykjen yn de ôfrûne wike" other: "%{count} registraasjebesykjen yn de ôfrûne wike" + created_msg: E-maildomein blokkearjen slagge delete: Fuortsmite dns: types: @@ -420,8 +441,12 @@ fy: new: create: Domein tafoegje resolve: Domein opsykje + title: Nije e-maildomein blokkearje + no_email_domain_block_selected: Der binne gjin e-maildomeinblokkaden wizige, omdat der gjin ien selektearre waard not_permitted: Net tastien + resolved_dns_records_hint_html: De domeinnamme slacht op de folgjende MX-domeinen dy’t úteinlik ferantwurdlik binne foar it akseptearjen fan e-mail. It blokkearjen fan in MX-domein blokkearret oanmeldingen fan elk e-mailadres dat itselde MX-domein brûkt, sels as de sichtbere domeinnamme oars is. Pas op dat jo gjin grutte e-mailproviders blokkearje. resolved_through_html: Blokkearre fia %{domain} + title: Blokkearre e-maildomeinen export_domain_allows: new: title: Tastiene domeinen ymportearje @@ -575,6 +600,7 @@ fy: resolve_description_html: Der wurdt tsjin it rapportearre account gjin maatregel nommen, gjin oertrêding registrearre en de rapportaazje wurdt markearre as oplost. silence_description_html: De account sil allinnich sichtber wêze foar dyjinge dy’t it al folgje of it hânmjittich opsykje, wêrtroch it berik earnstich beheind wurdt. Kin altyd weromdraaid wurde. Dit slút alle rapportaazjes oer dizze account. suspend_description_html: De account en alle ynhâld sil net tagonklik wêze en úteinlik fuortsmiten wurde, en ynteraksje hjirmei sil net mooglik wêze. Binnen 30 dagen werom te draaien. Dit slút alle rapportaazjes oer dizze account. + actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de spam-kategory keazen is. actions_description_remote_html: Beslút hokker aksje nommen wurde moat om dizze rapportaazje ôf te hanneljen. Dit hat allinnich ynfloed op hoe’t jo server kommunisearret mei dizze eksterne account en omgiet mei de ynhâld. add_to_report: Mear oan de rapportaazje tafoegje already_suspended_badges: @@ -639,6 +665,7 @@ fy: delete_data_html: It profyl en de ynhâld fan @%{acct} wurde nei 30 dagen fan no ôf fuortsmiten, útsein as de account yn de tuskentiid net mear blokkearre wurdt preview_preamble_html: "@%{acct} sil in warskôging ûntfange mei de folgjende ynhâld:" record_strike_html: In ban tsjin @%{acct} ynstelle, om jo te helpen by takomstige skeiningen fan dizze acount te eskalearjen + send_email_html: Stjoer @%{acct} in warskôgings-e-mailberjocht warning_placeholder: Ekstra opsjonele reden foar de moderaasje-aksje. target_origin: Orizjineel fan rapportearre account title: Rapportaazjes @@ -678,6 +705,7 @@ fy: manage_appeals: Beswieren beheare manage_appeals_description: Stiet brûkers ta om beswieren tsjin moderaasjemaatregelen te beoardielen manage_blocks: Blokkaden beheare + manage_blocks_description: Stiet brûkers ta om e-mailproviders en IP-adressen te blokkearjen manage_custom_emojis: Lokale emoji’s beheare manage_custom_emojis_description: Stiet brûkers ta om lokale emoji’s op de server te behearen manage_federation: Federaasje beheare @@ -695,6 +723,7 @@ fy: manage_taxonomies: Trends en hashtags beheare manage_taxonomies_description: Stiet brûkers ta om trending ynhâld te besjen en om hashtagynstellingen by te wurkjen manage_user_access: Brûkerstagong beheare + manage_user_access_description: Stiet brûkers ta om twa-stapsferifikaasje fan oare brûkers út te skeakeljen, om harren e-mailadres te wizigjen en om harren wachtwurd opnij yn te stellen manage_users: Brûkers beheare manage_users_description: Stiet brûkers ta om brûkersdetails fan oaren te besjen en moderaasjemaatregelen tsjin harren te nimmen manage_webhooks: Webhooks beheare @@ -769,6 +798,7 @@ fy: destroyed_msg: Fuortsmiten website-oplaad slagge! software_updates: critical_update: Krityk — fernij sa gau as mooglik + description: It wurdt oanrekommandearre om jo Mastodon-ynstallaasje by-de-tiid te hâlden om gebrûk meitsje te kinnen fan de nijste oplossingen en funksjes. Boppe dat is it somtiden krúsjaal om Mastodon tidich by te wurkjen om feiligheidsproblemen foar te kommen. Om dizze redenen kontrolearret Mastodon elke 30 minuten fernijingen en bringt jo hjirfan op de hichte neffens jo foarkarren foar e-mailmeldingen. documentation_link: Mear ynfo release_notes: Utjefte-opmerkingen title: Beskikbere fernijingen @@ -855,16 +885,39 @@ fy: action: Klik hjir foar mear ynformaasje message_html: "Jo objektûnthâld is ferkeard konfigurearre. De privacy fan jo brûkers is yn gefaar." tags: + moderation: + not_trendable: Net trendber + not_usable: Net brûkber + pending_review: Moat noch beoardiele wurde + review_requested: Beoardieling oanfrege + reviewed: Beoardiele + title: Status + trendable: Trendber + unreviewed: Net beoardiele + usable: Brûkber + name: Namme + newest: Nijste + oldest: Aldste + open: Yn it iepenbier besjen + reset: Opnij ynstelle review: Steat beoardiele + search: Sykje + title: Hashtags updated_msg: Hashtagynstellingen mei sukses bywurke title: Behear trends: allow: Tastean approved: Goedkarre + confirm_allow: Binne jo wis dat jo de selektearre hashtags tastean wolle? + confirm_disallow: Binne jo wis dat jo de selektearre hashtags ôfkarre wolle? disallow: Ofkarre links: allow: Keppeling goedkarre allow_provider: Auteur goedkarre + confirm_allow: Binne jo wis dat jo de selektearre keppelingen tastean wolle? + confirm_allow_provider: Binne jo wis dat jo de selektearre websites tastean wolle? + confirm_disallow: Binne jo wis dat jo de selektearre keppelingen ôfkarre wolle? + confirm_disallow_provider: Binne jo wis dat jo de selektearre providers ôfkarre wolle? description_html: Dit binne keppelingen dy’t op dit stuit in protte dield wurde troch accounts wêr’t jo server berjochten fan ûntfangt. Hjirtroch kinne jo brûkers sjen wat der yn de wrâld oan de hân is. Der wurde gjin keppelingen werjûn oant jo de website goedkard hawwe. Jo kinne ek yndividuele keppelingen goed- of ôfkarre. disallow: Keppeling ôfkarre disallow_provider: Website ôfkarre @@ -888,6 +941,10 @@ fy: statuses: allow: Berjocht goedkarre allow_account: Account goedkarre + confirm_allow: Binne jo wis dat jo de selektearre statussen ofkarre wolle? + confirm_allow_account: Binne jo wis dat jo de selektearre accounts tastean wolle? + confirm_disallow: Binne jo wis dat jo de selektearre statussen ôfkarre wolle? + confirm_disallow_account: Binne jo wis dat jo de selektearre accounts ôfkarre wolle? description_html: Dit binne berjochten dy’t op jo server bekend binne en dy’t op dit stuit in protte dield wurde en as favoryt markearre wurde. Hjirmei kinne nije en weromkearende brûkers mear minsken fine om te folgjen. Der wurde gjin berjochten yn it iepenbier werjûn oant de account troch jo goedkard is en de brûker tastiet dat harren account oan oaren oanrekommandearre wurdt. Jo kinne ek yndividuele berjochten goed- of ôfkarre. disallow: Berjocht ôfkarre disallow_account: Account ôfkarre @@ -920,6 +977,7 @@ fy: used_by_over_week: one: Dizze wike troch ien persoan brûkt other: Dizze wike troch %{count} persoanen brûkt + title: Oanrekommandaasjes & trends trending: Trending warning_presets: add_new: Nije tafoegje @@ -1004,7 +1062,9 @@ fy: guide_link_text: Elkenien kin bydrage. sensitive_content: Gefoelige ynhâld application_mailer: + notification_preferences: E-mailynstellingen wizigje salutation: "%{name}," + settings: 'E-mailfoarkarren wizigje: %{link}' unsubscribe: Ofmelde view: 'Besjoch:' view_profile: Profyl besjen @@ -1024,6 +1084,7 @@ fy: hint_html: Noch ien ding! Jo moatte befêstigje dat jo in minske binne (dit is om de spam bûten de doar te hâlden!). Los de ûndersteande CAPTCHA op en klik op ‘Trochgean’. title: Befeiligingskontrôle confirmations: + awaiting_review: Jo e-mailadres is befêstige! De %{domain}-meiwurkers binne no dwaande mei it besjen fan jo registraasje. Jo ûntfange in e-mailberjocht as de jo account goedkarre! awaiting_review_title: Jo registraasje wurdt beoardield clicking_this_link: klik op dizze keppeling login_link: oanmelde @@ -1031,6 +1092,7 @@ fy: redirect_to_app_html: Jo soene omlaad wêze moatte nei de %{app_name} app. As dat net bard is, probearje dan %{clicking_this_link} of kear hânmjittich werom nei de app. registration_complete: Jo registraasje op %{domain} is no foltôge! welcome_title: Wolkom, %{name}! + wrong_email_hint: As it e-mailadres net korrekt is, kinne jo dat wizigje yn de accountynstellingen. delete_account: Account fuortsmite delete_account_html: Wannear’t jo jo account graach fuortsmite wolle, kinne jo dat hjir dwaan. Wy freegje jo dêr om in befêstiging. description: @@ -1051,6 +1113,7 @@ fy: or_log_in_with: Of oanmelde mei privacy_policy_agreement_html: Ik haw it privacybelied lêzen en gean dêrmei akkoard progress: + confirm: E-mailadres werhelje details: Jo gegevens review: Us beoardieling rules: Regels akseptearje @@ -1072,8 +1135,10 @@ fy: security: Befeiliging set_new_password: Nij wachtwurd ynstelle setup: + email_below_hint_html: Kontrolearje jo map Net-winske, of freegje in nije befêstigingskeppeling oan. Jo kinne jo e-mailadres wizigje as it ferkeard is. email_settings_hint_html: Klik op de keppeling dy’t wy jo stjoerd hawwe om %{email} te ferifiearjen. Wy wachtsje wol even. link_not_received: Gjin keppeling krigen? + new_confirmation_instructions_sent: Jo ûntfange binnen inkelde minuten in nij e-mailberjocht mei de befêstigingskeppeling! title: Kontrolearje jo Postfek YN sign_in: preamble_html: Meld jo oan mei de oanmeldgegevens fan %{domain}. As jo account op in oare server stiet, kinne jo hjir net oanmelde. @@ -1084,7 +1149,9 @@ fy: title: Litte wy jo account op %{domain} ynstelle. status: account_status: Accountsteat + confirming: Oan it wachtsjen oant it e-mailadres befêstige is. functional: Jo account kin folslein brûkt wurde. + pending: Jo oanfraach moat noch beoardiele wurde troch ien fan ús meiwurkers. Dit kin miskien efkes duorje. Jo ûntfangt in e-mailberjocht wannear’t jo oanfraach goedkard is. redirecting_to: Jo account is ynaktyf, omdat it op dit stuit trochferwezen wurdt nei %{acct}. self_destruct: Omdat %{domain} sluten sil, krije jo mar beheind tagong ta jo account. view_strikes: Besjoch de earder troch moderatoaren fêststelde skeiningen dy’t jo makke hawwe @@ -1127,6 +1194,9 @@ fy: before: 'Lês dizze tekst soarchfâldich eardat jo troch gean:' caches: Berjochten en media dy’t op oare servers bewarre binne kinne dêr efterbliuwe data_removal: Jo berjochten en oare gegevens wurde permanint fuortmiten + email_change_html: Jo kinne jo e-mailadres wizigje sûnder dat jo jo account fuort hoege te smiten + email_contact_html: Wannear’t it noch hieltyd net oankomt, kinne jo foar help in e-mailberjocht stjoere nei %{email} + email_reconfirmation_html: Wannear’t jo it befêstigings-e-mailberjocht net ûntfongen hawwe, kinne jo dizze opnij oanfreegje irreversible: Jo sille net yn steat wêze om jo account te werstellen of te de-aktivearjen more_details_html: Sjoch it privacybelied foar mear ynformaasje. username_available: Jo brûkersnamme sil wer beskikber komme @@ -1359,6 +1429,7 @@ fy: authentication_methods: otp: twa-stapsferifikaasje-app password: wachtwurd + sign_in_token: befeiligingskoade fia e-mailberjocht webauthn: befeiligingskaaien description_html: Wannear’t jo aktiviteit sjogge dy’t jo net werkenne, tink dan nei om jo wachtwurd te wizigjen en twa-stapsferifikaasje yn te skeakeljen. empty: Gjin oanmeldskiednis beskikber @@ -1369,6 +1440,16 @@ fy: unsubscribe: action: Ja, ôfmelde complete: Ofmelden + confirmation_html: Binne jo wis dat jo jo ôfmelde wolle foar it ûntfangen fan %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}? Jo kinne jo altyd opnij abonnearje yn jo ynstellingen foar e-mailmeldingen. + emails: + notification_emails: + favourite: e-mailmeldingen foar favoriten + follow: e-mailmeldingen foar nije folgers + follow_request: e-mailmeldingen foar folchfersiken + mention: e-mailmeldingen foar fermeldingen + reblog: e-mailmeldingen foar boosts + resubscribe_html: As jo jo mei fersin ôfmeld hawwe, kinne jo jo opnij abonnearje yn jo ynstellingen foar e-mailmeldingen. + success_html: Jo ûntfange net langer %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}. title: Ofmelde media_attachments: validations: @@ -1449,6 +1530,8 @@ fy: update: subject: "%{name} hat in berjocht bewurke" notifications: + administration_emails: E-mailmeldingen behearder + email_events: E-mailmeldingen foar eveneminten email_events_hint: 'Selektearje eveneminten wêrfoar’t jo meldingen ûntfange wolle:' number: human: @@ -1607,6 +1690,7 @@ fy: import: Ymportearje import_and_export: Ymportearje en eksportearje migrate: Accountmigraasje + notifications: E-mailmeldingen preferences: Ynstellingen profile: Profyl relationships: Folgers en folgjenden @@ -1853,6 +1937,7 @@ fy: invalid_otp_token: Unjildige twa-stapstagongskoade otp_lost_help_html: As jo tagong ta beide kwytrekke binne, nim dan kontakt op fia %{email} rate_limited: Te folle autentikaasjebesykjen, probearje it letter opnij. + seamless_external_login: Jo binne oanmeld fia in eksterne tsjinst, dêrom binne wachtwurden en e-mailynstellingen net beskikber. signed_in_as: 'Oanmeld as:' verification: extra_instructions_html: Tip: De keppeling op jo website kin ûnsichtber wêze. It wichtige part is rel="me" dat ympersonaasje op websites mei user-generated ynhâld foarkomt. Jo kinne sels in link-label brûke yn de header fan de side yn stee fan a, mar de HTML moat ek sûnder JavaScript tagonklik wêze. diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 71df4c8d93..b43ec5d172 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1454,6 +1454,7 @@ gl: media_attachments: validations: images_and_video: Non podes anexar un vídeo a unha publicación que xa contén imaxes + not_found: Non se atopou o multimedia %{ids} ou xa é adxunto noutra publicación not_ready: Non se poden anexar ficheiros que aínda se están a procesar. Agarda un intre! too_many: Non pode anexar máis de 4 ficheiros migrations: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index c282a17f92..5596aacf2d 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -661,6 +661,7 @@ ia: delete_data_html: Deler le profilo e contento de @%{acct} in 30 dies excepte si le suspension es disfacite intertanto preview_preamble_html: "@%{acct} recipera un advertimento con le sequente contento:" record_strike_html: Registra un sanction contra @%{acct} pro adjutar te a prender mesuras adequate in caso de futur violationes committite desde iste conto + send_email_html: Inviar un e-mail de advertimento a @%{acct} warning_placeholder: Motivation supplementari facultative pro le action de moderation. target_origin: Origine del conto reportate title: Reportos @@ -700,6 +701,7 @@ ia: manage_appeals: Gerer appellos manage_appeals_description: Permitte que usatores revide appellos contra actiones de moderation manage_blocks: Gerer blocadas + manage_blocks_description: Permitter que usatores bloca le fornitores de e-mail e le adresses IP manage_custom_emojis: Gerer emojis personalisate manage_custom_emojis_description: Permitte que usatores gere emojis personalisate sur le servitor manage_federation: Gerer federation @@ -717,6 +719,7 @@ ia: manage_taxonomies: Gerer taxonomias manage_taxonomies_description: Permitte que usatores revide contento in tendentias e actualisa le parametros de hashtag manage_user_access: Gerer le accesso de usatores + manage_user_access_description: Permitte que usatores disactiva le authentication bifactorial de altere usatores, cambia lor adresses de e-mail, e reinitialisa lor contrasigno manage_users: Gerer usatores manage_users_description: Permitte que usatores vide le detalios de altere usatores e exeque actiones de moderation contra illes manage_webhooks: Gerer Webhooks @@ -791,6 +794,7 @@ ia: destroyed_msg: Le file incargate al sito ha essite delite! software_updates: critical_update: Critic – per favor, actualisa rapidemente + description: Il es recommendate mantener tu installation de Mastodon actualisate pro beneficiar del ultime reparationes e functiones. In ultra, de tempore a tempore, il es de importantia critic actualisar Mastodon in tempore utile pro evitar problemas de securitate. Pro iste rationes, Mastodon verifica le presentia de actualisationes cata 30 minutas, e te notificara secundo tu preferentias de notification in e-mail. documentation_link: Pro saper plus release_notes: Notas de version title: Actualisationes disponibile @@ -878,6 +882,7 @@ ia: message_html: "Tu immagazinage de objectos es mal configurate. Le confidentialitate de tu usatores es in risco." tags: moderation: + not_trendable: Non pro tendentia pending_review: Attende revision title: Stato name: Nomine diff --git a/config/locales/it.yml b/config/locales/it.yml index bc60b6ea50..54e122fd75 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1456,6 +1456,7 @@ it: media_attachments: validations: images_and_video: Impossibile allegare video a un post che contiene già immagini + not_found: Media %{ids} non trovato o già collegato a un altro post not_ready: Impossibile allegare file per cui l'elaborazione non è finita. Riprova tra poco! too_many: Impossibile allegare più di 4 file migrations: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e919e183d4..9632a3027b 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1430,6 +1430,7 @@ ko: media_attachments: validations: images_and_video: 이미 사진이 첨부된 게시물엔 동영상을 첨부할 수 없습니다. + not_found: 미디어 %{ids}는 찾을 수 없거나 이미 다른 게시물에 첨부되었습니다 not_ready: 처리가 끝나지 않은 파일은 첨부할 수 없습니다. 잠시 후에 다시 시도해 주세요! too_many: 최대 4개까지 첨부할 수 있습니다 migrations: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 6cc35d939d..8c3b8e2e73 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -941,6 +941,7 @@ lt: media_attachments: validations: images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką + not_found: Medija %{ids} nerasta arba jau pridėta prie kito įrašo. too_many: Negalima pridėti daugiau nei 4 failų migrations: acct: Perkelta į diff --git a/config/locales/nl.yml b/config/locales/nl.yml index cdd71112e9..46ed411776 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1454,6 +1454,7 @@ nl: media_attachments: validations: images_and_video: Een video kan niet aan een bericht met afbeeldingen worden gekoppeld + not_found: Media %{ids} niet gevonden of al toegevoegd aan een ander bericht not_ready: Kan geen bestanden toevoegen die nog niet zijn verwerkt. Probeer het later opnieuw! too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden migrations: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d79df666e5..95746bd10b 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1506,6 +1506,7 @@ pl: media_attachments: validations: images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia + not_found: Nie znaleziono mediów %{ids}, lub są już dołączone do innego wpisu not_ready: Nie można załączyć plików których przetwarzanie nie zostało ukończone. Spróbuj ponownie za chwilę! too_many: Nie możesz załączyć więcej niż 4 plików migrations: diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index bde97237f6..e6c1b0ee82 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -314,6 +314,7 @@ fy: listable: Tastean dat dizze hashtag yn sykopdrachten en oanrekommandaasjes te sjen is name: Hashtag trendable: Goedkarre dat dizze hashtag ûnder trends te sjen is + usable: Berjochten tastean dizze hashtag lokaal te brûken user: role: Rol time_zone: Tiidsône diff --git a/config/locales/sq.yml b/config/locales/sq.yml index ffaa8e00b9..b3d273024b 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1446,6 +1446,7 @@ sq: media_attachments: validations: images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë + not_found: S’u gjet media %{ids}, ose është bashkëngjitur tashmë një tjetër postimi not_ready: S’mund të bashkëngjiten kartela që s’kanë përfunduar së përpunuari. Riprovoni pas një çasti! too_many: S’mund të bashkëngjiten më shumë se 4 kartela migrations: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index c24ed77aef..544e2671c6 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1506,6 +1506,7 @@ uk: media_attachments: validations: images_and_video: Не можна додати відео до допису з зображеннями + not_found: Медіа %{ids} не знайдено або вже прикріплено до іншого допису not_ready: Не можна прикріпити файли, оброблення яких ще не закінчилося. Спробуйте ще раз через хвилину! too_many: Не можна додати більше 4 файлів migrations: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 9b3d2a1d75..2f607d1ecb 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1428,6 +1428,7 @@ vi: media_attachments: validations: images_and_video: Không thể đính kèm video vào tút đã chứa hình ảnh + not_found: Không tìm thấy %{ids} hoặc nó đã bị đính kèm với tút khác not_ready: Tập tin này vẫn chưa xử lý xong. Hãy thử lại sau! too_many: Không thể đính kèm hơn 4 tệp migrations: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index f85646b5bc..97a4399b21 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1430,6 +1430,7 @@ zh-TW: media_attachments: validations: images_and_video: 無法於已有圖片之嘟文中加入影片 + not_found: 找不到多媒體 %{ids} 或已附加於另一嘟文中 not_ready: 修但幾勒!不能附加未完成處理的檔案欸,咁按呢? too_many: 無法加入超過 4 個檔案 migrations: diff --git a/config/secrets.yml b/config/secrets.yml deleted file mode 100644 index 51681d7a5c..0000000000 --- a/config/secrets.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rails secret` to generate a secure secret key. - -# Make sure the secrets in this file are kept private -# if you're sharing your code publicly. - -development: - secret_key_base: d4398e4af52f1fc5be5c3c8764e9ecce7beac5462826cb8b649373b2aad5a0f133598ed817c4e9931e943041460d6b6eda40a854e825e1bbd510c4594b1538f2 - -test: - secret_key_base: 5be187ddbd651211a906f9aa399f4a148edf6e06b971c7c0b5429b9483df6e21d262cc846447d0f89b89c32d56a99e151039df5dd874ede7f712afbe041a9269 - -# Do not keep production secrets in the repository, -# instead read values from the environment. -production: - secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/spec/helpers/json_ld_helper_spec.rb b/spec/helpers/json_ld_helper_spec.rb index 4855085027..f4b849d7a1 100644 --- a/spec/helpers/json_ld_helper_spec.rb +++ b/spec/helpers/json_ld_helper_spec.rb @@ -21,6 +21,34 @@ describe JsonLdHelper do end end + describe '#uri_from_bearcap' do + subject { helper.uri_from_bearcap(string) } + + context 'when a bear string has a u param' do + let(:string) { 'bear:?t=TOKEN&u=https://example.com/foo' } + + it 'returns the value from the u query param' do + expect(subject).to eq('https://example.com/foo') + end + end + + context 'when a bear string does not have a u param' do + let(:string) { 'bear:?t=TOKEN&h=https://example.com/foo' } + + it 'returns nil' do + expect(subject).to be_nil + end + end + + context 'when a non-bear string' do + let(:string) { 'http://example.com' } + + it 'returns the string' do + expect(subject).to eq('http://example.com') + end + end + end + describe '#first_of_value' do context 'when value.is_a?(Array)' do it 'returns value.first' do diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb index ba6fe361d9..b7531ec0b7 100644 --- a/spec/helpers/statuses_helper_spec.rb +++ b/spec/helpers/statuses_helper_spec.rb @@ -23,12 +23,6 @@ describe StatusesHelper do end end - def status_text_summary(status) - return if status.spoiler_text.blank? - - I18n.t('statuses.content_warning', warning: status.spoiler_text) - end - describe 'fa_visibility_icon' do context 'with a status that is public' do let(:status) { Status.new(visibility: 'public') } diff --git a/spec/lib/annual_report_spec.rb b/spec/lib/annual_report_spec.rb new file mode 100644 index 0000000000..ffb742697b --- /dev/null +++ b/spec/lib/annual_report_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe AnnualReport do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect { subject.generate } + .to change(GeneratedAnnualReport, :count).by(1) + end + end +end diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb index 3d9eb65019..3432106a46 100644 --- a/spec/requests/api/v1/accounts_spec.rb +++ b/spec/requests/api/v1/accounts_spec.rb @@ -114,10 +114,11 @@ describe '/api/v1/accounts' do expect(response).to have_http_status(200) - json = body_as_json - - expect(json[:following]).to be true - expect(json[:requested]).to be false + expect(body_as_json) + .to include( + following: true, + requested: false + ) expect(user.account.following?(other_account)).to be true end @@ -133,10 +134,11 @@ describe '/api/v1/accounts' do expect(response).to have_http_status(200) - json = body_as_json - - expect(json[:following]).to be false - expect(json[:requested]).to be true + expect(body_as_json) + .to include( + following: false, + requested: true + ) expect(user.account.requested?(other_account)).to be true end diff --git a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb index 3f33b50f39..0cddf2c69e 100644 --- a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb +++ b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb @@ -96,10 +96,11 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - json = body_as_json - - expect(json[:id]).to eq(canonical_email_block.id.to_s) - expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + expect(body_as_json) + .to include( + id: eq(canonical_email_block.id.to_s), + canonical_email_hash: eq(canonical_email_block.canonical_email_hash) + ) end end diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb index 3aa79d3ce5..7f7b9aa48a 100644 --- a/spec/requests/api/v1/admin/domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -133,10 +133,8 @@ RSpec.describe 'Domain Blocks' do it 'creates a domain block with the expected domain name and severity', :aggregate_failures do subject - body = body_as_json - expect(response).to have_http_status(200) - expect(body).to match a_hash_including( + expect(body_as_json).to match a_hash_including( { domain: 'foo.bar.com', severity: 'silence', @@ -156,10 +154,8 @@ RSpec.describe 'Domain Blocks' do it 'creates a domain block with the expected domain name and severity', :aggregate_failures do subject - body = body_as_json - expect(response).to have_http_status(200) - expect(body).to match a_hash_including( + expect(body_as_json).to match a_hash_including( { domain: 'foo.bar.com', severity: 'suspend', diff --git a/spec/requests/api/v1/admin/ip_blocks_spec.rb b/spec/requests/api/v1/admin/ip_blocks_spec.rb index 98b954dd49..bd4015b2d9 100644 --- a/spec/requests/api/v1/admin/ip_blocks_spec.rb +++ b/spec/requests/api/v1/admin/ip_blocks_spec.rb @@ -88,10 +88,12 @@ RSpec.describe 'IP Blocks' do subject expect(response).to have_http_status(200) - json = body_as_json - expect(json[:ip]).to eq("#{ip_block.ip}/#{ip_block.ip.prefix}") - expect(json[:severity]).to eq(ip_block.severity.to_s) + expect(body_as_json) + .to include( + ip: eq("#{ip_block.ip}/#{ip_block.ip.prefix}"), + severity: eq(ip_block.severity.to_s) + ) end context 'when ip block does not exist' do @@ -118,11 +120,12 @@ RSpec.describe 'IP Blocks' do subject expect(response).to have_http_status(200) - json = body_as_json - - expect(json[:ip]).to eq("#{params[:ip]}/32") - expect(json[:severity]).to eq(params[:severity]) - expect(json[:comment]).to eq(params[:comment]) + expect(body_as_json) + .to include( + ip: eq("#{params[:ip]}/32"), + severity: eq(params[:severity]), + comment: eq(params[:comment]) + ) end context 'when the required ip param is not provided' do diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb index 1f01bddf3c..81d6c68126 100644 --- a/spec/requests/api/v1/apps_spec.rb +++ b/spec/requests/api/v1/apps_spec.rb @@ -61,9 +61,10 @@ RSpec.describe 'Apps' do expect(response).to have_http_status(200) expect(Doorkeeper::Application.find_by(name: client_name)).to be_present - body = body_as_json - - expect(body[:scopes]).to eq Doorkeeper.config.default_scopes.to_a + expect(body_as_json) + .to include( + scopes: Doorkeeper.config.default_scopes.to_a + ) end end @@ -81,9 +82,10 @@ RSpec.describe 'Apps' do expect(app).to be_present expect(app.scopes.to_s).to eq 'read' - body = body_as_json - - expect(body[:scopes]).to eq ['read'] + expect(body_as_json) + .to include( + scopes: %w(read) + ) end end @@ -163,10 +165,11 @@ RSpec.describe 'Apps' do expect(app.redirect_uri).to eq redirect_uris expect(app.redirect_uris).to eq redirect_uris.split - body = body_as_json - - expect(body[:redirect_uri]).to eq redirect_uris - expect(body[:redirect_uris]).to eq redirect_uris.split + expect(body_as_json) + .to include( + redirect_uri: redirect_uris, + redirect_uris: redirect_uris.split + ) end end @@ -184,10 +187,11 @@ RSpec.describe 'Apps' do expect(app.redirect_uri).to eq redirect_uris.join "\n" expect(app.redirect_uris).to eq redirect_uris - body = body_as_json - - expect(body[:redirect_uri]).to eq redirect_uris.join "\n" - expect(body[:redirect_uris]).to eq redirect_uris + expect(body_as_json) + .to include( + redirect_uri: redirect_uris.join("\n"), + redirect_uris: redirect_uris + ) end end diff --git a/spec/requests/api/v1/blocks_spec.rb b/spec/requests/api/v1/blocks_spec.rb index c6c2d56f36..06d2c4d997 100644 --- a/spec/requests/api/v1/blocks_spec.rb +++ b/spec/requests/api/v1/blocks_spec.rb @@ -55,10 +55,8 @@ RSpec.describe 'Blocks' do it 'queries the blocks in range according to max_id', :aggregate_failures do subject - response_body = body_as_json - - expect(response_body.size).to be 1 - expect(response_body[0][:id]).to eq(blocks[0].target_account.id.to_s) + expect(body_as_json) + .to contain_exactly(include(id: blocks.first.target_account.id.to_s)) end end @@ -68,10 +66,8 @@ RSpec.describe 'Blocks' do it 'queries the blocks in range according to since_id', :aggregate_failures do subject - response_body = body_as_json - - expect(response_body.size).to be 1 - expect(response_body[0][:id]).to eq(blocks[2].target_account.id.to_s) + expect(body_as_json) + .to contain_exactly(include(id: blocks[2].target_account.id.to_s)) end end end diff --git a/spec/requests/api/v1/featured_tags_spec.rb b/spec/requests/api/v1/featured_tags_spec.rb index 4b96988704..81e99e015b 100644 --- a/spec/requests/api/v1/featured_tags_spec.rb +++ b/spec/requests/api/v1/featured_tags_spec.rb @@ -37,9 +37,7 @@ RSpec.describe 'FeaturedTags' do it 'returns an empty body' do get '/api/v1/featured_tags', headers: headers - body = body_as_json - - expect(body).to be_empty + expect(body_as_json).to be_empty end end @@ -49,10 +47,10 @@ RSpec.describe 'FeaturedTags' do it 'returns only the featured tags belonging to the requesting user' do get '/api/v1/featured_tags', headers: headers - body = body_as_json - expected_ids = user_featured_tags.pluck(:id).map(&:to_s) - - expect(body.pluck(:id)).to match_array(expected_ids) + expect(body_as_json.pluck(:id)) + .to match_array( + user_featured_tags.pluck(:id).map(&:to_s) + ) end end end @@ -69,9 +67,10 @@ RSpec.describe 'FeaturedTags' do it 'returns the correct tag name' do post '/api/v1/featured_tags', headers: headers, params: params - body = body_as_json - - expect(body[:name]).to eq(params[:name]) + expect(body_as_json) + .to include( + name: params[:name] + ) end it 'creates a new featured tag for the requesting user' do @@ -142,9 +141,7 @@ RSpec.describe 'FeaturedTags' do it 'returns an empty body' do delete "/api/v1/featured_tags/#{id}", headers: headers - body = body_as_json - - expect(body).to be_empty + expect(body_as_json).to be_empty end it 'deletes the featured tag', :inline_jobs do diff --git a/spec/requests/api/v1/markers_spec.rb b/spec/requests/api/v1/markers_spec.rb index b04adf2594..2dbb9d205a 100644 --- a/spec/requests/api/v1/markers_spec.rb +++ b/spec/requests/api/v1/markers_spec.rb @@ -17,13 +17,12 @@ RSpec.describe 'API Markers' do end it 'returns markers', :aggregate_failures do - json = body_as_json - expect(response).to have_http_status(200) - expect(json.key?(:home)).to be true - expect(json[:home][:last_read_id]).to eq '123' - expect(json.key?(:notifications)).to be true - expect(json[:notifications][:last_read_id]).to eq '456' + expect(body_as_json) + .to include( + home: include(last_read_id: '123'), + notifications: include(last_read_id: '456') + ) end end diff --git a/spec/requests/api/v1/mutes_spec.rb b/spec/requests/api/v1/mutes_spec.rb index 019bf16584..988bb3c399 100644 --- a/spec/requests/api/v1/mutes_spec.rb +++ b/spec/requests/api/v1/mutes_spec.rb @@ -58,10 +58,8 @@ RSpec.describe 'Mutes' do it 'queries mutes in range according to max_id', :aggregate_failures do subject - body = body_as_json - - expect(body.size).to eq 1 - expect(body[0][:id]).to eq mutes[0].target_account_id.to_s + expect(body_as_json) + .to contain_exactly(include(id: mutes.first.target_account_id.to_s)) end end @@ -71,10 +69,8 @@ RSpec.describe 'Mutes' do it 'queries mutes in range according to since_id', :aggregate_failures do subject - body = body_as_json - - expect(body.size).to eq 1 - expect(body[0][:id]).to eq mutes[1].target_account_id.to_s + expect(body_as_json) + .to contain_exactly(include(id: mutes[1].target_account_id.to_s)) end end diff --git a/spec/requests/api/v1/statuses/reblogs_spec.rb b/spec/requests/api/v1/statuses/reblogs_spec.rb index 503d804ed0..77542d294e 100644 --- a/spec/requests/api/v1/statuses/reblogs_spec.rb +++ b/spec/requests/api/v1/statuses/reblogs_spec.rb @@ -24,11 +24,14 @@ describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be true - hash_body = body_as_json - - expect(hash_body[:reblog][:id]).to eq status.id.to_s - expect(hash_body[:reblog][:reblogs_count]).to eq 1 - expect(hash_body[:reblog][:reblogged]).to be true + expect(body_as_json) + .to include( + reblog: include( + id: status.id.to_s, + reblogs_count: 1, + reblogged: true + ) + ) end end @@ -57,11 +60,12 @@ describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be false - hash_body = body_as_json - - expect(hash_body[:id]).to eq status.id.to_s - expect(hash_body[:reblogs_count]).to eq 0 - expect(hash_body[:reblogged]).to be false + expect(body_as_json) + .to include( + id: status.id.to_s, + reblogs_count: 0, + reblogged: false + ) end end @@ -81,11 +85,12 @@ describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be false - hash_body = body_as_json - - expect(hash_body[:id]).to eq status.id.to_s - expect(hash_body[:reblogs_count]).to eq 0 - expect(hash_body[:reblogged]).to be false + expect(body_as_json) + .to include( + id: status.id.to_s, + reblogs_count: 0, + reblogged: false + ) end end diff --git a/spec/requests/api/v1/suggestions_spec.rb b/spec/requests/api/v1/suggestions_spec.rb index dc89613fc5..b900c910df 100644 --- a/spec/requests/api/v1/suggestions_spec.rb +++ b/spec/requests/api/v1/suggestions_spec.rb @@ -32,10 +32,8 @@ RSpec.describe 'Suggestions' do it 'returns accounts' do subject - body = body_as_json - - expect(body.size).to eq 2 - expect(body.pluck(:id)).to match_array([bob, jeff].map { |i| i.id.to_s }) + expect(body_as_json) + .to contain_exactly(include(id: bob.id.to_s), include(id: jeff.id.to_s)) end context 'with limit param' do diff --git a/spec/requests/api/v2/filters/keywords_spec.rb b/spec/requests/api/v2/filters/keywords_spec.rb index 55fb2afd95..69eff5a064 100644 --- a/spec/requests/api/v2/filters/keywords_spec.rb +++ b/spec/requests/api/v2/filters/keywords_spec.rb @@ -42,9 +42,11 @@ RSpec.describe 'API V2 Filters Keywords' do it 'creates a filter', :aggregate_failures do expect(response).to have_http_status(200) - json = body_as_json - expect(json[:keyword]).to eq 'magic' - expect(json[:whole_word]).to be false + expect(body_as_json) + .to include( + keyword: 'magic', + whole_word: false + ) filter = user.account.custom_filters.first expect(filter).to_not be_nil @@ -71,9 +73,11 @@ RSpec.describe 'API V2 Filters Keywords' do it 'responds with the keyword', :aggregate_failures do expect(response).to have_http_status(200) - json = body_as_json - expect(json[:keyword]).to eq 'foo' - expect(json[:whole_word]).to be false + expect(body_as_json) + .to include( + keyword: 'foo', + whole_word: false + ) end context "when trying to access another user's filter keyword" do diff --git a/spec/requests/api/v2/filters/statuses_spec.rb b/spec/requests/api/v2/filters/statuses_spec.rb index 26d2fb00e1..5969327829 100644 --- a/spec/requests/api/v2/filters/statuses_spec.rb +++ b/spec/requests/api/v2/filters/statuses_spec.rb @@ -43,8 +43,10 @@ RSpec.describe 'API V2 Filters Statuses' do it 'creates a filter', :aggregate_failures do expect(response).to have_http_status(200) - json = body_as_json - expect(json[:status_id]).to eq status.id.to_s + expect(body_as_json) + .to include( + status_id: status.id.to_s + ) filter = user.account.custom_filters.first expect(filter).to_not be_nil @@ -71,8 +73,10 @@ RSpec.describe 'API V2 Filters Statuses' do it 'responds with the filter', :aggregate_failures do expect(response).to have_http_status(200) - json = body_as_json - expect(json[:status_id]).to eq status_filter.status_id.to_s + expect(body_as_json) + .to include( + status_id: status_filter.status.id.to_s + ) end context "when trying to access another user's filter keyword" do diff --git a/spec/requests/api/v2/filters_spec.rb b/spec/requests/api/v2/filters_spec.rb index 8609e7dca1..036a6a65a9 100644 --- a/spec/requests/api/v2/filters_spec.rb +++ b/spec/requests/api/v2/filters_spec.rb @@ -58,12 +58,15 @@ RSpec.describe 'Filters' do it 'returns a filter with keywords', :aggregate_failures do subject - json = body_as_json - - expect(json[:title]).to eq 'magic' - expect(json[:filter_action]).to eq 'hide' - expect(json[:context]).to eq ['home'] - expect(json[:keywords].map { |keyword| keyword.slice(:keyword, :whole_word) }).to match [{ keyword: 'magic', whole_word: true }] + expect(body_as_json) + .to include( + title: 'magic', + filter_action: 'hide', + context: %w(home), + keywords: contain_exactly( + include(keyword: 'magic', whole_word: true) + ) + ) end it 'creates a filter', :aggregate_failures do diff --git a/spec/requests/well_known/webfinger_spec.rb b/spec/requests/well_known/webfinger_spec.rb index 0aafdf5624..cd8a35c702 100644 --- a/spec/requests/well_known/webfinger_spec.rb +++ b/spec/requests/well_known/webfinger_spec.rb @@ -129,9 +129,11 @@ describe 'The /.well-known/webfinger endpoint' do end it 'returns links for the internal account' do - json = body_as_json - expect(json[:subject]).to eq 'acct:mastodon.internal@cb6e6126.ngrok.io' - expect(json[:aliases]).to eq ['https://cb6e6126.ngrok.io/actor'] + expect(body_as_json) + .to include( + subject: 'acct:mastodon.internal@cb6e6126.ngrok.io', + aliases: ['https://cb6e6126.ngrok.io/actor'] + ) end end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 5857263f61..7e44789628 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -34,7 +34,7 @@ RSpec.describe PostStatusService do it 'schedules a status for future creation and does not create one immediately' do media = Fabricate(:media_attachment, account: account) - status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) + status = subject.call(account, text: 'Hi future!', media_ids: [media.id.to_s], scheduled_at: future) expect(status) .to be_a(ScheduledStatus) @@ -42,7 +42,7 @@ RSpec.describe PostStatusService do scheduled_at: eq(future), params: include( 'text' => eq('Hi future!'), - 'media_ids' => contain_exactly(media.id) + 'media_ids' => contain_exactly(media.id.to_s) ) ) expect(media.reload.status).to be_nil @@ -219,7 +219,7 @@ RSpec.describe PostStatusService do status = subject.call( account, text: 'test status update', - media_ids: [media.id] + media_ids: [media.id.to_s] ) expect(media.reload.status).to eq status @@ -233,7 +233,7 @@ RSpec.describe PostStatusService do subject.call( account, text: 'test status update', - media_ids: [media.id] + media_ids: [media.id.to_s] ) end.to raise_error( Mastodon::ValidationError, @@ -249,7 +249,7 @@ RSpec.describe PostStatusService do subject.call( account, text: 'test status update', - media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map(&:id) + media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map { |m| m.id.to_s } ) end.to raise_error( Mastodon::ValidationError, @@ -271,7 +271,7 @@ RSpec.describe PostStatusService do media_ids: [ video, image, - ].map(&:id) + ].map { |m| m.id.to_s } ) end.to raise_error( Mastodon::ValidationError, diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb index 47be53f4fc..de06fb13c6 100644 --- a/spec/services/update_status_service_spec.rb +++ b/spec/services/update_status_service_spec.rb @@ -69,7 +69,7 @@ RSpec.describe UpdateStatusService do before do status.media_attachments << detached_media_attachment - subject.call(status, status.account_id, text: 'Foo', media_ids: [attached_media_attachment.id]) + subject.call(status, status.account_id, text: 'Foo', media_ids: [attached_media_attachment.id.to_s]) end it 'updates media attachments' do @@ -95,7 +95,7 @@ RSpec.describe UpdateStatusService do before do status.media_attachments << media_attachment - subject.call(status, status.account_id, text: 'Foo', media_ids: [media_attachment.id], media_attributes: [{ id: media_attachment.id, description: 'New description' }]) + subject.call(status, status.account_id, text: 'Foo', media_ids: [media_attachment.id.to_s], media_attributes: [{ id: media_attachment.id, description: 'New description' }]) end it 'does not detach media attachment' do