38 lines
949 B
Ruby
38 lines
949 B
Ruby
|
module RuboCop
|
||
|
module Cop
|
||
|
# This cop prevents usage of the `git` and `github` arguments to `gem` in a
|
||
|
# `Gemfile` in order to avoid additional points of failure beyond
|
||
|
# rubygems.org.
|
||
|
class GemFetcher < RuboCop::Cop::Cop
|
||
|
MSG = 'Do not use gems from git repositories, only use gems from RubyGems.'.freeze
|
||
|
|
||
|
GIT_KEYS = [:git, :github].freeze
|
||
|
|
||
|
def on_send(node)
|
||
|
return unless gemfile?(node)
|
||
|
|
||
|
func_name = node.children[1]
|
||
|
return unless func_name == :gem
|
||
|
|
||
|
node.children.last.each_node(:pair) do |pair|
|
||
|
key_name = pair.children[0].children[0].to_sym
|
||
|
if GIT_KEYS.include?(key_name)
|
||
|
add_offense(node, pair.source_range, MSG)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def gemfile?(node)
|
||
|
node
|
||
|
.location
|
||
|
.expression
|
||
|
.source_buffer
|
||
|
.name
|
||
|
.end_with?("Gemfile")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|