groovenauts-thor 0.19.1 → 0.19.1.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -24
- data/groovenauts-thor.gemspec +1 -1
- data/lib/thor/base.rb +1 -1
- data/lib/thor/core_ext/ordered_hash.rb +63 -94
- data/lib/thor/parser/arguments.rb +1 -1
- data/lib/thor/parser/option.rb +0 -15
- data/lib/thor/version.rb +1 -1
- data/spec/actions/create_file_spec.rb +168 -0
- data/spec/actions/create_link_spec.rb +96 -0
- data/spec/actions/directory_spec.rb +169 -0
- data/spec/actions/empty_directory_spec.rb +129 -0
- data/spec/actions/file_manipulation_spec.rb +392 -0
- data/spec/actions/inject_into_file_spec.rb +135 -0
- data/spec/actions_spec.rb +331 -0
- data/spec/base_spec.rb +298 -0
- data/spec/command_spec.rb +79 -0
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +48 -0
- data/spec/core_ext/ordered_hash_spec.rb +115 -0
- data/spec/exit_condition_spec.rb +19 -0
- data/spec/fixtures/application.rb +2 -0
- data/spec/fixtures/app{1}/README +3 -0
- data/spec/fixtures/bundle/execute.rb +6 -0
- data/spec/fixtures/bundle/main.thor +1 -0
- data/spec/fixtures/command.thor +10 -0
- data/spec/fixtures/doc/%file_name%.rb.tt +1 -0
- data/spec/fixtures/doc/COMMENTER +11 -0
- data/spec/fixtures/doc/README +3 -0
- data/spec/fixtures/doc/block_helper.rb +3 -0
- data/spec/fixtures/doc/config.rb +1 -0
- data/spec/fixtures/doc/config.yaml.tt +1 -0
- data/spec/fixtures/doc/excluding/%file_name%.rb.tt +1 -0
- data/spec/fixtures/enum.thor +10 -0
- data/spec/fixtures/group.thor +128 -0
- data/spec/fixtures/invoke.thor +131 -0
- data/spec/fixtures/path with spaces b/data/spec/fixtures/path with → spaces +0 -0
- data/spec/fixtures/preserve/script.sh +3 -0
- data/spec/fixtures/script.thor +220 -0
- data/spec/fixtures/subcommand.thor +17 -0
- data/spec/group_spec.rb +222 -0
- data/spec/helper.rb +80 -0
- data/spec/invocation_spec.rb +120 -0
- data/spec/line_editor/basic_spec.rb +28 -0
- data/spec/line_editor/readline_spec.rb +69 -0
- data/spec/line_editor_spec.rb +43 -0
- data/spec/parser/argument_spec.rb +53 -0
- data/spec/parser/arguments_spec.rb +66 -0
- data/spec/parser/option_spec.rb +210 -0
- data/spec/parser/options_spec.rb +414 -0
- data/spec/quality_spec.rb +75 -0
- data/spec/rake_compat_spec.rb +72 -0
- data/spec/register_spec.rb +227 -0
- data/spec/runner_spec.rb +246 -0
- data/spec/sandbox/application.rb +2 -0
- data/spec/sandbox/app{1}/README +3 -0
- data/spec/sandbox/bundle/execute.rb +6 -0
- data/spec/sandbox/bundle/main.thor +1 -0
- data/spec/sandbox/command.thor +10 -0
- data/spec/sandbox/doc/%file_name%.rb.tt +1 -0
- data/spec/sandbox/doc/COMMENTER +11 -0
- data/spec/sandbox/doc/README +3 -0
- data/spec/sandbox/doc/block_helper.rb +3 -0
- data/spec/sandbox/doc/config.rb +1 -0
- data/spec/sandbox/doc/config.yaml.tt +1 -0
- data/spec/sandbox/doc/excluding/%file_name%.rb.tt +1 -0
- data/spec/sandbox/enum.thor +10 -0
- data/spec/sandbox/group.thor +128 -0
- data/spec/sandbox/invoke.thor +131 -0
- data/spec/sandbox/path with spaces b/data/spec/sandbox/path with → spaces +0 -0
- data/spec/sandbox/preserve/script.sh +3 -0
- data/spec/sandbox/script.thor +220 -0
- data/spec/sandbox/subcommand.thor +17 -0
- data/spec/shell/basic_spec.rb +337 -0
- data/spec/shell/color_spec.rb +119 -0
- data/spec/shell/html_spec.rb +31 -0
- data/spec/shell_spec.rb +47 -0
- data/spec/subcommand_spec.rb +71 -0
- data/spec/thor_spec.rb +505 -0
- data/spec/util_spec.rb +196 -0
- metadata +146 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 951deb43fb72171180a7b1c8252e4d828e53739d
         | 
| 4 | 
            +
              data.tar.gz: d241708a49b81fc3ce9e6e9c5507b21945c5144e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 56285e5f1f3d967d1af3d1044a7aa2f08c6e918416dfd97fab455e3c94d71a7ab8280bea36dec1a3391719f7aeee3ac568303b5fdeb830e08053f56652a02438
         | 
| 7 | 
            +
              data.tar.gz: c0a5863d78e69670fe0612ade541c3cf2b68dae3e2a88acca5c29bb1d0f642a667d09e24506cf9eb7d4d1843b07579a39338860eed6fa2ea529480a9a84a5a7c
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,27 +1,3 @@ | |
| 1 | 
            -
            ## 0.19.1, release 2014-03-24
         | 
| 2 | 
            -
            * Fix `say` non-String break regression
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            ## 0.19.0, release 2014-03-22
         | 
| 5 | 
            -
            * Add support for a default to #ask
         | 
| 6 | 
            -
            * Avoid @namespace not initialized warning
         | 
| 7 | 
            -
            * Avoid private attribute? warning
         | 
| 8 | 
            -
            * Fix initializing with unknown options
         | 
| 9 | 
            -
            * Loosen required_rubygems_version for compatibility with Ubuntu 10.04
         | 
| 10 | 
            -
            * Shell#ask: support a noecho option for stdin
         | 
| 11 | 
            -
            * Shell#ask: change API to be :echo => false
         | 
| 12 | 
            -
            * Display a message without a stack trace for ambiguous commands
         | 
| 13 | 
            -
            * Make say and say_status thread safe
         | 
| 14 | 
            -
            * Dependency for console io version check
         | 
| 15 | 
            -
            * Alias --help to help on subcommands
         | 
| 16 | 
            -
            * Use mime-types 1.x for Ruby 1.8.7 compatibility for Ruby 1.8 only
         | 
| 17 | 
            -
            * Accept .tt files as templates
         | 
| 18 | 
            -
            * Check if numeric value is in enum
         | 
| 19 | 
            -
            * Use Readline for user input
         | 
| 20 | 
            -
            * Fix dispatching of subcommands (concerning :help and *args)
         | 
| 21 | 
            -
            * Fix warnings when running specs with `$VERBOSE = true`
         | 
| 22 | 
            -
            * Make subcommand help more consistent
         | 
| 23 | 
            -
            * Make the current command chain accessible in command
         | 
| 24 | 
            -
             | 
| 25 1 | 
             
            ## 0.18.1, release 2013-03-30
         | 
| 26 2 | 
             
            * Revert regressions found in 0.18.0
         | 
| 27 3 |  | 
    
        data/groovenauts-thor.gemspec
    CHANGED
    
    | @@ -10,7 +10,6 @@ Gem::Specification.new do |spec| | |
| 10 10 | 
             
              spec.description = "Thor is a toolkit for building powerful command-line interfaces."
         | 
| 11 11 | 
             
              # spec.email = "ruby-thor@googlegroups.com"
         | 
| 12 12 | 
             
              spec.email = "t-akima@groovenauts.jp"
         | 
| 13 | 
            -
              # spec.executables = %w[thor]
         | 
| 14 13 | 
             
              spec.executables = %w[groovenauts-thor]
         | 
| 15 14 | 
             
              spec.files = %w[.document groovenauts-thor.gemspec] + Dir['*.md', 'bin/*', 'lib/**/*.rb']
         | 
| 16 15 | 
             
              # spec.homepage = "http://whatisthor.com/"
         | 
| @@ -20,5 +19,6 @@ Gem::Specification.new do |spec| | |
| 20 19 | 
             
              spec.require_paths = %w[lib]
         | 
| 21 20 | 
             
              spec.required_rubygems_version = ">= 1.3.5"
         | 
| 22 21 | 
             
              spec.summary = spec.description
         | 
| 22 | 
            +
              spec.test_files = Dir.glob("spec/**/*")
         | 
| 23 23 | 
             
              spec.version = Thor::VERSION
         | 
| 24 24 | 
             
            end
         | 
    
        data/lib/thor/base.rb
    CHANGED
    
    
| @@ -1,127 +1,96 @@ | |
| 1 1 | 
             
            class Thor
         | 
| 2 | 
            -
              module CoreExt
         | 
| 3 | 
            -
                 | 
| 4 | 
            -
                   | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 2 | 
            +
              module CoreExt #:nodoc:
         | 
| 3 | 
            +
                if RUBY_VERSION >= "1.9"
         | 
| 4 | 
            +
                  class OrderedHash < ::Hash
         | 
| 5 | 
            +
                  end
         | 
| 6 | 
            +
                else
         | 
| 7 | 
            +
                  # This class is based on the Ruby 1.9 ordered hashes.
         | 
| 8 | 
            +
                  #
         | 
| 9 | 
            +
                  # It keeps the semantics and most of the efficiency of normal hashes
         | 
| 10 | 
            +
                  # while also keeping track of the order in which elements were set.
         | 
| 11 | 
            +
                  #
         | 
| 12 | 
            +
                  class OrderedHash #:nodoc:
         | 
| 13 | 
            +
                    include Enumerable
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    Node = Struct.new(:key, :value, :next, :prev)
         | 
| 9 16 |  | 
| 10 | 
            -
                    def  | 
| 11 | 
            -
                       | 
| 12 | 
            -
                      # make a deep copy of keys
         | 
| 13 | 
            -
                      @keys = other.keys
         | 
| 17 | 
            +
                    def initialize
         | 
| 18 | 
            +
                      @hash = {}
         | 
| 14 19 | 
             
                    end
         | 
| 15 20 |  | 
| 16 | 
            -
                    def [] | 
| 17 | 
            -
                      @ | 
| 18 | 
            -
                      super
         | 
| 21 | 
            +
                    def [](key)
         | 
| 22 | 
            +
                      @hash[key] && @hash[key].value
         | 
| 19 23 | 
             
                    end
         | 
| 20 24 |  | 
| 21 | 
            -
                    def  | 
| 22 | 
            -
                      if key | 
| 23 | 
            -
                         | 
| 24 | 
            -
             | 
| 25 | 
            +
                    def []=(key, value)
         | 
| 26 | 
            +
                      if node = @hash[key] # rubocop:disable AssignmentInCondition
         | 
| 27 | 
            +
                        node.value = value
         | 
| 28 | 
            +
                      else
         | 
| 29 | 
            +
                        node = Node.new(key, value)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                        if !defined?(@first) || @first.nil?
         | 
| 32 | 
            +
                          @first = @last = node
         | 
| 33 | 
            +
                        else
         | 
| 34 | 
            +
                          node.prev = @last
         | 
| 35 | 
            +
                          @last.next = node
         | 
| 36 | 
            +
                          @last = node
         | 
| 37 | 
            +
                        end
         | 
| 25 38 | 
             
                      end
         | 
| 26 | 
            -
                      super
         | 
| 27 | 
            -
                    end
         | 
| 28 39 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
                       | 
| 31 | 
            -
                      sync_keys!
         | 
| 32 | 
            -
                      self
         | 
| 40 | 
            +
                      @hash[key] = node
         | 
| 41 | 
            +
                      value
         | 
| 33 42 | 
             
                    end
         | 
| 34 43 |  | 
| 35 | 
            -
                     | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
                    end
         | 
| 44 | 
            +
                    def delete(key)
         | 
| 45 | 
            +
                      if node = @hash[key] # rubocop:disable AssignmentInCondition
         | 
| 46 | 
            +
                        prev_node = node.prev
         | 
| 47 | 
            +
                        next_node = node.next
         | 
| 40 48 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                    end
         | 
| 49 | 
            +
                        next_node.prev = prev_node if next_node
         | 
| 50 | 
            +
                        prev_node.next = next_node if prev_node
         | 
| 44 51 |  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
                    end
         | 
| 52 | 
            +
                        @first = next_node if @first == node
         | 
| 53 | 
            +
                        @last = prev_node  if @last  == node
         | 
| 48 54 |  | 
| 49 | 
            -
             | 
| 50 | 
            -
                       | 
| 51 | 
            -
                    end
         | 
| 55 | 
            +
                        value = node.value
         | 
| 56 | 
            +
                      end
         | 
| 52 57 |  | 
| 53 | 
            -
             | 
| 54 | 
            -
                       | 
| 58 | 
            +
                      @hash.delete(key)
         | 
| 59 | 
            +
                      value
         | 
| 55 60 | 
             
                    end
         | 
| 56 61 |  | 
| 57 | 
            -
                    def  | 
| 58 | 
            -
                       | 
| 59 | 
            -
                      @keys.each { |key| yield(key) }
         | 
| 60 | 
            -
                      self
         | 
| 62 | 
            +
                    def keys
         | 
| 63 | 
            +
                      map { |k, v| k }
         | 
| 61 64 | 
             
                    end
         | 
| 62 65 |  | 
| 63 | 
            -
                    def  | 
| 64 | 
            -
                       | 
| 65 | 
            -
                      @keys.each { |key| yield(self[key]) }
         | 
| 66 | 
            -
                      self
         | 
| 66 | 
            +
                    def values
         | 
| 67 | 
            +
                      map { |k, v| v }
         | 
| 67 68 | 
             
                    end
         | 
| 68 69 |  | 
| 69 70 | 
             
                    def each
         | 
| 70 | 
            -
                      return  | 
| 71 | 
            -
                      @ | 
| 72 | 
            -
                       | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
                    def each_pair
         | 
| 76 | 
            -
                      return to_enum(:each_pair) unless block_given?
         | 
| 77 | 
            -
                      @keys.each { |key| yield(key, self[key]) }
         | 
| 71 | 
            +
                      return unless defined?(@first) && @first
         | 
| 72 | 
            +
                      yield [@first.key, @first.value]
         | 
| 73 | 
            +
                      node = @first
         | 
| 74 | 
            +
                      yield [node.key, node.value] while node = node.next # rubocop:disable AssignmentInCondition
         | 
| 78 75 | 
             
                      self
         | 
| 79 76 | 
             
                    end
         | 
| 80 77 |  | 
| 81 | 
            -
                     | 
| 82 | 
            -
             | 
| 83 | 
            -
                    def clear
         | 
| 84 | 
            -
                      super
         | 
| 85 | 
            -
                      @keys.clear
         | 
| 86 | 
            -
                      self
         | 
| 87 | 
            -
                    end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                    def shift
         | 
| 90 | 
            -
                      k = @keys.first
         | 
| 91 | 
            -
                      v = delete(k)
         | 
| 92 | 
            -
                      [k, v]
         | 
| 93 | 
            -
                    end
         | 
| 78 | 
            +
                    def merge(other)
         | 
| 79 | 
            +
                      hash = self.class.new
         | 
| 94 80 |  | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
                        other_hash.each { |k, v| self[k] = key?(k) ? yield(k, self[k], v) : v }
         | 
| 98 | 
            -
                      else
         | 
| 99 | 
            -
                        other_hash.each { |k, v| self[k] = v }
         | 
| 81 | 
            +
                      each do |key, value|
         | 
| 82 | 
            +
                        hash[key] = value
         | 
| 100 83 | 
             
                      end
         | 
| 101 | 
            -
                      self
         | 
| 102 | 
            -
                    end
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                    alias_method :update, :merge!
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                    def merge(other_hash, &block)
         | 
| 107 | 
            -
                      dup.merge!(other_hash, &block)
         | 
| 108 | 
            -
                    end
         | 
| 109 84 |  | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
                       | 
| 113 | 
            -
                      @keys = other.keys
         | 
| 114 | 
            -
                      self
         | 
| 115 | 
            -
                    end
         | 
| 85 | 
            +
                      other.each do |key, value|
         | 
| 86 | 
            +
                        hash[key] = value
         | 
| 87 | 
            +
                      end
         | 
| 116 88 |  | 
| 117 | 
            -
             | 
| 118 | 
            -
                      "#<#{self.class} #{super}>"
         | 
| 89 | 
            +
                      hash
         | 
| 119 90 | 
             
                    end
         | 
| 120 91 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
                    def sync_keys!
         | 
| 124 | 
            -
                      @keys.delete_if { |k| !key?(k) }
         | 
| 92 | 
            +
                    def empty?
         | 
| 93 | 
            +
                      @hash.empty?
         | 
| 125 94 | 
             
                    end
         | 
| 126 95 | 
             
                  end
         | 
| 127 96 | 
             
                end
         | 
    
        data/lib/thor/parser/option.rb
    CHANGED
    
    | @@ -108,21 +108,6 @@ class Thor | |
| 108 108 |  | 
| 109 109 | 
             
                def validate!
         | 
| 110 110 | 
             
                  fail ArgumentError, "An option cannot be boolean and required." if boolean? && required?
         | 
| 111 | 
            -
                  validate_default_type!
         | 
| 112 | 
            -
                end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                def validate_default_type!
         | 
| 115 | 
            -
                  default_type = case @default
         | 
| 116 | 
            -
                                 when nil
         | 
| 117 | 
            -
                                   return
         | 
| 118 | 
            -
                                 when TrueClass, FalseClass
         | 
| 119 | 
            -
                                   :boolean
         | 
| 120 | 
            -
                                 when Numeric
         | 
| 121 | 
            -
                                   :numeric
         | 
| 122 | 
            -
                                 when Hash, Array, String
         | 
| 123 | 
            -
                                   @default.class.name.downcase.to_sym
         | 
| 124 | 
            -
                                 end
         | 
| 125 | 
            -
                  fail ArgumentError, "An option's default must match its type." unless default_type == @type
         | 
| 126 111 | 
             
                end
         | 
| 127 112 |  | 
| 128 113 | 
             
                def dasherized?
         | 
    
        data/lib/thor/version.rb
    CHANGED
    
    
| @@ -0,0 +1,168 @@ | |
| 1 | 
            +
            require "helper"
         | 
| 2 | 
            +
            require "thor/actions"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Thor::Actions::CreateFile do
         | 
| 5 | 
            +
              before do
         | 
| 6 | 
            +
                @silence = false
         | 
| 7 | 
            +
                ::FileUtils.rm_rf(destination_root)
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def create_file(destination = nil, config = {}, options = {})
         | 
| 11 | 
            +
                @base = MyCounter.new([1, 2], options, :destination_root => destination_root)
         | 
| 12 | 
            +
                allow(@base).to receive(:file_name).and_return("rdoc")
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                @action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION", {:verbose => !@silence}.merge(config))
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def invoke!
         | 
| 18 | 
            +
                capture(:stdout) { @action.invoke! }
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def revoke!
         | 
| 22 | 
            +
                capture(:stdout) { @action.revoke! }
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def silence!
         | 
| 26 | 
            +
                @silence = true
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              describe "#invoke!" do
         | 
| 30 | 
            +
                it "creates a file" do
         | 
| 31 | 
            +
                  create_file("doc/config.rb")
         | 
| 32 | 
            +
                  invoke!
         | 
| 33 | 
            +
                  expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be true
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                it "does not create a file if pretending" do
         | 
| 37 | 
            +
                  create_file("doc/config.rb", {}, :pretend => true)
         | 
| 38 | 
            +
                  invoke!
         | 
| 39 | 
            +
                  expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be false
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                it "shows created status to the user" do
         | 
| 43 | 
            +
                  create_file("doc/config.rb")
         | 
| 44 | 
            +
                  expect(invoke!).to eq("      create  doc/config.rb\n")
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it "does not show any information if log status is false" do
         | 
| 48 | 
            +
                  silence!
         | 
| 49 | 
            +
                  create_file("doc/config.rb")
         | 
| 50 | 
            +
                  expect(invoke!).to be_empty
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                it "returns the given destination" do
         | 
| 54 | 
            +
                  capture(:stdout) do
         | 
| 55 | 
            +
                    expect(create_file("doc/config.rb").invoke!).to eq("doc/config.rb")
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                it "converts encoded instructions" do
         | 
| 60 | 
            +
                  create_file("doc/%file_name%.rb.tt")
         | 
| 61 | 
            +
                  invoke!
         | 
| 62 | 
            +
                  expect(File.exist?(File.join(destination_root, "doc/rdoc.rb.tt"))).to be true
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                describe "when file exists" do
         | 
| 66 | 
            +
                  before do
         | 
| 67 | 
            +
                    create_file("doc/config.rb")
         | 
| 68 | 
            +
                    invoke!
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  describe "and is identical" do
         | 
| 72 | 
            +
                    it "shows identical status" do
         | 
| 73 | 
            +
                      create_file("doc/config.rb")
         | 
| 74 | 
            +
                      invoke!
         | 
| 75 | 
            +
                      expect(invoke!).to eq("   identical  doc/config.rb\n")
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  describe "and is not identical" do
         | 
| 80 | 
            +
                    before do
         | 
| 81 | 
            +
                      File.open(File.join(destination_root, "doc/config.rb"), "w") { |f| f.write("FOO = 3") }
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    it "shows forced status to the user if force is given" do
         | 
| 85 | 
            +
                      expect(create_file("doc/config.rb", {}, :force => true)).not_to be_identical
         | 
| 86 | 
            +
                      expect(invoke!).to eq("       force  doc/config.rb\n")
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    it "shows skipped status to the user if skip is given" do
         | 
| 90 | 
            +
                      expect(create_file("doc/config.rb", {}, :skip => true)).not_to be_identical
         | 
| 91 | 
            +
                      expect(invoke!).to eq("        skip  doc/config.rb\n")
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    it "shows forced status to the user if force is configured" do
         | 
| 95 | 
            +
                      expect(create_file("doc/config.rb", :force => true)).not_to be_identical
         | 
| 96 | 
            +
                      expect(invoke!).to eq("       force  doc/config.rb\n")
         | 
| 97 | 
            +
                    end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    it "shows skipped status to the user if skip is configured" do
         | 
| 100 | 
            +
                      expect(create_file("doc/config.rb", :skip => true)).not_to be_identical
         | 
| 101 | 
            +
                      expect(invoke!).to eq("        skip  doc/config.rb\n")
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                    it "shows conflict status to the user" do
         | 
| 105 | 
            +
                      file = File.join(destination_root, "doc/config.rb")
         | 
| 106 | 
            +
                      expect(create_file("doc/config.rb")).not_to be_identical
         | 
| 107 | 
            +
                      expect(Thor::LineEditor).to receive(:readline).with("Overwrite #{file}? (enter \"h\" for help) [Ynaqdh] ", anything).and_return("s")
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                      content = invoke!
         | 
| 110 | 
            +
                      expect(content).to match(/conflict  doc\/config\.rb/)
         | 
| 111 | 
            +
                      expect(content).to match(/skip  doc\/config\.rb/)
         | 
| 112 | 
            +
                    end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                    it "creates the file if the file collision menu returns true" do
         | 
| 115 | 
            +
                      create_file("doc/config.rb")
         | 
| 116 | 
            +
                      expect(Thor::LineEditor).to receive(:readline).and_return("y")
         | 
| 117 | 
            +
                      expect(invoke!).to match(/force  doc\/config\.rb/)
         | 
| 118 | 
            +
                    end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    it "skips the file if the file collision menu returns false" do
         | 
| 121 | 
            +
                      create_file("doc/config.rb")
         | 
| 122 | 
            +
                      expect(Thor::LineEditor).to receive(:readline).and_return("n")
         | 
| 123 | 
            +
                      expect(invoke!).to match(/skip  doc\/config\.rb/)
         | 
| 124 | 
            +
                    end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                    it "executes the block given to show file content" do
         | 
| 127 | 
            +
                      create_file("doc/config.rb")
         | 
| 128 | 
            +
                      expect(Thor::LineEditor).to receive(:readline).and_return("d", "n")
         | 
| 129 | 
            +
                      expect(@base.shell).to receive(:system).with(/diff -u/)
         | 
| 130 | 
            +
                      invoke!
         | 
| 131 | 
            +
                    end
         | 
| 132 | 
            +
                  end
         | 
| 133 | 
            +
                end
         | 
| 134 | 
            +
              end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
              describe "#revoke!" do
         | 
| 137 | 
            +
                it "removes the destination file" do
         | 
| 138 | 
            +
                  create_file("doc/config.rb")
         | 
| 139 | 
            +
                  invoke!
         | 
| 140 | 
            +
                  revoke!
         | 
| 141 | 
            +
                  expect(File.exist?(@action.destination)).to be false
         | 
| 142 | 
            +
                end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                it "does not raise an error if the file does not exist" do
         | 
| 145 | 
            +
                  create_file("doc/config.rb")
         | 
| 146 | 
            +
                  revoke!
         | 
| 147 | 
            +
                  expect(File.exist?(@action.destination)).to be false
         | 
| 148 | 
            +
                end
         | 
| 149 | 
            +
              end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
              describe "#exists?" do
         | 
| 152 | 
            +
                it "returns true if the destination file exists" do
         | 
| 153 | 
            +
                  create_file("doc/config.rb")
         | 
| 154 | 
            +
                  expect(@action.exists?).to be false
         | 
| 155 | 
            +
                  invoke!
         | 
| 156 | 
            +
                  expect(@action.exists?).to be true
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
              end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
              describe "#identical?" do
         | 
| 161 | 
            +
                it "returns true if the destination file exists and is identical" do
         | 
| 162 | 
            +
                  create_file("doc/config.rb")
         | 
| 163 | 
            +
                  expect(@action.identical?).to be false
         | 
| 164 | 
            +
                  invoke!
         | 
| 165 | 
            +
                  expect(@action.identical?).to be true
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
              end
         | 
| 168 | 
            +
            end
         |