Commit 9ac0c76b authored by Lin Jen-Shin's avatar Lin Jen-Shin

Use StrongMemoize and enable/disable cops properly

parent 0af35d7e
module CreatesCommit module CreatesCommit
extend ActiveSupport::Concern extend ActiveSupport::Concern
include Gitlab::Utils::StrongMemoize
# rubocop:disable Cop/ModuleWithInstanceVariables # rubocop:disable Cop/ModuleWithInstanceVariables
def create_commit(service, success_path:, failure_path:, failure_view: nil, success_notice: nil) def create_commit(service, success_path:, failure_path:, failure_view: nil, success_notice: nil)
...@@ -94,15 +95,20 @@ module CreatesCommit ...@@ -94,15 +95,20 @@ module CreatesCommit
# rubocop:enable Cop/ModuleWithInstanceVariables # rubocop:enable Cop/ModuleWithInstanceVariables
def existing_merge_request_path def existing_merge_request_path
project_merge_request_path(@project, @merge_request) project_merge_request_path(@project, @merge_request) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
# rubocop:disable Cop/ModuleWithInstanceVariables # rubocop:disable Cop/ModuleWithInstanceVariables
def merge_request_exists? def merge_request_exists?
return @merge_request if defined?(@merge_request) strong_memoize(:merge_request) do
MergeRequestsFinder.new(current_user, project_id: @project.id)
@merge_request = MergeRequestsFinder.new(current_user, project_id: @project.id).execute.opened .execute
.find_by(source_project_id: @project_to_commit_into, source_branch: @branch_name, target_branch: @start_branch) .opened
.find_by(
source_project_id: @project_to_commit_into,
source_branch: @branch_name,
target_branch: @start_branch)
end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables # rubocop:enable Cop/ModuleWithInstanceVariables
......
module GroupTree module GroupTree
# rubocop:disable Cop/ModuleWithInstanceVariables
def render_group_tree(groups) def render_group_tree(groups)
@groups = if params[:filter].present? @groups = if params[:filter].present?
Gitlab::GroupHierarchy.new(groups.search(params[:filter])) Gitlab::GroupHierarchy.new(groups.search(params[:filter]))
...@@ -20,5 +21,6 @@ module GroupTree ...@@ -20,5 +21,6 @@ module GroupTree
render json: serializer.represent(@groups) render json: serializer.represent(@groups)
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
end end
end end
...@@ -142,6 +142,7 @@ module IssuableActions ...@@ -142,6 +142,7 @@ module IssuableActions
@resource_name ||= controller_name.singularize @resource_name ||= controller_name.singularize
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def render_entity_json def render_entity_json
if @issuable.valid? if @issuable.valid?
render json: serializer.represent(@issuable) render json: serializer.represent(@issuable)
...@@ -149,6 +150,7 @@ module IssuableActions ...@@ -149,6 +150,7 @@ module IssuableActions
render json: { errors: @issuable.errors.full_messages }, status: :unprocessable_entity render json: { errors: @issuable.errors.full_messages }, status: :unprocessable_entity
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
def serializer def serializer
raise NotImplementedError raise NotImplementedError
...@@ -159,6 +161,6 @@ module IssuableActions ...@@ -159,6 +161,6 @@ module IssuableActions
end end
def parent def parent
@project || @group @project || @group # rubocop:disable Cop/ModuleWithInstanceVariables
end end
end end
...@@ -2,6 +2,7 @@ module IssuableCollections ...@@ -2,6 +2,7 @@ module IssuableCollections
extend ActiveSupport::Concern extend ActiveSupport::Concern
include SortingHelper include SortingHelper
include Gitlab::IssuableMetadata include Gitlab::IssuableMetadata
include Gitlab::Utils::StrongMemoize
included do included do
helper_method :finder helper_method :finder
...@@ -43,7 +44,7 @@ module IssuableCollections ...@@ -43,7 +44,7 @@ module IssuableCollections
def redirect_out_of_range(total_pages) def redirect_out_of_range(total_pages)
return false if total_pages.zero? return false if total_pages.zero?
out_of_range = @issuables.current_page > total_pages out_of_range = @issuables.current_page > total_pages # rubocop:disable Cop/ModuleWithInstanceVariables
if out_of_range if out_of_range
redirect_to(url_for(params.merge(page: total_pages, only_path: true))) redirect_to(url_for(params.merge(page: total_pages, only_path: true)))
...@@ -53,7 +54,7 @@ module IssuableCollections ...@@ -53,7 +54,7 @@ module IssuableCollections
end end
def issuable_page_count def issuable_page_count
page_count_for_relation(@issuables, finder.row_count) page_count_for_relation(@issuables, finder.row_count) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def page_count_for_relation(relation, row_count) def page_count_for_relation(relation, row_count)
...@@ -133,9 +134,9 @@ module IssuableCollections ...@@ -133,9 +134,9 @@ module IssuableCollections
end end
def finder def finder
return @finder if defined?(@finder) strong_memoize(:finder) do
issuable_finder_for(@finder_type) # rubocop:disable Cop/ModuleWithInstanceVariables
@finder = issuable_finder_for(@finder_type) end
end end
def collection_type def collection_type
......
# rubocop:disable Cop/ModuleWithInstanceVariables
module NotesActions module NotesActions
include RendersNotes include RendersNotes
include Gitlab::Utils::StrongMemoize
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
...@@ -31,6 +31,7 @@ module NotesActions ...@@ -31,6 +31,7 @@ module NotesActions
render json: notes_json render json: notes_json
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def create def create
create_params = note_params.merge( create_params = note_params.merge(
merge_request_diff_head_sha: params[:merge_request_diff_head_sha], merge_request_diff_head_sha: params[:merge_request_diff_head_sha],
...@@ -48,7 +49,9 @@ module NotesActions ...@@ -48,7 +49,9 @@ module NotesActions
format.html { redirect_back_or_default } format.html { redirect_back_or_default }
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def update def update
@note = Notes::UpdateService.new(project, current_user, note_params).execute(note) @note = Notes::UpdateService.new(project, current_user, note_params).execute(note)
...@@ -61,6 +64,7 @@ module NotesActions ...@@ -61,6 +64,7 @@ module NotesActions
format.html { redirect_back_or_default } format.html { redirect_back_or_default }
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
def destroy def destroy
if note.editable? if note.editable?
...@@ -139,7 +143,7 @@ module NotesActions ...@@ -139,7 +143,7 @@ module NotesActions
end end
else else
template = "discussions/_diff_discussion" template = "discussions/_diff_discussion"
@fresh_discussion = true @fresh_discussion = true # rubocop:disable Cop/ModuleWithInstanceVariables
locals = { discussions: [discussion], on_image: on_image } locals = { discussions: [discussion], on_image: on_image }
end end
...@@ -192,7 +196,7 @@ module NotesActions ...@@ -192,7 +196,7 @@ module NotesActions
end end
def noteable def noteable
@noteable ||= notes_finder.target || @note&.noteable @noteable ||= notes_finder.target || @note&.noteable # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def require_noteable! def require_noteable!
...@@ -212,20 +216,21 @@ module NotesActions ...@@ -212,20 +216,21 @@ module NotesActions
end end
def note_project def note_project
return @note_project if defined?(@note_project) strong_memoize(:note_project) do
return nil unless project return nil unless project
note_project_id = params[:note_project_id] note_project_id = params[:note_project_id]
@note_project = the_project =
if note_project_id.present? if note_project_id.present?
Project.find(note_project_id) Project.find(note_project_id)
else else
project project
end end
return access_denied! unless can?(current_user, :create_note, @note_project) return access_denied! unless can?(current_user, :create_note, the_project)
@note_project the_project
end
end end
end end
module PreviewMarkdown module PreviewMarkdown
extend ActiveSupport::Concern extend ActiveSupport::Concern
# rubocop:disable Cop/ModuleWithInstanceVariables
def preview_markdown def preview_markdown
result = PreviewMarkdownService.new(@project, current_user, params).execute result = PreviewMarkdownService.new(@project, current_user, params).execute
...@@ -19,4 +20,5 @@ module PreviewMarkdown ...@@ -19,4 +20,5 @@ module PreviewMarkdown
} }
} }
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
end end
module RendersCommits module RendersCommits
# rubocop:disable Cop/ModuleWithInstanceVariables
def prepare_commits_for_rendering(commits) def prepare_commits_for_rendering(commits)
Banzai::CommitRenderer.render(commits, @project, current_user) Banzai::CommitRenderer.render(commits, @project, current_user) # rubocop:disable Cop/ModuleWithInstanceVariables
commits commits
end end
......
...@@ -8,6 +8,7 @@ module RendersNotes ...@@ -8,6 +8,7 @@ module RendersNotes
notes notes
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
private private
......
...@@ -65,9 +65,8 @@ module ServiceParams ...@@ -65,9 +65,8 @@ module ServiceParams
# Parameters to ignore if no value is specified # Parameters to ignore if no value is specified
FILTER_BLANK_PARAMS = [:password].freeze FILTER_BLANK_PARAMS = [:password].freeze
# rubocop:disable Cop/ModuleWithInstanceVariables
def service_params def service_params
dynamic_params = @service.event_channel_names + @service.event_names dynamic_params = @service.event_channel_names + @service.event_names # rubocop:disable Cop/ModuleWithInstanceVariables
service_params = params.permit(:id, service: ALLOWED_PARAMS_CE + dynamic_params) service_params = params.permit(:id, service: ALLOWED_PARAMS_CE + dynamic_params)
if service_params[:service].is_a?(Hash) if service_params[:service].is_a?(Hash)
......
...@@ -15,6 +15,7 @@ module SnippetsActions ...@@ -15,6 +15,7 @@ module SnippetsActions
filename: @snippet.sanitized_file_name filename: @snippet.sanitized_file_name
) )
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
private private
......
...@@ -2,6 +2,7 @@ module SpammableActions ...@@ -2,6 +2,7 @@ module SpammableActions
extend ActiveSupport::Concern extend ActiveSupport::Concern
include Recaptcha::Verify include Recaptcha::Verify
include Gitlab::Utils::StrongMemoize
included do included do
before_action :authorize_submit_spammable!, only: :mark_as_spam before_action :authorize_submit_spammable!, only: :mark_as_spam
...@@ -17,11 +18,10 @@ module SpammableActions ...@@ -17,11 +18,10 @@ module SpammableActions
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def ensure_spam_config_loaded! def ensure_spam_config_loaded!
return @spam_config_loaded if defined?(@spam_config_loaded) strong_memoize(:spam_config_loaded) do
Gitlab::Recaptcha.load_configurations!
@spam_config_loaded = Gitlab::Recaptcha.load_configurations! end
end end
def recaptcha_check_with_fallback(&fallback) def recaptcha_check_with_fallback(&fallback)
......
...@@ -11,9 +11,8 @@ module ToggleSubscriptionAction ...@@ -11,9 +11,8 @@ module ToggleSubscriptionAction
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def subscribable_project def subscribable_project
@project || raise(NotImplementedError) @project ||= raise(NotImplementedError)
end end
def subscribable_resource def subscribable_resource
......
...@@ -43,15 +43,12 @@ module Mentionable ...@@ -43,15 +43,12 @@ module Mentionable
self self
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def all_references(current_user = nil, extractor: nil) def all_references(current_user = nil, extractor: nil)
@extractors ||= {}
# Use custom extractor if it's passed in the function parameters. # Use custom extractor if it's passed in the function parameters.
if extractor if extractor
@extractors[current_user] = extractor extractors[current_user] = extractor
else else
extractor = @extractors[current_user] ||= Gitlab::ReferenceExtractor.new(project, current_user) extractor = extractors[current_user] ||= Gitlab::ReferenceExtractor.new(project, current_user)
extractor.reset_memoized_values extractor.reset_memoized_values
end end
...@@ -70,6 +67,10 @@ module Mentionable ...@@ -70,6 +67,10 @@ module Mentionable
extractor extractor
end end
def extractors
@extractors ||= {}
end
def mentioned_users(current_user = nil) def mentioned_users(current_user = nil)
all_references(current_user).users all_references(current_user).users
end end
......
...@@ -102,11 +102,12 @@ module Milestoneish ...@@ -102,11 +102,12 @@ module Milestoneish
end end
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def memoize_per_user(user, method_name) def memoize_per_user(user, method_name)
@memoized ||= {} memoized_users[method_name][user&.id] ||= yield
@memoized[method_name] ||= {} end
@memoized[method_name][user&.id] ||= yield
def memoized_users
@memoized_users ||= Hash.new { |h, k| h[k] = {} }
end end
# override in a class that includes this module to get a faster query # override in a class that includes this module to get a faster query
......
...@@ -55,6 +55,7 @@ module Noteable ...@@ -55,6 +55,7 @@ module Noteable
discussion_notes.resolvable.discussions(self) discussion_notes.resolvable.discussions(self)
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
def discussions_resolvable? def discussions_resolvable?
resolvable_discussions.any?(&:resolvable?) resolvable_discussions.any?(&:resolvable?)
......
...@@ -44,7 +44,6 @@ module RelativePositioning ...@@ -44,7 +44,6 @@ module RelativePositioning
next_pos next_pos
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_between(before, after) def move_between(before, after)
return move_after(before) unless after return move_after(before) unless after
return move_before(after) unless before return move_before(after) unless before
...@@ -53,13 +52,12 @@ module RelativePositioning ...@@ -53,13 +52,12 @@ module RelativePositioning
# to its predecessor. This process will recursively move all the predecessors until we have a place # to its predecessor. This process will recursively move all the predecessors until we have a place
if (after.relative_position - before.relative_position) < 2 if (after.relative_position - before.relative_position) < 2
before.move_before before.move_before
@positionable_neighbours = [before] @positionable_neighbours = [before] # rubocop:disable Cop/ModuleWithInstanceVariables
end end
self.relative_position = position_between(before.relative_position, after.relative_position) self.relative_position = position_between(before.relative_position, after.relative_position)
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_after(before = self) def move_after(before = self)
pos_before = before.relative_position pos_before = before.relative_position
pos_after = before.next_relative_position pos_after = before.next_relative_position
...@@ -67,7 +65,7 @@ module RelativePositioning ...@@ -67,7 +65,7 @@ module RelativePositioning
if before.shift_after? if before.shift_after?
issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_after) issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_after)
issue_to_move.move_after issue_to_move.move_after
@positionable_neighbours = [issue_to_move] @positionable_neighbours = [issue_to_move] # rubocop:disable Cop/ModuleWithInstanceVariables
pos_after = issue_to_move.relative_position pos_after = issue_to_move.relative_position
end end
...@@ -75,7 +73,6 @@ module RelativePositioning ...@@ -75,7 +73,6 @@ module RelativePositioning
self.relative_position = position_between(pos_before, pos_after) self.relative_position = position_between(pos_before, pos_after)
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_before(after = self) def move_before(after = self)
pos_after = after.relative_position pos_after = after.relative_position
pos_before = after.prev_relative_position pos_before = after.prev_relative_position
...@@ -83,7 +80,7 @@ module RelativePositioning ...@@ -83,7 +80,7 @@ module RelativePositioning
if after.shift_before? if after.shift_before?
issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_before) issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_before)
issue_to_move.move_before issue_to_move.move_before
@positionable_neighbours = [issue_to_move] @positionable_neighbours = [issue_to_move] # rubocop:disable Cop/ModuleWithInstanceVariables
pos_before = issue_to_move.relative_position pos_before = issue_to_move.relative_position
end end
...@@ -144,4 +141,5 @@ module RelativePositioning ...@@ -144,4 +141,5 @@ module RelativePositioning
status status
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
end end
...@@ -84,7 +84,6 @@ module ResolvableDiscussion ...@@ -84,7 +84,6 @@ module ResolvableDiscussion
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def update def update
# Do not select `Note.resolvable`, so that system notes remain in the collection # Do not select `Note.resolvable`, so that system notes remain in the collection
notes_relation = Note.where(id: notes.map(&:id)) notes_relation = Note.where(id: notes.map(&:id))
......
...@@ -86,10 +86,9 @@ module Routable ...@@ -86,10 +86,9 @@ module Routable
end end
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def full_name def full_name
if route && route.name.present? if route && route.name.present?
@full_name ||= route.name @full_name ||= route.name # rubocop:disable Cop/ModuleWithInstanceVariables
else else
update_route if persisted? update_route if persisted?
...@@ -113,7 +112,7 @@ module Routable ...@@ -113,7 +112,7 @@ module Routable
def expires_full_path_cache def expires_full_path_cache
RequestStore.delete(full_path_key) if RequestStore.active? RequestStore.delete(full_path_key) if RequestStore.active?
@full_path = nil @full_path = nil # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def build_full_path def build_full_path
...@@ -126,10 +125,9 @@ module Routable ...@@ -126,10 +125,9 @@ module Routable
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def uncached_full_path def uncached_full_path
if route && route.path.present? if route && route.path.present?
@full_path ||= route.path @full_path ||= route.path # rubocop:disable Cop/ModuleWithInstanceVariables
else else
update_route if persisted? update_route if persisted?
...@@ -164,12 +162,11 @@ module Routable ...@@ -164,12 +162,11 @@ module Routable
route.save route.save
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def prepare_route def prepare_route
route || build_route(source: self) route || build_route(source: self)
route.path = build_full_path route.path = build_full_path
route.name = build_full_name route.name = build_full_name
@full_path = nil @full_path = nil # rubocop:disable Cop/ModuleWithInstanceVariables
@full_name = nil @full_name = nil # rubocop:disable Cop/ModuleWithInstanceVariables
end end
end end
...@@ -36,11 +36,10 @@ module Taskable ...@@ -36,11 +36,10 @@ module Taskable
end end
# Called by `TaskList::Summary` # Called by `TaskList::Summary`
# rubocop:disable Cop/ModuleWithInstanceVariables
def task_list_items def task_list_items
return [] if description.blank? return [] if description.blank?
@task_list_items ||= Taskable.get_tasks(description) @task_list_items ||= Taskable.get_tasks(description) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def tasks def tasks
......
...@@ -36,6 +36,7 @@ module TimeTrackable ...@@ -36,6 +36,7 @@ module TimeTrackable
end end
end end
alias_method :spend_time=, :spend_time alias_method :spend_time=, :spend_time
# rubocop:enable Cop/ModuleWithInstanceVariables
def total_time_spent def total_time_spent
timelogs.sum(:time_spent) timelogs.sum(:time_spent)
...@@ -51,11 +52,11 @@ module TimeTrackable ...@@ -51,11 +52,11 @@ module TimeTrackable
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def reset_spent_time def reset_spent_time
timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user) timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def add_or_subtract_spent_time def add_or_subtract_spent_time
timelogs.new( timelogs.new(
time_spent: time_spent, time_spent: time_spent,
...@@ -63,17 +64,19 @@ module TimeTrackable ...@@ -63,17 +64,19 @@ module TimeTrackable
spent_at: @spent_at spent_at: @spent_at
) )
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def check_negative_time_spent def check_negative_time_spent
return if time_spent.nil? || time_spent == :reset return if time_spent.nil? || time_spent == :reset
if time_spent < 0 && (time_spent.abs > original_total_time_spent)
errors.add(:time_spent, 'Time to subtract exceeds the total time spent')
end
end
# we need to cache the total time spent so multiple calls to #valid? # we need to cache the total time spent so multiple calls to #valid?
# doesn't give a false error # doesn't give a false error
def original_total_time_spent
@original_total_time_spent ||= total_time_spent @original_total_time_spent ||= total_time_spent
if time_spent < 0 && (time_spent.abs > @original_total_time_spent)
errors.add(:time_spent, 'Time to subtract exceeds the total time spent')
end
end end
end end
...@@ -14,7 +14,7 @@ module WithPagination ...@@ -14,7 +14,7 @@ module WithPagination
# we shouldn't try to paginate single resources # we shouldn't try to paginate single resources
def represent(resource, opts = {}) def represent(resource, opts = {})
if paginated? && resource.respond_to?(:page) if paginated? && resource.respond_to?(:page)
super(@paginator.paginate(resource), opts) super(paginator.paginate(resource), opts)
else else
super(resource, opts) super(resource, opts)
end end
......
module Issues module Issues
module ResolveDiscussions module ResolveDiscussions
include Gitlab::Utils::StrongMemoize
attr_reader :merge_request_to_resolve_discussions_of_iid, :discussion_to_resolve_id attr_reader :merge_request_to_resolve_discussions_of_iid, :discussion_to_resolve_id
# rubocop:disable Cop/ModuleWithInstanceVariables # rubocop:disable Cop/ModuleWithInstanceVariables
...@@ -7,21 +9,20 @@ module Issues ...@@ -7,21 +9,20 @@ module Issues
@merge_request_to_resolve_discussions_of_iid ||= params.delete(:merge_request_to_resolve_discussions_of) @merge_request_to_resolve_discussions_of_iid ||= params.delete(:merge_request_to_resolve_discussions_of)
@discussion_to_resolve_id ||= params.delete(:discussion_to_resolve) @discussion_to_resolve_id ||= params.delete(:discussion_to_resolve)
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def merge_request_to_resolve_discussions_of def merge_request_to_resolve_discussions_of
return @merge_request_to_resolve_discussions_of if defined?(@merge_request_to_resolve_discussions_of) strong_memoize(:merge_request_to_resolve_discussions_of) do
MergeRequestsFinder.new(current_user, project_id: project.id)
@merge_request_to_resolve_discussions_of = MergeRequestsFinder.new(current_user, project_id: project.id)
.execute .execute
.find_by(iid: merge_request_to_resolve_discussions_of_iid) .find_by(iid: merge_request_to_resolve_discussions_of_iid)
end end
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def discussions_to_resolve def discussions_to_resolve
return [] unless merge_request_to_resolve_discussions_of return [] unless merge_request_to_resolve_discussions_of
@discussions_to_resolve ||= @discussions_to_resolve ||= # rubocop:disable Cop/ModuleWithInstanceVariables
if discussion_to_resolve_id if discussion_to_resolve_id
discussion_or_nil = merge_request_to_resolve_discussions_of discussion_or_nil = merge_request_to_resolve_discussions_of
.find_discussion(discussion_to_resolve_id) .find_discussion(discussion_to_resolve_id)
......
...@@ -14,6 +14,7 @@ module SpamCheckService ...@@ -14,6 +14,7 @@ module SpamCheckService
@recaptcha_verified = params.delete(:recaptcha_verified) @recaptcha_verified = params.delete(:recaptcha_verified)
@spam_log_id = params.delete(:spam_log_id) @spam_log_id = params.delete(:spam_log_id)
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# In order to be proceed to the spam check process, @spammable has to be # In order to be proceed to the spam check process, @spammable has to be
# a dirty instance, which means it should be already assigned with the new # a dirty instance, which means it should be already assigned with the new
...@@ -26,4 +27,5 @@ module SpamCheckService ...@@ -26,4 +27,5 @@ module SpamCheckService
user.spam_logs.find_by(id: @spam_log_id)&.update!(recaptcha_verified: true) user.spam_logs.find_by(id: @spam_log_id)&.update!(recaptcha_verified: true)
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
end end
...@@ -8,18 +8,16 @@ module NewIssuable ...@@ -8,18 +8,16 @@ module NewIssuable
user && issuable user && issuable
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def set_user(user_id) def set_user(user_id)
@user = User.find_by(id: user_id) @user = User.find_by(id: user_id) # rubocop:disable Cop/ModuleWithInstanceVariables
log_error(User, user_id) unless @user log_error(User, user_id) unless @user # rubocop:disable Cop/ModuleWithInstanceVariables
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def set_issuable(issuable_id) def set_issuable(issuable_id)
@issuable = issuable_class.find_by(id: issuable_id) @issuable = issuable_class.find_by(id: issuable_id) # rubocop:disable Cop/ModuleWithInstanceVariables
log_error(issuable_class, issuable_id) unless @issuable log_error(issuable_class, issuable_id) unless @issuable # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def log_error(record_class, record_id) def log_error(record_class, record_id)
......
...@@ -4,10 +4,9 @@ module LocalCacheRegistryCleanupWithEnsure ...@@ -4,10 +4,9 @@ module LocalCacheRegistryCleanupWithEnsure
LocalStore = LocalStore =
ActiveSupport::Cache::Strategy::LocalCache::LocalStore ActiveSupport::Cache::Strategy::LocalCache::LocalStore
# rubocop:disable Cop/ModuleWithInstanceVariables
def call(env) def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new) LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env) response = @app.call(env) # rubocop:disable Cop/ModuleWithInstanceVariables
response[2] = ::Rack::BodyProxy.new(response[2]) do response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil) LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end end
......
...@@ -16,14 +16,13 @@ module RspecProfilingExt ...@@ -16,14 +16,13 @@ module RspecProfilingExt
end end
module Run module Run
# rubocop:disable Cop/ModuleWithInstanceVariables
def example_finished(*args) def example_finished(*args)
super super
rescue => err rescue => err
return if @already_logged_example_finished_error return if @already_logged_example_finished_error # rubocop:disable Cop/ModuleWithInstanceVariables
$stderr.puts "rspec_profiling couldn't collect an example: #{err}. Further warnings suppressed." $stderr.puts "rspec_profiling couldn't collect an example: #{err}. Further warnings suppressed."
@already_logged_example_finished_error = true @already_logged_example_finished_error = true # rubocop:disable Cop/ModuleWithInstanceVariables
end end
alias_method :example_passed, :example_finished alias_method :example_passed, :example_finished
......
...@@ -14,10 +14,12 @@ ...@@ -14,10 +14,12 @@
module Rugged module Rugged
class Repository class Repository
module UseGitlabGitAttributes module UseGitlabGitAttributes
# rubocop:disable Cop/ModuleWithInstanceVariables
def fetch_attributes(name, *) def fetch_attributes(name, *)
attributes.attributes(name)
end
def attributes
@attributes ||= Gitlab::Git::Attributes.new(path) @attributes ||= Gitlab::Git::Attributes.new(path)
@attributes.attributes(name)
end end
end end
......
...@@ -33,6 +33,10 @@ module API ...@@ -33,6 +33,10 @@ module API
end end
# rubocop:disable Cop/ModuleWithInstanceVariables # rubocop:disable Cop/ModuleWithInstanceVariables
# We can't rewrite this with StrongMemoize because `sudo!` would
# actually write to `@current_user`, and `sudo?` would immediately
# call `current_user` again which reads from `@current_user`.
# We should rewrite this in a way that using StrongMemoize is possible
def current_user def current_user
return @current_user if defined?(@current_user) return @current_user if defined?(@current_user)
...@@ -46,6 +50,7 @@ module API ...@@ -46,6 +50,7 @@ module API
@current_user @current_user
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
def sudo? def sudo?
initial_current_user != current_user initial_current_user != current_user
...@@ -394,6 +399,7 @@ module API ...@@ -394,6 +399,7 @@ module API
private private
# rubocop:disable Cop/ModuleWithInstanceVariables
def initial_current_user def initial_current_user
return @initial_current_user if defined?(@initial_current_user) return @initial_current_user if defined?(@initial_current_user)
...@@ -403,8 +409,8 @@ module API ...@@ -403,8 +409,8 @@ module API
unauthorized! unauthorized!
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def sudo! def sudo!
return unless sudo_identifier return unless sudo_identifier
...@@ -423,7 +429,7 @@ module API ...@@ -423,7 +429,7 @@ module API
sudoed_user = find_user(sudo_identifier) sudoed_user = find_user(sudo_identifier)
not_found!("User with ID or username '#{sudo_identifier}'") unless sudoed_user not_found!("User with ID or username '#{sudo_identifier}'") unless sudoed_user
@current_user = sudoed_user @current_user = sudoed_user # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def sudo_identifier def sudo_identifier
......
...@@ -8,16 +8,14 @@ module API ...@@ -8,16 +8,14 @@ module API
attr_reader :redirected_path attr_reader :redirected_path
# rubocop:disable Cop/ModuleWithInstanceVariables
def wiki? def wiki?
set_project unless defined?(@wiki) set_project unless defined?(@wiki) # rubocop:disable Cop/ModuleWithInstanceVariables
@wiki @wiki # rubocop:disable Cop/ModuleWithInstanceVariables
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def project def project
set_project unless defined?(@project) set_project unless defined?(@project) # rubocop:disable Cop/ModuleWithInstanceVariables
@project @project # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def ssh_authentication_abilities def ssh_authentication_abilities
...@@ -78,6 +76,7 @@ module API ...@@ -78,6 +76,7 @@ module API
@project, @wiki, @redirected_path = Gitlab::RepoPath.parse(params[:project]) @project, @wiki, @redirected_path = Gitlab::RepoPath.parse(params[:project])
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# Project id to pass between components that don't share/don't have # Project id to pass between components that don't share/don't have
# access to the same filesystem mounts # access to the same filesystem mounts
......
...@@ -37,11 +37,10 @@ module ExtractsPath ...@@ -37,11 +37,10 @@ module ExtractsPath
# #
# Returns an Array where the first value is the tree-ish and the second is the # Returns an Array where the first value is the tree-ish and the second is the
# path # path
# rubocop:disable Cop/ModuleWithInstanceVariables
def extract_ref(id) def extract_ref(id)
pair = ['', ''] pair = ['', '']
return pair unless @project return pair unless @project # rubocop:disable Cop/ModuleWithInstanceVariables
if id =~ /^(\h{40})(.+)/ if id =~ /^(\h{40})(.+)/
# If the ref appears to be a SHA, we're done, just split the string # If the ref appears to be a SHA, we're done, just split the string
...@@ -133,10 +132,10 @@ module ExtractsPath ...@@ -133,10 +132,10 @@ module ExtractsPath
rescue RuntimeError, NoMethodError, InvalidPathError rescue RuntimeError, NoMethodError, InvalidPathError
render_404 render_404
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def tree def tree
@tree ||= @repo.tree(@commit.id, @path) @tree ||= @repo.tree(@commit.id, @path) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
private private
...@@ -148,10 +147,9 @@ module ExtractsPath ...@@ -148,10 +147,9 @@ module ExtractsPath
id id
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def ref_names def ref_names
return [] unless @project return [] unless @project # rubocop:disable Cop/ModuleWithInstanceVariables
@ref_names ||= @project.repository.ref_names @ref_names ||= @project.repository.ref_names # rubocop:disable Cop/ModuleWithInstanceVariables
end end
end end
...@@ -45,12 +45,13 @@ module Gitlab ...@@ -45,12 +45,13 @@ module Gitlab
klass.prepend(extension) klass.prepend(extension)
end end
# rubocop:disable Cop/ModuleWithInstanceVariables attr_accessor :request_cache_key_block
def request_cache_key(&block) def request_cache_key(&block)
if block_given? if block_given?
@request_cache_key = block self.request_cache_key_block = block
else else
@request_cache_key request_cache_key_block
end end
end end
......
...@@ -2,12 +2,11 @@ module Gitlab ...@@ -2,12 +2,11 @@ module Gitlab
module Ci module Ci
module Charts module Charts
module DailyInterval module DailyInterval
# rubocop:disable Cop/ModuleWithInstanceVariables
def grouped_count(query) def grouped_count(query)
query query
.group("DATE(#{::Ci::Pipeline.table_name}.created_at)") .group("DATE(#{::Ci::Pipeline.table_name}.created_at)")
.count(:created_at) .count(:created_at)
.transform_keys { |date| date.strftime(@format) } .transform_keys { |date| date.strftime(@format) } # rubocop:disable Cop/ModuleWithInstanceVariables
end end
def interval_step def interval_step
......
...@@ -24,21 +24,20 @@ module Gitlab ...@@ -24,21 +24,20 @@ module Gitlab
end end
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def compose!(deps = nil) def compose!(deps = nil)
return unless valid? return unless valid?
self.class.nodes.each do |key, factory| self.class.nodes.each do |key, factory|
factory factory
.value(@config[key]) .value(config[key])
.with(key: key, parent: self) .with(key: key, parent: self)
@entries[key] = factory.create! entries[key] = factory.create!
end end
yield if block_given? yield if block_given?
@entries.each_value do |entry| entries.each_value do |entry|
entry.compose!(deps) entry.compose!(deps)
end end
end end
......
...@@ -90,6 +90,12 @@ module Gitlab ...@@ -90,6 +90,12 @@ module Gitlab
def self.aspects def self.aspects
@aspects ||= [] @aspects ||= []
end end
private
def entries
@entries
end
end end
end end
end end
......
...@@ -12,9 +12,8 @@ module Gitlab ...@@ -12,9 +12,8 @@ module Gitlab
end end
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def errors def errors
@validator.messages + descendants.flat_map(&:errors) @validator.messages + descendants.flat_map(&:errors) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
class_methods do class_methods do
......
...@@ -3,21 +3,19 @@ module Gitlab ...@@ -3,21 +3,19 @@ module Gitlab
module Pipeline module Pipeline
module Chain module Chain
module Helpers module Helpers
# rubocop:disable Cop/ModuleWithInstanceVariables include Gitlab::Utils::StrongMemoize
def branch_exists?
return @is_branch if defined?(@is_branch)
@is_branch = project.repository.branch_exists?(pipeline.ref) def branch_exists?
strong_memoize(:is_branch) do
project.repository.branch_exists?(pipeline.ref)
end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def tag_exists? def tag_exists?
return @is_tag if defined?(@is_tag) strong_memoize(:is_tag) do
project.repository.tag_exists?(pipeline.ref)
@is_tag = project.repository.tag_exists?(pipeline.ref) end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
def error(message) def error(message)
pipeline.errors.add(:base, message) pipeline.errors.add(:base, message)
......
...@@ -52,9 +52,8 @@ module Gitlab ...@@ -52,9 +52,8 @@ module Gitlab
::ApplicationSetting.create_from_defaults || in_memory_application_settings ::ApplicationSetting.create_from_defaults || in_memory_application_settings
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def in_memory_application_settings def in_memory_application_settings
@in_memory_application_settings ||= ::ApplicationSetting.new(::ApplicationSetting.defaults) @in_memory_application_settings ||= ::ApplicationSetting.new(::ApplicationSetting.defaults) # rubocop:disable Cop/ModuleWithInstanceVariables
rescue ActiveRecord::StatementInvalid, ActiveRecord::UnknownAttributeError rescue ActiveRecord::StatementInvalid, ActiveRecord::UnknownAttributeError
# In case migrations the application_settings table is not created yet, # In case migrations the application_settings table is not created yet,
# we fallback to a simple OpenStruct # we fallback to a simple OpenStruct
......
...@@ -11,13 +11,12 @@ module Gitlab ...@@ -11,13 +11,12 @@ module Gitlab
@base_query ||= stage_query @base_query ||= stage_query
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def stage_query def stage_query
query = mr_closing_issues_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id])) query = mr_closing_issues_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id]))
.join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id])) .join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id]))
.where(issue_table[:project_id].eq(@project.id)) .where(issue_table[:project_id].eq(@project.id)) # rubocop:disable Cop/ModuleWithInstanceVariables
.where(issue_table[:deleted_at].eq(nil)) .where(issue_table[:deleted_at].eq(nil))
.where(issue_table[:created_at].gteq(@options[:from])) .where(issue_table[:created_at].gteq(@options[:from])) # rubocop:disable Cop/ModuleWithInstanceVariables
# Load merge_requests # Load merge_requests
query = query.join(mr_table, Arel::Nodes::OuterJoin) query = query.join(mr_table, Arel::Nodes::OuterJoin)
......
module Gitlab module Gitlab
module CycleAnalytics module CycleAnalytics
module ProductionHelper module ProductionHelper
# rubocop:disable Cop/ModuleWithInstanceVariables
def stage_query def stage_query
super.where(mr_metrics_table[:first_deployed_to_production_at].gteq(@options[:from])) super
.where(mr_metrics_table[:first_deployed_to_production_at]
.gteq(@options[:from])) # rubocop:disable Cop/ModuleWithInstanceVariables
end end
end end
end end
......
...@@ -3,11 +3,10 @@ module Gitlab ...@@ -3,11 +3,10 @@ module Gitlab
module RenameReservedPathsMigration module RenameReservedPathsMigration
module V1 module V1
module MigrationClasses module MigrationClasses
# rubocop:disable Cop/ModuleWithInstanceVariables
module Routable module Routable
def full_path def full_path
if route && route.path.present? if route && route.path.present?
@full_path ||= route.path @full_path ||= route.path # rubocop:disable Cop/ModuleWithInstanceVariables
else else
update_route if persisted? update_route if persisted?
...@@ -31,7 +30,7 @@ module Gitlab ...@@ -31,7 +30,7 @@ module Gitlab
def prepare_route def prepare_route
route || build_route(source: self) route || build_route(source: self)
route.path = build_full_path route.path = build_full_path
@full_path = nil @full_path = nil # rubocop:disable Cop/ModuleWithInstanceVariables
end end
end end
......
...@@ -30,10 +30,9 @@ module Gitlab ...@@ -30,10 +30,9 @@ module Gitlab
execute(%W(tar -#{options} #{archive} -C #{dir})) execute(%W(tar -#{options} #{archive} -C #{dir}))
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def execute(cmd) def execute(cmd)
output, status = Gitlab::Popen.popen(cmd) output, status = Gitlab::Popen.popen(cmd)
@shared.error(Gitlab::ImportExport::Error.new(output.to_s)) unless status.zero? @shared.error(Gitlab::ImportExport::Error.new(output.to_s)) unless status.zero? # rubocop:disable Cop/ModuleWithInstanceVariables
status.zero? status.zero?
end end
......
...@@ -171,6 +171,7 @@ module Gitlab ...@@ -171,6 +171,7 @@ module Gitlab
@pool @pool
end end
end end
# rubocop:enable Cop/ModuleWithInstanceVariables
end end
end end
end end
...@@ -4,6 +4,7 @@ module Gitlab ...@@ -4,6 +4,7 @@ module Gitlab
module Metrics module Metrics
module Prometheus module Prometheus
include Gitlab::CurrentSettings include Gitlab::CurrentSettings
include Gitlab::Utils::StrongMemoize
REGISTRY_MUTEX = Mutex.new REGISTRY_MUTEX = Mutex.new
PROVIDER_MUTEX = Mutex.new PROVIDER_MUTEX = Mutex.new
...@@ -16,18 +17,19 @@ module Gitlab ...@@ -16,18 +17,19 @@ module Gitlab
::File.writable?(multiprocess_files_dir) ::File.writable?(multiprocess_files_dir)
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def prometheus_metrics_enabled? def prometheus_metrics_enabled?
return @prometheus_metrics_enabled if defined?(@prometheus_metrics_enabled) strong_memoize(:prometheus_metrics_enabled) do
prometheus_metrics_enabled_unmemoized
@prometheus_metrics_enabled = prometheus_metrics_enabled_unmemoized end
end end
def registry def registry
return @registry if @registry strong_memoize(:registry) do
REGISTRY_MUTEX.synchronize do REGISTRY_MUTEX.synchronize do
@registry ||= ::Prometheus::Client.registry strong_memoize(:registry) do
::Prometheus::Client.registry
end
end
end end
end end
......
# rubocop:disable Cop/ModuleWithInstanceVariables
module Gitlab module Gitlab
module PathRegex module PathRegex
extend self extend self
......
...@@ -10,36 +10,37 @@ module Gitlab ...@@ -10,36 +10,37 @@ module Gitlab
issuable.open? ? 'Open' : 'Closed' issuable.open? ? 'Open' : 'Closed'
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def project def project
@resource.project resource.project
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def author def author
@resource.author resource.author
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def fields def fields
[ [
{ {
title: "Assignee", title: "Assignee",
value: @resource.assignees.any? ? @resource.assignees.first.name : "_None_", value: resource.assignees.any? ? resource.assignees.first.name : "_None_",
short: true short: true
}, },
{ {
title: "Milestone", title: "Milestone",
value: @resource.milestone ? @resource.milestone.title : "_None_", value: resource.milestone ? resource.milestone.title : "_None_",
short: true short: true
}, },
{ {
title: "Labels", title: "Labels",
value: @resource.labels.any? ? @resource.label_names.join(', ') : "_None_", value: resource.labels.any? ? resource.label_names.join(', ') : "_None_",
short: true short: true
} }
] ]
end end
private
attr_reader :resource
end end
end end
end end
......
...@@ -23,6 +23,7 @@ namespace :gettext do ...@@ -23,6 +23,7 @@ namespace :gettext do
desc 'Lint all po files in `locale/' desc 'Lint all po files in `locale/'
task lint: :environment do task lint: :environment do
require 'simple_po_parser' require 'simple_po_parser'
require 'gitlab/utils'
FastGettext.silence_errors FastGettext.silence_errors
files = Dir.glob(Rails.root.join('locale/*/gitlab.po')) files = Dir.glob(Rails.root.join('locale/*/gitlab.po'))
......
require 'rainbow/ext/string' require 'rainbow/ext/string'
require 'gitlab/utils/strong_memoize'
module Gitlab module Gitlab
TaskFailedError = Class.new(StandardError) TaskFailedError = Class.new(StandardError)
TaskAbortedByUserError = Class.new(StandardError) TaskAbortedByUserError = Class.new(StandardError)
module TaskHelpers module TaskHelpers
include Gitlab::Utils::StrongMemoize
extend self extend self
# Ask if the user wants to continue # Ask if the user wants to continue
...@@ -104,19 +107,17 @@ module Gitlab ...@@ -104,19 +107,17 @@ module Gitlab
Gitlab.config.gitlab.user Gitlab.config.gitlab.user
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def gitlab_user? def gitlab_user?
return @is_gitlab_user unless @is_gitlab_user.nil? strong_memoize(:is_gitlab_user) do
current_user = run_command(%w(whoami)).chomp current_user = run_command(%w(whoami)).chomp
@is_gitlab_user = current_user == gitlab_user current_user == gitlab_user
end
end end
# rubocop:disable Cop/ModuleWithInstanceVariables
def warn_user_is_not_gitlab def warn_user_is_not_gitlab
return if @warned_user_not_gitlab return if gitlab_user?
unless gitlab_user? strong_memoize(:warned_user_not_gitlab) do
current_user = run_command(%w(whoami)).chomp current_user = run_command(%w(whoami)).chomp
puts " Warning ".color(:black).background(:yellow) puts " Warning ".color(:black).background(:yellow)
...@@ -124,8 +125,6 @@ module Gitlab ...@@ -124,8 +125,6 @@ module Gitlab
puts " Things may work\/fail for the wrong reasons." puts " Things may work\/fail for the wrong reasons."
puts " For correct results you should run this as user #{gitlab_user.color(:magenta)}." puts " For correct results you should run this as user #{gitlab_user.color(:magenta)}."
puts "" puts ""
@warned_user_not_gitlab = true
end end
end end
......
...@@ -6,13 +6,15 @@ module QA ...@@ -6,13 +6,15 @@ module QA
module Scenario module Scenario
extend self extend self
attr_reader :attributes def attributes
@attributes ||= {}
end
def define(attribute, value) def define(attribute, value)
(@attributes ||= {}).store(attribute.to_sym, value) attributes.store(attribute.to_sym, value)
define_singleton_method(attribute) do define_singleton_method(attribute) do
@attributes[attribute.to_sym].tap do |value| attributes[attribute.to_sym].tap do |value|
if value.to_s.empty? if value.to_s.empty?
raise ArgumentError, "Empty `#{attribute}` attribute!" raise ArgumentError, "Empty `#{attribute}` attribute!"
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment