Merge commit '34e826f373d20f6230d1ef0aa03ad41a3bdf5998' into glitch-soc/merge-upstream
Conflicts: - `app/helpers/theme_helper.rb`: Conflict caused by our different theme systems. Ported upstream's changes. - `app/models/account.rb`: Upstream basically made a change we already made. Moved constant declaration to match upstream.
This commit is contained in:
commit
6f342a6d4c
|
@ -53,7 +53,7 @@ jobs:
|
||||||
|
|
||||||
# Create or update the pull request
|
# Create or update the pull request
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v6.0.2
|
uses: peter-evans/create-pull-request@v6.0.3
|
||||||
with:
|
with:
|
||||||
commit-message: 'New Crowdin translations'
|
commit-message: 'New Crowdin translations'
|
||||||
title: 'New Crowdin Translations (automated)'
|
title: 'New Crowdin Translations (automated)'
|
||||||
|
|
|
@ -646,7 +646,7 @@ GEM
|
||||||
rspec-mocks (~> 3.0)
|
rspec-mocks (~> 3.0)
|
||||||
sidekiq (>= 5, < 8)
|
sidekiq (>= 5, < 8)
|
||||||
rspec-support (3.13.1)
|
rspec-support (3.13.1)
|
||||||
rubocop (1.62.1)
|
rubocop (1.63.1)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (>= 3.17.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
|
|
|
@ -5,10 +5,10 @@ module ThemeHelper
|
||||||
flavour, theme = flavour_and_skin
|
flavour, theme = flavour_and_skin
|
||||||
|
|
||||||
if theme == 'system'
|
if theme == 'system'
|
||||||
concat stylesheet_pack_tag("skins/#{flavour}/mastodon-light", media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous')
|
stylesheet_pack_tag("skins/#{flavour}/mastodon-light", media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') +
|
||||||
concat stylesheet_pack_tag("skins/#{flavour}/default", media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous')
|
stylesheet_pack_tag("skins/#{flavour}/default", media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous')
|
||||||
else
|
else
|
||||||
concat stylesheet_pack_tag "skins/#{flavour}/#{theme}", media: 'all', crossorigin: 'anonymous'
|
stylesheet_pack_tag "skins/#{flavour}/#{theme}", media: 'all', crossorigin: 'anonymous'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -16,8 +16,8 @@ module ThemeHelper
|
||||||
_, theme = flavour_and_skin
|
_, theme = flavour_and_skin
|
||||||
|
|
||||||
if theme == 'system'
|
if theme == 'system'
|
||||||
concat tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)')
|
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') +
|
||||||
concat tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)')
|
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)')
|
||||||
else
|
else
|
||||||
tag.meta name: 'theme-color', content: theme_color_for(theme)
|
tag.meta name: 'theme-color', content: theme_color_for(theme)
|
||||||
end
|
end
|
||||||
|
|
|
@ -107,7 +107,7 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
||||||
<td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
|
<td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>s</kbd></td>
|
<td><kbd>s</kbd>, <kbd>/</kbd></td>
|
||||||
<td><FormattedMessage id='keyboard_shortcuts.search' defaultMessage='to focus search' /></td>
|
<td><FormattedMessage id='keyboard_shortcuts.search' defaultMessage='to focus search' /></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
@ -89,7 +89,7 @@ const mapStateToProps = state => ({
|
||||||
const keyMap = {
|
const keyMap = {
|
||||||
help: '?',
|
help: '?',
|
||||||
new: 'n',
|
new: 'n',
|
||||||
search: 's',
|
search: ['s', '/'],
|
||||||
forceNew: 'option+n',
|
forceNew: 'option+n',
|
||||||
toggleComposeSpoilers: 'option+x',
|
toggleComposeSpoilers: 'option+x',
|
||||||
focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
|
focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
|
||||||
|
|
|
@ -89,6 +89,14 @@
|
||||||
"announcement.announcement": "Announcement",
|
"announcement.announcement": "Announcement",
|
||||||
"attachments_list.unprocessed": "(unprocessed)",
|
"attachments_list.unprocessed": "(unprocessed)",
|
||||||
"audio.hide": "Hide audio",
|
"audio.hide": "Hide audio",
|
||||||
|
"block_modal.remote_users_caveat": "We will ask the server {domain} to respect your decision. However, compliance is not guaranteed since some servers may handle blocks differently. Public posts may still be visible to non-logged-in users.",
|
||||||
|
"block_modal.show_less": "Show less",
|
||||||
|
"block_modal.show_more": "Show more",
|
||||||
|
"block_modal.they_cant_mention": "They can't mention or follow you.",
|
||||||
|
"block_modal.they_cant_see_posts": "They can't see your posts and you won't see theirs.",
|
||||||
|
"block_modal.they_will_know": "They can see that they're blocked.",
|
||||||
|
"block_modal.title": "Block user?",
|
||||||
|
"block_modal.you_wont_see_mentions": "You won't see posts that mention them.",
|
||||||
"boost_modal.combo": "You can press {combo} to skip this next time",
|
"boost_modal.combo": "You can press {combo} to skip this next time",
|
||||||
"bundle_column_error.copy_stacktrace": "Copy error report",
|
"bundle_column_error.copy_stacktrace": "Copy error report",
|
||||||
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
|
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
|
||||||
|
@ -169,6 +177,7 @@
|
||||||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
||||||
"confirmations.discard_edit_media.confirm": "Discard",
|
"confirmations.discard_edit_media.confirm": "Discard",
|
||||||
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
|
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
|
||||||
|
"confirmations.domain_block.confirm": "Block server",
|
||||||
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
|
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
|
||||||
"confirmations.edit.confirm": "Edit",
|
"confirmations.edit.confirm": "Edit",
|
||||||
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
|
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
|
||||||
|
@ -431,6 +440,7 @@
|
||||||
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
||||||
"notifications.column_settings.alert": "Desktop notifications",
|
"notifications.column_settings.alert": "Desktop notifications",
|
||||||
"notifications.column_settings.favourite": "Favourites:",
|
"notifications.column_settings.favourite": "Favourites:",
|
||||||
|
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
||||||
"notifications.column_settings.follow": "New followers:",
|
"notifications.column_settings.follow": "New followers:",
|
||||||
"notifications.column_settings.follow_request": "New follow requests:",
|
"notifications.column_settings.follow_request": "New follow requests:",
|
||||||
"notifications.column_settings.mention": "Mentions:",
|
"notifications.column_settings.mention": "Mentions:",
|
||||||
|
@ -456,6 +466,15 @@
|
||||||
"notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
|
"notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
|
||||||
"notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
|
"notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
|
||||||
"notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
|
"notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
|
||||||
|
"notifications.policy.filter_new_accounts.hint": "Created within the past {days, plural, one {one day} other {# days}}",
|
||||||
|
"notifications.policy.filter_new_accounts_title": "New accounts",
|
||||||
|
"notifications.policy.filter_not_followers_hint": "Including people who have been following you fewer than {days, plural, one {one day} other {# days}}",
|
||||||
|
"notifications.policy.filter_not_followers_title": "People not following you",
|
||||||
|
"notifications.policy.filter_not_following_hint": "Until you manually approve them",
|
||||||
|
"notifications.policy.filter_not_following_title": "People you don't follow",
|
||||||
|
"notifications.policy.filter_private_mentions_hint": "Filtered unless it's in reply to your own mention or if you follow the sender",
|
||||||
|
"notifications.policy.filter_private_mentions_title": "Unsolicited private mentions",
|
||||||
|
"notifications.policy.title": "Filter out notifications from…",
|
||||||
"notifications_permission_banner.enable": "Enable desktop notifications",
|
"notifications_permission_banner.enable": "Enable desktop notifications",
|
||||||
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
|
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
|
||||||
"notifications_permission_banner.title": "Never miss a thing",
|
"notifications_permission_banner.title": "Never miss a thing",
|
||||||
|
@ -632,9 +651,11 @@
|
||||||
"status.direct": "Privately mention @{name}",
|
"status.direct": "Privately mention @{name}",
|
||||||
"status.direct_indicator": "Private mention",
|
"status.direct_indicator": "Private mention",
|
||||||
"status.edit": "Edit",
|
"status.edit": "Edit",
|
||||||
|
"status.edited": "Last edited {date}",
|
||||||
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
||||||
"status.embed": "Embed",
|
"status.embed": "Embed",
|
||||||
"status.favourite": "Favourite",
|
"status.favourite": "Favourite",
|
||||||
|
"status.favourites": "{count, plural, one {favorite} other {favorites}}",
|
||||||
"status.filter": "Filter this post",
|
"status.filter": "Filter this post",
|
||||||
"status.filtered": "Filtered",
|
"status.filtered": "Filtered",
|
||||||
"status.hide": "Hide post",
|
"status.hide": "Hide post",
|
||||||
|
@ -655,6 +676,7 @@
|
||||||
"status.reblog": "Boost",
|
"status.reblog": "Boost",
|
||||||
"status.reblog_private": "Boost with original visibility",
|
"status.reblog_private": "Boost with original visibility",
|
||||||
"status.reblogged_by": "{name} boosted",
|
"status.reblogged_by": "{name} boosted",
|
||||||
|
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
|
||||||
"status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
|
"status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
|
||||||
"status.redraft": "Delete & re-draft",
|
"status.redraft": "Delete & re-draft",
|
||||||
"status.remove_bookmark": "Remove bookmark",
|
"status.remove_bookmark": "Remove bookmark",
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
"compose.published.open": "Ireki",
|
"compose.published.open": "Ireki",
|
||||||
"compose.saved.body": "Argitalpena gorde da.",
|
"compose.saved.body": "Argitalpena gorde da.",
|
||||||
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
|
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
|
||||||
"compose_form.encryption_warning": "Mastodoneko bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
|
"compose_form.encryption_warning": "Mastodon-go bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
|
||||||
"compose_form.hashtag_warning": "Tut hau ez da inolako traolatan zerrendatuko, ez baita publikoa. Tut publikoak soilik traolen bitartez bila daitezke.",
|
"compose_form.hashtag_warning": "Tut hau ez da inolako traolatan zerrendatuko, ez baita publikoa. Tut publikoak soilik traolen bitartez bila daitezke.",
|
||||||
"compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
|
"compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
|
||||||
"compose_form.lock_disclaimer.lock": "giltzapetuta",
|
"compose_form.lock_disclaimer.lock": "giltzapetuta",
|
||||||
|
@ -345,7 +345,7 @@
|
||||||
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
|
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
|
||||||
"home.column_settings.show_replies": "Erakutsi erantzunak",
|
"home.column_settings.show_replies": "Erakutsi erantzunak",
|
||||||
"home.hide_announcements": "Ezkutatu iragarpenak",
|
"home.hide_announcements": "Ezkutatu iragarpenak",
|
||||||
"home.pending_critical_update.body": "Eguneratu zure Mastodoneko zerbitzaria leheinbailehen!",
|
"home.pending_critical_update.body": "Eguneratu zure Mastodon-go zerbitzaria leheinbailehen!",
|
||||||
"home.pending_critical_update.link": "Ikusi eguneraketak",
|
"home.pending_critical_update.link": "Ikusi eguneraketak",
|
||||||
"home.pending_critical_update.title": "Segurtasun eguneraketa kritikoa eskuragarri!",
|
"home.pending_critical_update.title": "Segurtasun eguneraketa kritikoa eskuragarri!",
|
||||||
"home.show_announcements": "Erakutsi iragarpenak",
|
"home.show_announcements": "Erakutsi iragarpenak",
|
||||||
|
@ -548,7 +548,7 @@
|
||||||
"onboarding.share.message": "{username} naiz #Mastodon-en! Jarrai nazazu hemen: {url}",
|
"onboarding.share.message": "{username} naiz #Mastodon-en! Jarrai nazazu hemen: {url}",
|
||||||
"onboarding.share.next_steps": "Hurrengo urrats posibleak:",
|
"onboarding.share.next_steps": "Hurrengo urrats posibleak:",
|
||||||
"onboarding.share.title": "Partekatu zure profila",
|
"onboarding.share.title": "Partekatu zure profila",
|
||||||
"onboarding.start.lead": "Mastodonen parte zara orain, bakarra eta deszentralizatua den sare-sozialaren plataforma, non zuk, eta ez algoritmo batek, zeure esperientzia pertsonaliza dezakezun. Igaro ezazu muga soziala:",
|
"onboarding.start.lead": "Mastodon-en parte zara orain, bakarra eta deszentralizatua den sare sozialaren plataforma, non zuk, eta ez algoritmo batek, zeure esperientzia pertsonaliza dezakezun. Igaro ezazu muga soziala:",
|
||||||
"onboarding.start.skip": "Urrats guztiak saltatu nahi dituzu?",
|
"onboarding.start.skip": "Urrats guztiak saltatu nahi dituzu?",
|
||||||
"onboarding.start.title": "Lortu duzu!",
|
"onboarding.start.title": "Lortu duzu!",
|
||||||
"onboarding.steps.follow_people.body": "Zure jarioa zuk pertsonalizatzen duzu. Bete dezagun jende interesgarriaz.",
|
"onboarding.steps.follow_people.body": "Zure jarioa zuk pertsonalizatzen duzu. Bete dezagun jende interesgarriaz.",
|
||||||
|
@ -562,7 +562,7 @@
|
||||||
"onboarding.tips.2fa": "<strong>Bazenekien?</strong> Zure kontua babes dezakezu, bi faktoreko autentifikazioa zure kontuko ezarpenetan ezarriaz. Edozein TOTP aplikaziorekin dabil, ez da telefono-zenbakirik behar!",
|
"onboarding.tips.2fa": "<strong>Bazenekien?</strong> Zure kontua babes dezakezu, bi faktoreko autentifikazioa zure kontuko ezarpenetan ezarriaz. Edozein TOTP aplikaziorekin dabil, ez da telefono-zenbakirik behar!",
|
||||||
"onboarding.tips.accounts_from_other_servers": "<strong>Badakizu?</strong> Mastodon deszentralizatua denez, beste zerbitzarietako profilak topatuko dituzu. Eta, hala ere, arazorik gabe jardun dezakezu haiekin! Haien zerbitzaria erabiltzaile-izenaren bigarren erdian dago!",
|
"onboarding.tips.accounts_from_other_servers": "<strong>Badakizu?</strong> Mastodon deszentralizatua denez, beste zerbitzarietako profilak topatuko dituzu. Eta, hala ere, arazorik gabe jardun dezakezu haiekin! Haien zerbitzaria erabiltzaile-izenaren bigarren erdian dago!",
|
||||||
"onboarding.tips.migration": "<strong>Bazenekien?</strong> Uste baduzu {domain} ez dela aukera on bat zuretzako etorkizunari begira, beste Mastodon zerbitzari batera alda zaitezke, zure jarraitzaileak galdu gabe. Zure zerbitzaria propioa ere ostata dezakezu!",
|
"onboarding.tips.migration": "<strong>Bazenekien?</strong> Uste baduzu {domain} ez dela aukera on bat zuretzako etorkizunari begira, beste Mastodon zerbitzari batera alda zaitezke, zure jarraitzaileak galdu gabe. Zure zerbitzaria propioa ere ostata dezakezu!",
|
||||||
"onboarding.tips.verification": "<strong>Bazenekien?</strong> Zure kontua egiazta dezakezu zure webgunean zure Mastodoneko profilaren esteka jarriz, eta profilean webgunea gehituz. Ordainketa edo dokumenturik gabe!",
|
"onboarding.tips.verification": "<strong>Bazenekien?</strong> Zure kontua egiazta dezakezu zure webgunean zure Mastodon-go profilaren esteka jarriz, eta profilean webgunea gehituz. Ordainketa edo dokumenturik gabe!",
|
||||||
"password_confirmation.exceeds_maxlength": "Pasahitzaren berrespenak pasahitzaren gehienezko luzera gainditzen du",
|
"password_confirmation.exceeds_maxlength": "Pasahitzaren berrespenak pasahitzaren gehienezko luzera gainditzen du",
|
||||||
"password_confirmation.mismatching": "Pasahitzaren berrespena ez dator bat",
|
"password_confirmation.mismatching": "Pasahitzaren berrespena ez dator bat",
|
||||||
"picture_in_picture.restore": "Leheneratu",
|
"picture_in_picture.restore": "Leheneratu",
|
||||||
|
|
|
@ -701,7 +701,7 @@
|
||||||
"status.direct": "@{name} 님에게 개인적으로 멘션",
|
"status.direct": "@{name} 님에게 개인적으로 멘션",
|
||||||
"status.direct_indicator": "개인적인 멘션",
|
"status.direct_indicator": "개인적인 멘션",
|
||||||
"status.edit": "수정",
|
"status.edit": "수정",
|
||||||
"status.edited": "%{date}에 마지막으로 편집됨",
|
"status.edited": "{date}에 마지막으로 편집됨",
|
||||||
"status.edited_x_times": "{count}번 수정됨",
|
"status.edited_x_times": "{count}번 수정됨",
|
||||||
"status.embed": "임베드",
|
"status.embed": "임베드",
|
||||||
"status.favourite": "좋아요",
|
"status.favourite": "좋아요",
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
"account.badges.bot": "อัตโนมัติ",
|
"account.badges.bot": "อัตโนมัติ",
|
||||||
"account.badges.group": "กลุ่ม",
|
"account.badges.group": "กลุ่ม",
|
||||||
"account.block": "ปิดกั้น @{name}",
|
"account.block": "ปิดกั้น @{name}",
|
||||||
"account.block_domain": "ปิดกั้นโดเมน {domain}",
|
"account.block_domain": "เลิกปิดกั้นโดเมน {domain} แล้ว",
|
||||||
"account.block_short": "ปิดกั้น",
|
"account.block_short": "ปิดกั้น",
|
||||||
"account.blocked": "ปิดกั้นอยู่",
|
"account.blocked": "ปิดกั้นอยู่",
|
||||||
"account.browse_more_on_origin_server": "เรียกดูเพิ่มเติมในโปรไฟล์ดั้งเดิม",
|
"account.browse_more_on_origin_server": "เรียกดูเพิ่มเติมในโปรไฟล์ดั้งเดิม",
|
||||||
"account.cancel_follow_request": "ยกเลิกการติดตาม",
|
"account.cancel_follow_request": "ยกเลิกการติดตาม",
|
||||||
"account.copy": "คัดลอกลิงก์ไปยังโปรไฟล์",
|
"account.copy": "Copy link to profile",
|
||||||
"account.direct": "กล่าวถึง @{name} แบบส่วนตัว",
|
"account.direct": "กล่าวถึง @{name} แบบส่วนตัว",
|
||||||
"account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
|
"account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
|
||||||
"account.domain_blocked": "ปิดกั้นโดเมนอยู่",
|
"account.domain_blocked": "ปิดกั้นโดเมนอยู่",
|
||||||
|
|
|
@ -64,6 +64,7 @@ class Account < ApplicationRecord
|
||||||
)
|
)
|
||||||
|
|
||||||
BACKGROUND_REFRESH_INTERVAL = 1.week.freeze
|
BACKGROUND_REFRESH_INTERVAL = 1.week.freeze
|
||||||
|
DEFAULT_FIELDS_SIZE = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
|
||||||
INSTANCE_ACTOR_ID = -99
|
INSTANCE_ACTOR_ID = -99
|
||||||
|
|
||||||
USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i
|
USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i
|
||||||
|
@ -88,7 +89,6 @@ class Account < ApplicationRecord
|
||||||
|
|
||||||
MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
|
MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
|
||||||
MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i
|
MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i
|
||||||
DEFAULT_FIELDS_SIZE = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
|
|
||||||
|
|
||||||
enum :protocol, { ostatus: 0, activitypub: 1 }
|
enum :protocol, { ostatus: 0, activitypub: 1 }
|
||||||
enum :suspension_origin, { local: 0, remote: 1 }, prefix: true
|
enum :suspension_origin, { local: 0, remote: 1 }, prefix: true
|
||||||
|
|
|
@ -12,6 +12,7 @@ en-GB:
|
||||||
last_attempt: You have one more attempt before your account is locked.
|
last_attempt: You have one more attempt before your account is locked.
|
||||||
locked: Your account is locked.
|
locked: Your account is locked.
|
||||||
not_found_in_database: Invalid %{authentication_keys} or password.
|
not_found_in_database: Invalid %{authentication_keys} or password.
|
||||||
|
omniauth_user_creation_failure: Error creating an account for this identity.
|
||||||
pending: Your account is still under review.
|
pending: Your account is still under review.
|
||||||
timeout: Your session expired. Please log in again to continue.
|
timeout: Your session expired. Please log in again to continue.
|
||||||
unauthenticated: You need to log in or sign up before continuing.
|
unauthenticated: You need to log in or sign up before continuing.
|
||||||
|
|
|
@ -597,6 +597,9 @@ en-GB:
|
||||||
actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an e-mail notification will be sent to them, except when the <strong>Spam</strong> category is selected.
|
actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an e-mail notification will be sent to them, except when the <strong>Spam</strong> category is selected.
|
||||||
actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how <strong>your</strong> server communicates with this remote account and handle its content.
|
actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how <strong>your</strong> server communicates with this remote account and handle its content.
|
||||||
add_to_report: Add more to report
|
add_to_report: Add more to report
|
||||||
|
already_suspended_badges:
|
||||||
|
local: Already suspended on this server
|
||||||
|
remote: Already suspended on their server
|
||||||
are_you_sure: Are you sure?
|
are_you_sure: Are you sure?
|
||||||
assign_to_self: Assign to me
|
assign_to_self: Assign to me
|
||||||
assigned: Assigned moderator
|
assigned: Assigned moderator
|
||||||
|
@ -767,6 +770,7 @@ en-GB:
|
||||||
disabled: To no one
|
disabled: To no one
|
||||||
users: To logged-in local users
|
users: To logged-in local users
|
||||||
registrations:
|
registrations:
|
||||||
|
moderation_recommandation: Please make sure you have an adequate and reactive moderation team before you open registrations to everyone!
|
||||||
preamble: Control who can create an account on your server.
|
preamble: Control who can create an account on your server.
|
||||||
title: Registrations
|
title: Registrations
|
||||||
registrations_mode:
|
registrations_mode:
|
||||||
|
@ -774,6 +778,7 @@ en-GB:
|
||||||
approved: Approval required for sign up
|
approved: Approval required for sign up
|
||||||
none: Nobody can sign up
|
none: Nobody can sign up
|
||||||
open: Anyone can sign up
|
open: Anyone can sign up
|
||||||
|
warning_hint: We recommend using “Approval required for sign up” unless you are confident your moderation team can handle spam and malicious registrations in a timely fashion.
|
||||||
security:
|
security:
|
||||||
authorized_fetch: Require authentication from federated servers
|
authorized_fetch: Require authentication from federated servers
|
||||||
authorized_fetch_hint: Requiring authentication from federated servers enables stricter enforcement of both user-level and server-level blocks. However, this comes at the cost of a performance penalty, reduces the reach of your replies, and may introduce compatibility issues with some federated services. In addition, this will not prevent dedicated actors from fetching your public posts and accounts.
|
authorized_fetch_hint: Requiring authentication from federated servers enables stricter enforcement of both user-level and server-level blocks. However, this comes at the cost of a performance penalty, reduces the reach of your replies, and may introduce compatibility issues with some federated services. In addition, this will not prevent dedicated actors from fetching your public posts and accounts.
|
||||||
|
@ -966,6 +971,9 @@ en-GB:
|
||||||
title: Webhooks
|
title: Webhooks
|
||||||
webhook: Webhook
|
webhook: Webhook
|
||||||
admin_mailer:
|
admin_mailer:
|
||||||
|
auto_close_registrations:
|
||||||
|
body: Due to a lack of recent moderator activity, registrations on %{instance} have been automatically switched to requiring manual review, to prevent %{instance} from being used as a platform for potential bad actors. You can switch it back to open registrations at any time.
|
||||||
|
subject: Registrations for %{instance} have been automatically switched to requiring approval
|
||||||
new_appeal:
|
new_appeal:
|
||||||
actions:
|
actions:
|
||||||
delete_statuses: to delete their posts
|
delete_statuses: to delete their posts
|
||||||
|
@ -1647,13 +1655,26 @@ en-GB:
|
||||||
import: Import
|
import: Import
|
||||||
import_and_export: Import and export
|
import_and_export: Import and export
|
||||||
migrate: Account migration
|
migrate: Account migration
|
||||||
|
notifications: E-mail notifications
|
||||||
preferences: Preferences
|
preferences: Preferences
|
||||||
profile: Profile
|
profile: Profile
|
||||||
relationships: Follows and followers
|
relationships: Follows and followers
|
||||||
|
severed_relationships: Severed relationships
|
||||||
statuses_cleanup: Automated post deletion
|
statuses_cleanup: Automated post deletion
|
||||||
strikes: Moderation strikes
|
strikes: Moderation strikes
|
||||||
two_factor_authentication: Two-factor Auth
|
two_factor_authentication: Two-factor Auth
|
||||||
webauthn_authentication: Security keys
|
webauthn_authentication: Security keys
|
||||||
|
severed_relationships:
|
||||||
|
download: Download (%{count})
|
||||||
|
event_type:
|
||||||
|
account_suspension: Account suspension (%{target_name})
|
||||||
|
domain_block: Server suspension (%{target_name})
|
||||||
|
user_domain_block: You blocked %{target_name}
|
||||||
|
lost_followers: Lost followers
|
||||||
|
lost_follows: Lost follows
|
||||||
|
preamble: You may lose follows and followers when you block a domain or when your moderators decide to suspend a remote server. When that happens, you will be able to download lists of severed relationships, to be inspected and possibly imported on another server.
|
||||||
|
purged: Information about this server has been purged by your server's administrators.
|
||||||
|
type: Event
|
||||||
statuses:
|
statuses:
|
||||||
attached:
|
attached:
|
||||||
audio:
|
audio:
|
||||||
|
@ -1747,6 +1768,7 @@ en-GB:
|
||||||
contrast: Mastodon (High contrast)
|
contrast: Mastodon (High contrast)
|
||||||
default: Mastodon (Dark)
|
default: Mastodon (Dark)
|
||||||
mastodon-light: Mastodon (Light)
|
mastodon-light: Mastodon (Light)
|
||||||
|
system: Automatic (use system theme)
|
||||||
time:
|
time:
|
||||||
formats:
|
formats:
|
||||||
default: "%b %d, %Y, %H:%M"
|
default: "%b %d, %Y, %H:%M"
|
||||||
|
@ -1834,7 +1856,44 @@ en-GB:
|
||||||
silence: Account limited
|
silence: Account limited
|
||||||
suspend: Account suspended
|
suspend: Account suspended
|
||||||
welcome:
|
welcome:
|
||||||
|
apps_android_action: Get it on Google Play
|
||||||
|
apps_ios_action: Download on the App Store
|
||||||
|
apps_step: Download our official apps.
|
||||||
|
apps_title: Mastodon apps
|
||||||
|
checklist_subtitle: 'Let''s get you started on this new social frontier:'
|
||||||
|
checklist_title: Welcome Checklist
|
||||||
|
edit_profile_action: Personalise
|
||||||
|
edit_profile_step: Boost your interactions by having a comprehensive profile.
|
||||||
|
edit_profile_title: Personalise your profile
|
||||||
explanation: Here are some tips to get you started
|
explanation: Here are some tips to get you started
|
||||||
|
feature_action: Learn more
|
||||||
|
feature_audience: Mastodon provides you with a unique possibility of managing your audience without middlemen. Mastodon deployed on your own infrastructure allows you to follow and be followed from any other Mastodon server online and is under no one's control but yours.
|
||||||
|
feature_audience_title: Build your audience in confidence
|
||||||
|
feature_control: You know best what you want to see on your home feed. No algorithms or ads to waste your time. Follow anyone across any Mastodon server from a single account and receive their posts in chronological order, and make your corner of the Internet a little more like you.
|
||||||
|
feature_control_title: Stay in control of your own timeline
|
||||||
|
feature_creativity: Mastodon supports audio, video and picture posts, accessibility descriptions, polls, content warnings, animated avatars, custom emojis, thumbnail crop control, and more, to help you express yourself online. Whether you're publishing your art, your music, or your podcast, Mastodon is there for you.
|
||||||
|
feature_creativity_title: Unparalleled creativity
|
||||||
|
feature_moderation: Mastodon puts decision making back in your hands. Each server creates their own rules and regulations, which are enforced locally and not top-down like corporate social media, making it the most flexible in responding to the needs of different groups of people. Join a server with the rules you agree with, or host your own.
|
||||||
|
feature_moderation_title: Moderating the way it should be
|
||||||
|
follow_action: Follow
|
||||||
|
follow_step: Following interesting people is what Mastodon is all about.
|
||||||
|
follow_title: Personalise your home feed
|
||||||
|
follows_subtitle: Follow well-known accounts
|
||||||
|
follows_title: Who to follow
|
||||||
|
follows_view_more: View more people to follow
|
||||||
|
hashtags_recent_count:
|
||||||
|
one: "%{people} person in the past 2 days"
|
||||||
|
other: "%{people} people in the past 2 days"
|
||||||
|
hashtags_subtitle: Explore what’s trending since past 2 days
|
||||||
|
hashtags_title: Trending hashtags
|
||||||
|
hashtags_view_more: View more trending hashtags
|
||||||
|
post_action: Compose
|
||||||
|
post_step: Say hello to the world with text, photos, videos, or polls.
|
||||||
|
post_title: Make your first post
|
||||||
|
share_action: Share
|
||||||
|
share_step: Let your friends know how to find you on Mastodon.
|
||||||
|
share_title: Share your Mastodon profile
|
||||||
|
sign_in_action: Sign in
|
||||||
subject: Welcome to Mastodon
|
subject: Welcome to Mastodon
|
||||||
title: Welcome aboard, %{name}!
|
title: Welcome aboard, %{name}!
|
||||||
users:
|
users:
|
||||||
|
|
|
@ -39,12 +39,14 @@ en-GB:
|
||||||
text: You can only appeal a strike once
|
text: You can only appeal a strike once
|
||||||
defaults:
|
defaults:
|
||||||
autofollow: People who sign up through the invite will automatically follow you
|
autofollow: People who sign up through the invite will automatically follow you
|
||||||
|
avatar: WEBP, PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
|
||||||
bot: Signal to others that the account mainly performs automated actions and might not be monitored
|
bot: Signal to others that the account mainly performs automated actions and might not be monitored
|
||||||
context: One or multiple contexts where the filter should apply
|
context: One or multiple contexts where the filter should apply
|
||||||
current_password: For security purposes please enter the password of the current account
|
current_password: For security purposes please enter the password of the current account
|
||||||
current_username: To confirm, please enter the username of the current account
|
current_username: To confirm, please enter the username of the current account
|
||||||
digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
|
digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
|
||||||
email: You will be sent a confirmation e-mail
|
email: You will be sent a confirmation e-mail
|
||||||
|
header: WEBP, PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
|
||||||
inbox_url: Copy the URL from the frontpage of the relay you want to use
|
inbox_url: Copy the URL from the frontpage of the relay you want to use
|
||||||
irreversible: Filtered posts will disappear irreversibly, even if filter is later removed
|
irreversible: Filtered posts will disappear irreversibly, even if filter is later removed
|
||||||
locale: The language of the user interface, e-mails and push notifications
|
locale: The language of the user interface, e-mails and push notifications
|
||||||
|
@ -114,6 +116,7 @@ en-GB:
|
||||||
sign_up_requires_approval: New sign-ups will require your approval
|
sign_up_requires_approval: New sign-ups will require your approval
|
||||||
severity: Choose what will happen with requests from this IP
|
severity: Choose what will happen with requests from this IP
|
||||||
rule:
|
rule:
|
||||||
|
hint: Optional. Provide more details about the rule
|
||||||
text: Describe a rule or requirement for users on this server. Try to keep it short and simple
|
text: Describe a rule or requirement for users on this server. Try to keep it short and simple
|
||||||
sessions:
|
sessions:
|
||||||
otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:'
|
otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:'
|
||||||
|
@ -297,6 +300,7 @@ en-GB:
|
||||||
patch: Notify on bugfix updates
|
patch: Notify on bugfix updates
|
||||||
trending_tag: New trend requires review
|
trending_tag: New trend requires review
|
||||||
rule:
|
rule:
|
||||||
|
hint: Additional information
|
||||||
text: Rule
|
text: Rule
|
||||||
settings:
|
settings:
|
||||||
indexable: Include profile page in search engines
|
indexable: Include profile page in search engines
|
||||||
|
|
|
@ -3,7 +3,7 @@ eu:
|
||||||
simple_form:
|
simple_form:
|
||||||
hints:
|
hints:
|
||||||
account:
|
account:
|
||||||
discoverable: Zure bidalketa publikoak eta profila nabarmendu edo gomendatu egin daitezke Mastodoneko hainbat eremutan eta zure profila beste erabiltzaile batzuei iradoki dakieke.
|
discoverable: Zure bidalketa publikoak eta profila nabarmendu edo gomendatu egin daitezke Mastodon-go hainbat eremutan eta zure profila beste erabiltzaile batzuei iradoki dakieke.
|
||||||
display_name: Zure izena edo ezizena.
|
display_name: Zure izena edo ezizena.
|
||||||
fields: Zure webgunea, izenordainak, adina, nahi duzun guztia.
|
fields: Zure webgunea, izenordainak, adina, nahi duzun guztia.
|
||||||
indexable: Zure argitalpen publikoak bilaketa-emaitzetan ager daitezke Mastodonen. Zure argitalpenekin elkarregin duten jendeak ikusi ahal izango dituzte, hala ere.
|
indexable: Zure argitalpen publikoak bilaketa-emaitzetan ager daitezke Mastodonen. Zure argitalpenekin elkarregin duten jendeak ikusi ahal izango dituzte, hala ere.
|
||||||
|
|
|
@ -228,7 +228,7 @@ tr:
|
||||||
title: Başlık
|
title: Başlık
|
||||||
type: İçeri aktarma türü
|
type: İçeri aktarma türü
|
||||||
username: Kullanıcı adı
|
username: Kullanıcı adı
|
||||||
username_or_email: Kullanıcı adı ya da e-posta
|
username_or_email: Kullanıcı adı veya e-posta
|
||||||
whole_word: Tam sözcük
|
whole_word: Tam sözcük
|
||||||
email_domain_block:
|
email_domain_block:
|
||||||
with_dns_records: Alan adının MX kayıtlarını ve IP'lerini ekleyin
|
with_dns_records: Alan adının MX kayıtlarını ve IP'lerini ekleyin
|
||||||
|
@ -269,7 +269,7 @@ tr:
|
||||||
interactions:
|
interactions:
|
||||||
must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle
|
must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle
|
||||||
must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle
|
must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle
|
||||||
must_be_following_dm: Takip etmediğiniz kişilerden gelen direkt mesajları engelle
|
must_be_following_dm: Takip etmediğiniz kişilerden gelen doğrudan iletileri engelle
|
||||||
invite:
|
invite:
|
||||||
comment: Yorum
|
comment: Yorum
|
||||||
invite_request:
|
invite_request:
|
||||||
|
|
|
@ -1835,6 +1835,7 @@ th:
|
||||||
edit_profile_title: ปรับแต่งโปรไฟล์ของคุณ
|
edit_profile_title: ปรับแต่งโปรไฟล์ของคุณ
|
||||||
explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน
|
explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน
|
||||||
feature_action: เรียนรู้เพิ่มเติม
|
feature_action: เรียนรู้เพิ่มเติม
|
||||||
|
feature_audience: Mastodon มีความพิเศษที่ให้คุณจัดการผู้รับสารของคุณได้โดยไม่มีตัวกลาง นอกจากนี้ การติดตั้ง Mastodon บนโครงสร้างพื้นฐานของคุณจะทำให้คุณสามารถติดตาม (และติดตามโดย) เซิร์ฟเวอร์ Mastodon แห่งไหนก็ได้ที่ทำงานอยู่ โดยไม่มีใครสามารถควบคุมได้นอกจากคุณ
|
||||||
follow_action: ติดตาม
|
follow_action: ติดตาม
|
||||||
follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ
|
follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ
|
||||||
follow_title: ปรับแต่งฟีดหน้าแรกของคุณ
|
follow_title: ปรับแต่งฟีดหน้าแรกของคุณ
|
||||||
|
|
|
@ -3,16 +3,32 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::InstanceAccountsDimension do
|
describe Admin::Metrics::Dimension::InstanceAccountsDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:limit) { 10 }
|
let(:limit) { 10 }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new(domain: domain) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:domain) { 'host.example' }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: domain) }
|
||||||
|
let(:bob) { Fabricate(:account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate :follow, target_account: alice
|
||||||
|
Fabricate :follow, target_account: bob
|
||||||
|
Fabricate :status, account: alice
|
||||||
|
Fabricate :status, account: bob
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns instances with follow counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(1)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: alice.username, value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,16 +3,30 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::InstanceLanguagesDimension do
|
describe Admin::Metrics::Dimension::InstanceLanguagesDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:limit) { 10 }
|
let(:limit) { 10 }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new(domain: domain) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:domain) { 'host.example' }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: domain) }
|
||||||
|
let(:bob) { Fabricate(:account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate :status, account: alice, language: 'en'
|
||||||
|
Fabricate :status, account: bob, language: 'es'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns locales with status counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(1)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: 'en', value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::ServersDimension do
|
describe Admin::Metrics::Dimension::ServersDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
|
@ -11,8 +11,24 @@ describe Admin::Metrics::Dimension::ServersDimension do
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:domain) { 'host.example' }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: domain) }
|
||||||
|
let(:bob) { Fabricate(:account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate :status, account: alice, created_at: 1.day.ago
|
||||||
|
Fabricate :status, account: alice, created_at: 30.days.ago
|
||||||
|
Fabricate :status, account: bob, created_at: 1.day.ago
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns domains with status counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(2)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: domain, value: '1'),
|
||||||
|
include(key: Rails.configuration.x.local_domain, value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::SoftwareVersionsDimension do
|
describe Admin::Metrics::Dimension::SoftwareVersionsDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
|
@ -11,8 +11,12 @@ describe Admin::Metrics::Dimension::SoftwareVersionsDimension do
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'reports on the running software' do
|
||||||
expect { dimension.data }.to_not raise_error
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to include(
|
||||||
|
include(key: 'mastodon', value: Mastodon::Version.to_s),
|
||||||
|
include(key: 'ruby', value: include(RUBY_VERSION))
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::SourcesDimension do
|
describe Admin::Metrics::Dimension::SourcesDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
|
@ -11,8 +11,21 @@ describe Admin::Metrics::Dimension::SourcesDimension do
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:app) { Fabricate(:application) }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:alice) { Fabricate(:user) }
|
||||||
|
let(:bob) { Fabricate(:user) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
alice.update(created_by_application: app)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns OAuth applications with user counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(1)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: app.name, value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::SpaceUsageDimension do
|
describe Admin::Metrics::Dimension::SpaceUsageDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
|
@ -11,8 +11,13 @@ describe Admin::Metrics::Dimension::SpaceUsageDimension do
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'reports on used storage space' do
|
||||||
expect { dimension.data }.to_not raise_error
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to include(
|
||||||
|
include(key: 'media', value: /\d/),
|
||||||
|
include(key: 'postgresql', value: /\d/),
|
||||||
|
include(key: 'redis', value: /\d/)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,16 +3,36 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::TagLanguagesDimension do
|
describe Admin::Metrics::Dimension::TagLanguagesDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:limit) { 10 }
|
let(:limit) { 10 }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:alice) { Fabricate(:account) }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:bob) { Fabricate(:account) }
|
||||||
|
let(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
alice_status_recent = Fabricate :status, account: alice, created_at: 1.day.ago, language: 'en'
|
||||||
|
alice_status_older = Fabricate :status, account: alice, created_at: 30.days.ago, language: 'en'
|
||||||
|
bob_status_recent = Fabricate :status, account: bob, created_at: 1.day.ago, language: 'es'
|
||||||
|
|
||||||
|
alice_status_older.tags << tag
|
||||||
|
alice_status_recent.tags << tag
|
||||||
|
bob_status_recent.tags << tag
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns languages with tag usage counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(2)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: 'en', value: '1'),
|
||||||
|
include(key: 'es', value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,16 +3,37 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Dimension::TagServersDimension do
|
describe Admin::Metrics::Dimension::TagServersDimension do
|
||||||
subject(:dimension) { described_class.new(start_at, end_at, limit, params) }
|
subject { described_class.new(start_at, end_at, limit, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:limit) { 10 }
|
let(:limit) { 10 }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
let(:alice) { Fabricate(:account, domain: domain) }
|
||||||
expect { dimension.data }.to_not raise_error
|
let(:bob) { Fabricate(:account) }
|
||||||
|
let(:domain) { 'host.example' }
|
||||||
|
let(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
alice_status_recent = Fabricate :status, account: alice, created_at: 1.day.ago
|
||||||
|
alice_status_older = Fabricate :status, account: alice, created_at: 30.days.ago
|
||||||
|
bob_status_recent = Fabricate :status, account: bob, created_at: 1.day.ago
|
||||||
|
|
||||||
|
alice_status_older.tags << tag
|
||||||
|
alice_status_recent.tags << tag
|
||||||
|
bob_status_recent.tags << tag
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns servers with tag usage counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(2)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(key: domain, value: '1'),
|
||||||
|
include(key: Rails.configuration.x.local_domain, value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,15 +3,38 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::ActiveUsersMeasure do
|
describe Admin::Metrics::Measure::ActiveUsersMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with activity tracking records' do
|
||||||
expect { measure.data }.to_not raise_error
|
before do
|
||||||
|
3.times do
|
||||||
|
travel_to(2.days.ago) { record_login_activity }
|
||||||
|
end
|
||||||
|
2.times do
|
||||||
|
travel_to(1.day.ago) { record_login_activity }
|
||||||
|
end
|
||||||
|
travel_to(0.days.ago) { record_login_activity }
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct activity tracker counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def record_login_activity
|
||||||
|
ActivityTracker.record('activity:logins', Fabricate(:user).id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceAccountsMeasure do
|
describe Admin::Metrics::Measure::InstanceAccountsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -20,12 +20,13 @@ describe Admin::Metrics::Measure::InstanceAccountsMeasure do
|
||||||
Fabricate(:account, domain: "foo.#{domain}", created_at: 1.year.ago)
|
Fabricate(:account, domain: "foo.#{domain}", created_at: 1.year.ago)
|
||||||
Fabricate(:account, domain: "foo.#{domain}")
|
Fabricate(:account, domain: "foo.#{domain}")
|
||||||
Fabricate(:account, domain: "bar.#{domain}")
|
Fabricate(:account, domain: "bar.#{domain}")
|
||||||
|
Fabricate(:account, domain: 'other-host.example')
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 3
|
expect(subject.total).to eq 3
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -33,14 +34,21 @@ describe Admin::Metrics::Measure::InstanceAccountsMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
||||||
|
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 6
|
expect(subject.total).to eq 6
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct instance_accounts counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceFollowersMeasure do
|
describe Admin::Metrics::Measure::InstanceFollowersMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -22,12 +22,14 @@ describe Admin::Metrics::Measure::InstanceFollowersMeasure do
|
||||||
Fabricate(:account, domain: "foo.#{domain}").follow!(local_account)
|
Fabricate(:account, domain: "foo.#{domain}").follow!(local_account)
|
||||||
Fabricate(:account, domain: "foo.#{domain}").follow!(local_account)
|
Fabricate(:account, domain: "foo.#{domain}").follow!(local_account)
|
||||||
Fabricate(:account, domain: "bar.#{domain}")
|
Fabricate(:account, domain: "bar.#{domain}")
|
||||||
|
|
||||||
|
Fabricate(:account, domain: 'other.example').follow!(local_account)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 2
|
expect(subject.total).to eq 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -35,14 +37,21 @@ describe Admin::Metrics::Measure::InstanceFollowersMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
||||||
|
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 4
|
expect(subject.total).to eq 4
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct instance_followers counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '2')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceFollowsMeasure do
|
describe Admin::Metrics::Measure::InstanceFollowsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@ describe Admin::Metrics::Measure::InstanceFollowsMeasure do
|
||||||
Fabricate(:account, domain: "bar.#{domain}")
|
Fabricate(:account, domain: "bar.#{domain}")
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 2
|
expect(subject.total).to eq 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -35,14 +35,21 @@ describe Admin::Metrics::Measure::InstanceFollowsMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
||||||
|
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 4
|
expect(subject.total).to eq 4
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct instance_followers counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '2')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do
|
describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -20,11 +20,11 @@ describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do
|
||||||
remote_account_on_subdomain.media_attachments.create!(file: attachment_fixture('attachment.jpg'))
|
remote_account_on_subdomain.media_attachments.create!(file: attachment_fixture('attachment.jpg'))
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expected_total = remote_account.media_attachments.sum(:file_file_size) + remote_account.media_attachments.sum(:thumbnail_file_size)
|
expected_total = remote_account.media_attachments.sum(:file_file_size) + remote_account.media_attachments.sum(:thumbnail_file_size)
|
||||||
expect(measure.total).to eq expected_total
|
expect(subject.total).to eq expected_total
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -36,14 +36,25 @@ describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do
|
||||||
account.media_attachments.sum(:file_file_size) + account.media_attachments.sum(:thumbnail_file_size)
|
account.media_attachments.sum(:file_file_size) + account.media_attachments.sum(:thumbnail_file_size)
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(measure.total).to eq expected_total
|
expect(subject.total).to eq expected_total
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct media_attachments counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: expected_domain_only_total.to_s)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def expected_domain_only_total
|
||||||
|
remote_account.media_attachments.sum(:file_file_size) + remote_account.media_attachments.sum(:thumbnail_file_size)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceReportsMeasure do
|
describe Admin::Metrics::Measure::InstanceReportsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ describe Admin::Metrics::Measure::InstanceReportsMeasure do
|
||||||
Fabricate(:report, target_account: Fabricate(:account, domain: "bar.#{domain}"))
|
Fabricate(:report, target_account: Fabricate(:account, domain: "bar.#{domain}"))
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 2
|
expect(subject.total).to eq 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -32,14 +32,21 @@ describe Admin::Metrics::Measure::InstanceReportsMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
||||||
|
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 5
|
expect(subject.total).to eq 5
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct instance_reports counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '2')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InstanceStatusesMeasure do
|
describe Admin::Metrics::Measure::InstanceStatusesMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:domain) { 'example.com' }
|
let(:domain) { 'example.com' }
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ describe Admin::Metrics::Measure::InstanceStatusesMeasure do
|
||||||
Fabricate(:status, account: Fabricate(:account, domain: "bar.#{domain}"))
|
Fabricate(:status, account: Fabricate(:account, domain: "bar.#{domain}"))
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'total' do
|
describe '#total' do
|
||||||
context 'without include_subdomains' do
|
context 'without include_subdomains' do
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 2
|
expect(subject.total).to eq 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -32,14 +32,21 @@ describe Admin::Metrics::Measure::InstanceStatusesMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
let(:params) { ActionController::Parameters.new(domain: domain, include_subdomains: 'true') }
|
||||||
|
|
||||||
it 'returns the expected number of accounts' do
|
it 'returns the expected number of accounts' do
|
||||||
expect(measure.total).to eq 5
|
expect(subject.total).to eq 5
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
it 'returns correct instance_statuses counts' do
|
||||||
expect { measure.data }.to_not raise_error
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '0'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '2')
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,15 +3,38 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::InteractionsMeasure do
|
describe Admin::Metrics::Measure::InteractionsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with activity tracking records' do
|
||||||
expect { measure.data }.to_not raise_error
|
before do
|
||||||
|
3.times do
|
||||||
|
travel_to(2.days.ago) { record_interaction_activity }
|
||||||
|
end
|
||||||
|
2.times do
|
||||||
|
travel_to(1.day.ago) { record_interaction_activity }
|
||||||
|
end
|
||||||
|
travel_to(0.days.ago) { record_interaction_activity }
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct activity tracker counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def record_interaction_activity
|
||||||
|
ActivityTracker.increment('activity:interactions')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,15 +3,30 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::NewUsersMeasure do
|
describe Admin::Metrics::Measure::NewUsersMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with user records' do
|
||||||
expect { measure.data }.to_not raise_error
|
before do
|
||||||
|
3.times { Fabricate :user, created_at: 2.days.ago }
|
||||||
|
2.times { Fabricate :user, created_at: 1.day.ago }
|
||||||
|
Fabricate :user, created_at: 0.days.ago
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct user counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,15 +3,30 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::OpenedReportsMeasure do
|
describe Admin::Metrics::Measure::OpenedReportsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with report records' do
|
||||||
expect { measure.data }.to_not raise_error
|
before do
|
||||||
|
3.times { Fabricate :report, created_at: 2.days.ago }
|
||||||
|
2.times { Fabricate :report, created_at: 1.day.ago }
|
||||||
|
Fabricate :report, created_at: 0.days.ago
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct report counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,15 +3,30 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::ResolvedReportsMeasure do
|
describe Admin::Metrics::Measure::ResolvedReportsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let(:start_at) { 2.days.ago }
|
let(:start_at) { 2.days.ago }
|
||||||
let(:end_at) { Time.now.utc }
|
let(:end_at) { Time.now.utc }
|
||||||
let(:params) { ActionController::Parameters.new }
|
let(:params) { ActionController::Parameters.new }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with report records' do
|
||||||
expect { measure.data }.to_not raise_error
|
before do
|
||||||
|
3.times { Fabricate :report, action_taken_at: 2.days.ago }
|
||||||
|
2.times { Fabricate :report, action_taken_at: 1.day.ago }
|
||||||
|
Fabricate :report, action_taken_at: 0.days.ago
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct report counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::TagAccountsMeasure do
|
describe Admin::Metrics::Measure::TagAccountsMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let!(:tag) { Fabricate(:tag) }
|
let!(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
@ -12,8 +12,39 @@ describe Admin::Metrics::Measure::TagAccountsMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with tagged accounts' do
|
||||||
expect { measure.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: 'alice.example') }
|
||||||
|
let(:bob) { Fabricate(:account, domain: 'bob.example') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
3.times do
|
||||||
|
travel_to(2.days.ago) { add_tag_history(alice) }
|
||||||
|
end
|
||||||
|
|
||||||
|
2.times do
|
||||||
|
travel_to(1.day.ago) do
|
||||||
|
add_tag_history(alice)
|
||||||
|
add_tag_history(bob)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
add_tag_history(bob)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct tag_accounts counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '1'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_tag_history(account)
|
||||||
|
tag.history.add(account.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::TagServersMeasure do
|
describe Admin::Metrics::Measure::TagServersMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let!(:tag) { Fabricate(:tag) }
|
let!(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
@ -12,8 +12,38 @@ describe Admin::Metrics::Measure::TagServersMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with tagged statuses' do
|
||||||
expect { measure.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: 'alice.example') }
|
||||||
|
let(:bob) { Fabricate(:account, domain: 'bob.example') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
3.times do
|
||||||
|
status_alice = Fabricate(:status, account: alice, created_at: 2.days.ago)
|
||||||
|
status_alice.tags << tag
|
||||||
|
end
|
||||||
|
|
||||||
|
2.times do
|
||||||
|
status_alice = Fabricate(:status, account: alice, created_at: 1.day.ago)
|
||||||
|
status_alice.tags << tag
|
||||||
|
|
||||||
|
status_bob = Fabricate(:status, account: bob, created_at: 1.day.ago)
|
||||||
|
status_bob.tags << tag
|
||||||
|
end
|
||||||
|
|
||||||
|
status_bob = Fabricate(:status, account: bob, created_at: 0.days.ago)
|
||||||
|
status_bob.tags << tag
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct tag counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '1'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '2'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Admin::Metrics::Measure::TagUsesMeasure do
|
describe Admin::Metrics::Measure::TagUsesMeasure do
|
||||||
subject(:measure) { described_class.new(start_at, end_at, params) }
|
subject { described_class.new(start_at, end_at, params) }
|
||||||
|
|
||||||
let!(:tag) { Fabricate(:tag) }
|
let!(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
@ -12,8 +12,39 @@ describe Admin::Metrics::Measure::TagUsesMeasure do
|
||||||
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
let(:params) { ActionController::Parameters.new(id: tag.id) }
|
||||||
|
|
||||||
describe '#data' do
|
describe '#data' do
|
||||||
it 'runs data query without error' do
|
context 'with tagged accounts' do
|
||||||
expect { measure.data }.to_not raise_error
|
let(:alice) { Fabricate(:account, domain: 'alice.example') }
|
||||||
|
let(:bob) { Fabricate(:account, domain: 'bob.example') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
3.times do
|
||||||
|
travel_to(2.days.ago) { add_tag_history(alice) }
|
||||||
|
end
|
||||||
|
|
||||||
|
2.times do
|
||||||
|
travel_to(1.day.ago) do
|
||||||
|
add_tag_history(alice)
|
||||||
|
add_tag_history(bob)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
add_tag_history(bob)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns correct tag_uses counts' do
|
||||||
|
expect(subject.data.size)
|
||||||
|
.to eq(3)
|
||||||
|
expect(subject.data.map(&:symbolize_keys))
|
||||||
|
.to contain_exactly(
|
||||||
|
include(date: 2.days.ago.midnight.to_time, value: '3'),
|
||||||
|
include(date: 1.day.ago.midnight.to_time, value: '4'),
|
||||||
|
include(date: 0.days.ago.midnight.to_time, value: '1')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_tag_history(account)
|
||||||
|
tag.history.add(account.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,12 +9,18 @@ describe 'The account show page' do
|
||||||
|
|
||||||
get '/@alice'
|
get '/@alice'
|
||||||
|
|
||||||
|
expect(head_link_icons.size).to eq(4) # One general favicon and three with sizes
|
||||||
|
|
||||||
expect(head_meta_content('og:title')).to match alice.display_name
|
expect(head_meta_content('og:title')).to match alice.display_name
|
||||||
expect(head_meta_content('og:type')).to eq 'profile'
|
expect(head_meta_content('og:type')).to eq 'profile'
|
||||||
expect(head_meta_content('og:image')).to match '.+'
|
expect(head_meta_content('og:image')).to match '.+'
|
||||||
expect(head_meta_content('og:url')).to match 'http://.+'
|
expect(head_meta_content('og:url')).to match 'http://.+'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def head_link_icons
|
||||||
|
head_section.css('link[rel=icon]')
|
||||||
|
end
|
||||||
|
|
||||||
def head_meta_content(property)
|
def head_meta_content(property)
|
||||||
head_section.meta("[@property='#{property}']")[:content]
|
head_section.meta("[@property='#{property}']")[:content]
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,12 +21,11 @@ describe 'statuses/show.html.haml', :without_verify_partial_doubles do
|
||||||
|
|
||||||
render
|
render
|
||||||
|
|
||||||
header_tags = view.content_for(:header_tags)
|
expect(header_tags)
|
||||||
|
.to match(/<meta content=".+" property="og:title">/)
|
||||||
expect(header_tags).to match(/<meta content=".+" property="og:title">/)
|
.and match(/<meta content="article" property="og:type">/)
|
||||||
expect(header_tags).to match(/<meta content="article" property="og:type">/)
|
.and match(/<meta content=".+" property="og:image">/)
|
||||||
expect(header_tags).to match(/<meta content=".+" property="og:image">/)
|
.and match(%r{<meta content="http://.+" property="og:url">})
|
||||||
expect(header_tags).to match(%r{<meta content="http://.+" property="og:url">})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'has twitter player tag' do
|
it 'has twitter player tag' do
|
||||||
|
@ -40,9 +39,12 @@ describe 'statuses/show.html.haml', :without_verify_partial_doubles do
|
||||||
|
|
||||||
render
|
render
|
||||||
|
|
||||||
header_tags = view.content_for(:header_tags)
|
expect(header_tags)
|
||||||
|
.to match(%r{<meta content="http://.+/media/.+/player" property="twitter:player">})
|
||||||
|
.and match(/<meta content="player" property="twitter:card">/)
|
||||||
|
end
|
||||||
|
|
||||||
expect(header_tags).to match(%r{<meta content="http://.+/media/.+/player" property="twitter:player">})
|
def header_tags
|
||||||
expect(header_tags).to match(/<meta content="player" property="twitter:card">/)
|
view.content_for(:header_tags)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
71
yarn.lock
71
yarn.lock
|
@ -3334,8 +3334,8 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@testing-library/react@npm:^14.0.0":
|
"@testing-library/react@npm:^14.0.0":
|
||||||
version: 14.2.2
|
version: 14.3.1
|
||||||
resolution: "@testing-library/react@npm:14.2.2"
|
resolution: "@testing-library/react@npm:14.3.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime": "npm:^7.12.5"
|
"@babel/runtime": "npm:^7.12.5"
|
||||||
"@testing-library/dom": "npm:^9.0.0"
|
"@testing-library/dom": "npm:^9.0.0"
|
||||||
|
@ -3343,7 +3343,7 @@ __metadata:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^18.0.0
|
react: ^18.0.0
|
||||||
react-dom: ^18.0.0
|
react-dom: ^18.0.0
|
||||||
checksum: 10c0/ab36707f6701a4a56dd217e16e00d6326e0f760bb2e716245422c7500a0b94efcd351d0aa89c4fab2916e6ebc68c983cec6b3ae0804de813cafc913a612668f6
|
checksum: 10c0/1ccf4eb1510500cc20a805cb0244c9098dca28a8745173a8f71ea1274d63774f0b7898a35c878b43c797b89c13621548909ff37843b835c1a27ee1efbbdd098c
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -3702,13 +3702,13 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/pg@npm:^8.6.6":
|
"@types/pg@npm:^8.6.6":
|
||||||
version: 8.11.4
|
version: 8.11.5
|
||||||
resolution: "@types/pg@npm:8.11.4"
|
resolution: "@types/pg@npm:8.11.5"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node": "npm:*"
|
"@types/node": "npm:*"
|
||||||
pg-protocol: "npm:*"
|
pg-protocol: "npm:*"
|
||||||
pg-types: "npm:^4.0.1"
|
pg-types: "npm:^4.0.1"
|
||||||
checksum: 10c0/81158ffa9d2f9b2b299a1650756b90fc418e0040e654d7d9ee46734a3c874d07b638af86d765e22e9c8246054c30a0274ee4dea58a0a7ed5c0c4aa01964a09ef
|
checksum: 10c0/d64d183bee2df96cd0558231190ff629558e8c0fd3203b880f48a7d34b1eaea528d20c09b57b19c0939f369136e6c6941533592eadd71174be78d1ec0ca5e60e
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -3762,11 +3762,11 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4":
|
"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4":
|
||||||
version: 18.2.24
|
version: 18.2.25
|
||||||
resolution: "@types/react-dom@npm:18.2.24"
|
resolution: "@types/react-dom@npm:18.2.25"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/react": "npm:*"
|
"@types/react": "npm:*"
|
||||||
checksum: 10c0/9ec38e5ab4727c56ef17bd8e938ead88748ba19db314b8d9807714a5cae430f5b799514667b221b4f2dc8d9b4ca17dd1c3da8c41c083c2de9eddcc31bec6b8ff
|
checksum: 10c0/87604407eca6884c5b4d4657cb511dc5ba28ea1cfa5d0ce1fc2d659a7ad1b64ae85dcda60e3f010641f9a52a6a60dfcaa6be3b0d0de9d624475052a13dae01f4
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -3865,12 +3865,12 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7":
|
"@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7":
|
||||||
version: 18.2.74
|
version: 18.2.78
|
||||||
resolution: "@types/react@npm:18.2.74"
|
resolution: "@types/react@npm:18.2.78"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/prop-types": "npm:*"
|
"@types/prop-types": "npm:*"
|
||||||
csstype: "npm:^3.0.2"
|
csstype: "npm:^3.0.2"
|
||||||
checksum: 10c0/347e38b4c5dc20d50ff71bf04b7caaef490e5ff695e74a0088a13fbb2a0c5d125a5ecfd142adfa30f0176da0e2734942c91ba61d95ce269c43b3265bd7379361
|
checksum: 10c0/5eb8e1dd98c29aeddf40b90f466d1a9ce83b113d42a096633d632b834e7ae9821f24ba7999928de9d98cca37764532a7ea35355a8103a377d8baa750f1841b5c
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -13224,9 +13224,9 @@ __metadata:
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"postcss-custom-properties@npm:^13.3.6":
|
"postcss-custom-properties@npm:^13.3.7":
|
||||||
version: 13.3.6
|
version: 13.3.7
|
||||||
resolution: "postcss-custom-properties@npm:13.3.6"
|
resolution: "postcss-custom-properties@npm:13.3.7"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@csstools/cascade-layer-name-parser": "npm:^1.0.9"
|
"@csstools/cascade-layer-name-parser": "npm:^1.0.9"
|
||||||
"@csstools/css-parser-algorithms": "npm:^2.6.1"
|
"@csstools/css-parser-algorithms": "npm:^2.6.1"
|
||||||
|
@ -13235,7 +13235,7 @@ __metadata:
|
||||||
postcss-value-parser: "npm:^4.2.0"
|
postcss-value-parser: "npm:^4.2.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
postcss: ^8.4
|
postcss: ^8.4
|
||||||
checksum: 10c0/faa3b692966314a6dfcba93e74d91f20f2484ea328f88c809b1d0daa8ecc0d8d5125e06d1d7c18b5455ac30cb3501c7069b6e56e5efac61523a6ed75c3d73a30
|
checksum: 10c0/5d8767efae956f98d9a62a8f54d913c9ea95eaab1c906679ddeee64d87f0fb37d99c8ac1d16ec199794ed7c13a42d39ca2ea0a98df1056d400d4cbc9f31d6b94
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -13696,8 +13696,8 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"postcss-preset-env@npm:^9.5.2":
|
"postcss-preset-env@npm:^9.5.2":
|
||||||
version: 9.5.4
|
version: 9.5.5
|
||||||
resolution: "postcss-preset-env@npm:9.5.4"
|
resolution: "postcss-preset-env@npm:9.5.5"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@csstools/postcss-cascade-layers": "npm:^4.0.4"
|
"@csstools/postcss-cascade-layers": "npm:^4.0.4"
|
||||||
"@csstools/postcss-color-function": "npm:^3.0.13"
|
"@csstools/postcss-color-function": "npm:^3.0.13"
|
||||||
|
@ -13740,7 +13740,7 @@ __metadata:
|
||||||
postcss-color-hex-alpha: "npm:^9.0.4"
|
postcss-color-hex-alpha: "npm:^9.0.4"
|
||||||
postcss-color-rebeccapurple: "npm:^9.0.3"
|
postcss-color-rebeccapurple: "npm:^9.0.3"
|
||||||
postcss-custom-media: "npm:^10.0.4"
|
postcss-custom-media: "npm:^10.0.4"
|
||||||
postcss-custom-properties: "npm:^13.3.6"
|
postcss-custom-properties: "npm:^13.3.7"
|
||||||
postcss-custom-selectors: "npm:^7.1.8"
|
postcss-custom-selectors: "npm:^7.1.8"
|
||||||
postcss-dir-pseudo-class: "npm:^8.0.1"
|
postcss-dir-pseudo-class: "npm:^8.0.1"
|
||||||
postcss-double-position-gradients: "npm:^5.0.6"
|
postcss-double-position-gradients: "npm:^5.0.6"
|
||||||
|
@ -13761,7 +13761,7 @@ __metadata:
|
||||||
postcss-selector-not: "npm:^7.0.2"
|
postcss-selector-not: "npm:^7.0.2"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
postcss: ^8.4
|
postcss: ^8.4
|
||||||
checksum: 10c0/6af900ad2f46b640339b626317288543ebb7c47b739f4776e4006513b32eceabe0be78109aa58446fa0f50284a433b3e3a9bd48aa5730fd0ac59ef51153e8f7b
|
checksum: 10c0/afc31fb75bc5e8e223d38fd34b81da08ee340818f5e392df1781728f2ff2a9dbc75e458673ce9f52deafefa90bbc99e0bd1453271498f5e02746c785180bad07
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -14454,8 +14454,8 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"react-redux@npm:^9.0.4":
|
"react-redux@npm:^9.0.4":
|
||||||
version: 9.1.0
|
version: 9.1.1
|
||||||
resolution: "react-redux@npm:9.1.0"
|
resolution: "react-redux@npm:9.1.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/use-sync-external-store": "npm:^0.0.3"
|
"@types/use-sync-external-store": "npm:^0.0.3"
|
||||||
use-sync-external-store: "npm:^1.0.0"
|
use-sync-external-store: "npm:^1.0.0"
|
||||||
|
@ -14471,7 +14471,7 @@ __metadata:
|
||||||
optional: true
|
optional: true
|
||||||
redux:
|
redux:
|
||||||
optional: true
|
optional: true
|
||||||
checksum: 10c0/53161b5dc4d109020fbc42d26906ace92fed9ba1d7ab6274af60e9c0684583d20d1c8ec6d58601ac7b833c6468a652bbf3d4a102149d1793cb8a28b05b042f73
|
checksum: 10c0/40ccdc8d48aefeed02c025f46e4a2e6641a2996fe985feb70d25feaaf8f101f6ef937cd1420909cad4c8869a8c79323ee071f5b090b011b950e5ae09100f5767
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -15324,15 +15324,15 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"sass@npm:^1.62.1":
|
"sass@npm:^1.62.1":
|
||||||
version: 1.74.1
|
version: 1.75.0
|
||||||
resolution: "sass@npm:1.74.1"
|
resolution: "sass@npm:1.75.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar: "npm:>=3.0.0 <4.0.0"
|
chokidar: "npm:>=3.0.0 <4.0.0"
|
||||||
immutable: "npm:^4.0.0"
|
immutable: "npm:^4.0.0"
|
||||||
source-map-js: "npm:>=0.6.2 <2.0.0"
|
source-map-js: "npm:>=0.6.2 <2.0.0"
|
||||||
bin:
|
bin:
|
||||||
sass: sass.js
|
sass: sass.js
|
||||||
checksum: 10c0/4610257ee27823276ce4998a534b4ee9f313e5a0b3d3899e70e0f87096feeae4cd8dd3c2f765b52f57dd87f5dab22370ef63f95a837a189fbb9401396d5ce717
|
checksum: 10c0/1564ab2c8041c99a330cec93127fe8abcf65ac63eecb471610ed7f3126a2599a58b788a3a98eb8719f7f40b9b04e00c92bc9e11a9c2180ad582b8cba9fb030b0
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -17107,22 +17107,22 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"typescript@npm:5, typescript@npm:^5.0.4":
|
"typescript@npm:5, typescript@npm:^5.0.4":
|
||||||
version: 5.4.4
|
version: 5.4.5
|
||||||
resolution: "typescript@npm:5.4.4"
|
resolution: "typescript@npm:5.4.5"
|
||||||
bin:
|
bin:
|
||||||
tsc: bin/tsc
|
tsc: bin/tsc
|
||||||
tsserver: bin/tsserver
|
tsserver: bin/tsserver
|
||||||
checksum: 10c0/4d8de0291204ed61ca97ad0cba2ce064e09c4988ca1c451c787e4653ba76296ba35177a52694e8a00cf4ef899d0ee83338663b926d8b7d55167ff0ba81549999
|
checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"typescript@patch:typescript@npm%3A5#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin<compat/typescript>":
|
"typescript@patch:typescript@npm%3A5#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin<compat/typescript>":
|
||||||
version: 5.4.4
|
version: 5.4.5
|
||||||
resolution: "typescript@patch:typescript@npm%3A5.4.4#optional!builtin<compat/typescript>::version=5.4.4&hash=5adc0c"
|
resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>::version=5.4.5&hash=5adc0c"
|
||||||
bin:
|
bin:
|
||||||
tsc: bin/tsc
|
tsc: bin/tsc
|
||||||
tsserver: bin/tsserver
|
tsserver: bin/tsserver
|
||||||
checksum: 10c0/1fa41b9964a9ff0ed913b339c90b46031b2d2da3cb1a192af516610733f7f1d5f7f9754a8e22b9ac7076d3d8aedd2c4f84db3f113bad060eac3a95962443a1bf
|
checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
@ -17643,8 +17643,8 @@ __metadata:
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"webpack-bundle-analyzer@npm:^4.8.0":
|
"webpack-bundle-analyzer@npm:^4.8.0":
|
||||||
version: 4.10.1
|
version: 4.10.2
|
||||||
resolution: "webpack-bundle-analyzer@npm:4.10.1"
|
resolution: "webpack-bundle-analyzer@npm:4.10.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@discoveryjs/json-ext": "npm:0.5.7"
|
"@discoveryjs/json-ext": "npm:0.5.7"
|
||||||
acorn: "npm:^8.0.4"
|
acorn: "npm:^8.0.4"
|
||||||
|
@ -17654,14 +17654,13 @@ __metadata:
|
||||||
escape-string-regexp: "npm:^4.0.0"
|
escape-string-regexp: "npm:^4.0.0"
|
||||||
gzip-size: "npm:^6.0.0"
|
gzip-size: "npm:^6.0.0"
|
||||||
html-escaper: "npm:^2.0.2"
|
html-escaper: "npm:^2.0.2"
|
||||||
is-plain-object: "npm:^5.0.0"
|
|
||||||
opener: "npm:^1.5.2"
|
opener: "npm:^1.5.2"
|
||||||
picocolors: "npm:^1.0.0"
|
picocolors: "npm:^1.0.0"
|
||||||
sirv: "npm:^2.0.3"
|
sirv: "npm:^2.0.3"
|
||||||
ws: "npm:^7.3.1"
|
ws: "npm:^7.3.1"
|
||||||
bin:
|
bin:
|
||||||
webpack-bundle-analyzer: lib/bin/analyzer.js
|
webpack-bundle-analyzer: lib/bin/analyzer.js
|
||||||
checksum: 10c0/6a94c8f6aa03296fb2eb00d6ad3b27bd5c551590fd253772bc61debf3177414d42701014079d4f85c74ba1ca685ae9f0cb4063812b58c21f294d108e9908e5cd
|
checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue