mirror of
https://github.com/mastodon/mastodon.git
synced 2024-11-08 08:44:27 +00:00
Fix all rubocop warnings
This commit is contained in:
parent
05e39dc619
commit
bf851133ae
33
.rubocop.yml
33
.rubocop.yml
|
@ -2,8 +2,9 @@ require:
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 2.5
|
TargetRubyVersion: 2.6
|
||||||
NewCops: disable
|
NewCops: disable
|
||||||
|
SuggestExtensions: false
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'spec/**/*'
|
- 'spec/**/*'
|
||||||
- 'db/**/*'
|
- 'db/**/*'
|
||||||
|
@ -41,6 +42,10 @@ Layout/FirstHashElementIndentation:
|
||||||
Layout/HashAlignment:
|
Layout/HashAlignment:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/LineLength:
|
||||||
|
AllowURI: true
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Layout/SpaceAroundMethodCallOperator:
|
Layout/SpaceAroundMethodCallOperator:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
@ -56,6 +61,9 @@ Lint/DuplicateElsifCondition:
|
||||||
Lint/MixedRegexpCaptureTypes:
|
Lint/MixedRegexpCaptureTypes:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
Lint/NonLocalExitFromIterator:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Lint/RaiseException:
|
Lint/RaiseException:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
@ -93,10 +101,6 @@ Metrics/CyclomaticComplexity:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
|
||||||
Layout/LineLength:
|
|
||||||
AllowURI: true
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
Max: 65
|
Max: 65
|
||||||
|
@ -108,11 +112,14 @@ Metrics/ModuleLength:
|
||||||
Max: 200
|
Max: 200
|
||||||
|
|
||||||
Metrics/ParameterLists:
|
Metrics/ParameterLists:
|
||||||
Max: 5
|
Max: 6
|
||||||
CountKeywordArgs: true
|
CountKeywordArgs: true
|
||||||
|
MaxOptionalParameters: 4
|
||||||
|
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
Max: 25
|
Max: 25
|
||||||
|
Exclude:
|
||||||
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
|
||||||
Naming/MemoizedInstanceVariableName:
|
Naming/MemoizedInstanceVariableName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -166,6 +173,10 @@ Rails/InverseOf:
|
||||||
Rails/LexicallyScopedActionFilter:
|
Rails/LexicallyScopedActionFilter:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Rails/Output:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
|
||||||
Rails/OutputSafety:
|
Rails/OutputSafety:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
@ -204,6 +215,9 @@ Style/CollectionMethods:
|
||||||
PreferredMethods:
|
PreferredMethods:
|
||||||
find_all: 'select'
|
find_all: 'select'
|
||||||
|
|
||||||
|
Style/CombinableLoops:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/Documentation:
|
Style/Documentation:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
@ -255,6 +269,9 @@ Style/Lambda:
|
||||||
Style/MutableConstant:
|
Style/MutableConstant:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/OptionalBooleanParameter:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/PercentLiteralDelimiters:
|
Style/PercentLiteralDelimiters:
|
||||||
PreferredDelimiters:
|
PreferredDelimiters:
|
||||||
'%i': '()'
|
'%i': '()'
|
||||||
|
@ -307,3 +324,7 @@ Style/TrailingCommaInHashLiteral:
|
||||||
|
|
||||||
Style/UnpackFirst:
|
Style/UnpackFirst:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/WordArray:
|
||||||
|
Exclude:
|
||||||
|
- 'app/helpers/languages_helper.rb'
|
||||||
|
|
2
Gemfile
2
Gemfile
|
@ -132,7 +132,7 @@ group :development do
|
||||||
gem 'letter_opener', '~> 1.8'
|
gem 'letter_opener', '~> 1.8'
|
||||||
gem 'letter_opener_web', '~> 2.0'
|
gem 'letter_opener_web', '~> 2.0'
|
||||||
gem 'memory_profiler'
|
gem 'memory_profiler'
|
||||||
gem 'rubocop', '~> 1.30', require: false
|
gem 'rubocop', '~> 1.31', require: false
|
||||||
gem 'rubocop-rails', '~> 2.15', require: false
|
gem 'rubocop-rails', '~> 2.15', require: false
|
||||||
gem 'brakeman', '~> 5.2', require: false
|
gem 'brakeman', '~> 5.2', require: false
|
||||||
gem 'bundler-audit', '~> 0.9', require: false
|
gem 'bundler-audit', '~> 0.9', require: false
|
||||||
|
|
21
Gemfile.lock
21
Gemfile.lock
|
@ -305,7 +305,7 @@ GEM
|
||||||
httplog (1.5.0)
|
httplog (1.5.0)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rainbow (>= 2.0.0)
|
rainbow (>= 2.0.0)
|
||||||
i18n (1.10.0)
|
i18n (1.12.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (1.0.11)
|
i18n-tasks (1.0.11)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
|
@ -396,7 +396,7 @@ GEM
|
||||||
mime-types-data (3.2022.0105)
|
mime-types-data (3.2022.0105)
|
||||||
mini_mime (1.1.2)
|
mini_mime (1.1.2)
|
||||||
mini_portile2 (2.8.0)
|
mini_portile2 (2.8.0)
|
||||||
minitest (5.16.0)
|
minitest (5.16.2)
|
||||||
msgpack (1.5.2)
|
msgpack (1.5.2)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
|
@ -569,7 +569,8 @@ GEM
|
||||||
rspec-support (3.11.0)
|
rspec-support (3.11.0)
|
||||||
rspec_junit_formatter (0.5.1)
|
rspec_junit_formatter (0.5.1)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
rubocop (1.30.1)
|
rubocop (1.31.2)
|
||||||
|
json (~> 2.3)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.1.0.0)
|
parser (>= 3.1.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
|
@ -578,9 +579,9 @@ GEM
|
||||||
rubocop-ast (>= 1.18.0, < 2.0)
|
rubocop-ast (>= 1.18.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.18.0)
|
rubocop-ast (1.19.1)
|
||||||
parser (>= 3.1.1.0)
|
parser (>= 3.1.1.0)
|
||||||
rubocop-rails (2.15.0)
|
rubocop-rails (2.15.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
|
@ -678,7 +679,7 @@ GEM
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.8.2)
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.2.0)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.16.0)
|
||||||
validate_email (0.1.6)
|
validate_email (0.1.6)
|
||||||
activemodel (>= 3.0)
|
activemodel (>= 3.0)
|
||||||
|
@ -822,7 +823,7 @@ DEPENDENCIES
|
||||||
rspec-rails (~> 5.1)
|
rspec-rails (~> 5.1)
|
||||||
rspec-sidekiq (~> 3.1)
|
rspec-sidekiq (~> 3.1)
|
||||||
rspec_junit_formatter (~> 0.5)
|
rspec_junit_formatter (~> 0.5)
|
||||||
rubocop (~> 1.30)
|
rubocop (~> 1.31)
|
||||||
rubocop-rails (~> 2.15)
|
rubocop-rails (~> 2.15)
|
||||||
ruby-progressbar (~> 1.11)
|
ruby-progressbar (~> 1.11)
|
||||||
sanitize (~> 6.0)
|
sanitize (~> 6.0)
|
||||||
|
@ -848,3 +849,9 @@ DEPENDENCIES
|
||||||
webpacker (~> 5.4)
|
webpacker (~> 5.4)
|
||||||
webpush (~> 0.3)
|
webpush (~> 0.3)
|
||||||
xorcist (~> 1.1)
|
xorcist (~> 1.1)
|
||||||
|
|
||||||
|
RUBY VERSION
|
||||||
|
ruby 3.0.4p208
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.2.33
|
||||||
|
|
|
@ -30,7 +30,7 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
self.response_body = Oj.dump(response.body)
|
self.response_body = Oj.dump(response.body)
|
||||||
self.status = response.status
|
self.status = response.status
|
||||||
rescue ActiveRecord::RecordInvalid => e
|
rescue ActiveRecord::RecordInvalid => e
|
||||||
render json: ValidationErrorFormatter.new(e, :'account.username' => :username, :'invite_request.text' => :reason).as_json, status: :unprocessable_entity
|
render json: ValidationErrorFormatter.new(e, 'account.username': :username, 'invite_request.text': :reason).as_json, status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow
|
def follow
|
||||||
|
|
|
@ -122,7 +122,7 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
redirect_to new_user_session_path, alert: I18n.t('devise.failure.timeout')
|
redirect_to new_user_session_path, alert: I18n.t('devise.failure.timeout')
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_attempt_session(user)
|
def set_attempt_session(user) # rubocop:disable Naming/AccessorMethodName
|
||||||
session[:attempt_user_id] = user.id
|
session[:attempt_user_id] = user.id
|
||||||
session[:attempt_user_updated_at] = user.updated_at.to_s
|
session[:attempt_user_updated_at] = user.updated_at.to_s
|
||||||
end
|
end
|
||||||
|
|
|
@ -112,7 +112,7 @@ module JsonLdHelper
|
||||||
if value.is_a?(Hash) && compacted_value.is_a?(Hash)
|
if value.is_a?(Hash) && compacted_value.is_a?(Hash)
|
||||||
patch_for_forwarding!(value, compacted_value)
|
patch_for_forwarding!(value, compacted_value)
|
||||||
elsif value.is_a?(Array)
|
elsif value.is_a?(Array)
|
||||||
compacted_value = [compacted_value] unless compacted_value.is_a?(Array)
|
compacted_value = [compacted_value] unless compacted_value.is_a?(Array) # rubocop:disable Style/ArrayCoercion
|
||||||
return if value.size != compacted_value.size
|
return if value.size != compacted_value.size
|
||||||
|
|
||||||
compacted[key] = value.zip(compacted_value).map do |v, vc|
|
compacted[key] = value.zip(compacted_value).map do |v, vc|
|
||||||
|
@ -143,7 +143,7 @@ module JsonLdHelper
|
||||||
def safe_for_forwarding?(original, compacted)
|
def safe_for_forwarding?(original, compacted)
|
||||||
original.without('@context', 'signature').all? do |key, value|
|
original.without('@context', 'signature').all? do |key, value|
|
||||||
compacted_value = compacted[key]
|
compacted_value = compacted[key]
|
||||||
return false unless value.class == compacted_value.class
|
return false unless value.class == compacted_value.class # rubocop:disable Style/ClassEqualityComparison
|
||||||
|
|
||||||
if value.is_a?(Hash)
|
if value.is_a?(Hash)
|
||||||
safe_for_forwarding?(value, compacted_value)
|
safe_for_forwarding?(value, compacted_value)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module LanguagesHelper
|
module LanguagesHelper # rubocop:disable Metrics/ModuleLength
|
||||||
ISO_639_1 = {
|
ISO_639_1 = {
|
||||||
aa: ['Afar', 'Afaraf'].freeze,
|
aa: ['Afar', 'Afaraf'].freeze,
|
||||||
ab: ['Abkhaz', 'аҧсуа бызшәа'].freeze,
|
ab: ['Abkhaz', 'аҧсуа бызшәа'].freeze,
|
||||||
|
|
|
@ -13,7 +13,7 @@ module ActivityPub::CaseTransform
|
||||||
when Symbol then camel_lower(value.to_s).to_sym
|
when Symbol then camel_lower(value.to_s).to_sym
|
||||||
when String
|
when String
|
||||||
camel_lower_cache[value] ||= if value.start_with?('_:')
|
camel_lower_cache[value] ||= if value.start_with?('_:')
|
||||||
'_:' + value.gsub(/\A_:/, '').underscore.camelize(:lower)
|
"_:#{value.gsub(/\A_:/, '').underscore.camelize(:lower)}"
|
||||||
else
|
else
|
||||||
value.underscore.camelize(:lower)
|
value.underscore.camelize(:lower)
|
||||||
end
|
end
|
||||||
|
|
|
@ -62,7 +62,7 @@ class EmojiFormatter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
result << html[last_index..-1]
|
result << html[last_index..]
|
||||||
|
|
||||||
result.html_safe # rubocop:disable Rails/OutputSafety
|
result.html_safe # rubocop:disable Rails/OutputSafety
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,7 +29,7 @@ module Extractor
|
||||||
|
|
||||||
text.scan(Account::MENTION_RE) do |screen_name, _|
|
text.scan(Account::MENTION_RE) do |screen_name, _|
|
||||||
match_data = $LAST_MATCH_INFO
|
match_data = $LAST_MATCH_INFO
|
||||||
after = $'
|
after = Regexp.last_match.post_match
|
||||||
|
|
||||||
unless Twitter::TwitterText::Regex[:end_mention_match].match?(after)
|
unless Twitter::TwitterText::Regex[:end_mention_match].match?(after)
|
||||||
_, domain = screen_name.split('@')
|
_, domain = screen_name.split('@')
|
||||||
|
@ -64,7 +64,7 @@ module Extractor
|
||||||
match_data = $LAST_MATCH_INFO
|
match_data = $LAST_MATCH_INFO
|
||||||
start_position = match_data.char_begin(1) - 1
|
start_position = match_data.char_begin(1) - 1
|
||||||
end_position = match_data.char_end(1)
|
end_position = match_data.char_end(1)
|
||||||
after = $'
|
after = Regexp.last_match.post_match
|
||||||
|
|
||||||
if %r{\A://}.match?(after)
|
if %r{\A://}.match?(after)
|
||||||
hash_text.match(/(.+)(https?\Z)/) do |matched|
|
hash_text.match(/(.+)(https?\Z)/) do |matched|
|
||||||
|
|
|
@ -7,8 +7,8 @@ class RedisConfiguration
|
||||||
@pool = ConnectionPool.new(size: new_pool_size) { new.connection }
|
@pool = ConnectionPool.new(size: new_pool_size) { new.connection }
|
||||||
end
|
end
|
||||||
|
|
||||||
def with
|
def with(&block)
|
||||||
pool.with { |redis| yield redis }
|
pool.with(&block)
|
||||||
end
|
end
|
||||||
|
|
||||||
def pool
|
def pool
|
||||||
|
|
|
@ -64,7 +64,7 @@ class TextFormatter
|
||||||
indices.last
|
indices.last
|
||||||
end
|
end
|
||||||
|
|
||||||
result << h(text[last_index..-1])
|
result << h(text[last_index..])
|
||||||
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
@ -75,8 +75,8 @@ class TextFormatter
|
||||||
|
|
||||||
prefix = url.match(URL_PREFIX_REGEX).to_s
|
prefix = url.match(URL_PREFIX_REGEX).to_s
|
||||||
display_url = url[prefix.length, 30]
|
display_url = url[prefix.length, 30]
|
||||||
suffix = url[prefix.length + 30..-1]
|
suffix = url[prefix.length + 30..]
|
||||||
cutoff = url[prefix.length..-1].length > 30
|
cutoff = url[prefix.length..].length > 30
|
||||||
|
|
||||||
<<~HTML.squish
|
<<~HTML.squish
|
||||||
<a href="#{h(url)}" target="_blank" rel="#{rel.join(' ')}"><span class="invisible">#{h(prefix)}</span><span class="#{cutoff ? 'ellipsis' : ''}">#{h(display_url)}</span><span class="invisible">#{h(suffix)}</span></a>
|
<a href="#{h(url)}" target="_blank" rel="#{rel.join(' ')}"><span class="invisible">#{h(prefix)}</span><span class="#{cutoff ? 'ellipsis' : ''}">#{h(display_url)}</span><span class="invisible">#{h(suffix)}</span></a>
|
||||||
|
|
|
@ -53,7 +53,7 @@ class TOCGenerator
|
||||||
|
|
||||||
next unless LISTED_ELEMENTS.include?(node.name)
|
next unless LISTED_ELEMENTS.include?(node.name)
|
||||||
|
|
||||||
depth = node.name[1..-1]
|
depth = node.name[1..]
|
||||||
latest_section = @headers.last
|
latest_section = @headers.last
|
||||||
|
|
||||||
if latest_section.nil? || latest_section.depth >= depth
|
if latest_section.nil? || latest_section.depth >= depth
|
||||||
|
|
|
@ -14,7 +14,7 @@ class UserSettingsDecorator
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def process_update
|
def process_update # rubocop:disable Metrics/AbcSize
|
||||||
user.settings['notification_emails'] = merged_notification_emails if change?('notification_emails')
|
user.settings['notification_emails'] = merged_notification_emails if change?('notification_emails')
|
||||||
user.settings['interactions'] = merged_interactions if change?('interactions')
|
user.settings['interactions'] = merged_interactions if change?('interactions')
|
||||||
user.settings['default_privacy'] = default_privacy_preference if change?('setting_default_privacy')
|
user.settings['default_privacy'] = default_privacy_preference if change?('setting_default_privacy')
|
||||||
|
|
|
@ -19,7 +19,7 @@ class ValidationErrorFormatter
|
||||||
messages = errors.messages[attribute_name]
|
messages = errors.messages[attribute_name]
|
||||||
|
|
||||||
h[@aliases[attribute_name] || attribute_name] = attribute_errors.map.with_index do |error, index|
|
h[@aliases[attribute_name] || attribute_name] = attribute_errors.map.with_index do |error, index|
|
||||||
{ error: 'ERR_' + error[:error].to_s.upcase, description: messages[index] }
|
{ error: "ERR_#{error[:error].to_s.upcase}", description: messages[index] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ class Webfinger
|
||||||
end
|
end
|
||||||
|
|
||||||
def standard_url
|
def standard_url
|
||||||
if @domain.end_with? ".onion"
|
if @domain.end_with? '.onion'
|
||||||
"http://#{@domain}/.well-known/webfinger?resource=#{@uri}"
|
"http://#{@domain}/.well-known/webfinger?resource=#{@uri}"
|
||||||
else
|
else
|
||||||
"https://#{@domain}/.well-known/webfinger?resource=#{@uri}"
|
"https://#{@domain}/.well-known/webfinger?resource=#{@uri}"
|
||||||
|
@ -107,7 +107,7 @@ class Webfinger
|
||||||
end
|
end
|
||||||
|
|
||||||
def host_meta_url
|
def host_meta_url
|
||||||
if @domain.end_with? ".onion"
|
if @domain.end_with? '.onion'
|
||||||
"http://#{@domain}/.well-known/host-meta"
|
"http://#{@domain}/.well-known/host-meta"
|
||||||
else
|
else
|
||||||
"https://#{@domain}/.well-known/host-meta"
|
"https://#{@domain}/.well-known/host-meta"
|
||||||
|
|
|
@ -9,9 +9,7 @@ class ApplicationMailer < ActionMailer::Base
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def locale_for_account(account)
|
def locale_for_account(account, &block)
|
||||||
I18n.with_locale(account.user_locale || I18n.default_locale) do
|
I18n.with_locale(account.user_locale || I18n.default_locale, &block)
|
||||||
yield
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,7 @@ class AccountAlias < ApplicationRecord
|
||||||
|
|
||||||
def acct=(val)
|
def acct=(val)
|
||||||
val = val.to_s.strip
|
val = val.to_s.strip
|
||||||
super(val.start_with?('@') ? val[1..-1] : val)
|
super(val.start_with?('@') ? val[1..] : val)
|
||||||
end
|
end
|
||||||
|
|
||||||
def pretty_acct
|
def pretty_acct
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
class AccountWarning < ApplicationRecord
|
class AccountWarning < ApplicationRecord
|
||||||
|
# rubocop:disable Lint/RedundantCopDisableDirective, Layout/FirstHashElementIndentation
|
||||||
enum action: {
|
enum action: {
|
||||||
none: 0,
|
none: 0,
|
||||||
disable: 1_000,
|
disable: 1_000,
|
||||||
|
@ -25,6 +26,7 @@ class AccountWarning < ApplicationRecord
|
||||||
silence: 3_000,
|
silence: 3_000,
|
||||||
suspend: 4_000,
|
suspend: 4_000,
|
||||||
}, _suffix: :action
|
}, _suffix: :action
|
||||||
|
# rubocop:enable Lint/RedundantCopDisableDirective, Layout/FirstHashElementIndentation
|
||||||
|
|
||||||
belongs_to :account, inverse_of: :account_warnings
|
belongs_to :account, inverse_of: :account_warnings
|
||||||
belongs_to :target_account, class_name: 'Account', inverse_of: :strikes
|
belongs_to :target_account, class_name: 'Account', inverse_of: :strikes
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module AccountInteractions
|
module AccountInteractions # rubocop:disable Metrics/ModuleLength
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
class_methods do
|
class_methods do
|
||||||
|
|
|
@ -17,7 +17,7 @@ module Expireable
|
||||||
end
|
end
|
||||||
|
|
||||||
def expires_in=(interval)
|
def expires_in=(interval)
|
||||||
self.expires_at = interval.present? ? interval.to_i.seconds.from_now : nil
|
self.expires_at = interval.present? ? interval.to_i.seconds.from_now : nil
|
||||||
@expires_in = interval
|
@expires_in = interval
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class CustomEmoji < ApplicationRecord
|
||||||
scope :local, -> { where(domain: nil) }
|
scope :local, -> { where(domain: nil) }
|
||||||
scope :remote, -> { where.not(domain: nil) }
|
scope :remote, -> { where.not(domain: nil) }
|
||||||
scope :alphabetic, -> { order(domain: :asc, shortcode: :asc) }
|
scope :alphabetic, -> { order(domain: :asc, shortcode: :asc) }
|
||||||
scope :by_domain_and_subdomains, ->(domain) { where(domain: domain).or(where(arel_table[:domain].matches('%.' + domain))) }
|
scope :by_domain_and_subdomains, ->(domain) { where(domain: domain).or(where(arel_table[:domain].matches("%.#{domain}"))) }
|
||||||
scope :listed, -> { local.where(disabled: false).where(visible_in_picker: true) }
|
scope :listed, -> { local.where(disabled: false).where(visible_in_picker: true) }
|
||||||
|
|
||||||
remotable_attachment :image, LIMIT
|
remotable_attachment :image, LIMIT
|
||||||
|
|
|
@ -63,7 +63,7 @@ class DomainBlock < ApplicationRecord
|
||||||
|
|
||||||
uri = Addressable::URI.new.tap { |u| u.host = domain.strip.gsub(/[\/]/, '') }
|
uri = Addressable::URI.new.tap { |u| u.host = domain.strip.gsub(/[\/]/, '') }
|
||||||
segments = uri.normalized_host.split('.')
|
segments = uri.normalized_host.split('.')
|
||||||
variants = segments.map.with_index { |_, i| segments[i..-1].join('.') }
|
variants = segments.map.with_index { |_, i| segments[i..].join('.') }
|
||||||
|
|
||||||
where(domain: variants).order(Arel.sql('char_length(domain) desc')).first
|
where(domain: variants).order(Arel.sql('char_length(domain) desc')).first
|
||||||
rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
|
rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
|
||||||
|
|
|
@ -52,6 +52,6 @@ class PreviewCardProvider < ApplicationRecord
|
||||||
|
|
||||||
def self.matching_domain(domain)
|
def self.matching_domain(domain)
|
||||||
segments = domain.split('.')
|
segments = domain.split('.')
|
||||||
where(domain: segments.map.with_index { |_, i| segments[i..-1].join('.') }).order(Arel.sql('char_length(domain) desc')).first
|
where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).order(Arel.sql('char_length(domain) desc')).first
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer
|
class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer
|
||||||
def self.serializer_for(model, options)
|
def self.serializer_for(model, options)
|
||||||
if model.class.name == 'ActivityPub::ActivityPresenter'
|
if model.instance_of?(ActivityPub::ActivityPresenter)
|
||||||
ActivityPub::ActivitySerializer
|
ActivityPub::ActivitySerializer
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
|
|
|
@ -53,7 +53,7 @@ class BackupService < BaseService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
archive_filename = ['archive', Time.now.utc.strftime('%Y%m%d%H%M%S'), SecureRandom.hex(16)].join('-') + '.tar.gz'
|
archive_filename = "#{['archive', Time.now.utc.strftime('%Y%m%d%H%M%S'), SecureRandom.hex(16)].join('-')}.tar.gz"
|
||||||
|
|
||||||
@backup.dump = ActionDispatch::Http::UploadedFile.new(tempfile: tmp_file, filename: archive_filename)
|
@backup.dump = ActionDispatch::Http::UploadedFile.new(tempfile: tmp_file, filename: archive_filename)
|
||||||
@backup.processed = true
|
@backup.processed = true
|
||||||
|
@ -86,14 +86,14 @@ class BackupService < BaseService
|
||||||
def dump_actor!(tar)
|
def dump_actor!(tar)
|
||||||
actor = serialize(account, ActivityPub::ActorSerializer)
|
actor = serialize(account, ActivityPub::ActorSerializer)
|
||||||
|
|
||||||
actor[:icon][:url] = 'avatar' + File.extname(actor[:icon][:url]) if actor[:icon]
|
actor[:icon][:url] = "avatar#{File.extname(actor[:icon][:url])}" if actor[:icon]
|
||||||
actor[:image][:url] = 'header' + File.extname(actor[:image][:url]) if actor[:image]
|
actor[:image][:url] = "header#{File.extname(actor[:image][:url])}" if actor[:image]
|
||||||
actor[:outbox] = 'outbox.json'
|
actor[:outbox] = 'outbox.json'
|
||||||
actor[:likes] = 'likes.json'
|
actor[:likes] = 'likes.json'
|
||||||
actor[:bookmarks] = 'bookmarks.json'
|
actor[:bookmarks] = 'bookmarks.json'
|
||||||
|
|
||||||
download_to_tar(tar, account.avatar, 'avatar' + File.extname(account.avatar.path)) if account.avatar.exists?
|
download_to_tar(tar, account.avatar, "avatar#{File.extname(account.avatar.path)}") if account.avatar.exists?
|
||||||
download_to_tar(tar, account.header, 'header' + File.extname(account.header.path)) if account.header.exists?
|
download_to_tar(tar, account.header, "header#{File.extname(account.header.path)}") if account.header.exists?
|
||||||
|
|
||||||
json = Oj.dump(actor)
|
json = Oj.dump(actor)
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ class FetchLinkCardService < BaseService
|
||||||
def html
|
def html
|
||||||
return @html if defined?(@html)
|
return @html if defined?(@html)
|
||||||
|
|
||||||
Request.new(:get, @url).add_headers('Accept' => 'text/html', 'User-Agent' => Mastodon::Version.user_agent + ' Bot').perform do |res|
|
Request.new(:get, @url).add_headers('Accept' => 'text/html', 'User-Agent' => '${Mastodon::Version.user_agent} Bot').perform do |res|
|
||||||
# We follow redirects, and ideally we want to save the preview card for
|
# We follow redirects, and ideally we want to save the preview card for
|
||||||
# the destination URL and not any link shortener in-between, so here
|
# the destination URL and not any link shortener in-between, so here
|
||||||
# we set the URL to the one of the last response in the redirect chain
|
# we set the URL to the one of the last response in the redirect chain
|
||||||
|
|
|
@ -21,8 +21,8 @@ class ExistingUsernameValidator < ActiveModel::EachValidator
|
||||||
|
|
||||||
if options[:multiple]
|
if options[:multiple]
|
||||||
record.errors.add(attribute, I18n.t('existing_username_validator.not_found_multiple', usernames: usernames_with_no_accounts.join(', '))) if usernames_with_no_accounts.any?
|
record.errors.add(attribute, I18n.t('existing_username_validator.not_found_multiple', usernames: usernames_with_no_accounts.join(', '))) if usernames_with_no_accounts.any?
|
||||||
else
|
elsif usernames_with_no_accounts.any? || usernames_and_domains.size > 1
|
||||||
record.errors.add(attribute, I18n.t('existing_username_validator.not_found')) if usernames_with_no_accounts.any? || usernames_and_domains.size > 1
|
record.errors.add(attribute, I18n.t('existing_username_validator.not_found'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -53,7 +53,7 @@ class StatusLengthValidator < ActiveModel::Validator
|
||||||
entity[:indices].last
|
entity[:indices].last
|
||||||
end
|
end
|
||||||
|
|
||||||
result << str[last_index..-1]
|
result << str[last_index..]
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,7 +29,7 @@ module ActiveRecord
|
||||||
if flatten
|
if flatten
|
||||||
yield record[1]
|
yield record[1]
|
||||||
else
|
else
|
||||||
yield record[1..-1]
|
yield record[1..]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ module Mastodon
|
||||||
failed = Concurrent::AtomicFixnum.new(0)
|
failed = Concurrent::AtomicFixnum.new(0)
|
||||||
start_at = Time.now.to_f
|
start_at = Time.now.to_f
|
||||||
seed = start ? [start] : Instance.pluck(:domain)
|
seed = start ? [start] : Instance.pluck(:domain)
|
||||||
blocked_domains = Regexp.new('\\.?' + DomainBlock.where(severity: 1).pluck(:domain).join('|') + '$')
|
blocked_domains = Regexp.new("\\.?#{DomainBlock.where(severity: 1).pluck(:domain).join('|')}$")
|
||||||
progress = create_progress_bar
|
progress = create_progress_bar
|
||||||
|
|
||||||
pool = Concurrent::ThreadPoolExecutor.new(min_threads: 0, max_threads: options[:concurrency], idletime: 10, auto_terminate: true, max_queue: 0)
|
pool = Concurrent::ThreadPoolExecutor.new(min_threads: 0, max_threads: options[:concurrency], idletime: 10, auto_terminate: true, max_queue: 0)
|
||||||
|
|
|
@ -49,7 +49,7 @@ module Mastodon
|
||||||
next if filename.start_with?('._')
|
next if filename.start_with?('._')
|
||||||
|
|
||||||
shortcode = [options[:prefix], filename, options[:suffix]].compact.join
|
shortcode = [options[:prefix], filename, options[:suffix]].compact.join
|
||||||
custom_emoji = CustomEmoji.local.find_by("LOWER(shortcode) = ?", shortcode.downcase)
|
custom_emoji = CustomEmoji.local.find_by('LOWER(shortcode) = ?', shortcode.downcase)
|
||||||
|
|
||||||
if custom_emoji && !options[:overwrite]
|
if custom_emoji && !options[:overwrite]
|
||||||
skipped += 1
|
skipped += 1
|
||||||
|
@ -68,7 +68,7 @@ module Mastodon
|
||||||
failed += 1
|
failed += 1
|
||||||
say('Failure/Error: ', :red)
|
say('Failure/Error: ', :red)
|
||||||
say(entry.full_name)
|
say(entry.full_name)
|
||||||
say(' ' + custom_emoji.errors[:image].join(', '), :red)
|
say(" #{custom_emoji.errors[:image].join(', ')}", :red)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -183,7 +183,7 @@ module Mastodon
|
||||||
deduplicate_tags!
|
deduplicate_tags!
|
||||||
deduplicate_webauthn_credentials!
|
deduplicate_webauthn_credentials!
|
||||||
|
|
||||||
Scenic.database.refresh_materialized_view('instances', concurrently: true, cascade: false) if ActiveRecord::Migrator.current_version >= 2020_12_06_004238
|
Scenic.database.refresh_materialized_view('instances', concurrently: true, cascade: false) if ActiveRecord::Migrator.current_version >= 2020_12_06_004238 # rubocop:disable Style/NumericLiterals
|
||||||
Rails.cache.clear
|
Rails.cache.clear
|
||||||
|
|
||||||
@prompt.say 'Finished!'
|
@prompt.say 'Finished!'
|
||||||
|
@ -207,7 +207,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring index_accounts_on_username_and_domain_lower…'
|
@prompt.say 'Restoring index_accounts_on_username_and_domain_lower…'
|
||||||
if ActiveRecord::Migrator.current_version < 20200620164023 # rubocop:disable Style/NumericLiterals
|
if ActiveRecord::Migrator.current_version < 2020_06_20_16_40_23 # rubocop:disable Style/NumericLiterals
|
||||||
ActiveRecord::Base.connection.add_index :accounts, 'lower (username), lower(domain)', name: 'index_accounts_on_username_and_domain_lower', unique: true
|
ActiveRecord::Base.connection.add_index :accounts, 'lower (username), lower(domain)', name: 'index_accounts_on_username_and_domain_lower', unique: true
|
||||||
else
|
else
|
||||||
ActiveRecord::Base.connection.add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true
|
ActiveRecord::Base.connection.add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true
|
||||||
|
@ -250,7 +250,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if ActiveRecord::Migrator.current_version < 20220118183010 # rubocop:disable Style/NumericLiterals
|
if ActiveRecord::Migrator.current_version < 2022_01_18_18_30_10 # rubocop:disable Style/NumericLiterals
|
||||||
ActiveRecord::Base.connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE remember_token IS NOT NULL GROUP BY remember_token HAVING count(*) > 1").each do |row|
|
ActiveRecord::Base.connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE remember_token IS NOT NULL GROUP BY remember_token HAVING count(*) > 1").each do |row|
|
||||||
users = User.where(id: row['ids'].split(',')).sort_by(&:updated_at).reverse.drop(1)
|
users = User.where(id: row['ids'].split(',')).sort_by(&:updated_at).reverse.drop(1)
|
||||||
@prompt.warn "Unsetting remember token for those accounts: #{users.map(&:account).map(&:acct).join(', ')}"
|
@prompt.warn "Unsetting remember token for those accounts: #{users.map(&:account).map(&:acct).join(', ')}"
|
||||||
|
@ -273,9 +273,9 @@ module Mastodon
|
||||||
@prompt.say 'Restoring users indexes…'
|
@prompt.say 'Restoring users indexes…'
|
||||||
ActiveRecord::Base.connection.add_index :users, ['confirmation_token'], name: 'index_users_on_confirmation_token', unique: true
|
ActiveRecord::Base.connection.add_index :users, ['confirmation_token'], name: 'index_users_on_confirmation_token', unique: true
|
||||||
ActiveRecord::Base.connection.add_index :users, ['email'], name: 'index_users_on_email', unique: true
|
ActiveRecord::Base.connection.add_index :users, ['email'], name: 'index_users_on_email', unique: true
|
||||||
ActiveRecord::Base.connection.add_index :users, ['remember_token'], name: 'index_users_on_remember_token', unique: true if ActiveRecord::Migrator.current_version < 20220118183010
|
ActiveRecord::Base.connection.add_index :users, ['remember_token'], name: 'index_users_on_remember_token', unique: true if ActiveRecord::Migrator.current_version < 2022_01_18_18_30_10 # rubocop:disable Style/NumericLiterals
|
||||||
|
|
||||||
if ActiveRecord::Migrator.current_version < 20220310060641 # rubocop:disable Style/NumericLiterals
|
if ActiveRecord::Migrator.current_version < 2022_03_10_06_06_41 # rubocop:disable Style/NumericLiterals
|
||||||
ActiveRecord::Base.connection.add_index :users, ['reset_password_token'], name: 'index_users_on_reset_password_token', unique: true
|
ActiveRecord::Base.connection.add_index :users, ['reset_password_token'], name: 'index_users_on_reset_password_token', unique: true
|
||||||
else
|
else
|
||||||
ActiveRecord::Base.connection.add_index :users, ['reset_password_token'], name: 'index_users_on_reset_password_token', unique: true, where: 'reset_password_token IS NOT NULL', opclass: :text_pattern_ops
|
ActiveRecord::Base.connection.add_index :users, ['reset_password_token'], name: 'index_users_on_reset_password_token', unique: true, where: 'reset_password_token IS NOT NULL', opclass: :text_pattern_ops
|
||||||
|
@ -291,7 +291,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring account domain blocks indexes…'
|
@prompt.say 'Restoring account domain blocks indexes…'
|
||||||
ActiveRecord::Base.connection.add_index :account_domain_blocks, ['account_id', 'domain'], name: 'index_account_domain_blocks_on_account_id_and_domain', unique: true
|
ActiveRecord::Base.connection.add_index :account_domain_blocks, %w(account_id domain), name: 'index_account_domain_blocks_on_account_id_and_domain', unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
def deduplicate_account_identity_proofs!
|
def deduplicate_account_identity_proofs!
|
||||||
|
@ -305,7 +305,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring account identity proofs indexes…'
|
@prompt.say 'Restoring account identity proofs indexes…'
|
||||||
ActiveRecord::Base.connection.add_index :account_identity_proofs, ['account_id', 'provider', 'provider_username'], name: 'index_account_proofs_on_account_and_provider_and_username', unique: true
|
ActiveRecord::Base.connection.add_index :account_identity_proofs, %w(account_id provider provider_username), name: 'index_account_proofs_on_account_and_provider_and_username', unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
def deduplicate_announcement_reactions!
|
def deduplicate_announcement_reactions!
|
||||||
|
@ -319,7 +319,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring announcement_reactions indexes…'
|
@prompt.say 'Restoring announcement_reactions indexes…'
|
||||||
ActiveRecord::Base.connection.add_index :announcement_reactions, ['account_id', 'announcement_id', 'name'], name: 'index_announcement_reactions_on_account_id_and_announcement_id', unique: true
|
ActiveRecord::Base.connection.add_index :announcement_reactions, %w(account_id announcement_id name), name: 'index_announcement_reactions_on_account_id_and_announcement_id', unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
def deduplicate_conversations!
|
def deduplicate_conversations!
|
||||||
|
@ -338,7 +338,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring conversations indexes…'
|
@prompt.say 'Restoring conversations indexes…'
|
||||||
if ActiveRecord::Migrator.current_version < 20220307083603 # rubocop:disable Style/NumericLiterals
|
if ActiveRecord::Migrator.current_version < 2022_03_07_08_36_03 # rubocop:disable Style/NumericLiterals
|
||||||
ActiveRecord::Base.connection.add_index :conversations, ['uri'], name: 'index_conversations_on_uri', unique: true
|
ActiveRecord::Base.connection.add_index :conversations, ['uri'], name: 'index_conversations_on_uri', unique: true
|
||||||
else
|
else
|
||||||
ActiveRecord::Base.connection.add_index :conversations, ['uri'], name: 'index_conversations_on_uri', unique: true, where: 'uri IS NOT NULL', opclass: :text_pattern_ops
|
ActiveRecord::Base.connection.add_index :conversations, ['uri'], name: 'index_conversations_on_uri', unique: true, where: 'uri IS NOT NULL', opclass: :text_pattern_ops
|
||||||
|
@ -361,7 +361,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring custom_emojis indexes…'
|
@prompt.say 'Restoring custom_emojis indexes…'
|
||||||
ActiveRecord::Base.connection.add_index :custom_emojis, ['shortcode', 'domain'], name: 'index_custom_emojis_on_shortcode_and_domain', unique: true
|
ActiveRecord::Base.connection.add_index :custom_emojis, %w(shortcode domain), name: 'index_custom_emojis_on_shortcode_and_domain', unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
def deduplicate_custom_emoji_categories!
|
def deduplicate_custom_emoji_categories!
|
||||||
|
@ -488,7 +488,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
@prompt.say 'Restoring statuses indexes…'
|
@prompt.say 'Restoring statuses indexes…'
|
||||||
if ActiveRecord::Migrator.current_version < 20220310060706 # rubocop:disable Style/NumericLiterals
|
if ActiveRecord::Migrator.current_version < 2022_03_10_06_07_06 # rubocop:disable Style/NumericLiterals
|
||||||
ActiveRecord::Base.connection.add_index :statuses, ['uri'], name: 'index_statuses_on_uri', unique: true
|
ActiveRecord::Base.connection.add_index :statuses, ['uri'], name: 'index_statuses_on_uri', unique: true
|
||||||
else
|
else
|
||||||
ActiveRecord::Base.connection.add_index :statuses, ['uri'], name: 'index_statuses_on_uri', unique: true, where: 'uri IS NOT NULL', opclass: :text_pattern_ops
|
ActiveRecord::Base.connection.add_index :statuses, ['uri'], name: 'index_statuses_on_uri', unique: true, where: 'uri IS NOT NULL', opclass: :text_pattern_ops
|
||||||
|
|
|
@ -260,7 +260,7 @@ module Mastodon
|
||||||
def lookup(url)
|
def lookup(url)
|
||||||
path = Addressable::URI.parse(url).path
|
path = Addressable::URI.parse(url).path
|
||||||
|
|
||||||
path_segments = path.split('/')[2..-1]
|
path_segments = path.split('/')[2..]
|
||||||
path_segments.delete('cache')
|
path_segments.delete('cache')
|
||||||
|
|
||||||
unless [7, 10].include?(path_segments.size)
|
unless [7, 10].include?(path_segments.size)
|
||||||
|
|
|
@ -284,13 +284,6 @@ module Mastodon
|
||||||
# table - The name of the table.
|
# table - The name of the table.
|
||||||
# column - The name of the column to update.
|
# column - The name of the column to update.
|
||||||
# value - The value for the column.
|
# value - The value for the column.
|
||||||
#
|
|
||||||
# Rubocop's Metrics/AbcSize metric is disabled for this method as Rubocop
|
|
||||||
# determines this method to be too complex while there's no way to make it
|
|
||||||
# less "complex" without introducing extra methods (which actually will
|
|
||||||
# make things _more_ complex).
|
|
||||||
#
|
|
||||||
# rubocop: disable Metrics/AbcSize
|
|
||||||
def update_column_in_batches(table_name, column, value)
|
def update_column_in_batches(table_name, column, value)
|
||||||
if transaction_open?
|
if transaction_open?
|
||||||
raise 'update_column_in_batches can not be run inside a transaction, ' \
|
raise 'update_column_in_batches can not be run inside a transaction, ' \
|
||||||
|
|
|
@ -12,7 +12,7 @@ module PremailerWebpackStrategy
|
||||||
css = if url.start_with?('http')
|
css = if url.start_with?('http')
|
||||||
HTTP.get(url).to_s
|
HTTP.get(url).to_s
|
||||||
else
|
else
|
||||||
url = url[1..-1] if url.start_with?('/')
|
url = url[1..] if url.start_with?('/')
|
||||||
File.read(Rails.root.join('public', url))
|
File.read(Rails.root.join('public', url))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
def setup_redis_env_url(prefix = nil, defaults = true)
|
def setup_redis_env_url(prefix = nil, defaults = true)
|
||||||
prefix = prefix.to_s.upcase + '_' unless prefix.nil?
|
prefix = "#{prefix.to_s.upcase}_" unless prefix.nil?
|
||||||
prefix = '' if prefix.nil?
|
prefix = '' if prefix.nil?
|
||||||
|
|
||||||
return if ENV[prefix + 'REDIS_URL'].present?
|
return if ENV["#{prefix}REDIS_URL"].present?
|
||||||
|
|
||||||
password = ENV.fetch(prefix + 'REDIS_PASSWORD') { '' if defaults }
|
password = ENV.fetch("#{prefix}REDIS_PASSWORD") { '' if defaults }
|
||||||
host = ENV.fetch(prefix + 'REDIS_HOST') { 'localhost' if defaults }
|
host = ENV.fetch("#{prefix}REDIS_HOST") { 'localhost' if defaults }
|
||||||
port = ENV.fetch(prefix + 'REDIS_PORT') { 6379 if defaults }
|
port = ENV.fetch("#{prefix}REDIS_PORT") { 6379 if defaults }
|
||||||
db = ENV.fetch(prefix + 'REDIS_DB') { 0 if defaults }
|
db = ENV.fetch("#{prefix}REDIS_DB") { 0 if defaults }
|
||||||
|
|
||||||
ENV[prefix + 'REDIS_URL'] = begin
|
ENV["#{prefix}REDIS_URL"] = begin
|
||||||
if [password, host, port, db].all?(&:nil?)
|
if [password, host, port, db].all?(&:nil?)
|
||||||
ENV['REDIS_URL']
|
ENV['REDIS_URL']
|
||||||
else
|
else
|
||||||
|
@ -27,7 +27,7 @@ setup_redis_env_url(:cache, false)
|
||||||
setup_redis_env_url(:sidekiq, false)
|
setup_redis_env_url(:sidekiq, false)
|
||||||
|
|
||||||
namespace = ENV.fetch('REDIS_NAMESPACE', nil)
|
namespace = ENV.fetch('REDIS_NAMESPACE', nil)
|
||||||
cache_namespace = namespace ? namespace + '_cache' : 'cache'
|
cache_namespace = namespace ? "#{namespace}_cache" : 'cache'
|
||||||
sidekiq_namespace = namespace
|
sidekiq_namespace = namespace
|
||||||
|
|
||||||
REDIS_CACHE_PARAMS = {
|
REDIS_CACHE_PARAMS = {
|
||||||
|
|
|
@ -115,7 +115,7 @@ module Mastodon::Snowflake
|
||||||
# And only those that are using timestamp_id.
|
# And only those that are using timestamp_id.
|
||||||
next unless (data = DEFAULT_REGEX.match(id_col.default_function))
|
next unless (data = DEFAULT_REGEX.match(id_col.default_function))
|
||||||
|
|
||||||
seq_name = data[:seq_prefix] + '_id_seq'
|
seq_name = "#{data[:seq_prefix]}_id_seq"
|
||||||
|
|
||||||
# If we were on Postgres 9.5+, we could do CREATE SEQUENCE IF
|
# If we were on Postgres 9.5+, we could do CREATE SEQUENCE IF
|
||||||
# NOT EXISTS, but we can't depend on that. Instead, catch the
|
# NOT EXISTS, but we can't depend on that. Instead, catch the
|
||||||
|
|
|
@ -8,7 +8,7 @@ module Paperclip
|
||||||
|
|
||||||
# monkey-patch to avoid unlinking too avoid unlinking source file too early
|
# monkey-patch to avoid unlinking too avoid unlinking source file too early
|
||||||
# see https://github.com/kreeti/kt-paperclip/issues/64
|
# see https://github.com/kreeti/kt-paperclip/issues/64
|
||||||
def post_process_style(name, style) #:nodoc:
|
def post_process_style(name, style) # :nodoc:
|
||||||
raise "Style #{name} has no processors defined." if style.processors.blank?
|
raise "Style #{name} has no processors defined." if style.processors.blank?
|
||||||
|
|
||||||
intermediate_files = []
|
intermediate_files = []
|
||||||
|
@ -16,16 +16,14 @@ module Paperclip
|
||||||
# if we're processing the original, close + unlink the source tempfile
|
# if we're processing the original, close + unlink the source tempfile
|
||||||
intermediate_files << original if name == :original
|
intermediate_files << original if name == :original
|
||||||
|
|
||||||
@queued_for_write[name] = style.processors.
|
@queued_for_write[name] = style.processors.reduce(original) do |file, processor|
|
||||||
inject(original) do |file, processor|
|
|
||||||
file = Paperclip.processor(processor).make(file, style.processor_options, self)
|
file = Paperclip.processor(processor).make(file, style.processor_options, self)
|
||||||
intermediate_files << file unless file == original
|
intermediate_files << file unless file == original
|
||||||
file
|
file
|
||||||
end
|
end
|
||||||
|
|
||||||
unadapted_file = @queued_for_write[name]
|
unadapted_file = @queued_for_write[name]
|
||||||
@queued_for_write[name] = Paperclip.io_adapters.
|
@queued_for_write[name] = Paperclip.io_adapters.for(@queued_for_write[name], @options[:adapter_options])
|
||||||
for(@queued_for_write[name], @options[:adapter_options])
|
|
||||||
unadapted_file.close if unadapted_file.respond_to?(:close)
|
unadapted_file.close if unadapted_file.respond_to?(:close)
|
||||||
@queued_for_write[name]
|
@queued_for_write[name]
|
||||||
rescue Paperclip::Errors::NotIdentifiedByImageMagickError => e
|
rescue Paperclip::Errors::NotIdentifiedByImageMagickError => e
|
||||||
|
|
|
@ -109,7 +109,7 @@ module Paperclip
|
||||||
final_file = Paperclip::Transcoder.make(file, options, attachment)
|
final_file = Paperclip::Transcoder.make(file, options, attachment)
|
||||||
|
|
||||||
if options[:style] == :original
|
if options[:style] == :original
|
||||||
attachment.instance.file_file_name = File.basename(attachment.instance.file_file_name, '.*') + '.mp4'
|
attachment.instance.file_file_name = "#{File.basename(attachment.instance.file_file_name, '.*')}.mp4"
|
||||||
attachment.instance.file_content_type = 'video/mp4'
|
attachment.instance.file_content_type = 'video/mp4'
|
||||||
attachment.instance.type = MediaAttachment.types[:gifv]
|
attachment.instance.type = MediaAttachment.types[:gifv]
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,7 @@ module Paperclip
|
||||||
def make
|
def make
|
||||||
return @file unless options[:format]
|
return @file unless options[:format]
|
||||||
|
|
||||||
target_extension = '.' + options[:format]
|
target_extension = ".#{options[:format]}"
|
||||||
extension = File.extname(attachment.instance_read(:file_name))
|
extension = File.extname(attachment.instance_read(:file_name))
|
||||||
|
|
||||||
return @file unless options[:style] == :original && target_extension && extension != target_extension
|
return @file unless options[:style] == :original && target_extension && extension != target_extension
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module Rails
|
module Rails
|
||||||
module EngineExtensions
|
module EngineExtensions
|
||||||
# Rewrite task loading code to filter digitalocean.rake task
|
# Rewrite task loading code to filter digitalocean.rake task
|
||||||
def run_tasks_blocks(app)
|
def run_tasks_blocks(app)
|
||||||
Railtie.instance_method(:run_tasks_blocks).bind(self).call(app)
|
Railtie.instance_method(:run_tasks_blocks).bind(self).call(app)
|
||||||
paths["lib/tasks"].existent.reject { |ext| ext.end_with?('digitalocean.rake') }.sort.each { |ext| load(ext) }
|
paths['lib/tasks'].existent.reject { |ext| ext.end_with?('digitalocean.rake') }.sort.each { |ext| load(ext) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
namespace :branding do
|
namespace :branding do
|
||||||
desc 'Generate necessary graphic assets for branding from source SVG files'
|
desc 'Generate necessary graphic assets for branding from source SVG files'
|
||||||
task generate: :environment do
|
task generate: :environment do
|
||||||
|
|
|
@ -69,7 +69,7 @@ namespace :emojis do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
existence_maps = grouped_codes.map { |c| c.index_with { |cc| File.exist?(Rails.root.join('public', 'emoji', codepoints_to_filename(cc) + '.svg')) } }
|
existence_maps = grouped_codes.map { |c| c.index_with { |cc| File.exist?(Rails.root.join('public', 'emoji', "#{codepoints_to_filename(cc)}.svg")) } }
|
||||||
map = {}
|
map = {}
|
||||||
|
|
||||||
existence_maps.each do |group|
|
existence_maps.each do |group|
|
||||||
|
|
|
@ -399,11 +399,13 @@ namespace :mastodon do
|
||||||
prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...'
|
prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...'
|
||||||
prompt.say "\n\n"
|
prompt.say "\n\n"
|
||||||
|
|
||||||
|
# rubocop:disable Metrics/BlockNesting
|
||||||
if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile')
|
if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile')
|
||||||
prompt.error 'That failed! Maybe you need swap space?'
|
prompt.error 'That failed! Maybe you need swap space?'
|
||||||
else
|
else
|
||||||
prompt.say 'Done!'
|
prompt.say 'Done!'
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Metrics/BlockNesting
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace :repo do
|
||||||
file.each_line do |line|
|
file.each_line do |line|
|
||||||
if line.start_with?('-')
|
if line.start_with?('-')
|
||||||
new_line = line.gsub(/#([[:digit:]]+)*/) do |pull_request_reference|
|
new_line = line.gsub(/#([[:digit:]]+)*/) do |pull_request_reference|
|
||||||
pull_request_number = pull_request_reference[1..-1]
|
pull_request_number = pull_request_reference[1..]
|
||||||
response = nil
|
response = nil
|
||||||
|
|
||||||
loop do
|
loop do
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace :mastodon do
|
||||||
task :stats do
|
task :stats do
|
||||||
require 'rails/code_statistics'
|
require 'rails/code_statistics'
|
||||||
[
|
[
|
||||||
%w(App\ Libraries app/lib),
|
['App Libraries', 'app/lib'],
|
||||||
%w(Presenters app/presenters),
|
%w(Presenters app/presenters),
|
||||||
%w(Services app/services),
|
%w(Services app/services),
|
||||||
%w(Validators app/validators),
|
%w(Validators app/validators),
|
||||||
|
|
|
@ -4,6 +4,7 @@ module Webpacker::ManifestExtensions
|
||||||
def lookup(name, pack_type = {})
|
def lookup(name, pack_type = {})
|
||||||
asset = super
|
asset = super
|
||||||
|
|
||||||
|
# rubocop:disable Style/SingleArgumentDig
|
||||||
if pack_type[:with_integrity] && asset.respond_to?(:dig)
|
if pack_type[:with_integrity] && asset.respond_to?(:dig)
|
||||||
[asset.dig('src'), asset.dig('integrity')]
|
[asset.dig('src'), asset.dig('integrity')]
|
||||||
elsif asset.respond_to?(:dig)
|
elsif asset.respond_to?(:dig)
|
||||||
|
@ -11,6 +12,7 @@ module Webpacker::ManifestExtensions
|
||||||
else
|
else
|
||||||
asset
|
asset
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Style/SingleArgumentDig
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue