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.

Methods

Public Instance methods

Does nothing for all commands except Create.

[Source]

# File railties/lib/rails_generator/commands.rb, line 52
        def class_collisions(*class_names)
        end

[Source]

# 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.

[Source]

# File railties/lib/rails_generator/commands.rb, line 41
        def invoke!
          manifest.replay(self)
        end

Does nothing for all commands except Create.

[Source]

# File railties/lib/rails_generator/commands.rb, line 56
        def readme(*args)
        end

Protected Instance methods

[Source]

# 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

[Source]

# 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

[Source]

# 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

[Source]

# File railties/lib/rails_generator/commands.rb, line 60
          def migration_directory(relative_path)
            directory(@migration_directory = relative_path)
          end

[Source]

# File railties/lib/rails_generator/commands.rb, line 68
          def migration_exists?(file_name)
            not existing_migrations(file_name).empty?
          end

[Source]

# File railties/lib/rails_generator/commands.rb, line 79
          def next_migration_number
            current_migration_number + 1
          end

[Source]

# File railties/lib/rails_generator/commands.rb, line 83
          def next_migration_string(padding = 3)
            "%.#{padding}d" % next_migration_number
          end

Private Instance methods

[Source]

# 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.

[Source]

# 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

[Source]

# 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

[Source]

# File railties/lib/rails_generator/commands.rb, line 136
          def template_part_mark(name, id)
            "<!--[#{name}:#{id}]-->\n"
          end

[Validate]