Spec-Zone.ru › Ruby on Rails 7.2

class ActiveSupport::BacktraceCleaner

Parent:
Объект

Очиститель строк трассировки

Строки трассировки часто содержат много строк, не относящихся к рассматриваемому контексту. Это затрудняет поиск сигнала среди шума строк трассировки и увеличивает время отладки. С помощью BacktraceCleaner, используются фильтры и глушители для удаления шумных строк, оставляя только самые релевантные.

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

bc = ActiveSupport::BacktraceCleaner.new
root = "#{Rails.root}/"
bc.add_filter   { |line| line.start_with?(root) ? line.from(root.size) : line } # strip the Rails.root prefix
bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
bc.clean(exception.backtrace) # perform the cleanup

Для переконфигурации существующего BacktraceCleaner (например, по умолчанию в Rails) и отображения максимального количества данных, можно всегда вызвать BacktraceCleaner#remove_silencers!, что восстановит строки трассировки в первозданном виде. Если вам нужно переконфигурировать существующий BacktraceCleaner, чтобы он не фильтровал или не изменял пути строк трассировки, можно вызвать BacktraceCleaner#remove_filters!. Эти два метода предоставят вам совершенно нетронутые строки трассировки.

Вдохновлено плагином Quiet Backtrace от thoughtbot.

Константы

FORMATTED_GEMS_PATTERN

Публичные методы класса

new() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 35
def initialize
  @filters, @silencers = [], []
  add_core_silencer
  add_gem_filter
  add_gem_silencer
  add_stdlib_silencer
end

Публичные методы экземпляра

add_filter(&block) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 83
def add_filter(&block)
  @filters << block
end

Добавляет фильтр из предоставленного блока. Каждая строка в строках трассировки будет сопоставлена с этим фильтром.

# Will turn "/my/rails/root/app/models/person.rb" into "app/models/person.rb"
root = "#{Rails.root}/"
backtrace_cleaner.add_filter { |line| line.start_with?(root) ? line.from(root.size) : line }
add_silencer(&block) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 92
def add_silencer(&block)
  @silencers << block
end

Добавляет глушитель из предоставленного блока. Если глушитель возвращает true для заданной строки, она будет исключена из очищенных строк трассировки.

# Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
backtrace_cleaner.add_silencer { |line| /puma/.match?(line) }
clean(backtrace, kind = :silent) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 45
def clean(backtrace, kind = :silent)
  filtered = filter_backtrace(backtrace)

  case kind
  when :silent
    silence(filtered)
  when :noise
    noise(filtered)
  else
    filtered
  end
end

Возвращает строки трассировки после применения всех фильтров и глушителей. Фильтры применяются первыми, затем глушители.

Также алиас: filter
clean_frame(frame, kind = :silent) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 61
def clean_frame(frame, kind = :silent)
  frame = frame.to_s
  @filters.each do |f|
    frame = f.call(frame.to_s)
  end

  case kind
  when :silent
    frame unless @silencers.any? { |s| s.call(frame) }
  when :noise
    frame if @silencers.any? { |s| s.call(frame) }
  else
    frame
  end
end

Возвращает строку с примененными всеми фильтрами. Возвращает nil если строка была заглушена.

filter(backtrace, kind = :silent)
Алиас для: clean
remove_filters!() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 106
def remove_filters!
  @filters = []
end

Удаляет все фильтры, но оставляет глушители. Полезно, если вам внезапно нужно увидеть полные пути в строках трассировки, которые вы уже отфильтровали.

remove_silencers!() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 99
def remove_silencers!
  @silencers = []
end

Удаляет все глушители, но оставляет фильтры. Полезно, если ваш контекст отладки внезапно расширился, и вы подозреваете ошибку в одной из используемых вами библиотек.

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

Spec-Zone.ru

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