add preliminary RuboCop for generate_completions DSL
This commit is contained in:
parent
db921d88d9
commit
fd98c3df58
@ -415,6 +415,76 @@ module RuboCop
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This cop makes sure that the `generate_completions` DSL is used.
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
class GenerateCompletionsDSL < FormulaCop
|
||||||
|
extend AutoCorrector
|
||||||
|
|
||||||
|
def audit_formula(_node, _class_node, _parent_class_node, body_node)
|
||||||
|
install = find_method_def(body_node, :install)
|
||||||
|
|
||||||
|
correctable_shell_completion_node(install) do |node, shell, base_name, binary, cmd, shell_parameter|
|
||||||
|
next unless shell_parameter.match?(/(bash|zsh|fish)/) # generate_completions only applicable if shell is passed
|
||||||
|
|
||||||
|
base_name = base_name.delete_prefix("_").delete_suffix(".fish")
|
||||||
|
shell = shell.to_s.sub("_completion", "").to_sym
|
||||||
|
binary = binary.source
|
||||||
|
shell_parameter_stripped = shell_parameter.sub("bash", "").sub("zsh", "").sub("fish", "")
|
||||||
|
shell_prefix = if shell_parameter_stripped.empty?
|
||||||
|
nil
|
||||||
|
elsif shell_parameter_stripped == "--"
|
||||||
|
:flag
|
||||||
|
else
|
||||||
|
"\"#{shell_parameter_stripped}\""
|
||||||
|
end
|
||||||
|
|
||||||
|
replacement_args = %w[]
|
||||||
|
replacement_args << "base_name: \"#{base_name}\"" unless base_name == @formula_name
|
||||||
|
replacement_args << "shells: [:#{shell}]"
|
||||||
|
replacement_args << "binary: #{binary}" unless binary.to_s == "bin/\"#{@formula_name}\""
|
||||||
|
replacement_args << "cmd: \"#{cmd}\"" unless cmd == "completion"
|
||||||
|
replacement_args << "shell_prefix: #{shell_prefix}" unless shell_prefix.nil?
|
||||||
|
|
||||||
|
offending_node(node)
|
||||||
|
replacement = "generate_completions(#{replacement_args.join(", ")})"
|
||||||
|
problem "Use `#{replacement}` instead of `#{@offensive_node.source}`." do |corrector|
|
||||||
|
corrector.replace(@offensive_node.source_range, replacement)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shell_completion_node(install) do |node|
|
||||||
|
offending_node(node)
|
||||||
|
problem "Use `generate_completions` DSL instead of `#{@offensive_node.source}`."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# matches ({bash,zsh,fish}_completion/"_?foo{.fish}?").write Utils.safe_popen_read(foo, cmd, shell_parameter)
|
||||||
|
def_node_search :correctable_shell_completion_node, <<~EOS
|
||||||
|
$(send
|
||||||
|
(begin
|
||||||
|
(send
|
||||||
|
(send nil? ${:bash_completion :zsh_completion :fish_completion}) :/
|
||||||
|
(str $_))) :write
|
||||||
|
(send
|
||||||
|
(const nil? :Utils) :safe_popen_read
|
||||||
|
$(send
|
||||||
|
(send nil? :bin) :/
|
||||||
|
(str _))
|
||||||
|
(str $_)
|
||||||
|
(str $_)))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
# matches ({bash,zsh,fish}_completion/"_?foo{.fish}?").write output
|
||||||
|
def_node_search :shell_completion_node, <<~EOS
|
||||||
|
$(send
|
||||||
|
(begin
|
||||||
|
(send
|
||||||
|
(send nil? {:bash_completion :zsh_completion :fish_completion}) :/
|
||||||
|
(str _))) :write _)
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
|
||||||
# This cop checks for other miscellaneous style violations.
|
# This cop checks for other miscellaneous style violations.
|
||||||
#
|
#
|
||||||
# @api private
|
# @api private
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user