Class: RuboCop::Cop::Packaging::GemspecGit

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/packaging/gemspec_git.rb

Overview

This cop flags the usage of ‘git ls-files` in gemspec and suggests to use a plain Ruby alternative, like `Dir`, `Dir.glob`, or `Rake::FileList` instead.

Examples:


# bad
Gem::Specification.new do |spec|
  spec.files = `git ls-files`.split("\n")
end

# good
Gem::Specification.new do |spec|
  spec.files = Dir["lib/**/*", "LICENSE", "README.md"]
end

# bad
Gem::Specification.new do |spec|
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
    `git ls-files -z`.split("\\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  end
end

# good
require "rake/file_list"

Gem::Specification.new do |spec|
  spec.files = Rake::FileList["**/*"].exclude(*File.read(".gitignore").split)
end

# bad
Gem::Specification.new do |spec|
  spec.files        = `git ls-files -- lib/`.split("\n")
  spec.executables  = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
end

# good
Gem::Specification.new do |spec|
  spec.files        = Dir.glob("lib/**/*")
  spec.executables  = Dir.glob("bin/*").map{ |f| File.basename(f) }
end

Constant Summary collapse

MSG =

This is the message that will be displayed when RuboCop finds an offense of using ‘git ls-files`.

"Avoid using git to produce lists of files. " \
"Downstreams often need to build your package in an environment " \
"that does not have git (on purpose). " \
"Use some pure Ruby alternative, like `Dir` or `Dir.glob`."

Instance Method Summary collapse

Instance Method Details

#on_new_investigationObject

Extended from the Cop class. More about the ‘#investigate` method can be found here: github.com/rubocop-hq/rubocop/blob/59543c8e2b66bff249de131fa9105f3eb11e9edb/lib/rubocop/cop/cop.rb#L13-L25

Processing of the AST happens here.



70
71
72
73
74
75
76
77
78
79
# File 'lib/rubocop/cop/packaging/gemspec_git.rb', line 70

def on_new_investigation
  return if processed_source.blank?

  xstr(processed_source.ast).each do |node|
    add_offense(
      node.loc.expression,
      message: MSG
    )
  end
end

#starts_with_git?(str) ⇒ Boolean

This method is called from inside ‘#def_node_search`. It is used to find strings which start with “git”.

Returns:

  • (Boolean)


83
84
85
# File 'lib/rubocop/cop/packaging/gemspec_git.rb', line 83

def starts_with_git?(str)
  str.start_with?("git")
end