thor 0.14.4 → 0.14.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of thor might be problematic. Click here for more details.
- data/CHANGELOG.rdoc +11 -0
- data/Thorfile +9 -55
- data/lib/thor.rb +17 -0
- data/lib/thor/actions.rb +11 -6
- data/lib/thor/actions/create_file.rb +2 -2
- data/lib/thor/actions/create_link.rb +57 -0
- data/lib/thor/actions/file_manipulation.rb +36 -12
- data/lib/thor/actions/inject_into_file.rb +15 -10
- data/lib/thor/parser/option.rb +1 -1
- data/lib/thor/task.rb +1 -1
- data/lib/thor/version.rb +1 -1
- data/spec/actions/create_file_spec.rb +27 -27
- data/spec/actions/directory_spec.rb +23 -23
- data/spec/actions/empty_directory_spec.rb +12 -12
- data/spec/actions/file_manipulation_spec.rb +65 -42
- data/spec/actions/inject_into_file_spec.rb +24 -24
- data/spec/actions_spec.rb +63 -58
- data/spec/base_spec.rb +60 -60
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +14 -14
- data/spec/core_ext/ordered_hash_spec.rb +28 -28
- data/spec/group_spec.rb +39 -39
- data/spec/invocation_spec.rb +21 -21
- data/spec/parser/argument_spec.rb +7 -7
- data/spec/parser/arguments_spec.rb +11 -11
- data/spec/parser/option_spec.rb +45 -45
- data/spec/parser/options_spec.rb +75 -75
- data/spec/rake_compat_spec.rb +10 -10
- data/spec/register_spec.rb +92 -0
- data/spec/runner_spec.rb +32 -32
- data/spec/shell/basic_spec.rb +18 -18
- data/spec/shell/color_spec.rb +3 -3
- data/spec/shell_spec.rb +10 -10
- data/spec/spec_helper.rb +9 -10
- data/spec/task_spec.rb +8 -8
- data/spec/thor_spec.rb +62 -62
- data/spec/util_spec.rb +35 -35
- metadata +100 -68
- data/spec/spec.opts +0 -1
    
        data/CHANGELOG.rdoc
    CHANGED
    
    | @@ -1,3 +1,14 @@ | |
| 1 | 
            +
            == 0.14, released 2010-07-25
         | 
| 2 | 
            +
            * Added CreateLink class and #link_file method 
         | 
| 3 | 
            +
            * Made Thor::Actions#run use system as default method for system calls
         | 
| 4 | 
            +
            * Allow use of private methods from superclass as tasks 
         | 
| 5 | 
            +
            * Added mute(&block) method which allows to run block without any output
         | 
| 6 | 
            +
            * Removed config[:pretend]
         | 
| 7 | 
            +
            * Enabled underscores for command line switches
         | 
| 8 | 
            +
            * Added Thor::Base.basename which is used by both Thor.banner and Thor::Group.banner
         | 
| 9 | 
            +
            * Deprecated invoke() without arguments
         | 
| 10 | 
            +
            * Added :only and :except to check_unknown_options
         | 
| 11 | 
            +
             | 
| 1 12 | 
             
            == 0.13, released 2010-02-03
         | 
| 2 13 |  | 
| 3 14 | 
             
            * Added :lazy_default which is only triggered if a switch is given
         | 
    
        data/Thorfile
    CHANGED
    
    | @@ -1,70 +1,24 @@ | |
| 1 1 | 
             
            # enconding: utf-8
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require File.join(File.dirname(__FILE__), "lib", "thor", "version")
         | 
| 4 | 
            -
            require 'rubygems'
         | 
| 5 2 | 
             
            require 'thor/rake_compat'
         | 
| 6 | 
            -
            require 'spec/rake/spectask'
         | 
| 7 | 
            -
            begin
         | 
| 8 | 
            -
              require 'rdoc/task'
         | 
| 9 | 
            -
            rescue LoadError
         | 
| 10 | 
            -
            end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            GEM_NAME = 'thor'
         | 
| 13 | 
            -
            EXTRA_RDOC_FILES = ["README.md", "LICENSE", "CHANGELOG.rdoc", "Thorfile"]
         | 
| 14 3 |  | 
| 15 4 | 
             
            class Default < Thor
         | 
| 16 5 | 
             
              include Thor::RakeCompat
         | 
| 17 6 |  | 
| 18 | 
            -
               | 
| 19 | 
            -
             | 
| 20 | 
            -
                t.spec_opts = ['--options', "spec/spec.opts"]
         | 
| 21 | 
            -
                t.spec_files = FileList['spec/**/*_spec.rb']
         | 
| 22 | 
            -
              end
         | 
| 7 | 
            +
              require 'rspec/core/rake_task'
         | 
| 8 | 
            +
              RSpec::Core::RakeTask.new(:spec)
         | 
| 23 9 |  | 
| 24 | 
            -
               | 
| 25 | 
            -
             | 
| 26 | 
            -
                t.spec_opts = ['--options', "spec/spec.opts"]
         | 
| 27 | 
            -
                t.spec_files = FileList['spec/**/*_spec.rb']
         | 
| 28 | 
            -
                t.rcov = true
         | 
| 29 | 
            -
                t.rcov_dir = "rcov"
         | 
| 30 | 
            -
              end
         | 
| 10 | 
            +
              require 'bundler'
         | 
| 11 | 
            +
              Bundler::GemHelper.install_tasks
         | 
| 31 12 |  | 
| 13 | 
            +
              require 'rdoc/task'
         | 
| 32 14 | 
             
              if defined?(RDoc)
         | 
| 33 15 | 
             
                RDoc::Task.new do |rdoc|
         | 
| 34 | 
            -
                  rdoc.main     =  | 
| 35 | 
            -
                  rdoc.rdoc_dir =  | 
| 36 | 
            -
                  rdoc.title    =  | 
| 37 | 
            -
                  rdoc.rdoc_files.include( | 
| 16 | 
            +
                  rdoc.main     = 'README.md'
         | 
| 17 | 
            +
                  rdoc.rdoc_dir = 'rdoc'
         | 
| 18 | 
            +
                  rdoc.title    = 'thor'
         | 
| 19 | 
            +
                  rdoc.rdoc_files.include('README.md', 'LICENSE', 'CHANGELOG.rdoc', 'Thorfile')
         | 
| 38 20 | 
             
                  rdoc.rdoc_files.include('lib/**/*.rb')
         | 
| 39 21 | 
             
                  rdoc.options << '--line-numbers' << '--inline-source'
         | 
| 40 22 | 
             
                end
         | 
| 41 23 | 
             
              end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              begin
         | 
| 44 | 
            -
                require 'jeweler'
         | 
| 45 | 
            -
                Jeweler::Tasks.new do |s|
         | 
| 46 | 
            -
                  s.name = GEM_NAME
         | 
| 47 | 
            -
                  s.version = Thor::VERSION.dup
         | 
| 48 | 
            -
                  s.rubyforge_project = "textmate"
         | 
| 49 | 
            -
                  s.platform = Gem::Platform::RUBY
         | 
| 50 | 
            -
                  s.summary = "A scripting framework that replaces rake, sake and rubigen"
         | 
| 51 | 
            -
                  s.email = "ruby-thor@googlegroups.com"
         | 
| 52 | 
            -
                  s.homepage = "http://yehudakatz.com"
         | 
| 53 | 
            -
                  s.description = "A scripting framework that replaces rake, sake and rubigen"
         | 
| 54 | 
            -
                  s.authors = ['Yehuda Katz', 'José Valim']
         | 
| 55 | 
            -
                  s.has_rdoc = true
         | 
| 56 | 
            -
                  s.extra_rdoc_files = EXTRA_RDOC_FILES
         | 
| 57 | 
            -
                  s.require_path = 'lib'
         | 
| 58 | 
            -
                  s.bindir = "bin"
         | 
| 59 | 
            -
                  s.executables = %w( thor rake2thor )
         | 
| 60 | 
            -
                  s.files = s.extra_rdoc_files + Dir.glob("{bin,lib}/**/*")
         | 
| 61 | 
            -
                  s.test_files.include 'spec/**/*'
         | 
| 62 | 
            -
                  s.test_files.include 'spec/fixtures/doc/components/.empty_directory'
         | 
| 63 | 
            -
                  s.test_files.exclude 'spec/sandbox/**/*'
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                Jeweler::GemcutterTasks.new
         | 
| 67 | 
            -
              rescue LoadError
         | 
| 68 | 
            -
                puts "Jeweler, or one of its dependencies, is not available. Install it with: gem install jeweler"
         | 
| 69 | 
            -
              end
         | 
| 70 24 | 
             
            end
         | 
    
        data/lib/thor.rb
    CHANGED
    
    | @@ -18,6 +18,23 @@ class Thor | |
| 18 18 | 
             
                  end
         | 
| 19 19 | 
             
                end
         | 
| 20 20 |  | 
| 21 | 
            +
                # Registers another Thor subclass as a command.
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                # ==== Parameters
         | 
| 24 | 
            +
                # klass<Class>:: Thor subclass to register
         | 
| 25 | 
            +
                # command<String>:: Subcommand name to use
         | 
| 26 | 
            +
                # usage<String>:: Short usage for the subcommand
         | 
| 27 | 
            +
                # description<String>:: Description for the subcommand
         | 
| 28 | 
            +
                def register(klass, subcommand_name, usage, description, options={})
         | 
| 29 | 
            +
                  if klass <= Thor::Group
         | 
| 30 | 
            +
                    desc usage, description, options
         | 
| 31 | 
            +
                    define_method(subcommand_name) { invoke klass }
         | 
| 32 | 
            +
                  else
         | 
| 33 | 
            +
                    desc usage, description, options
         | 
| 34 | 
            +
                    subcommand subcommand_name, klass
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 21 38 | 
             
                # Defines the usage and the description of the next task.
         | 
| 22 39 | 
             
                #
         | 
| 23 40 | 
             
                # ==== Parameters
         | 
    
        data/lib/thor/actions.rb
    CHANGED
    
    | @@ -168,7 +168,7 @@ class Thor | |
| 168 168 | 
             
                  if !File.exist?(destination_root) && !pretend
         | 
| 169 169 | 
             
                    FileUtils.mkdir_p(destination_root)
         | 
| 170 170 | 
             
                  end
         | 
| 171 | 
            -
             | 
| 171 | 
            +
             | 
| 172 172 | 
             
                  if pretend
         | 
| 173 173 | 
             
                    # In pretend mode, just yield down to the block
         | 
| 174 174 | 
             
                    block.arity == 1 ? yield(destination_root) : yield
         | 
| @@ -220,7 +220,7 @@ class Thor | |
| 220 220 | 
             
                #
         | 
| 221 221 | 
             
                # ==== Parameters
         | 
| 222 222 | 
             
                # command<String>:: the command to be executed.
         | 
| 223 | 
            -
                # config<Hash>:: give :verbose => false to not log the status. Specify :with
         | 
| 223 | 
            +
                # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
         | 
| 224 224 | 
             
                #                to append an executable to command executation.
         | 
| 225 225 | 
             
                #
         | 
| 226 226 | 
             
                # ==== Example
         | 
| @@ -241,7 +241,10 @@ class Thor | |
| 241 241 | 
             
                  end
         | 
| 242 242 |  | 
| 243 243 | 
             
                  say_status :run, desc, config.fetch(:verbose, true)
         | 
| 244 | 
            -
             | 
| 244 | 
            +
             | 
| 245 | 
            +
                  unless options[:pretend]
         | 
| 246 | 
            +
                    config[:capture] ? `#{command}` : system("#{command}")
         | 
| 247 | 
            +
                  end
         | 
| 245 248 | 
             
                end
         | 
| 246 249 |  | 
| 247 250 | 
             
                # Executes a ruby script (taking into account WIN32 platform quirks).
         | 
| @@ -261,8 +264,9 @@ class Thor | |
| 261 264 | 
             
                # ==== Parameters
         | 
| 262 265 | 
             
                # task<String>:: the task to be invoked
         | 
| 263 266 | 
             
                # args<Array>:: arguments to the task
         | 
| 264 | 
            -
                # config<Hash>:: give :verbose => false to not log the status | 
| 265 | 
            -
                #                are given as parameter to Thor.
         | 
| 267 | 
            +
                # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output.
         | 
| 268 | 
            +
                #                Other options are given as parameter to Thor.
         | 
| 269 | 
            +
                #
         | 
| 266 270 | 
             
                #
         | 
| 267 271 | 
             
                # ==== Examples
         | 
| 268 272 | 
             
                #
         | 
| @@ -276,12 +280,13 @@ class Thor | |
| 276 280 | 
             
                  config  = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 277 281 | 
             
                  verbose = config.key?(:verbose) ? config.delete(:verbose) : true
         | 
| 278 282 | 
             
                  pretend = config.key?(:pretend) ? config.delete(:pretend) : false
         | 
| 283 | 
            +
                  capture = config.key?(:capture) ? config.delete(:capture) : false
         | 
| 279 284 |  | 
| 280 285 | 
             
                  args.unshift task
         | 
| 281 286 | 
             
                  args.push Thor::Options.to_switches(config)
         | 
| 282 287 | 
             
                  command = args.join(' ').strip
         | 
| 283 288 |  | 
| 284 | 
            -
                  run command, :with => :thor, :verbose => verbose, :pretend => pretend
         | 
| 289 | 
            +
                  run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
         | 
| 285 290 | 
             
                end
         | 
| 286 291 |  | 
| 287 292 | 
             
                protected
         | 
| @@ -18,7 +18,7 @@ class Thor | |
| 18 18 | 
             
                #     "vhost.name = #{hostname}"
         | 
| 19 19 | 
             
                #   end
         | 
| 20 20 | 
             
                #
         | 
| 21 | 
            -
                #   create_file "config/ | 
| 21 | 
            +
                #   create_file "config/apache.conf", "your apache config"
         | 
| 22 22 | 
             
                #
         | 
| 23 23 | 
             
                def create_file(destination, *args, &block)
         | 
| 24 24 | 
             
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| @@ -27,7 +27,7 @@ class Thor | |
| 27 27 | 
             
                end
         | 
| 28 28 | 
             
                alias :add_file :create_file
         | 
| 29 29 |  | 
| 30 | 
            -
                #  | 
| 30 | 
            +
                # CreateFile is a subset of Template, which instead of rendering a file with
         | 
| 31 31 | 
             
                # ERB, it gets the content from the user.
         | 
| 32 32 | 
             
                #
         | 
| 33 33 | 
             
                class CreateFile < EmptyDirectory #:nodoc:
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require 'thor/actions/empty_directory'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Thor
         | 
| 4 | 
            +
              module Actions
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # Create a new file relative to the destination root from the given source.
         | 
| 7 | 
            +
                #
         | 
| 8 | 
            +
                # ==== Parameters
         | 
| 9 | 
            +
                # destination<String>:: the relative path to the destination root.
         | 
| 10 | 
            +
                # source<String|NilClass>:: the relative path to the source root.
         | 
| 11 | 
            +
                # config<Hash>:: give :verbose => false to not log the status.
         | 
| 12 | 
            +
                #   :: give :symbolic => false for hard link.
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                # ==== Examples
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                #   create_link "config/apache.conf", "/etc/apache.conf"
         | 
| 17 | 
            +
                #
         | 
| 18 | 
            +
                def create_link(destination, *args, &block)
         | 
| 19 | 
            +
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 20 | 
            +
                  source = args.first
         | 
| 21 | 
            +
                  action CreateLink.new(self, destination, source, config)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                alias :add_link :create_link
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # CreateLink is a subset of CreateFile, which instead of taking a block of
         | 
| 26 | 
            +
                # data, just takes a source string from the user.
         | 
| 27 | 
            +
                #
         | 
| 28 | 
            +
                class CreateLink < CreateFile #:nodoc:
         | 
| 29 | 
            +
                  attr_reader :data
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  # Checks if the content of the file at the destination is identical to the rendered result.
         | 
| 32 | 
            +
                  #
         | 
| 33 | 
            +
                  # ==== Returns
         | 
| 34 | 
            +
                  # Boolean:: true if it is identical, false otherwise.
         | 
| 35 | 
            +
                  #
         | 
| 36 | 
            +
                  def identical?
         | 
| 37 | 
            +
                    exists? && File.identical?(render, destination)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def invoke!
         | 
| 41 | 
            +
                    invoke_with_conflict_check do
         | 
| 42 | 
            +
                      FileUtils.mkdir_p(File.dirname(destination))
         | 
| 43 | 
            +
                      # Create a symlink by default
         | 
| 44 | 
            +
                      config[:symbolic] ||= true
         | 
| 45 | 
            +
                      File.unlink(destination) if exists?
         | 
| 46 | 
            +
                      if config[:symbolic]
         | 
| 47 | 
            +
                        File.symlink(render, destination)
         | 
| 48 | 
            +
                      else
         | 
| 49 | 
            +
                        File.link(render, destination)
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                    given_destination
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| @@ -30,6 +30,28 @@ class Thor | |
| 30 30 | 
             
                  end
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 | 
            +
                # Links the file from the relative source to the relative destination. If
         | 
| 34 | 
            +
                # the destination is not given it's assumed to be equal to the source.
         | 
| 35 | 
            +
                #
         | 
| 36 | 
            +
                # ==== Parameters
         | 
| 37 | 
            +
                # source<String>:: the relative path to the source root.
         | 
| 38 | 
            +
                # destination<String>:: the relative path to the destination root.
         | 
| 39 | 
            +
                # config<Hash>:: give :verbose => false to not log the status.
         | 
| 40 | 
            +
                #
         | 
| 41 | 
            +
                # ==== Examples
         | 
| 42 | 
            +
                #
         | 
| 43 | 
            +
                #   link_file "README", "doc/README"
         | 
| 44 | 
            +
                #
         | 
| 45 | 
            +
                #   link_file "doc/README"
         | 
| 46 | 
            +
                #
         | 
| 47 | 
            +
                def link_file(source, *args, &block)
         | 
| 48 | 
            +
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 49 | 
            +
                  destination = args.first || source
         | 
| 50 | 
            +
                  source = File.expand_path(find_in_source_paths(source.to_s))
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  create_link destination, source, config
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 33 55 | 
             
                # Gets the content at the given address and places it at the given relative
         | 
| 34 56 | 
             
                # destination. If a block is given instead of destination, the content of
         | 
| 35 57 | 
             
                # the url is yielded and used as location.
         | 
| @@ -110,7 +132,7 @@ class Thor | |
| 110 132 | 
             
                  FileUtils.chmod_R(mode, path) unless options[:pretend]
         | 
| 111 133 | 
             
                end
         | 
| 112 134 |  | 
| 113 | 
            -
                # Prepend text to a file. Since it depends on  | 
| 135 | 
            +
                # Prepend text to a file. Since it depends on insert_into_file, it's reversible.
         | 
| 114 136 | 
             
                #
         | 
| 115 137 | 
             
                # ==== Parameters
         | 
| 116 138 | 
             
                # path<String>:: path of the file to be changed
         | 
| @@ -119,19 +141,20 @@ class Thor | |
| 119 141 | 
             
                #
         | 
| 120 142 | 
             
                # ==== Example
         | 
| 121 143 | 
             
                #
         | 
| 122 | 
            -
                #    | 
| 144 | 
            +
                #   prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
         | 
| 123 145 | 
             
                #
         | 
| 124 | 
            -
                #    | 
| 146 | 
            +
                #   prepend_to_file 'config/environments/test.rb' do
         | 
| 125 147 | 
             
                #     'config.gem "rspec"'
         | 
| 126 148 | 
             
                #   end
         | 
| 127 149 | 
             
                #
         | 
| 128 | 
            -
                def  | 
| 150 | 
            +
                def prepend_to_file(path, *args, &block)
         | 
| 129 151 | 
             
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 130 152 | 
             
                  config.merge!(:after => /\A/)
         | 
| 131 | 
            -
                   | 
| 153 | 
            +
                  insert_into_file(path, *(args << config), &block)
         | 
| 132 154 | 
             
                end
         | 
| 155 | 
            +
                alias_method :prepend_file, :prepend_to_file
         | 
| 133 156 |  | 
| 134 | 
            -
                # Append text to a file. Since it depends on  | 
| 157 | 
            +
                # Append text to a file. Since it depends on insert_into_file, it's reversible.
         | 
| 135 158 | 
             
                #
         | 
| 136 159 | 
             
                # ==== Parameters
         | 
| 137 160 | 
             
                # path<String>:: path of the file to be changed
         | 
| @@ -140,20 +163,21 @@ class Thor | |
| 140 163 | 
             
                #
         | 
| 141 164 | 
             
                # ==== Example
         | 
| 142 165 | 
             
                #
         | 
| 143 | 
            -
                #    | 
| 166 | 
            +
                #   append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
         | 
| 144 167 | 
             
                #
         | 
| 145 | 
            -
                #    | 
| 168 | 
            +
                #   append_to_file 'config/environments/test.rb' do
         | 
| 146 169 | 
             
                #     'config.gem "rspec"'
         | 
| 147 170 | 
             
                #   end
         | 
| 148 171 | 
             
                #
         | 
| 149 | 
            -
                def  | 
| 172 | 
            +
                def append_to_file(path, *args, &block)
         | 
| 150 173 | 
             
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 151 174 | 
             
                  config.merge!(:before => /\z/)
         | 
| 152 | 
            -
                   | 
| 175 | 
            +
                  insert_into_file(path, *(args << config), &block)
         | 
| 153 176 | 
             
                end
         | 
| 177 | 
            +
                alias_method :append_file, :append_to_file
         | 
| 154 178 |  | 
| 155 179 | 
             
                # Injects text right after the class definition. Since it depends on
         | 
| 156 | 
            -
                #  | 
| 180 | 
            +
                # insert_into_file, it's reversible.
         | 
| 157 181 | 
             
                #
         | 
| 158 182 | 
             
                # ==== Parameters
         | 
| 159 183 | 
             
                # path<String>:: path of the file to be changed
         | 
| @@ -172,7 +196,7 @@ class Thor | |
| 172 196 | 
             
                def inject_into_class(path, klass, *args, &block)
         | 
| 173 197 | 
             
                  config = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 174 198 | 
             
                  config.merge!(:after => /class #{klass}\n|class #{klass} .*\n/)
         | 
| 175 | 
            -
                   | 
| 199 | 
            +
                  insert_into_file(path, *(args << config), &block)
         | 
| 176 200 | 
             
                end
         | 
| 177 201 |  | 
| 178 202 | 
             
                # Run a regular expression replacement on a file.
         | 
| @@ -10,19 +10,19 @@ class Thor | |
| 10 10 | 
             
                # destination<String>:: Relative path to the destination root
         | 
| 11 11 | 
             
                # data<String>:: Data to add to the file. Can be given as a block.
         | 
| 12 12 | 
             
                # config<Hash>:: give :verbose => false to not log the status and the flag
         | 
| 13 | 
            -
                #                for injection (:after or :before) or :force => true for | 
| 13 | 
            +
                #                for injection (:after or :before) or :force => true for
         | 
| 14 14 | 
             
                #                insert two or more times the same content.
         | 
| 15 | 
            -
                # | 
| 15 | 
            +
                #
         | 
| 16 16 | 
             
                # ==== Examples
         | 
| 17 17 | 
             
                #
         | 
| 18 | 
            -
                #    | 
| 18 | 
            +
                #   insert_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
         | 
| 19 19 | 
             
                #
         | 
| 20 | 
            -
                #    | 
| 20 | 
            +
                #   insert_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
         | 
| 21 21 | 
             
                #     gems = ask "Which gems would you like to add?"
         | 
| 22 22 | 
             
                #     gems.split(" ").map{ |gem| "  config.gem :#{gem}" }.join("\n")
         | 
| 23 23 | 
             
                #   end
         | 
| 24 24 | 
             
                #
         | 
| 25 | 
            -
                def  | 
| 25 | 
            +
                def insert_into_file(destination, *args, &block)
         | 
| 26 26 | 
             
                  if block_given?
         | 
| 27 27 | 
             
                    data, config = block, args.shift
         | 
| 28 28 | 
             
                  else
         | 
| @@ -30,6 +30,7 @@ class Thor | |
| 30 30 | 
             
                  end
         | 
| 31 31 | 
             
                  action InjectIntoFile.new(self, destination, data, config)
         | 
| 32 32 | 
             
                end
         | 
| 33 | 
            +
                alias_method :inject_into_file, :insert_into_file
         | 
| 33 34 |  | 
| 34 35 | 
             
                class InjectIntoFile < EmptyDirectory #:nodoc:
         | 
| 35 36 | 
             
                  attr_reader :replacement, :flag, :behavior
         | 
| @@ -76,12 +77,16 @@ class Thor | |
| 76 77 | 
             
                  protected
         | 
| 77 78 |  | 
| 78 79 | 
             
                    def say_status(behavior)
         | 
| 79 | 
            -
                      status = if  | 
| 80 | 
            -
                         | 
| 81 | 
            -
             | 
| 82 | 
            -
                         | 
| 80 | 
            +
                      status = if behavior == :invoke
         | 
| 81 | 
            +
                        if flag == /\A/
         | 
| 82 | 
            +
                           :prepend
         | 
| 83 | 
            +
                        elsif flag == /\z/
         | 
| 84 | 
            +
                          :append
         | 
| 85 | 
            +
                        else
         | 
| 86 | 
            +
                          :insert
         | 
| 87 | 
            +
                        end
         | 
| 83 88 | 
             
                      else
         | 
| 84 | 
            -
                         | 
| 89 | 
            +
                        :subtract
         | 
| 85 90 | 
             
                      end
         | 
| 86 91 |  | 
| 87 92 | 
             
                      super(status, config[:verbose])
         | 
    
        data/lib/thor/parser/option.rb
    CHANGED
    
    
    
        data/lib/thor/task.rb
    CHANGED
    
    
    
        data/lib/thor/version.rb
    CHANGED
    
    
| @@ -30,36 +30,36 @@ describe Thor::Actions::CreateFile do | |
| 30 30 | 
             
                it "creates a file" do
         | 
| 31 31 | 
             
                  create_file("doc/config.rb")
         | 
| 32 32 | 
             
                  invoke!
         | 
| 33 | 
            -
                  File.exists?(File.join(destination_root, "doc/config.rb")). | 
| 33 | 
            +
                  File.exists?(File.join(destination_root, "doc/config.rb")).should be_true
         | 
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| 36 36 | 
             
                it "does not create a file if pretending" do
         | 
| 37 37 | 
             
                  create_file("doc/config.rb", {}, :pretend => true)
         | 
| 38 38 | 
             
                  invoke!
         | 
| 39 | 
            -
                  File.exists?(File.join(destination_root, "doc/config.rb")). | 
| 39 | 
            +
                  File.exists?(File.join(destination_root, "doc/config.rb")).should be_false
         | 
| 40 40 | 
             
                end
         | 
| 41 41 |  | 
| 42 42 | 
             
                it "shows created status to the user" do
         | 
| 43 43 | 
             
                  create_file("doc/config.rb")
         | 
| 44 | 
            -
                  invoke!. | 
| 44 | 
            +
                  invoke!.should == "      create  doc/config.rb\n"
         | 
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 47 | 
             
                it "does not show any information if log status is false" do
         | 
| 48 48 | 
             
                  silence!
         | 
| 49 49 | 
             
                  create_file("doc/config.rb")
         | 
| 50 | 
            -
                  invoke!. | 
| 50 | 
            +
                  invoke!.should be_empty
         | 
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 53 | 
             
                it "returns the given destination" do
         | 
| 54 54 | 
             
                  capture(:stdout) do
         | 
| 55 | 
            -
                    create_file("doc/config.rb").invoke!. | 
| 55 | 
            +
                    create_file("doc/config.rb").invoke!.should == "doc/config.rb"
         | 
| 56 56 | 
             
                  end
         | 
| 57 57 | 
             
                end
         | 
| 58 58 |  | 
| 59 59 | 
             
                it "converts encoded instructions" do
         | 
| 60 60 | 
             
                  create_file("doc/%file_name%.rb.tt")
         | 
| 61 61 | 
             
                  invoke!
         | 
| 62 | 
            -
                  File.exists?(File.join(destination_root, "doc/rdoc.rb.tt")). | 
| 62 | 
            +
                  File.exists?(File.join(destination_root, "doc/rdoc.rb.tt")).should be_true
         | 
| 63 63 | 
             
                end
         | 
| 64 64 |  | 
| 65 65 | 
             
                describe "when file exists" do
         | 
| @@ -72,7 +72,7 @@ describe Thor::Actions::CreateFile do | |
| 72 72 | 
             
                    it "shows identical status" do
         | 
| 73 73 | 
             
                      create_file("doc/config.rb")
         | 
| 74 74 | 
             
                      invoke!
         | 
| 75 | 
            -
                      invoke!. | 
| 75 | 
            +
                      invoke!.should == "   identical  doc/config.rb\n"
         | 
| 76 76 | 
             
                    end
         | 
| 77 77 | 
             
                  end
         | 
| 78 78 |  | 
| @@ -82,46 +82,46 @@ describe Thor::Actions::CreateFile do | |
| 82 82 | 
             
                    end
         | 
| 83 83 |  | 
| 84 84 | 
             
                    it "shows forced status to the user if force is given" do
         | 
| 85 | 
            -
                      create_file("doc/config.rb", {}, :force => true). | 
| 86 | 
            -
                      invoke!. | 
| 85 | 
            +
                      create_file("doc/config.rb", {}, :force => true).should_not be_identical
         | 
| 86 | 
            +
                      invoke!.should == "       force  doc/config.rb\n"
         | 
| 87 87 | 
             
                    end
         | 
| 88 88 |  | 
| 89 89 | 
             
                    it "shows skipped status to the user if skip is given" do
         | 
| 90 | 
            -
                      create_file("doc/config.rb", {}, :skip => true). | 
| 91 | 
            -
                      invoke!. | 
| 90 | 
            +
                      create_file("doc/config.rb", {}, :skip => true).should_not be_identical
         | 
| 91 | 
            +
                      invoke!.should == "        skip  doc/config.rb\n"
         | 
| 92 92 | 
             
                    end
         | 
| 93 93 |  | 
| 94 94 | 
             
                    it "shows forced status to the user if force is configured" do
         | 
| 95 | 
            -
                      create_file("doc/config.rb", :force => true). | 
| 96 | 
            -
                      invoke!. | 
| 95 | 
            +
                      create_file("doc/config.rb", :force => true).should_not be_identical
         | 
| 96 | 
            +
                      invoke!.should == "       force  doc/config.rb\n"
         | 
| 97 97 | 
             
                    end
         | 
| 98 98 |  | 
| 99 99 | 
             
                    it "shows skipped status to the user if skip is configured" do
         | 
| 100 | 
            -
                      create_file("doc/config.rb", :skip => true). | 
| 101 | 
            -
                      invoke!. | 
| 100 | 
            +
                      create_file("doc/config.rb", :skip => true).should_not be_identical
         | 
| 101 | 
            +
                      invoke!.should == "        skip  doc/config.rb\n"
         | 
| 102 102 | 
             
                    end
         | 
| 103 103 |  | 
| 104 104 | 
             
                    it "shows conflict status to ther user" do
         | 
| 105 | 
            -
                      create_file("doc/config.rb"). | 
| 105 | 
            +
                      create_file("doc/config.rb").should_not be_identical
         | 
| 106 106 | 
             
                      $stdin.should_receive(:gets).and_return('s')
         | 
| 107 107 | 
             
                      file = File.join(destination_root, 'doc/config.rb')
         | 
| 108 108 |  | 
| 109 109 | 
             
                      content = invoke!
         | 
| 110 | 
            -
                      content. | 
| 111 | 
            -
                      content. | 
| 112 | 
            -
                      content. | 
| 110 | 
            +
                      content.should =~ /conflict  doc\/config\.rb/
         | 
| 111 | 
            +
                      content.should =~ /Overwrite #{file}\? \(enter "h" for help\) \[Ynaqdh\]/
         | 
| 112 | 
            +
                      content.should =~ /skip  doc\/config\.rb/
         | 
| 113 113 | 
             
                    end
         | 
| 114 114 |  | 
| 115 115 | 
             
                    it "creates the file if the file collision menu returns true" do
         | 
| 116 116 | 
             
                      create_file("doc/config.rb")
         | 
| 117 117 | 
             
                      $stdin.should_receive(:gets).and_return('y')
         | 
| 118 | 
            -
                      invoke!. | 
| 118 | 
            +
                      invoke!.should =~ /force  doc\/config\.rb/
         | 
| 119 119 | 
             
                    end
         | 
| 120 120 |  | 
| 121 121 | 
             
                    it "skips the file if the file collision menu returns false" do
         | 
| 122 122 | 
             
                      create_file("doc/config.rb")
         | 
| 123 123 | 
             
                      $stdin.should_receive(:gets).and_return('n')
         | 
| 124 | 
            -
                      invoke!. | 
| 124 | 
            +
                      invoke!.should =~ /skip  doc\/config\.rb/
         | 
| 125 125 | 
             
                    end
         | 
| 126 126 |  | 
| 127 127 | 
             
                    it "executes the block given to show file content" do
         | 
| @@ -140,31 +140,31 @@ describe Thor::Actions::CreateFile do | |
| 140 140 | 
             
                  create_file("doc/config.rb")
         | 
| 141 141 | 
             
                  invoke!
         | 
| 142 142 | 
             
                  revoke!
         | 
| 143 | 
            -
                  File.exists?(@action.destination). | 
| 143 | 
            +
                  File.exists?(@action.destination).should be_false
         | 
| 144 144 | 
             
                end
         | 
| 145 145 |  | 
| 146 146 | 
             
                it "does not raise an error if the file does not exist" do
         | 
| 147 147 | 
             
                  create_file("doc/config.rb")
         | 
| 148 148 | 
             
                  revoke!
         | 
| 149 | 
            -
                  File.exists?(@action.destination). | 
| 149 | 
            +
                  File.exists?(@action.destination).should be_false
         | 
| 150 150 | 
             
                end
         | 
| 151 151 | 
             
              end
         | 
| 152 152 |  | 
| 153 153 | 
             
              describe "#exists?" do
         | 
| 154 154 | 
             
                it "returns true if the destination file exists" do
         | 
| 155 155 | 
             
                  create_file("doc/config.rb")
         | 
| 156 | 
            -
                  @action.exists?. | 
| 156 | 
            +
                  @action.exists?.should be_false
         | 
| 157 157 | 
             
                  invoke!
         | 
| 158 | 
            -
                  @action.exists?. | 
| 158 | 
            +
                  @action.exists?.should be_true
         | 
| 159 159 | 
             
                end
         | 
| 160 160 | 
             
              end
         | 
| 161 161 |  | 
| 162 162 | 
             
              describe "#identical?" do
         | 
| 163 163 | 
             
                it "returns true if the destination file and is identical" do
         | 
| 164 164 | 
             
                  create_file("doc/config.rb")
         | 
| 165 | 
            -
                  @action.identical?. | 
| 165 | 
            +
                  @action.identical?.should be_false
         | 
| 166 166 | 
             
                  invoke!
         | 
| 167 | 
            -
                  @action.identical?. | 
| 167 | 
            +
                  @action.identical?.should be_true
         | 
| 168 168 | 
             
                end
         | 
| 169 169 | 
             
              end
         | 
| 170 170 | 
             
            end
         |