class RuboCop::Cop::Packaging::RequireHardcodingLib

This cop flags the `require` calls, from anywhere mapping to the “lib” directory, except originating from lib/.

@example

# bad
require "../lib/foo/bar"

# good
require "foo/bar"

# bad
require File.expand_path("../../lib/foo", __FILE__)

# good
require "foo"

# bad
require File.expand_path("../../../lib/foo/bar/baz/qux", __dir__)

# good
require "foo/bar/baz/qux"

# bad
require File.dirname(__FILE__) + "/../../lib/baz/qux"

# good
require "baz/qux"

Constants

MSG

This is the message that will be displayed when RuboCop::Packaging finds an offense of using `require` with relative path to lib.

Public Instance Methods

falls_in_lib?(str) click to toggle source

This method is called from inside `#def_node_matcher`. It flags an offense if the `require` call is made from anywhere except the “lib” directory.

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 85
def falls_in_lib?(str)
  @str = str
  target_falls_in_lib?(str) && inspected_file_is_not_in_lib_or_gemspec?
end
falls_in_lib_using_file?(str) click to toggle source

This method is called from inside `#def_node_matcher`. It flags an offense if the `require` call (using the __FILE__ arguement) is made from anywhere except the “lib” directory.

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 93
def falls_in_lib_using_file?(str)
  @str = str
  target_falls_in_lib_using_file?(str) && inspected_file_is_not_in_lib_or_gemspec?
end
falls_in_lib_with_file_dirname_plus_str?(str) click to toggle source

This method preprends a “.” to the string that starts with “/”. And then determines if that call is made to “lib/”.

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 100
def falls_in_lib_with_file_dirname_plus_str?(str)
  @str = str
  str.prepend(".")
  target_falls_in_lib?(str) && inspected_file_is_not_in_lib_or_gemspec?
end
good_require_call() click to toggle source

Called from on_send, this method helps to replace the “bad” require call with the “good” one.

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 77
def good_require_call
  good_call = @str.sub(%r{^.*/lib/}, "")
  %(require "#{good_call}")
end
on_new_investigation() click to toggle source

Extended from the Base class. More about the `#on_new_investigation` method can be found here: github.com/rubocop-hq/rubocop/blob/343f62e4555be0470326f47af219689e21c61a37/lib/rubocop/cop/base.rb

Processing of the AST happens here.

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 59
def on_new_investigation
  @file_path = processed_source.file_path
  @file_directory = File.dirname(@file_path)
end
on_send(node) click to toggle source

Extended from AST::Traversal. More about the `#on_send` method can be found here: github.com/rubocop-hq/rubocop-ast/blob/08d0f49a47af1e9a30a6d8f67533ba793c843d67/lib/rubocop/ast/traversal.rb#L112

# File lib/rubocop/cop/packaging/require_hardcoding_lib.rb, line 67
def on_send(node)
  return unless require?(node)

  add_offense(node) do |corrector|
    corrector.replace(node, good_require_call)
  end
end