class HotReloader

Constants

VERSION

Public Class Methods

eager_load(*folders, logger: Logger.new(IO::NULL), ignore: []) click to toggle source

Enable autoload ruby file based on default Zeitwerk rule. More rule see github.com/fxn/zeitwerk

@param [*String, Array<String>] folders folders which should be autoload, can be multi-args or array.

or only one Zeitwerk::Loader object can be provided.

@param [#call] logger logger object, e.g. Logger.new($stdout) @param [Array<String>, Array<Pathname>] ignore File names, Glob patterns or Pathname object which should be excluded for zeitwerk. @return nil

# File lib/hot_reloader.rb, line 59
def eager_load(*folders, logger: Logger.new(IO::NULL), ignore: [])
  folders = folders.flatten

  if folders.first.is_a? Zeitwerk::Loader
    loader = folders.first
    folders = loader.root_dirs.keys
  else
    loader = Zeitwerk::Loader.new

    raise 'you must set the root directories from which you want to load watched files.' if folders&.empty?
    raise 'ignore: only accept an array of glob patterns string or Pathname objects.' unless ignore.is_a? Array

    folders.each {|folder| loader.push_dir(folder) }
  end

  loader.logger = logger
  loader.ignore(ignore) unless ignore.empty?

  loader.setup
  loader.eager_load
end
will_listen(*folders, logger: Logger.new(IO::NULL), ignore: [], wait_for_delay: nil, listen_ignore: []) click to toggle source

Listen on folders for file change, and reload changed rb file if necessary. Should be used for development mode only.

@param [*String, Array<String>] folders Folders which should be monitor, can be multi-args or array.

or only one Zeitwerk::Loader object can be provided.

@param [#call] logger logger object, e.g. Logger.new($stdout). @param [Array<String>, Array<Pathname>] ignore File names, Glob patterns or Pathname object which should be excluded for zeitwerk. @param [Integer] wait_for_delay Set the delay (in seconds) before call loader.reload when changes exist. @param [Array<Regexp>] listen_ignore The regexp pattern which don't want listen on. @return nil

# File lib/hot_reloader.rb, line 18
def will_listen(*folders, logger: Logger.new(IO::NULL), ignore: [], wait_for_delay: nil, listen_ignore: [])
  folders = folders.flatten

  if folders.first.is_a? Zeitwerk::Loader
    loader, *listened_folders = folders
    folders = loader.root_dirs.keys
    # `folders' will add to zeitwerk root directories and listened.
    # `reloadable_folder' listened only, it can be reload dynamically.
    # but not constant lookup use name convention.
  else
    loader = Zeitwerk::Loader.new

    raise 'you must set the root directories from which you want to load watched files.' if folders&.empty?
    raise 'ignore: only accept an array of glob patterns string or Pathname objects.' unless ignore.is_a? Array

    folders.each {|folder| loader.push_dir(folder) }
    listened_folders = []
  end

  loader.enable_reloading if loader.respond_to? :enable_reloading
  loader.logger = logger
  loader.ignore(ignore) unless ignore.empty?
  loader.setup

  Listen.logger = logger

  listen_options = {ignore: [/\A\.?#/]}
  listen_options.merge!({wait_for_delay: wait_for_delay}) if wait_for_delay
  listen_options[:ignore].concat listen_ignore if listen_ignore

  Listen.to(*(folders + listened_folders), listen_options) { loader.reload }.start
end