класс Rails::SourceAnnotationExtractor
Реализует логику, лежащую в основе Rails::Command::NotesCommand. См. rails notes --help для информации об использовании.
Объекты Annotation представляют собой тройки :line, :tag, :text, которые отражают строку, в которой находится аннотация, её метку и текст. Обратите внимание, что имя файла не хранится.
Аннотации ищутся в комментариях и пробельных символах модуля, они должны начинаться с метки, за которой необязательно следует двоеточие. Всё до конца строки (или закрывающей тега комментария ERB) считается текстом аннотации.
Атрибуты
Публичные методы класса
# File railties/lib/rails/source_annotation_extractor.rb, line 85
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`.
# File railties/lib/rails/source_annotation_extractor.rb, line 94 def initialize(tag) @tag = tag end
Публичные методы экземпляра
# File railties/lib/rails/source_annotation_extractor.rb, line 146
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 каждой аннотации.
# File railties/lib/rails/source_annotation_extractor.rb, line 134
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 массиву его аннотаций. В противном случае он возвращает пустой хэш.
# File railties/lib/rails/source_annotation_extractor.rb, line 100
def find(dirs)
dirs.inject({}) { |h, dir| h.update(find_in(dir)) }
end Возвращает хэш, который сопоставляет имена файлов в dirs (рекурсивно) массивам их аннотаций.
# File railties/lib/rails/source_annotation_extractor.rb, line 108
def find_in(dir)
results = {}
Dir.glob("#{dir}/*") do |item|
next if File.basename(item)[0] == ?.
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–2019 David Heinemeier Hansson
Licensed under the MIT License.