| Class | Rails::Generator::Commands::Base |
| In: |
railties/lib/rails_generator/commands.rb
|
| Parent: | DelegateClass(Rails::Generator::Base) |
Generator commands delegate Rails::Generator::Base and implement a standard set of actions. Their behavior is defined by the way they respond to these actions: Create brings life; Destroy brings death; List passively observes.
Commands are invoked by replaying (or rewinding) the generator’s manifest of actions. See Rails::Generator::Manifest and Rails::Generator::Base#manifest method that generator subclasses are required to override.
Commands allows generators to "plug in" invocation behavior, which corresponds to the GoF Strategy pattern.
# File railties/lib/rails_generator/commands.rb, line 45 def dependency(generator_name, args, runtime_options = {}) logger.dependency(generator_name) do self.class.new(instance(generator_name, args, full_options(runtime_options))).invoke! end end
Replay action manifest. RewindBase subclass rewinds manifest.
# File railties/lib/rails_generator/commands.rb, line 41 def invoke! manifest.replay(self) end
# File railties/lib/rails_generator/commands.rb, line 72 def current_migration_number Dir.glob("#{@migration_directory}/[0-9]*.rb").inject(0) do |max, file_path| n = File.basename(file_path).split('_', 2).first.to_i if n > max then n else max end end end
# File railties/lib/rails_generator/commands.rb, line 64 def existing_migrations(file_name) Dir.glob("#{@migration_directory}/[0-9]*_*.rb").grep(/[0-9]+_#{file_name}.rb$/) end
# File railties/lib/rails_generator/commands.rb, line 87 def gsub_file(relative_destination, regexp, *args, &block) path = destination_path(relative_destination) content = File.read(path).gsub(regexp, *args, &block) File.open(path, 'wb') { |file| file.write(content) } end
# File railties/lib/rails_generator/commands.rb, line 60 def migration_directory(relative_path) directory(@migration_directory = relative_path) end
# File railties/lib/rails_generator/commands.rb, line 68 def migration_exists?(file_name) not existing_migrations(file_name).empty? end
# File railties/lib/rails_generator/commands.rb, line 79 def next_migration_number current_migration_number + 1 end
# File railties/lib/rails_generator/commands.rb, line 83 def next_migration_string(padding = 3) "%.#{padding}d" % next_migration_number end
# File railties/lib/rails_generator/commands.rb, line 119 def diff_cmd ENV['RAILS_DIFF'] || 'diff -u' end
Ask the user interactively whether to force collision.
# File railties/lib/rails_generator/commands.rb, line 95 def force_file_collision?(destination, src, dst, file_options = {}, &block) $stdout.print "overwrite #{destination}? [Ynaqd] " case $stdin.gets when /d/i Tempfile.open(File.basename(destination), File.dirname(dst)) do |temp| temp.write render_file(src, file_options, &block) temp.rewind $stdout.puts `#{diff_cmd} #{dst} #{temp.path}` end puts "retrying" raise 'retry diff' when /a/i $stdout.puts "forcing #{spec.name}" options[:collision] = :force when /q/i $stdout.puts "aborting #{spec.name}" raise SystemExit when /n/i then :skip else :force end rescue retry end
# File railties/lib/rails_generator/commands.rb, line 123 def render_template_part(template_options) # Getting Sandbox to evaluate part template in it part_binding = template_options[:sandbox].call.sandbox_binding part_rel_path = template_options[:insert] part_path = source_path(part_rel_path) # Render inner template within Sandbox binding rendered_part = ERB.new(File.readlines(part_path).join, nil, '-').result(part_binding) begin_mark = template_part_mark(template_options[:begin_mark], template_options[:mark_id]) end_mark = template_part_mark(template_options[:end_mark], template_options[:mark_id]) begin_mark + rendered_part + end_mark end