модуль Rails::Generators
Константы
- DEFAULT_ALIASES
- DEFAULT_OPTIONS
- RAILS_DEV_PATH
-
Нам нужно хранить RAILS_DEV_PATH в константе, иначе путь может измениться в Ruby 1.8.7 при использовании FileUtils.cd.
- RESERVED_NAMES
Открытые методы класса
# File railties/lib/rails/generators.rb, line 98
def self.fallbacks
@fallbacks ||= {}
end Хранит настроенные резервные генераторы. Если разработчик плагина хочет, чтобы группа генераторов переходила к другой группе в случае отсутствия генераторов, он может добавить резервное копирование.
Например, shoulda считается test_framework и является расширением test_unit. Однако большая часть генераторов shoulda похожа на генераторы test_unit.
Shoulda может указать генераторам искать генераторы test_unit, когда некоторые из них недоступны, добавив резервное копирование:
Rails::Generators.fallbacks[:shoulda] = :test_unit
# File railties/lib/rails/generators.rb, line 211
def self.help(command = 'generate')
puts "Usage: rails #{command} GENERATOR [args] [options]"
puts
puts "General options:"
puts " -h, [--help] # Print generator's options and usage"
puts " -p, [--pretend] # Run but do not make any changes"
puts " -f, [--force] # Overwrite files that already exist"
puts " -s, [--skip] # Skip files that already exist"
puts " -q, [--quiet] # Suppress status output"
puts
puts "Please choose a generator below."
puts
print_generators
end Показать сообщение справки с доступными генераторами.
Возвращает массив имён пространств генераторов, которые скрыты. Пространства имён генераторов могут быть скрыты по разным причинам. Некоторые из них являются псевдонимами, такими как “rails:migration”, и могут быть вызваны с более коротким именем “migration”, другие являются закрытыми для других генераторов, такими как “css:scaffold”.
# File railties/lib/rails/generators.rb, line 204 def hide_namespaces(*namespaces) hidden_namespaces.concat(namespaces) end
# File railties/lib/rails/generators.rb, line 153
def self.invoke(namespace, args=ARGV, config={})
names = namespace.to_s.split(':')
if klass = find_by_namespace(names.pop, names.any? && names.join(':'))
args << "--help" if args.empty? && klass.arguments.any? { |a| a.required? }
klass.start(args, config)
else
options = sorted_groups.map(&:last).flatten
suggestions = options.sort_by {|suggested| levenshtein_distance(namespace.to_s, suggested) }.first(3)
msg = "Could not find generator '#{namespace}'. "
msg << "Maybe you meant #{ suggestions.map {|s| "'#{s}'"}.to_sentence(last_word_connector: " or ") }\n"
msg << "Run `rails generate --help` for more options."
puts msg
end
end Принимает имя пространства, аргументы и поведение для вызова генератора. Используется в качестве точки входа по умолчанию для команд generate, destroy и update.
# File railties/lib/rails/generators.rb, line 103 def self.no_color! Thor::Base.shell = Thor::Shell::Basic end
Удалить цвет из вывода.
# File railties/lib/rails/generators.rb, line 232
def self.print_generators
sorted_groups.each { |b, n| print_list(b, n) }
end # File railties/lib/rails/generators.rb, line 227
def self.public_namespaces
lookup!
subclasses.map { |k| k.namespace }
end # File railties/lib/rails/generators.rb, line 236
def self.sorted_groups
namespaces = public_namespaces
namespaces.sort!
groups = Hash.new { |h,k| h[k] = [] }
namespaces.each do |namespace|
base = namespace.split(':').first
groups[base] << namespace
end
rails = groups.delete("rails")
rails.map! { |n| n.sub(/^rails:/, '') }
rails.delete("app")
rails.delete("plugin")
hidden_namespaces.each { |n| groups.delete(n.to_s) }
[["rails", rails]] + groups.sort.to_a
end # File railties/lib/rails/generators.rb, line 108 def self.subclasses @subclasses ||= [] end
Отслеживать все подклассы генераторов.
Защищенные методы класса
# File railties/lib/rails/generators.rb, line 258
def self.levenshtein_distance str1, str2
s = str1
t = str2
n = s.length
m = t.length
return m if (0 == n)
return n if (0 == m)
d = (0..m).to_a
x = nil
str1.each_char.each_with_index do |char1,i|
e = i+1
str2.each_char.each_with_index do |char2,j|
cost = (char1 == char2) ? 0 : 1
x = [
d[j+1] + 1, # insertion
e + 1, # deletion
d[j] + cost # substitution
].min
d[j] = e
e = x
end
d[m] = x
end
return x
end Этот код основан непосредственно на реализации Text gem Возвращает значение, представляющее «стоимость» преобразования str1 в str2
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.