Commit 23db6449 authored by Rémy Coutable's avatar Rémy Coutable

Add support for no-op slash commands that appear in autocomplete

The first one is /cc
Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent e0216044
...@@ -117,7 +117,7 @@ module SlashCommands ...@@ -117,7 +117,7 @@ module SlashCommands
return unless noteable.respond_to?(:due_date) return unless noteable.respond_to?(:due_date)
due_date = begin due_date = begin
if due_date_param.downcase == 'tomorrow' if due_date_param.casecmp('tomorrow').zero?
Date.tomorrow Date.tomorrow
else else
Time.now + ChronicDuration.parse(due_date_param) Time.now + ChronicDuration.parse(due_date_param)
...@@ -136,6 +136,14 @@ module SlashCommands ...@@ -136,6 +136,14 @@ module SlashCommands
@updates[:due_date] = nil @updates[:due_date] = nil
end end
# This is a dummy command, so that it appears in the autocomplete commands
desc 'CC'
params '@user'
noop true
command :cc do
return
end
def find_label_ids(labels_param) def find_label_ids(labels_param)
extract_references(labels_param, :label).map(&:id) extract_references(labels_param, :label).map(&:id)
end end
......
...@@ -14,8 +14,10 @@ module Gitlab ...@@ -14,8 +14,10 @@ module Gitlab
def command_names def command_names
command_definitions.flat_map do |command_definition| command_definitions.flat_map do |command_definition|
[command_definition[:name], command_definition[:aliases]].flatten unless command_definition[:noop]
end [command_definition[:name], command_definition[:aliases]].flatten
end
end.compact
end end
# Allows to give a description to the next slash command # Allows to give a description to the next slash command
...@@ -28,6 +30,11 @@ module Gitlab ...@@ -28,6 +30,11 @@ module Gitlab
@params = params @params = params
end end
# Allows to define if a command is a no-op, but should appear in autocomplete
def noop(noop)
@noop = noop
end
# Registers a new command which is recognizeable # Registers a new command which is recognizeable
# from body of email or comment. # from body of email or comment.
# Example: # Example:
...@@ -63,7 +70,8 @@ module Gitlab ...@@ -63,7 +70,8 @@ module Gitlab
name: command_name, name: command_name,
aliases: aliases, aliases: aliases,
description: @description || '', description: @description || '',
params: @params || [] params: @params || [],
noop: @noop || false
} }
@command_definitions << command_definition @command_definitions << command_definition
......
...@@ -29,6 +29,11 @@ describe Gitlab::SlashCommands::Dsl do ...@@ -29,6 +29,11 @@ describe Gitlab::SlashCommands::Dsl do
command :wildcard do |*args| command :wildcard do |*args|
args args
end end
noop true
command :cc do |*args|
args
end
end end
end end
let(:dummy) { DummyClass.new } let(:dummy) { DummyClass.new }
...@@ -36,11 +41,12 @@ describe Gitlab::SlashCommands::Dsl do ...@@ -36,11 +41,12 @@ describe Gitlab::SlashCommands::Dsl do
describe '.command_definitions' do describe '.command_definitions' do
it 'returns an array with commands definitions' do it 'returns an array with commands definitions' do
expected = [ expected = [
{ name: :no_args, aliases: [:none], description: 'A command with no args', params: [] }, { name: :no_args, aliases: [:none], description: 'A command with no args', params: [], noop: false },
{ name: :returning, aliases: [], description: 'A command returning a value', params: [] }, { name: :returning, aliases: [], description: 'A command returning a value', params: [], noop: false },
{ name: :one_arg, aliases: [:once, :first], description: '', params: ['The first argument'] }, { name: :one_arg, aliases: [:once, :first], description: '', params: ['The first argument'], noop: false },
{ name: :two_args, aliases: [], description: 'A command with two args', params: ['The first argument', 'The second argument'] }, { name: :two_args, aliases: [], description: 'A command with two args', params: ['The first argument', 'The second argument'], noop: false },
{ name: :wildcard, aliases: [], description: '', params: [] } { name: :wildcard, aliases: [], description: '', params: [], noop: false },
{ name: :cc, aliases: [], description: '', params: [], noop: true }
] ]
expect(DummyClass.command_definitions).to eq expected expect(DummyClass.command_definitions).to eq expected
......
...@@ -175,7 +175,7 @@ describe Gitlab::SlashCommands::Extractor do ...@@ -175,7 +175,7 @@ describe Gitlab::SlashCommands::Extractor do
end end
it 'does not extract commands inside a blockcode' do it 'does not extract commands inside a blockcode' do
msg = msg = "Hello\r\n```\r\nThis is some text\r\n/close\r\n/assign @user\r\n```\r\n\r\nWorld" msg = "Hello\r\n```\r\nThis is some text\r\n/close\r\n/assign @user\r\n```\r\n\r\nWorld"
expected = msg.delete("\r") expected = msg.delete("\r")
commands = extractor.extract_commands!(msg) commands = extractor.extract_commands!(msg)
...@@ -193,7 +193,7 @@ describe Gitlab::SlashCommands::Extractor do ...@@ -193,7 +193,7 @@ describe Gitlab::SlashCommands::Extractor do
end end
it 'does not extract commands inside a HTML tag' do it 'does not extract commands inside a HTML tag' do
msg = msg = "Hello\r\n<div>\r\nThis is some text\r\n/close\r\n/assign @user\r\n</div>\r\n\r\nWorld" msg = "Hello\r\n<div>\r\nThis is some text\r\n/close\r\n/assign @user\r\n</div>\r\n\r\nWorld"
expected = msg.delete("\r") expected = msg.delete("\r")
commands = extractor.extract_commands!(msg) commands = extractor.extract_commands!(msg)
......
...@@ -28,7 +28,7 @@ shared_examples 'issuable record that supports slash commands in its description ...@@ -28,7 +28,7 @@ shared_examples 'issuable record that supports slash commands in its description
issuable = project.public_send(issuable_type.to_s.pluralize).first issuable = project.public_send(issuable_type.to_s.pluralize).first
expect(issuable.description).to eq "bug description\r\n" expect(issuable.description).to eq "bug description\n"
expect(issuable.labels).to eq [label_bug] expect(issuable.labels).to eq [label_bug]
expect(issuable.milestone).to eq milestone expect(issuable.milestone).to eq milestone
expect(page).to have_content 'bug 345' expect(page).to have_content 'bug 345'
...@@ -57,7 +57,7 @@ shared_examples 'issuable record that supports slash commands in its description ...@@ -57,7 +57,7 @@ shared_examples 'issuable record that supports slash commands in its description
issuable.reload issuable.reload
note = issuable.notes.user.first note = issuable.notes.user.first
expect(note.note).to eq "Awesome!\r\n" expect(note.note).to eq "Awesome!\n"
expect(issuable.assignee).to eq assignee expect(issuable.assignee).to eq assignee
expect(issuable.labels).to eq [label_bug] expect(issuable.labels).to eq [label_bug]
expect(issuable.milestone).to eq milestone expect(issuable.milestone).to eq milestone
...@@ -189,7 +189,6 @@ shared_examples 'issuable record that supports slash commands in its description ...@@ -189,7 +189,6 @@ shared_examples 'issuable record that supports slash commands in its description
end end
it "does not reopen the #{issuable_type}" do it "does not reopen the #{issuable_type}" do
current_title = issuable.title
page.within('.js-main-target-form') do page.within('.js-main-target-form') do
fill_in 'note[note]', with: "/title Awesome new title" fill_in 'note[note]', with: "/title Awesome new title"
click_button 'Comment' click_button 'Comment'
......
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