Spec-Zone.ru › Ruby on Rails 8.1

class ActiveSupport::FileUpdateChecker

Родительский класс:
Object

Проверка обновления файлов

FileUpdateChecker определяет API, используемый Rails для отслеживания файлов и управления перезагрузкой. API зависит от четырех методов:

  • initialize принимает два параметра и один блок, как описано ниже.

  • updated? возвращает логическое значение, указывающее, были ли обновления в файловой системе.

  • execute выполняет заданный блок при инициализации и обновляет список последних отслеживаемых файлов и временную метку.

  • execute_if_updated просто выполняет блок, если произошло обновление.

После инициализации вызов execute_if_updated должен выполнять блок только в том случае, если в файловой системе действительно произошли изменения.

Этот класс используется Rails для перезагрузки фреймворка I18n при изменении его файлов во время нового запроса.

i18n_reloader = ActiveSupport::FileUpdateChecker.new(paths) do
  I18n.reload!
end

ActiveSupport::Reloader.to_prepare do
  i18n_reloader.execute_if_updated
end

Общедоступные методы класса

new (files, dirs = {}, &block) Показать исходный код
# File activesupport/lib/active_support/file_update_checker.rb, line 44
def initialize(files, dirs = {}, &block)
  unless block
    raise ArgumentError, "A block is required to initialize a FileUpdateChecker"
  end

  gem_paths = Gem.path
  @files = files.reject { |file| File.expand_path(file).start_with?(*gem_paths) }.freeze

  @globs = compile_glob(dirs)&.reject { |dir| dir.start_with?(*gem_paths) }

  @block = block

  @watched    = nil
  @updated_at = nil

  @last_watched   = watched
  @last_update_at = updated_at(@last_watched)
end

При инициализации метод принимает два параметра. Первый — массив файлов, а второй — необязательный хеш каталогов. Ключами хеша должны быть каталоги, а значениями — массив расширений файлов, которые нужно отслеживать в соответствующем каталоге.

Методу также необходимо передать блок, который будет вызван при изменении пути. Массив файлов и список каталогов нельзя изменить после инициализации FileUpdateChecker.

Общедоступные методы экземпляра

execute () Показать исходный код
# File activesupport/lib/active_support/file_update_checker.rb, line 85
def execute
  @last_watched   = watched
  @last_update_at = updated_at(@last_watched)
  @block.call
ensure
  @watched = nil
  @updated_at = nil
end

Выполняет заданный блок и обновляет список последних отслеживаемых файлов и временную метку.

execute_if_updated () { || ... } Показать исходный код
# File activesupport/lib/active_support/file_update_checker.rb, line 95
def execute_if_updated
  if updated?
    yield if block_given?
    execute
    true
  else
    false
  end
end

Выполняет переданный блок, если произошло обновление.

updated? () Показать исходный код
# File activesupport/lib/active_support/file_update_checker.rb, line 66
def updated?
  current_watched = watched
  if @last_watched.size != current_watched.size
    @watched = current_watched
    true
  else
    current_updated_at = updated_at(current_watched)
    if @last_update_at < current_updated_at
      @watched    = current_watched
      @updated_at = current_updated_at
      true
    else
      false
    end
  end
end

Проверяет, были ли обновлены какие-либо элементы. Если да, значения watched и/или updated_at кэшируются до выполнения блока через execute или execute_if_updated.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API