debian-mirror-gitlab/lib/gitlab/quick_actions/dsl.rb

229 lines
7.2 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
2016-09-13 17:45:13 +05:30
module Gitlab
2017-09-10 17:25:29 +05:30
module QuickActions
2016-09-13 17:45:13 +05:30
module Dsl
extend ActiveSupport::Concern
included do
cattr_accessor :command_definitions, instance_accessor: false do
[]
end
cattr_accessor :command_definitions_by_name, instance_accessor: false do
{}
end
end
class_methods do
2017-09-10 17:25:29 +05:30
# Allows to give a description to the next quick action.
2016-09-13 17:45:13 +05:30
# This description is shown in the autocomplete menu.
# It accepts a block that will be evaluated with the context given to
# `CommandDefintion#to_h`.
#
# Example:
#
# desc do
2019-07-07 11:18:12 +05:30
# "This is a dynamic description for #{quick_action_target.to_ability_name}"
2016-09-13 17:45:13 +05:30
# end
# command :command_key do |arguments|
# # Awesome code block
# end
def desc(text = '', &block)
2022-08-27 11:52:29 +05:30
@description = block || text
2016-09-13 17:45:13 +05:30
end
2020-03-13 15:44:24 +05:30
def warning(text = '', &block)
2022-08-27 11:52:29 +05:30
@warning = block || text
2020-03-13 15:44:24 +05:30
end
def icon(string = '')
@icon = string
2019-02-15 15:39:39 +05:30
end
2017-09-10 17:25:29 +05:30
# Allows to define params for the next quick action.
2016-09-13 17:45:13 +05:30
# These params are shown in the autocomplete menu.
#
# Example:
#
# params "~label ~label2"
# command :command_key do |arguments|
# # Awesome code block
# end
2017-08-17 22:00:37 +05:30
def params(*params, &block)
2022-08-27 11:52:29 +05:30
@params = block || params
2017-08-17 22:00:37 +05:30
end
# Allows to give an explanation of what the command will do when
# executed. This explanation is shown when rendering the Markdown
# preview.
#
# Example:
#
# explanation do |arguments|
# "Adds label(s) #{arguments.join(' ')}"
# end
# command :command_key do |arguments|
# # Awesome code block
# end
def explanation(text = '', &block)
2022-08-27 11:52:29 +05:30
@explanation = block || text
2016-09-13 17:45:13 +05:30
end
2019-10-12 21:52:04 +05:30
# Allows to provide a message about quick action execution result, success or failure.
# This message is shown after quick action execution and after saving the note.
#
# Example:
#
# execution_message do |arguments|
# "Added label(s) #{arguments.join(' ')}"
# end
# command :command_key do |arguments|
# # Awesome code block
# end
#
# Note: The execution_message won't be executed unless the condition block returns true.
# execution_message block is executed always after the command block has run,
# for this reason if the condition block doesn't return true after the command block has
# run you need to set the @execution_message variable inside the command block instead as
# shown in the following example.
#
# Example using instance variable:
#
# command :command_key do |arguments|
# # Awesome code block
# @execution_message[:command_key] = 'command_key executed successfully'
# end
#
def execution_message(text = '', &block)
2022-08-27 11:52:29 +05:30
@execution_message = block || text
2019-10-12 21:52:04 +05:30
end
2019-07-07 11:18:12 +05:30
# Allows to define type(s) that must be met in order for the command
# to be returned by `.command_names` & `.command_definitions`.
#
# It is being evaluated before the conditions block is being evaluated
#
# If no types are passed then any type is allowed as the check is simply skipped.
#
# Example:
#
# types Commit, Issue, MergeRequest
# command :command_key do |arguments|
# # Awesome code block
# end
def types(*types_list)
@types = types_list
end
2016-09-13 17:45:13 +05:30
# Allows to define conditions that must be met in order for the command
# to be returned by `.command_names` & `.command_definitions`.
2018-03-27 19:54:05 +05:30
# It accepts a block that will be evaluated with the context
# of a QuickActions::InterpretService instance
2016-09-13 17:45:13 +05:30
# Example:
#
# condition do
# project.public?
# end
# command :command_key do |arguments|
# # Awesome code block
# end
def condition(&block)
@condition_block = block
end
2017-08-17 22:00:37 +05:30
# Allows to perform initial parsing of parameters. The result is passed
# both to `command` and `explanation` blocks, instead of the raw
# parameters.
# It accepts a block that will be evaluated with the context given to
# `CommandDefintion#to_h`.
#
# Example:
#
# parse_params do |raw|
# raw.strip
# end
# command :command_key do |parsed|
# # Awesome code block
# end
def parse_params(&block)
@parse_params_block = block
end
2016-09-13 17:45:13 +05:30
# Registers a new command which is recognizeable from body of email or
# comment.
# It accepts aliases and takes a block.
#
2019-10-12 21:52:04 +05:30
# You can also set the @execution_message instance variable, on conflicts with
# execution_message method the instance variable has precedence.
#
2016-09-13 17:45:13 +05:30
# Example:
#
# command :my_command, :alias_for_my_command do |arguments|
# # Awesome code block
2019-10-12 21:52:04 +05:30
# @updates[:my_command] = 'foo'
#
# @execution_message[:my_command] = 'my_command executed successfully'
2016-09-13 17:45:13 +05:30
# end
def command(*command_names, &block)
2017-09-10 17:25:29 +05:30
define_command(CommandDefinition, *command_names, &block)
end
# Registers a new substitution which is recognizable from body of email or
# comment.
# It accepts aliases and takes a block with the formatted content.
#
# Example:
#
# command :my_substitution, :alias_for_my_substitution do |text|
# "#{text} MY AWESOME SUBSTITUTION"
# end
def substitution(*substitution_names, &block)
define_command(SubstitutionDefinition, *substitution_names, &block)
end
def definition_by_name(name)
command_definitions_by_name[name.to_sym]
end
private
def define_command(klass, *command_names, &block)
2016-09-13 17:45:13 +05:30
name, *aliases = command_names
2017-09-10 17:25:29 +05:30
definition = klass.new(
2016-09-13 17:45:13 +05:30
name,
2017-08-17 22:00:37 +05:30
aliases: aliases,
description: @description,
2019-02-15 15:39:39 +05:30
warning: @warning,
2020-03-13 15:44:24 +05:30
icon: @icon,
2017-08-17 22:00:37 +05:30
explanation: @explanation,
2019-10-12 21:52:04 +05:30
execution_message: @execution_message,
2017-08-17 22:00:37 +05:30
params: @params,
condition_block: @condition_block,
parse_params_block: @parse_params_block,
2019-07-07 11:18:12 +05:30
action_block: block,
types: @types
2016-09-13 17:45:13 +05:30
)
self.command_definitions << definition
definition.all_names.each do |name|
self.command_definitions_by_name[name] = definition
end
@description = nil
2017-08-17 22:00:37 +05:30
@explanation = nil
2019-10-12 21:52:04 +05:30
@execution_message = nil
2016-09-13 17:45:13 +05:30
@params = nil
@condition_block = nil
2019-02-15 15:39:39 +05:30
@warning = nil
2020-03-13 15:44:24 +05:30
@icon = nil
2017-08-17 22:00:37 +05:30
@parse_params_block = nil
2019-07-07 11:18:12 +05:30
@types = nil
2017-08-17 22:00:37 +05:30
end
2016-09-13 17:45:13 +05:30
end
end
end
end