class RuboCop::Cop::SketchupRequirements::SketchupRequire

Omit file extensions when using `Sketchup.require` to allow encrypted files to be loaded.

Ruby C extensions, `.so`/`.bundle` libraries must always be loaded via the normal `require`.

@example Bad - This will fail if extension is encrypted

Sketchup.require 'hello/world.rb'

@example Good - This will work for `.rbe`, `.rbs` and `rb` files.

Sketchup.require 'hello/world'

@example Bad - This will fail if extension is encrypted

extension = SketchupExtension.new("Example", "Example/main.rb")

@example Good - This will work for `.rbe`, `.rbs` and `rb` files.

extension = SketchupExtension.new("Example", "Example/main")

Constants

MSG_EXTENSION_NEW_EXT_NAME
MSG_REQUIRE_ENCRYPTED
MSG_REQUIRE_FOR_BINARY
MSG_SKETCHUP_REQUIRE_EXT_NAME
TOOLS_RUBY_FILES

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 71
def on_send(node)
  if sketchup_require?(node)
    filename = sketchup_require(node)
    return if check_binary_sketchup_require(node, filename)
    return if check_sketchup_require_filename(node, filename)

  elsif ruby_require?(node)
    filename = ruby_require(node)
    return if check_encrypted_require(node, filename)

  elsif sketchup_extension_new?(node)
    filename = sketchup_extension_new(node)
    return if check_sketchup_extension_new_filename(node, filename)

  end
end

Private Instance Methods

binary_require?(filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 90
def binary_require?(filename)
  return unless extension_binaries?
  return if extension_binaries.empty?

  extension_binaries.include?(filename)
end
check_binary_sketchup_require(node, filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 97
def check_binary_sketchup_require(node, filename)
  return unless binary_require?(filename)

  end_pos = node.loc.dot.end_pos
  range = node.receiver.loc.expression.with(end_pos: end_pos)
  add_offense(node, location: range, message: MSG_REQUIRE_FOR_BINARY)
  true
end
check_encrypted_require(node, filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 122
def check_encrypted_require(node, filename)
  return unless encrypted_extension?
  return unless extension_file?(filename)

  add_offense(node, location: node.loc.selector,
                    message: MSG_REQUIRE_ENCRYPTED)
  true
end
check_sketchup_extension_new_filename(node, filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 114
def check_sketchup_extension_new_filename(node, filename)
  return if valid_filename?(filename)

  add_offense(node, location: file_ext_range(node.arguments.last),
                    message: MSG_EXTENSION_NEW_EXT_NAME)
  true
end
check_sketchup_require_filename(node, filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 106
def check_sketchup_require_filename(node, filename)
  return if valid_filename?(filename)

  add_offense(node, location: file_ext_range(node.arguments.first),
                    message: MSG_SKETCHUP_REQUIRE_EXT_NAME)
  true
end
extension_file?(filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 135
def extension_file?(filename)
  pathname = Pathname.new(filename).cleanpath
  return false unless pathname.relative?

  first_directory(extension_directory) == first_directory(pathname)
end
first_directory(path) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 131
def first_directory(path)
  path.to_s.split(File::SEPARATOR).first.downcase
end
valid_filename?(filename) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_require.rb, line 142
def valid_filename?(filename)
  File.extname(filename).empty? || TOOLS_RUBY_FILES.include?(filename)
end