Spec-Zone.ru › Ruby on Rails 7.0

класс Rails::SourceAnnotationExtractor

Родитель:
Объект

Реализует логику, лежащую в основе Rails::Command::NotesCommand. См. rails notes --help для информации об использовании.

Annotation объекты представляют собой тройки :line, :tag, :text, которые представляют строку, в которой находится аннотация, ее тег и ее текст. Обратите внимание, что имя файла не сохраняется.

Аннотации ищутся в комментариях и в модулях пробелов, они должны начинаться с тега, за которым необязательно следует двоеточие. Все до конца строки (или закрывающего ERB тега комментария) считается их текстом.

Атрибуты

tag[R]

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

enumerate(tag = nil, options = {}) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 76
def self.enumerate(tag = nil, options = {})
  tag ||= Annotation.tags.join("|")
  extractor = new(tag)
  dirs = options.delete(:dirs) || Annotation.directories
  extractor.display(extractor.find(dirs), options)
end

Печатает все аннотации с тегом tag в корневых каталогах app, config, db, lib, и test (рекурсивно).

Если tag равно nil, печатаются аннотации с тегами по умолчанию или зарегистрированными тегами.

Конкретные каталоги могут быть явно заданы с помощью ключа :dirs в options.

Rails::SourceAnnotationExtractor.enumerate 'TODO|FIXME', dirs: %w(app lib), tag: true

Если options содержит флаг :tag, он будет передан каждому методу to_s аннотации.

См. #find_in для списка расширений файлов, которые будут учитываться.

Этот метод класса является единственной точкой входа для команды rails notes.

new(tag) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 85
def initialize(tag)
  @tag = tag
end

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

display(results, options = {}) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 137
def display(results, options = {})
  options[:indent] = results.flat_map { |f, a| a.map(&:line) }.max.to_s.size
  results.keys.sort.each do |file|
    puts "#{file}:"
    results[file].each do |note|
      puts "  * #{note.to_s(options)}"
    end
    puts
  end
end

Выводит отображение имен файлов к аннотациям в results в порядке возрастания имен файлов. Хэш options передается в метод to_s каждой аннотации.

extract_annotations_from(file, pattern) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 125
def extract_annotations_from(file, pattern)
  lineno = 0
  result = File.readlines(file, encoding: Encoding::BINARY).inject([]) do |list, line|
    lineno += 1
    next list unless line =~ pattern
    list << Annotation.new(lineno, $1, $2)
  end
  result.empty? ? {} : { file => result }
end

Если file — это имя файла, содержащего аннотации, этот метод возвращает хэш с единственным элементом, который сопоставляет file массиву его аннотаций. В противном случае возвращается пустой хэш.

find(dirs) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 91
def find(dirs)
  dirs.inject({}) { |h, dir| h.update(find_in(dir)) }
end

Возвращает хэш, который сопоставляет имена файлов в dirs (рекурсивно) массивам с их аннотациями.

find_in(dir) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 99
def find_in(dir)
  results = {}

  Dir.glob("#{dir}/*") do |item|
    next if File.basename(item).start_with?(".")

    if File.directory?(item)
      results.update(find_in(item))
    else
      extension = Annotation.extensions.detect do |regexp, _block|
        regexp.match(item)
      end

      if extension
        pattern = extension.last.call(tag)
        results.update(extract_annotations_from(item, pattern)) if pattern
      end
    end
  end

  results
end

Возвращает хэш, который сопоставляет имена файлов в dir (рекурсивно) массивам с их аннотациями. Файлы с расширениями, зарегистрированными в Rails::SourceAnnotationExtractor::Annotation.extensions, учитываются. Включаются только файлы с аннотациями.

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

Spec-Zone.ru

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