Spec-Zone.ru › Ruby on Rails 8.1

класс Rails::SourceAnnotationExtractor

Родитель:
Object

Реализует логику, лежащую в основе 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 149
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 каждой аннотации.

Список учитываемых расширений файлов см. в разделе SourceAnnotationExtractor#find_in.

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

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

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

display (results, options = {}) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 207
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).strip}"
    end
    puts
  end
end

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

find (dirs) Показать исходный код
# File railties/lib/rails/source_annotation_extractor.rb, line 164
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 172
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)

        # In case a user-defined pattern returns nothing for the given set
        # of tags, we exit early.
        next unless pattern

        # If a user-defined pattern returns a regular expression, we will
        # wrap it in a PatternExtractor to keep the same API.
        pattern = PatternExtractor.new(pattern) if pattern.is_a?(Regexp)

        annotations = pattern.annotations(item)
        results.update(item => annotations) if annotations.any?
      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