Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
projects.thm.de
GitLab
Commits
2703330a
Commit
2703330a
authored
Aug 18, 2016
by
Douwe Maan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix behavior around commands with optional arguments
parent
6f2f2a6b
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
63 additions
and
42 deletions
+63
-42
app/services/slash_commands/interpret_service.rb
app/services/slash_commands/interpret_service.rb
+2
-2
lib/gitlab/slash_commands/command_definition.rb
lib/gitlab/slash_commands/command_definition.rb
+6
-5
lib/gitlab/slash_commands/extractor.rb
lib/gitlab/slash_commands/extractor.rb
+7
-6
spec/lib/gitlab/slash_commands/command_definition_spec.rb
spec/lib/gitlab/slash_commands/command_definition_spec.rb
+47
-17
spec/lib/gitlab/slash_commands/dsl_spec.rb
spec/lib/gitlab/slash_commands/dsl_spec.rb
+1
-12
No files found.
app/services/slash_commands/interpret_service.rb
View file @
2703330a
...
...
@@ -18,11 +18,11 @@ def execute(content, issuable)
content
,
commands
=
extractor
.
extract_commands
(
content
,
opts
)
commands
.
each
do
|
name
,
arg
s
|
commands
.
each
do
|
name
,
arg
|
definition
=
self
.
class
.
command_definitions_by_name
[
name
.
to_sym
]
next
unless
definition
definition
.
execute
(
self
,
opts
,
arg
s
)
definition
.
execute
(
self
,
opts
,
arg
)
end
[
content
,
@updates
]
...
...
lib/gitlab/slash_commands/command_definition.rb
View file @
2703330a
...
...
@@ -28,13 +28,14 @@ def available?(opts)
context
.
instance_exec
(
&
condition_block
)
end
def
execute
(
context
,
opts
,
arg
s
)
def
execute
(
context
,
opts
,
arg
)
return
if
noop?
||
!
available?
(
opts
)
block_arity
=
action_block
.
arity
return
unless
(
args
.
present?
&&
block_arity
==
1
)
||
(
args
.
blank?
&&
block_arity
<=
0
)
context
.
instance_exec
(
args
,
&
action_block
)
if
arg
.
present?
context
.
instance_exec
(
arg
,
&
action_block
)
elsif
action_block
.
arity
==
0
context
.
instance_exec
(
&
action_block
)
end
end
def
to_h
(
opts
)
...
...
lib/gitlab/slash_commands/extractor.rb
View file @
2703330a
...
...
@@ -39,7 +39,7 @@ def extract_commands(content, opts = {})
content
.
delete!
(
"
\r
"
)
content
.
gsub!
(
commands_regex
(
opts
))
do
if
$~
[
:cmd
]
commands
<<
[
$~
[
:cmd
],
$~
[
:arg
s
]].
reject
(
&
:blank?
)
commands
<<
[
$~
[
:cmd
],
$~
[
:arg
]].
reject
(
&
:blank?
)
''
else
$~
[
0
]
...
...
@@ -50,13 +50,14 @@ def extract_commands(content, opts = {})
end
private
# Builds a regular expression to match known commands.
# First match group captures the command name and
# second match group captures its arguments.
#
# It looks something like:
#
# /^\/(?<cmd>close|reopen|...)(?:( |$))(?<arg
s
>[^\/\n]*)(?:\n|$)/
# /^\/(?<cmd>close|reopen|...)(?:( |$))(?<arg>[^\/\n]*)(?:\n|$)/
def
commands_regex
(
opts
)
names
=
command_names
(
opts
).
map
(
&
:to_s
)
...
...
@@ -64,7 +65,7 @@ def commands_regex(opts)
(?<code>
# Code blocks:
# ```
# Anything, including `/cmd arg
s
` which are ignored by this filter
# Anything, including `/cmd arg` which are ignored by this filter
# ```
^```
...
...
@@ -75,7 +76,7 @@ def commands_regex(opts)
(?<html>
# HTML block:
# <tag>
# Anything, including `/cmd arg
s
` which are ignored by this filter
# Anything, including `/cmd arg` which are ignored by this filter
# </tag>
^<[^>]+?>
\n
...
...
@@ -86,7 +87,7 @@ def commands_regex(opts)
(?<html>
# Quote block:
# >>>
# Anything, including `/cmd arg
s
` which are ignored by this filter
# Anything, including `/cmd arg` which are ignored by this filter
# >>>
^>>>
...
...
@@ -102,7 +103,7 @@ def commands_regex(opts)
(?<cmd>
#{
Regexp
.
union
(
names
)
}
)
(?:
[ ]
(?<arg
s
>[^
\/\n
]*)
(?<arg>[^
\/\n
]*)
)?
(?:
\n
|$)
)
...
...
spec/lib/gitlab/slash_commands/command_definition_spec.rb
View file @
2703330a
...
...
@@ -24,7 +24,7 @@
describe
"#noop?"
do
context
"when the command has an action block"
do
before
do
subject
.
action_block
=
->
{
}
subject
.
action_block
=
proc
{
}
end
it
"returns false"
do
...
...
@@ -44,7 +44,7 @@
context
"when the command has a condition block"
do
before
do
subject
.
condition_block
=
->
{
go
}
subject
.
condition_block
=
proc
{
go
}
end
context
"when the condition block returns true"
do
...
...
@@ -78,7 +78,7 @@
it
"doesn't execute the command"
do
expect
(
context
).
not_to
receive
(
:instance_exec
)
subject
.
execute
(
context
,
{})
subject
.
execute
(
context
,
{}
,
nil
)
expect
(
context
.
run
).
to
be
false
end
...
...
@@ -86,52 +86,82 @@
context
"when the command is not a noop"
do
before
do
subject
.
action_block
=
->
{
self
.
run
=
true
}
subject
.
action_block
=
proc
{
self
.
run
=
true
}
end
context
"when the command is not available"
do
before
do
subject
.
condition_block
=
->
{
false
}
subject
.
condition_block
=
proc
{
false
}
end
it
"doesn't execute the command"
do
subject
.
execute
(
context
,
{})
subject
.
execute
(
context
,
{}
,
nil
)
expect
(
context
.
run
).
to
be
false
end
end
context
"when the command is available"
do
context
"when the comm
a
nd has
an exact number of
arguments"
do
context
"when the commnd has
no
arguments"
do
before
do
subject
.
action_block
=
->
(
arg
)
{
self
.
run
=
arg
}
subject
.
action_block
=
proc
{
self
.
run
=
true
}
end
context
"when the command is provided a
wrong number of
argument
s
"
do
it
"
doesn't
execute the command"
do
subject
.
execute
(
context
,
{},
true
,
true
)
context
"when the command is provided a
n
argument"
do
it
"execute
s
the command"
do
subject
.
execute
(
context
,
{},
true
)
expect
(
context
.
run
).
to
be
fals
e
expect
(
context
.
run
).
to
be
tru
e
end
end
context
"when the command is provided the right number of arguments"
do
context
"when the command is not provided an argument"
do
it
"executes the command"
do
subject
.
execute
(
context
,
{},
nil
)
expect
(
context
.
run
).
to
be
true
end
end
end
context
"when the command has 1 required argument"
do
before
do
subject
.
action_block
=
->
(
arg
)
{
self
.
run
=
arg
}
end
context
"when the command is provided an argument"
do
it
"executes the command"
do
subject
.
execute
(
context
,
{},
true
)
expect
(
context
.
run
).
to
be
true
end
end
context
"when the command is not provided an argument"
do
it
"doesn't execute the command"
do
subject
.
execute
(
context
,
{},
nil
)
expect
(
context
.
run
).
to
be
false
end
end
end
context
"when the command has
a variable number of
argument
s
"
do
context
"when the command has
1 optional
argument"
do
before
do
subject
.
action_block
=
->
(
*
args
)
{
self
.
run
=
args
.
first
}
subject
.
action_block
=
proc
{
|
arg
=
nil
|
self
.
run
=
arg
||
true
}
end
context
"when the command is provided an argument"
do
it
"executes the command"
do
subject
.
execute
(
context
,
{},
true
)
expect
(
context
.
run
).
to
be
true
end
end
context
"when the command is provided an
y number of
argument
s
"
do
context
"when the command is
not
provided an argument"
do
it
"executes the command"
do
subject
.
execute
(
context
,
{},
true
,
true
)
subject
.
execute
(
context
,
{},
nil
)
expect
(
context
.
run
).
to
be
true
end
...
...
spec/lib/gitlab/slash_commands/dsl_spec.rb
View file @
2703330a
...
...
@@ -31,16 +31,12 @@
command
:cond_action
do
|
arg
|
arg
end
command
:wildcard
do
|*
args
|
args
end
end
end
describe
'.command_definitions'
do
it
'returns an array with commands definitions'
do
no_args_def
,
one_arg_def
,
two_args_def
,
cc_def
,
cond_action_def
,
wildcard_def
=
DummyClass
.
command_definitions
no_args_def
,
one_arg_def
,
two_args_def
,
cc_def
,
cond_action_def
=
DummyClass
.
command_definitions
expect
(
no_args_def
.
name
).
to
eq
(
:no_args
)
expect
(
no_args_def
.
aliases
).
to
eq
([
:none
])
...
...
@@ -76,13 +72,6 @@
expect
(
cond_action_def
.
params
).
to
eq
([])
expect
(
cond_action_def
.
condition_block
).
to
be_a_kind_of
(
Proc
)
expect
(
cond_action_def
.
action_block
).
to
be_a_kind_of
(
Proc
)
expect
(
wildcard_def
.
name
).
to
eq
(
:wildcard
)
expect
(
wildcard_def
.
aliases
).
to
eq
([])
expect
(
wildcard_def
.
description
).
to
eq
(
''
)
expect
(
wildcard_def
.
params
).
to
eq
([])
expect
(
wildcard_def
.
condition_block
).
to
be_nil
expect
(
wildcard_def
.
action_block
).
to
be_a_kind_of
(
Proc
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment