Class: RuboCop::Cop::Chef::Ruby::UnlessDefinedRequire

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/chef/ruby/unless_defined_require.rb

Overview

Rubygems is VERY slow to require gems even if they’ve already been loaded. To work around this wrap your require statement with an ‘if defined?()` check.

Constant Summary collapse

MSG =
"Workaround rubygems slow requires by only running require if the class isn't already defined"
REQUIRE_TO_CLASS =
{
  "addressable/uri" => "Addressable::URI",
  "appscript" => "Appscript",
  "base64" => "Base64",
  "benchmark" => "Benchmark",
  "cgi" => "CGI",
  "chef-utils" => "ChefUtils::CANARY",
  "chef-utils/dist" => "ChefUtils::Dist",
  "csv" => "CSV",
  "digest" => "Digest",
  "digest/md5" => "Digest::MD5",
  "digest/sha1" => "Digest::SHA1",
  "digest/sha2" => "Digest::SHA2",
  "droplet_kit" => "DropletKit",
  "erb" => "Erb",
  "erubis" => "Erubis",
  "etc" => "Etc",
  "excon" => "Excon",
  "faraday" => "Faraday",
  "ffi_yajl" => "FFI_Yajl",
  "ffi" => "FFI",
  "fileutils" => "FileUtils",
  "find" => "Find.find",
  "forwardable" => "Forwardable",
  "ipaddr" => "IPAddr",
  "json" => "JSON",
  "mime/types" => "MIME::Types",
  "mixlib/archive" => "Mixlib::Archive",
  "mixlib/cli" => "Mixlib::CLI",
  "mixlib/config" => "Mixlib::Config",
  "mixlib/shellout" => "Mixlib::ShellOut",
  "multi_json" => "MultiJson",
  "net/http" => "Net::HTTP",
  "net/ssh" => "Net::SSH",
  "netaddr" => "NetAddr",
  "nokogiri" => "Nokogiri",
  "ohai" => "Ohai::System",
  "open-uri" => "OpenURI",
  "openssl" => "OpenSSL",
  "optparse" => "OptionParser",
  "ostruct" => "OpenStruct",
  "pathname" => "Pathname",
  "pp" => "PP",
  "rack" => "Rack",
  "rbconfig" => "RbConfig",
  "retryable" => "Retryable",
  "rexml/document" => "REXML::Document",
  "rubygems" => "Gem",
  "rubygems/package" => "Gem::Package",
  "securerandom" => "SecureRandom",
  "set" => "Set",
  "shellwords" => "Shellwords",
  "singleton" => "Singleton",
  "socket" => "Socket",
  "sslshake" => "SSLShake",
  "stringio" => "StringIO",
  "tempfile" => "Tempfile",
  "thor" => "Thor",
  "time" => "Time.zone_offset",
  "timeout" => "Timeout",
  "tmpdir" => "Dir.mktmpdir",
  "tomlrb" => "Tomlrb",
  "uri" => "URI",
  "webrick" => "WEBrick",
  "win32/registry" => "Win32::Registry",
  "win32ole" => "WIN32OLE",
  "winrm" => "WinRM::Connection",
  "yard" => "YARD",
  "zip" => "Zip",
  "zlib" => "Zlib",
  "pastel" => "Pastel",
}.freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



108
109
110
111
112
113
114
115
116
117
# File 'lib/rubocop/cop/chef/ruby/unless_defined_require.rb', line 108

def on_send(node)
  require?(node) do |r|
    next if node.parent && node.parent.conditional? # catch both if and unless
    next unless REQUIRE_TO_CLASS[r]

    add_offense(node.loc.expression, message: MSG, severity: :refactor) do |corrector|
      corrector.replace(node.loc.expression, "#{node.source} unless defined?(#{REQUIRE_TO_CLASS[r]})")
    end
  end
end