diff --git a/Gemfile b/Gemfile index 004b3120c..28f0577c4 100644 --- a/Gemfile +++ b/Gemfile @@ -145,7 +145,7 @@ group :development do gem 'brakeman', '~> 4.10', require: false gem 'bundler-audit', '~> 0.7', require: false - gem 'capistrano', '~> 3.14' + gem 'capistrano', '~> 3.15' gem 'capistrano-rails', '~> 1.6' gem 'capistrano-rbenv', '~> 2.2' gem 'capistrano-yarn', '~> 2.0' diff --git a/Gemfile.lock b/Gemfile.lock index 8d6ce3e0e..15bd1d988 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -116,7 +116,7 @@ GEM bundler (>= 1.2.0, < 3) thor (>= 0.18, < 2) byebug (11.1.3) - capistrano (3.14.1) + capistrano (3.15.0) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -272,7 +272,7 @@ GEM httplog (1.4.3) rack (>= 1.0) rainbow (>= 2.0.0) - i18n (1.8.5) + i18n (1.8.7) concurrent-ruby (~> 1.0) i18n-tasks (0.9.33) activesupport (>= 4.0.2) @@ -359,10 +359,10 @@ GEM net-ssh (>= 2.6.5, < 7.0.0) net-ssh (6.1.0) nio4r (2.5.4) - nokogiri (1.11.0) + nokogiri (1.11.1) mini_portile2 (~> 2.5.0) racc (~> 1.4) - nokogumbo (2.0.2) + nokogumbo (2.0.4) nokogiri (~> 1.8, >= 1.8.4) nsa (0.2.7) activesupport (>= 4.2, < 6) @@ -561,7 +561,7 @@ GEM fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) - sanitize (5.2.1) + sanitize (5.2.2) crass (~> 1.0.2) nokogiri (>= 1.8.0) nokogumbo (~> 2.0) @@ -592,7 +592,7 @@ GEM simple_form (5.0.3) actionpack (>= 5.0) activemodel (>= 5.0) - simplecov (0.21.0) + simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) @@ -605,7 +605,7 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - sshkit (1.21.0) + sshkit (1.21.1) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.16) @@ -698,7 +698,7 @@ DEPENDENCIES browser bullet (~> 6.1) bundler-audit (~> 0.7) - capistrano (~> 3.14) + capistrano (~> 3.15) capistrano-rails (~> 1.6) capistrano-rbenv (~> 2.2) capistrano-yarn (~> 2.0) diff --git a/app/controllers/api/v1/markers_controller.rb b/app/controllers/api/v1/markers_controller.rb index 28c2ec791..867e6facf 100644 --- a/app/controllers/api/v1/markers_controller.rb +++ b/app/controllers/api/v1/markers_controller.rb @@ -7,7 +7,7 @@ class Api::V1::MarkersController < Api::BaseController before_action :require_user! def index - @markers = current_user.markers.where(timeline: Array(params[:timeline])).each_with_object({}) { |marker, h| h[marker.timeline] = marker } + @markers = current_user.markers.where(timeline: Array(params[:timeline])).index_by(&:timeline) render json: serialize_map(@markers) end diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb index 8d82eda5c..3fb4b962a 100644 --- a/app/controllers/concerns/cache_concern.rb +++ b/app/controllers/concerns/cache_concern.rb @@ -38,7 +38,7 @@ module CacheConcern klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!) unless uncached_ids.empty? - uncached = klass.where(id: uncached_ids).with_includes.each_with_object({}) { |item, h| h[item.id] = item } + uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id) uncached.each_value do |item| Rails.cache.write(item, item) diff --git a/app/lib/activitypub/activity/block.rb b/app/lib/activitypub/activity/block.rb index 90477bf33..92a0f813f 100644 --- a/app/lib/activitypub/activity/block.rb +++ b/app/lib/activitypub/activity/block.rb @@ -11,8 +11,13 @@ class ActivityPub::Activity::Block < ActivityPub::Activity return end + UnfollowService.new.call(@account, target_account) if @account.following?(target_account) UnfollowService.new.call(target_account, @account) if target_account.following?(@account) + RejectFollowService.new.call(target_account, @account) if target_account.requested?(@account) - @account.block!(target_account, uri: @json['id']) unless delete_arrived_first?(@json['id']) + unless delete_arrived_first?(@json['id']) + BlockWorker.perform_async(@account.id, target_account.id) + @account.block!(target_account, uri: @json['id']) + end end end diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb index e38a3adcd..5d51e8585 100644 --- a/app/lib/entity_cache.rb +++ b/app/lib/entity_cache.rb @@ -25,7 +25,7 @@ class EntityCache end unless uncached_ids.empty? - uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).each_with_object({}) { |item, h| h[item.shortcode] = item } + uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).index_by(&:shortcode) uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) } end diff --git a/app/lib/settings/scoped_settings.rb b/app/lib/settings/scoped_settings.rb index 9889940f3..95e195458 100644 --- a/app/lib/settings/scoped_settings.rb +++ b/app/lib/settings/scoped_settings.rb @@ -31,7 +31,7 @@ module Settings def all_as_records vars = thing_scoped - records = vars.each_with_object({}) { |r, h| h[r.var] = r } + records = vars.index_by(&:var) Setting.default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb index c7aa43bb3..702365939 100644 --- a/app/lib/webfinger.rb +++ b/app/lib/webfinger.rb @@ -21,7 +21,7 @@ class Webfinger private def links - @links ||= @json['links'].map { |link| [link['rel'], link] }.to_h + @links ||= @json['links'].index_by { |link| link['rel'] } end end diff --git a/app/models/account.rb b/app/models/account.rb index 15bd8a917..b03cbbdf4 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -277,7 +277,7 @@ class Account < ApplicationRecord end def tags_as_strings=(tag_names) - hashtags_map = Tag.find_or_create_by_names(tag_names).each_with_object({}) { |tag, h| h[tag.name] = tag } + hashtags_map = Tag.find_or_create_by_names(tag_names).index_by(&:name) # Remove hashtags that are to be deleted tags.each do |tag| diff --git a/app/models/notification.rb b/app/models/notification.rb index b6db37d6d..5e9ea62a0 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -96,7 +96,7 @@ class Notification < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).includes(:account_stat).each_with_object({}) { |a, h| h[a.id] = a } + accounts = Account.where(id: account_ids).includes(:account_stat).index_by(&:id) cached_items.each do |item| item.from_account = accounts[item.from_account_id] diff --git a/app/models/setting.rb b/app/models/setting.rb index a5878e96a..4bcaa060f 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -40,7 +40,7 @@ class Setting < RailsSettings::Base def all_as_records vars = thing_scoped - records = vars.each_with_object({}) { |r, h| h[r.var] = r } + records = vars.index_by(&:var) default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) diff --git a/app/models/status.rb b/app/models/status.rb index 766c13a40..836d363ef 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -354,7 +354,7 @@ class Status < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).includes(:account_stat).each_with_object({}) { |a, h| h[a.id] = a } + accounts = Account.where(id: account_ids).includes(:account_stat).index_by(&:id) cached_items.each do |item| item.account = accounts[item.account_id] diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index c69f6d3c3..9c2aa0ee8 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -91,7 +91,7 @@ class TrendingTags tags = Tag.where(id: tag_ids) tags = tags.trendable if filtered - tags = tags.each_with_object({}) { |tag, h| h[tag.id] = tag } + tags = tags.index_by(&:id) tag_ids.map { |tag_id| tags[tag_id] }.compact.take(limit) end diff --git a/config/deploy.rb b/config/deploy.rb index 5d6873588..c0d72f48f 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -lock '3.14.1' +lock '3.15.0' set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git') set :branch, ENV.fetch('BRANCH', 'master') diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 5f4a414b1..59c118500 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -326,7 +326,7 @@ module Mastodon end preload_map.each_with_object({}) do |(model_name, record_ids), model_map| - model_map[model_name] = model_name.constantize.where(id: record_ids).each_with_object({}) { |record, record_map| record_map[record.id] = record } + model_map[model_name] = model_name.constantize.where(id: record_ids).index_by(&:id) end end end diff --git a/package.json b/package.json index 98f8b6d83..2e44cf4ed 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@clusterws/cws": "^3.0.0", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^0.5.7", - "@rails/ujs": "^6.1.0", + "@rails/ujs": "^6.1.1", "array-includes": "^3.1.2", "atrament": "0.2.4", "arrow-key-navigation": "^1.2.0", @@ -156,7 +156,7 @@ "requestidlecallback": "^0.3.0", "reselect": "^4.0.0", "rimraf": "^3.0.2", - "sass": "^1.32.0", + "sass": "^1.32.2", "sass-loader": "^10.1.0", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", @@ -166,7 +166,7 @@ "throng": "^4.0.0", "tiny-queue": "^0.2.1", "uuid": "^8.3.1", - "webpack": "^4.44.2", + "webpack": "^4.45.0", "webpack-assets-manifest": "^4.0.0", "webpack-bundle-analyzer": "^4.3.0", "webpack-cli": "^3.3.12", @@ -175,7 +175,7 @@ }, "devDependencies": { "@testing-library/jest-dom": "^5.11.8", - "@testing-library/react": "^11.2.2", + "@testing-library/react": "^11.2.3", "babel-eslint": "^10.1.0", "babel-jest": "^26.6.3", "eslint": "^7.17.0", diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index d2e676ec2..0a045904b 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -71,7 +71,7 @@ RSpec.describe Notification, type: :model do before do allow(accounts_with_ids).to receive(:[]).with(stale_account1.id).and_return(account1) allow(accounts_with_ids).to receive(:[]).with(stale_account2.id).and_return(account2) - allow(Account).to receive_message_chain(:where, :includes, :each_with_object).and_return(accounts_with_ids) + allow(Account).to receive_message_chain(:where, :includes, :index_by).and_return(accounts_with_ids) end let(:cached_items) do diff --git a/yarn.lock b/yarn.lock index df415f517..e5e7ab2f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1352,10 +1352,10 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71" integrity sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA== -"@rails/ujs@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.0.tgz#9a48df6511cb2b472c9f596c1f37dc0af022e751" - integrity sha512-kQNKyM4ePAc4u9eR1c4OqrbAHH+3SJXt++8izIjeaZeg+P7yBtgoF/dogMD/JPPowNC74ACFpM/4op0Ggp/fPw== +"@rails/ujs@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.1.tgz#25c4e60018274b37e5ba0850134f6445429de2f5" + integrity sha512-uF6zEbXpGkNa7Vvxrd9Yqas8xsbc3lsC733V6I7fXgPuj8xXiuZakdE4uIyQSFRVmZKe12qmC6CNJNtIEvt4bA== "@sinonjs/commons@^1.7.0": version "1.8.1" @@ -1399,10 +1399,10 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.2.tgz#099c6c195140ff069211143cb31c0f8337bdb7b7" - integrity sha512-jaxm0hwUjv+hzC+UFEywic7buDC9JQ1q3cDsrWVSDAPmLotfA6E6kUHlYm/zOeGCac6g48DR36tFHxl7Zb+N5A== +"@testing-library/react@^11.2.3": + version "11.2.3" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.3.tgz#9971ede1c8465a231d7982eeca3c39fc362d5443" + integrity sha512-BirBUGPkTW28ULuCwIbYo0y2+0aavHczBT6N9r3LrsswEW3pg25l1wgoE7I8QBIy1upXWkwKpYdWY7NYYP0Bxw== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^7.28.1" @@ -9528,10 +9528,10 @@ sass-loader@^10.1.0: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.0.tgz#10101a026c13080b14e2b374d4e15ee24400a4d3" - integrity sha512-fhyqEbMIycQA4blrz/C0pYhv2o4x2y6FYYAH0CshBw3DXh5D5wyERgxw0ptdau1orc/GhNrhF7DFN2etyOCEng== +sass@^1.32.2: + version "1.32.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.2.tgz#66dc0250bc86c15d19ddee7135e93d0cf3d3257b" + integrity sha512-u1pUuzqwz3SAgvHSWp1k0mRhX82b2DdlVnP6UIetQPZtYbuJUDaPQhZE12jyjB7vYeOScfz9WPsZJB6Rpk7heA== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -11185,10 +11185,10 @@ webpack-sources@^1.0, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-so source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.44.2: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== +webpack@^4.45.0: + version "4.45.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.45.0.tgz#bcdc1ddb43959adb47f8974e60d944027267c1be" + integrity sha512-JhDaVi4CbRcwLLAoqC7eugMSMJnZbIfE2AyjaZ19pnOIh/R2O/lXOiXA2tQFN0iXEcxgpPJsPJHW2wOWqiTLcw== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0"