Class: Rails::Generator::Commands::Destroy

Inherits:
RewindBase show all
Defined in:
lib/rails_generator/commands.rb

Overview

Undo the actions performed by a generator. Rewind the action manifest and attempt to completely erase the results of each action.

Instance Attribute Summary

Attributes inherited from Base

#args, #destination_root, #source_root

Attributes included from Options

#options

Instance Method Summary collapse

Methods inherited from RewindBase

#invoke!

Methods inherited from Base

#class_collisions, #dependency, #invoke!, #readme

Methods inherited from Base

#destination_path, #initialize, #manifest, #source_path

Methods included from Options

included

Constructor Details

This class inherits a constructor from Rails::Generator::Base

Instance Method Details

#complex_template(*args) ⇒ Object



513
514
515
# File 'lib/rails_generator/commands.rb', line 513

def complex_template(*args)
  # nothing should be done here
end

#directory(relative_path) ⇒ Object

Remove each directory in the given path from right to left. Remove each subdirectory if it exists and is a directory.



477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
# File 'lib/rails_generator/commands.rb', line 477

def directory(relative_path)
  parts = relative_path.split('/')
  until parts.empty?
    partial = File.join(parts)
    path = destination_path(partial)
    if File.exist?(path)
      if Dir[File.join(path, '*')].empty?
        logger.rmdir partial
        unless options[:pretend]
          if options[:svn]
            # If the directory has been marked to be added
            # but has not yet been checked in, revert and delete
            if options[:svn][relative_path]
              system("svn revert #{path}")
              FileUtils.rmdir(path)
            else
            # If the directory is not in the status list, it
            # has no modifications so we can simply remove it
              system("svn rm #{path}")
            end
          # I don't think git needs to remove directories?..
          # or maybe they have special consideration...
          else
            FileUtils.rmdir(path)
          end
        end
      else
        logger.notempty partial
      end
    else
      logger.missing partial
    end
    parts.pop
  end
end

#file(relative_source, relative_destination, file_options = {}) ⇒ Object Also known as: template

Remove a file if it exists and is a file.



432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
# File 'lib/rails_generator/commands.rb', line 432

def file(relative_source, relative_destination, file_options = {})
  destination = destination_path(relative_destination)
  if File.exist?(destination)
    logger.rm relative_destination
    unless options[:pretend]
      if options[:svn]
        # If the file has been marked to be added
        # but has not yet been checked in, revert and delete
        if options[:svn][relative_destination]
          system("svn revert #{destination}")
          FileUtils.rm(destination)
        else
        # If the directory is not in the status list, it
        # has no modifications so we can simply remove it
          system("svn rm #{destination}")
        end
      elsif options[:git]
        if options[:git][:new][relative_destination]
          # file has been added, but not committed
          system("git reset HEAD #{relative_destination}")
          FileUtils.rm(destination)
        elsif options[:git][:modified][relative_destination]
          # file is committed and modified
          system("git rm -f #{relative_destination}")
        else
          # If the directory is not in the status list, it
          # has no modifications so we can simply remove it
          system("git rm #{relative_destination}")
        end
      else
        FileUtils.rm(destination)
      end
    end
  else
    logger.missing relative_destination
    return
  end
end

#migration_template(relative_source, relative_destination, template_options = {}) ⇒ Object

When deleting a migration, it knows to delete every file named “[0-9]*_#file_name”.



518
519
520
521
522
523
524
525
526
527
528
529
530
531
# File 'lib/rails_generator/commands.rb', line 518

def migration_template(relative_source, relative_destination, template_options = {})
  migration_directory relative_destination

  migration_file_name = template_options[:migration_file_name] || file_name
  unless migration_exists?(migration_file_name)
    puts "There is no migration named #{migration_file_name}"
    return
  end


  existing_migrations(migration_file_name).each do |file_path|
    file(relative_source, file_path, template_options)
  end
end

#route_resources(*resources) ⇒ Object



533
534
535
536
537
538
# File 'lib/rails_generator/commands.rb', line 533

def route_resources(*resources)
  resource_list = resources.map { |r| r.to_sym.inspect }.join(', ')
  look_for = "\n  map.resources #{resource_list}\n"
  logger.route "map.resources #{resource_list}"
  gsub_file 'config/routes.rb', /(#{look_for})/mi, ''
end