Commit 3357b690 authored by Lin Jen-Shin's avatar Lin Jen-Shin
Browse files

Use StrongMemoize and enable/disable cops properly

parent 892e39467f19
module CreatesCommit
extend ActiveSupport::Concern
include Gitlab::Utils::StrongMemoize
# rubocop:disable Cop/ModuleWithInstanceVariables
def create_commit(service, success_path:, failure_path:, failure_view: nil, success_notice: nil)
......@@ -94,15 +95,20 @@ def new_merge_request_path
# rubocop:enable Cop/ModuleWithInstanceVariables
def existing_merge_request_path
project_merge_request_path(@project, @merge_request)
project_merge_request_path(@project, @merge_request) # rubocop:disable Cop/ModuleWithInstanceVariables
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def merge_request_exists?
return @merge_request if defined?(@merge_request)
@merge_request = MergeRequestsFinder.new(current_user, project_id: @project.id).execute.opened
.find_by(source_project_id: @project_to_commit_into, source_branch: @branch_name, target_branch: @start_branch)
strong_memoize(:merge_request) do
MergeRequestsFinder.new(current_user, project_id: @project.id)
.execute
.opened
.find_by(
source_project_id: @project_to_commit_into,
source_branch: @branch_name,
target_branch: @start_branch)
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
......
module GroupTree
# rubocop:disable Cop/ModuleWithInstanceVariables
def render_group_tree(groups)
@groups = if params[:filter].present?
Gitlab::GroupHierarchy.new(groups.search(params[:filter]))
......@@ -20,5 +21,6 @@ def render_group_tree(groups)
render json: serializer.represent(@groups)
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
end
end
......@@ -142,6 +142,7 @@ def resource_name
@resource_name ||= controller_name.singularize
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def render_entity_json
if @issuable.valid?
render json: serializer.represent(@issuable)
......@@ -149,6 +150,7 @@ def render_entity_json
render json: { errors: @issuable.errors.full_messages }, status: :unprocessable_entity
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
def serializer
raise NotImplementedError
......@@ -159,6 +161,6 @@ def update_service
end
def parent
@project || @group
@project || @group # rubocop:disable Cop/ModuleWithInstanceVariables
end
end
......@@ -2,6 +2,7 @@ module IssuableCollections
extend ActiveSupport::Concern
include SortingHelper
include Gitlab::IssuableMetadata
include Gitlab::Utils::StrongMemoize
included do
helper_method :finder
......@@ -43,7 +44,7 @@ def issuables_collection
def redirect_out_of_range(total_pages)
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
redirect_to(url_for(params.merge(page: total_pages, only_path: true)))
......@@ -53,7 +54,7 @@ def redirect_out_of_range(total_pages)
end
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
def page_count_for_relation(relation, row_count)
......@@ -133,9 +134,9 @@ def update_cookie_value(value)
end
def finder
return @finder if defined?(@finder)
@finder = issuable_finder_for(@finder_type)
strong_memoize(:finder) do
issuable_finder_for(@finder_type) # rubocop:disable Cop/ModuleWithInstanceVariables
end
end
def collection_type
......
# rubocop:disable Cop/ModuleWithInstanceVariables
module NotesActions
include RendersNotes
include Gitlab::Utils::StrongMemoize
extend ActiveSupport::Concern
included do
......@@ -31,6 +31,7 @@ def index
render json: notes_json
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def create
create_params = note_params.merge(
merge_request_diff_head_sha: params[:merge_request_diff_head_sha],
......@@ -48,7 +49,9 @@ def create
format.html { redirect_back_or_default }
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def update
@note = Notes::UpdateService.new(project, current_user, note_params).execute(note)
......@@ -61,6 +64,7 @@ def update
format.html { redirect_back_or_default }
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
def destroy
if note.editable?
......@@ -139,7 +143,7 @@ def diff_discussion_html(discussion)
end
else
template = "discussions/_diff_discussion"
@fresh_discussion = true
@fresh_discussion = true # rubocop:disable Cop/ModuleWithInstanceVariables
locals = { discussions: [discussion], on_image: on_image }
end
......@@ -192,7 +196,7 @@ def set_polling_interval_header
end
def noteable
@noteable ||= notes_finder.target || @note&.noteable
@noteable ||= notes_finder.target || @note&.noteable # rubocop:disable Cop/ModuleWithInstanceVariables
end
def require_noteable!
......@@ -212,20 +216,21 @@ def note_serializer
end
def note_project
return @note_project if defined?(@note_project)
return nil unless project
strong_memoize(:note_project) do
return nil unless project
note_project_id = params[:note_project_id]
note_project_id = params[:note_project_id]
@note_project =
if note_project_id.present?
Project.find(note_project_id)
else
project
end
the_project =
if note_project_id.present?
Project.find(note_project_id)
else
project
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
module PreviewMarkdown
extend ActiveSupport::Concern
# rubocop:disable Cop/ModuleWithInstanceVariables
def preview_markdown
result = PreviewMarkdownService.new(@project, current_user, params).execute
......@@ -19,4 +20,5 @@ def preview_markdown
}
}
end
# rubocop:enable Cop/ModuleWithInstanceVariables
end
module RendersCommits
# rubocop:disable Cop/ModuleWithInstanceVariables
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
end
......
......@@ -8,6 +8,7 @@ def prepare_notes_for_rendering(notes, noteable = nil)
notes
end
# rubocop:enable Cop/ModuleWithInstanceVariables
private
......
......@@ -65,9 +65,8 @@ module ServiceParams
# Parameters to ignore if no value is specified
FILTER_BLANK_PARAMS = [:password].freeze
# rubocop:disable Cop/ModuleWithInstanceVariables
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)
if service_params[:service].is_a?(Hash)
......
......@@ -15,6 +15,7 @@ def raw
filename: @snippet.sanitized_file_name
)
end
# rubocop:enable Cop/ModuleWithInstanceVariables
private
......
......@@ -2,6 +2,7 @@ module SpammableActions
extend ActiveSupport::Concern
include Recaptcha::Verify
include Gitlab::Utils::StrongMemoize
included do
before_action :authorize_submit_spammable!, only: :mark_as_spam
......@@ -17,11 +18,10 @@ def mark_as_spam
private
# rubocop:disable Cop/ModuleWithInstanceVariables
def ensure_spam_config_loaded!
return @spam_config_loaded if defined?(@spam_config_loaded)
@spam_config_loaded = Gitlab::Recaptcha.load_configurations!
strong_memoize(:spam_config_loaded) do
Gitlab::Recaptcha.load_configurations!
end
end
def recaptcha_check_with_fallback(&fallback)
......
......@@ -11,9 +11,8 @@ def toggle_subscription
private
# rubocop:disable Cop/ModuleWithInstanceVariables
def subscribable_project
@project || raise(NotImplementedError)
@project ||= raise(NotImplementedError)
end
def subscribable_resource
......
......@@ -43,15 +43,12 @@ def local_reference
self
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def all_references(current_user = nil, extractor: nil)
@extractors ||= {}
# Use custom extractor if it's passed in the function parameters.
if extractor
@extractors[current_user] = extractor
extractors[current_user] = extractor
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
end
......@@ -70,6 +67,10 @@ def all_references(current_user = nil, extractor: nil)
extractor
end
def extractors
@extractors ||= {}
end
def mentioned_users(current_user = nil)
all_references(current_user).users
end
......
......@@ -102,11 +102,12 @@ def count_issues_by_state(user)
end
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def memoize_per_user(user, method_name)
@memoized ||= {}
@memoized[method_name] ||= {}
@memoized[method_name][user&.id] ||= yield
memoized_users[method_name][user&.id] ||= yield
end
def memoized_users
@memoized_users ||= Hash.new { |h, k| h[k] = {} }
end
# override in a class that includes this module to get a faster query
......
......@@ -55,6 +55,7 @@ def resolvable_discussions
discussion_notes.resolvable.discussions(self)
end
end
# rubocop:enable Cop/ModuleWithInstanceVariables
def discussions_resolvable?
resolvable_discussions.any?(&:resolvable?)
......
......@@ -44,7 +44,6 @@ def next_relative_position
next_pos
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_between(before, after)
return move_after(before) unless after
return move_before(after) unless before
......@@ -53,13 +52,12 @@ def move_between(before, after)
# to its predecessor. This process will recursively move all the predecessors until we have a place
if (after.relative_position - before.relative_position) < 2
before.move_before
@positionable_neighbours = [before]
@positionable_neighbours = [before] # rubocop:disable Cop/ModuleWithInstanceVariables
end
self.relative_position = position_between(before.relative_position, after.relative_position)
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_after(before = self)
pos_before = before.relative_position
pos_after = before.next_relative_position
......@@ -67,7 +65,7 @@ def move_after(before = self)
if before.shift_after?
issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_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
end
......@@ -75,7 +73,6 @@ def move_after(before = self)
self.relative_position = position_between(pos_before, pos_after)
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def move_before(after = self)
pos_after = after.relative_position
pos_before = after.prev_relative_position
......@@ -83,7 +80,7 @@ def move_before(after = self)
if after.shift_before?
issue_to_move = self.class.in_projects(project_ids).find_by!(relative_position: pos_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
end
......@@ -144,4 +141,5 @@ def save_positionable_neighbours
status
end
# rubocop:enable Cop/ModuleWithInstanceVariables
end
......@@ -84,7 +84,6 @@ def unresolve!
private
# rubocop:disable Cop/ModuleWithInstanceVariables
def update
# Do not select `Note.resolvable`, so that system notes remain in the collection
notes_relation = Note.where(id: notes.map(&:id))
......
......@@ -86,10 +86,9 @@ def where_full_path_in(paths)
end
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def full_name
if route && route.name.present?
@full_name ||= route.name
@full_name ||= route.name # rubocop:disable Cop/ModuleWithInstanceVariables
else
update_route if persisted?
......@@ -113,7 +112,7 @@ def full_path_components
def expires_full_path_cache
RequestStore.delete(full_path_key) if RequestStore.active?
@full_path = nil
@full_path = nil # rubocop:disable Cop/ModuleWithInstanceVariables
end
def build_full_path
......@@ -126,10 +125,9 @@ def build_full_path
private
# rubocop:disable Cop/ModuleWithInstanceVariables
def uncached_full_path
if route && route.path.present?
@full_path ||= route.path
@full_path ||= route.path # rubocop:disable Cop/ModuleWithInstanceVariables
else
update_route if persisted?
......@@ -164,12 +162,11 @@ def update_route
route.save
end
# rubocop:disable Cop/ModuleWithInstanceVariables
def prepare_route
route || build_route(source: self)
route.path = build_full_path
route.name = build_full_name
@full_path = nil
@full_name = nil
@full_path = nil # rubocop:disable Cop/ModuleWithInstanceVariables
@full_name = nil # rubocop:disable Cop/ModuleWithInstanceVariables
end
end
......@@ -36,11 +36,10 @@ def self.get_updated_tasks(old_content:, new_content:)
end
# Called by `TaskList::Summary`
# rubocop:disable Cop/ModuleWithInstanceVariables
def task_list_items
return [] if description.blank?
@task_list_items ||= Taskable.get_tasks(description)
@task_list_items ||= Taskable.get_tasks(description) # rubocop:disable Cop/ModuleWithInstanceVariables
end
def tasks
......
......@@ -36,6 +36,7 @@ def spend_time(options)
end
end
alias_method :spend_time=, :spend_time
# rubocop:enable Cop/ModuleWithInstanceVariables
def total_time_spent
timelogs.sum(:time_spent)
......@@ -51,11 +52,11 @@ def human_time_estimate
private
# rubocop:disable Cop/ModuleWithInstanceVariables
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
# rubocop:disable Cop/ModuleWithInstanceVariables
def add_or_subtract_spent_time
timelogs.new(
time_spent: time_spent,
......@@ -63,17 +64,19 @@ def add_or_subtract_spent_time
spent_at: @spent_at
)
end
# rubocop:enable Cop/ModuleWithInstanceVariables
# rubocop:disable Cop/ModuleWithInstanceVariables
def check_negative_time_spent
return if time_spent.nil? || time_spent == :reset
# we need to cache the total time spent so multiple calls to #valid?
# doesn't give a false error
@original_total_time_spent ||= total_time_spent
if time_spent < 0 && (time_spent.abs > @original_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
# we need to cache the total time spent so multiple calls to #valid?
# doesn't give a false error
def original_total_time_spent
@original_total_time_spent ||= total_time_spent
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