Simplify Mentionable concern instance methods
We remove some arguments that are rarely used or used just to simplify setups on specs. Modified Mentionable#create_new_cross_references method we don’t need to calculate previous references to avoid the duplication because we do that at database level when creating references extracted from the current entity state. MergeRequests won’t create cross_references for commits that are included so we change a spec to use a different merge request to make references to commits to other branches
This commit is contained in:
parent
ccd89ec965
commit
4ff345c488
5 changed files with 30 additions and 26 deletions
|
@ -11,6 +11,7 @@ v 8.13.0 (unreleased)
|
|||
- Log LDAP lookup errors and don't swallow unrelated exceptions. !6103 (Markus Koller)
|
||||
- Add more tests for calendar contribution (ClemMakesApps)
|
||||
- Avoid database queries on Banzai::ReferenceParser::BaseParser for nodes without references
|
||||
- Simplify Mentionable concern instance methods
|
||||
- Fix permission for setting an issue's due date
|
||||
- Expose expires_at field when sharing project on API
|
||||
- Fix issue with page scrolling to top when closing or pinning sidebar (lukehowell)
|
||||
|
|
|
@ -43,19 +43,15 @@ module Mentionable
|
|||
self
|
||||
end
|
||||
|
||||
def all_references(current_user = nil, text = nil, extractor: nil)
|
||||
def all_references(current_user = nil, extractor: nil)
|
||||
extractor ||= Gitlab::ReferenceExtractor.
|
||||
new(project, current_user)
|
||||
|
||||
if text
|
||||
extractor.analyze(text, author: author)
|
||||
else
|
||||
self.class.mentionable_attrs.each do |attr, options|
|
||||
text = __send__(attr)
|
||||
options = options.merge(cache_key: [self, attr], author: author)
|
||||
self.class.mentionable_attrs.each do |attr, options|
|
||||
text = __send__(attr)
|
||||
options = options.merge(cache_key: [self, attr], author: author)
|
||||
|
||||
extractor.analyze(text, options)
|
||||
end
|
||||
extractor.analyze(text, options)
|
||||
end
|
||||
|
||||
extractor
|
||||
|
@ -66,8 +62,8 @@ module Mentionable
|
|||
end
|
||||
|
||||
# Extract GFM references to other Mentionables from this Mentionable. Always excludes its #local_reference.
|
||||
def referenced_mentionables(current_user = self.author, text = nil)
|
||||
refs = all_references(current_user, text)
|
||||
def referenced_mentionables(current_user = self.author)
|
||||
refs = all_references(current_user)
|
||||
refs = (refs.issues + refs.merge_requests + refs.commits)
|
||||
|
||||
# We're using this method instead of Array diffing because that requires
|
||||
|
@ -77,8 +73,8 @@ module Mentionable
|
|||
end
|
||||
|
||||
# Create a cross-reference Note for each GFM reference to another Mentionable found in the +mentionable_attrs+.
|
||||
def create_cross_references!(author = self.author, without = [], text = nil)
|
||||
refs = referenced_mentionables(author, text)
|
||||
def create_cross_references!(author = self.author, without = [])
|
||||
refs = referenced_mentionables(author)
|
||||
|
||||
# We're using this method instead of Array diffing because that requires
|
||||
# both of the object's `hash` values to be the same, which may not be the
|
||||
|
@ -97,10 +93,7 @@ module Mentionable
|
|||
|
||||
return if changes.empty?
|
||||
|
||||
original_text = changes.collect { |_, vals| vals.first }.join(' ')
|
||||
|
||||
preexisting = referenced_mentionables(author, original_text)
|
||||
create_cross_references!(author, preexisting)
|
||||
create_cross_references!(author)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -1,18 +1,27 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Mentionable do
|
||||
include Mentionable
|
||||
class Example
|
||||
include Mentionable
|
||||
|
||||
def author
|
||||
nil
|
||||
attr_accessor :project, :message
|
||||
attr_mentionable :message
|
||||
|
||||
def author
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'references' do
|
||||
let(:project) { create(:project) }
|
||||
let(:mentionable) { Example.new }
|
||||
|
||||
it 'excludes JIRA references' do
|
||||
allow(project).to receive_messages(jira_tracker?: true)
|
||||
expect(referenced_mentionables(project, 'JIRA-123')).to be_empty
|
||||
|
||||
mentionable.project = project
|
||||
mentionable.message = 'JIRA-123'
|
||||
expect(mentionable.referenced_mentionables).to be_empty
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -39,9 +48,8 @@ describe Issue, "Mentionable" do
|
|||
let(:user) { create(:user) }
|
||||
|
||||
def referenced_issues(current_user)
|
||||
text = "#{private_issue.to_reference(project)} and #{public_issue.to_reference}"
|
||||
|
||||
issue.referenced_mentionables(current_user, text)
|
||||
issue.title = "#{private_issue.to_reference(project)} and #{public_issue.to_reference}"
|
||||
issue.referenced_mentionables(current_user)
|
||||
end
|
||||
|
||||
context 'when the current user can see the issue' do
|
||||
|
|
|
@ -522,7 +522,7 @@ describe MergeRequest, models: true do
|
|||
end
|
||||
|
||||
it_behaves_like 'an editable mentionable' do
|
||||
subject { create(:merge_request) }
|
||||
subject { create(:merge_request, :simple) }
|
||||
|
||||
let(:backref_text) { "merge request #{subject.to_reference}" }
|
||||
let(:set_mentionable_text) { ->(txt){ subject.description = txt } }
|
||||
|
|
|
@ -9,7 +9,7 @@ shared_context 'mentionable context' do
|
|||
let(:author) { subject.author }
|
||||
|
||||
let(:mentioned_issue) { create(:issue, project: project) }
|
||||
let!(:mentioned_mr) { create(:merge_request, :simple, source_project: project) }
|
||||
let!(:mentioned_mr) { create(:merge_request, source_project: project) }
|
||||
let(:mentioned_commit) { project.commit("HEAD~1") }
|
||||
|
||||
let(:ext_proj) { create(:project, :public) }
|
||||
|
@ -100,6 +100,7 @@ shared_examples 'an editable mentionable' do
|
|||
|
||||
it 'creates new cross-reference notes when the mentionable text is edited' do
|
||||
subject.save
|
||||
subject.create_cross_references!
|
||||
|
||||
new_text = <<-MSG.strip_heredoc
|
||||
These references already existed:
|
||||
|
@ -131,6 +132,7 @@ shared_examples 'an editable mentionable' do
|
|||
end
|
||||
|
||||
# These two issues are new and should receive reference notes
|
||||
# In the case of MergeRequests remember that cannot mention commits included in the MergeRequest
|
||||
new_issues.each do |newref|
|
||||
expect(SystemNoteService).to receive(:cross_reference).
|
||||
with(newref, subject.local_reference, author)
|
||||
|
|
Loading…
Reference in a new issue