pretty_diff 2.0.1 → 2.1.0
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/Gemfile +1 -6
- data/Gemfile.lock +11 -2
- data/VERSION +1 -1
- data/lib/pretty_diff.rb +2 -1
- data/lib/pretty_diff/chunk.rb +5 -1
- data/lib/pretty_diff/diff.rb +2 -2
- data/lib/pretty_diff/line.rb +0 -1
- data/lib/pretty_diff/word_diff_finder.rb +130 -0
- data/pretty_diff.gemspec +16 -6
- data/test/basic_generator_test.rb +5 -5
- data/test/diff_test.rb +1 -1
- data/test/fixtures/inline_change.diff +29 -0
- data/test/fixtures/mid_sized_change.diff +109 -0
- data/test/fixtures/quick_change.diff +3 -0
- data/test/fixtures/space_change.diff +9 -0
- data/test/fixtures/special_characters.diff +25 -0
- data/test/helper.rb +18 -1
- data/test/line_test.rb +4 -4
- data/test/word_diff_finder_test.rb +79 -0
- metadata +28 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: aa8fdb38ef57b9d401bd02d8755fd35c12f1b328
         | 
| 4 | 
            +
              data.tar.gz: 7813678ca54211816a9a7c484b837b718548623a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e103bae389f4f3433db7ced131e764490ce97f9c9c2f19ecf377e92baf37164016c847f037d12cf7f52ba272803163a25a98e8ef5e5affd26e03299c1540fd86
         | 
| 7 | 
            +
              data.tar.gz: 9b3af1e0b269f1c5f259b2962e8ff9d2e71c1fb17fa2806d1de45ba61623466d74d137096a753c45b9ca788a2f333138f4fcf9b0bc6892b1ad05a95dc865e69c
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,9 +1,15 @@ | |
| 1 | 
            +
            PATH
         | 
| 2 | 
            +
              remote: .
         | 
| 3 | 
            +
              specs:
         | 
| 4 | 
            +
                pretty_diff (2.1.0)
         | 
| 5 | 
            +
                  pretty_diff
         | 
| 6 | 
            +
             | 
| 1 7 | 
             
            GEM
         | 
| 2 8 | 
             
              remote: http://rubygems.org/
         | 
| 3 9 | 
             
              specs:
         | 
| 4 10 | 
             
                addressable (2.3.5)
         | 
| 11 | 
            +
                ansi (1.4.3)
         | 
| 5 12 | 
             
                builder (3.1.4)
         | 
| 6 | 
            -
                charlock_holmes (0.6.9.1)
         | 
| 7 13 | 
             
                descendants_tracker (0.0.3)
         | 
| 8 14 | 
             
                faraday (0.9.0)
         | 
| 9 15 | 
             
                  multipart-post (>= 1.2, < 3)
         | 
| @@ -46,11 +52,14 @@ GEM | |
| 46 52 | 
             
                rake (10.1.1)
         | 
| 47 53 | 
             
                rdoc (4.1.1)
         | 
| 48 54 | 
             
                  json (~> 1.4)
         | 
| 55 | 
            +
                turn (0.9.6)
         | 
| 56 | 
            +
                  ansi
         | 
| 49 57 |  | 
| 50 58 | 
             
            PLATFORMS
         | 
| 51 59 | 
             
              ruby
         | 
| 52 60 |  | 
| 53 61 | 
             
            DEPENDENCIES
         | 
| 54 62 | 
             
              builder
         | 
| 55 | 
            -
              charlock_holmes (~> 0.6)
         | 
| 56 63 | 
             
              jeweler
         | 
| 64 | 
            +
              pretty_diff!
         | 
| 65 | 
            +
              turn
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            2.0 | 
| 1 | 
            +
            2.1.0
         | 
    
        data/lib/pretty_diff.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            module PrettyDiff
         | 
| 2 | 
            -
              class  | 
| 2 | 
            +
              class InvalidGeneratorError < Exception; end
         | 
| 3 3 | 
             
            end
         | 
| 4 4 |  | 
| 5 5 | 
             
            def require_local(suffix)
         | 
| @@ -11,5 +11,6 @@ require_local 'pretty_diff/diff' | |
| 11 11 | 
             
            require_local 'pretty_diff/chunk'
         | 
| 12 12 | 
             
            require_local 'pretty_diff/line_numbers'
         | 
| 13 13 | 
             
            require_local 'pretty_diff/line'
         | 
| 14 | 
            +
            require_local 'pretty_diff/word_diff_finder'
         | 
| 14 15 | 
             
            require_local 'pretty_diff/abstract_generator'
         | 
| 15 16 | 
             
            require_local 'pretty_diff/basic_generator'
         | 
    
        data/lib/pretty_diff/chunk.rb
    CHANGED
    
    | @@ -15,9 +15,13 @@ module PrettyDiff | |
| 15 15 |  | 
| 16 16 | 
             
              private
         | 
| 17 17 |  | 
| 18 | 
            +
                def wdiff(lines)
         | 
| 19 | 
            +
                  PrettyDiff::WordDiffFinder.find_word_diffs(lines)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 18 22 | 
             
                def find_lines
         | 
| 19 23 | 
             
                  [].tap do |lines|
         | 
| 20 | 
            -
                    contents.split(/\r?\n|\r/).each do |line_str|
         | 
| 24 | 
            +
                    wdiff(contents.split(/\r?\n|\r/)).each do |line_str|
         | 
| 21 25 | 
             
                      line = Line.new(self, line_str)
         | 
| 22 26 | 
             
                      next if line.ignored?
         | 
| 23 27 | 
             
                      lines << line
         | 
    
        data/lib/pretty_diff/diff.rb
    CHANGED
    
    | @@ -26,7 +26,7 @@ module PrettyDiff | |
| 26 26 | 
             
                  @unified_diff = unified_diff
         | 
| 27 27 | 
             
                  @options = options
         | 
| 28 28 | 
             
                  @out_encoding = 
         | 
| 29 | 
            -
                  @generator = validate_generator(options[:generator] | 
| 29 | 
            +
                  @generator = validate_generator( options[:generator] || BasicGenerator )
         | 
| 30 30 | 
             
                  @out_encoding = options[:out_encoding] || 'utf-8'
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| @@ -73,7 +73,7 @@ module PrettyDiff | |
| 73 73 | 
             
                  if valid_generator?(gen)
         | 
| 74 74 | 
             
                    gen
         | 
| 75 75 | 
             
                  else
         | 
| 76 | 
            -
                    raise  | 
| 76 | 
            +
                    raise InvalidGeneratorError, "#{gen.inspect} is not a valid PrettyDiff generator"
         | 
| 77 77 | 
             
                  end
         | 
| 78 78 | 
             
                end
         | 
| 79 79 |  | 
    
        data/lib/pretty_diff/line.rb
    CHANGED
    
    
| @@ -0,0 +1,130 @@ | |
| 1 | 
            +
            require 'levenshtein'
         | 
| 2 | 
            +
            require 'diff_match_patch_native'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module PrettyDiff
         | 
| 5 | 
            +
              module WordDiffFinder
         | 
| 6 | 
            +
                WDIFF_INSERTED_START = "\x01"
         | 
| 7 | 
            +
                WDIFF_INSERTED_END   = "\x02"
         | 
| 8 | 
            +
                WDIFF_DELETED_START  = "\x03"
         | 
| 9 | 
            +
                WDIFF_DELETED_END    = "\x04"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                extend self
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def find_word_diffs(lines)
         | 
| 14 | 
            +
                  dmp = DiffMatchPatch.new
         | 
| 15 | 
            +
                  result = []
         | 
| 16 | 
            +
                  added_next_line_already = false
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  lines.each_with_index do |line, idx|
         | 
| 19 | 
            +
                    if added_next_line_already
         | 
| 20 | 
            +
                      added_next_line_already = false
         | 
| 21 | 
            +
                      next
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    previous_line = idx > 0 ? lines[idx - 1] : nil
         | 
| 25 | 
            +
                    stripped_line = strip(line)
         | 
| 26 | 
            +
                    next_line = lines[idx + 1]
         | 
| 27 | 
            +
                    stripped_next_line = strip(next_line || '')
         | 
| 28 | 
            +
                    after_next_line = idx < lines.size ? lines[idx + 2] : nil
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    # only show word diffing when change was a single line
         | 
| 31 | 
            +
                    if changed_line?(line, next_line) && !changed_block?(previous_line, line, next_line, after_next_line) && similiar_lines?(stripped_line, stripped_next_line)
         | 
| 32 | 
            +
                      diffs = dmp.diff_cleanup_semantic!(dmp.diff_main(stripped_line, stripped_next_line, true))
         | 
| 33 | 
            +
                      replacement, next_replacement = join_diffs(diffs)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      if line.include?(replacement.first)
         | 
| 36 | 
            +
                        # String#gsub in the form gsub(exp,replacement) has odd quirks
         | 
| 37 | 
            +
                        # affecting the replacement string which sometimes require
         | 
| 38 | 
            +
                        # lots of escaping slashes. Ruby users are frequently directed
         | 
| 39 | 
            +
                        # to use the block form instead.
         | 
| 40 | 
            +
                        # See: http://stackoverflow.com/a/13818467/204927
         | 
| 41 | 
            +
                        line.gsub!(replacement.first) { replacement.last }
         | 
| 42 | 
            +
                      else # it has to come form next_line
         | 
| 43 | 
            +
                        next_line.gsub!(replacement.first) { replacement.last }
         | 
| 44 | 
            +
                        added_next_line_already = true
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                      if next_line && next_replacement
         | 
| 48 | 
            +
                        next_line.gsub!(next_replacement.first) { next_replacement.last }
         | 
| 49 | 
            +
                        added_next_line_already = true
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    result << line
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    if added_next_line_already
         | 
| 56 | 
            +
                      result << next_line
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  result
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              private
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def to_utf8(str)
         | 
| 66 | 
            +
                  str.force_encoding('utf-8')
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def wrap_in_inserted_tokens(str)
         | 
| 70 | 
            +
                  "#{WDIFF_INSERTED_START}#{str}#{WDIFF_INSERTED_END}"
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def wrap_in_deleted_tokens(str)
         | 
| 74 | 
            +
                  "#{WDIFF_DELETED_START}#{str}#{WDIFF_DELETED_END}"
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def join_diffs(diffs)
         | 
| 78 | 
            +
                  inserted, deleted = '', ''
         | 
| 79 | 
            +
                  inserted_with_token, deleted_with_token = '', ''
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  operations = diffs.map(&:first)
         | 
| 82 | 
            +
                  # inline change
         | 
| 83 | 
            +
                  if ( operations.include?(1) && !operations.include?(-1) ) || ( operations.include?(-1) && !operations.include?(1) )
         | 
| 84 | 
            +
                    diffs.each do |diff|
         | 
| 85 | 
            +
                      deleted += diff.last
         | 
| 86 | 
            +
                      if diff.first == 0 # didn't change
         | 
| 87 | 
            +
                        deleted_with_token += diff.last
         | 
| 88 | 
            +
                      elsif diff.first == 1 # inserted
         | 
| 89 | 
            +
                        deleted_with_token += wrap_in_inserted_tokens(diff.last)
         | 
| 90 | 
            +
                      elsif diff.first == -1 # deleted
         | 
| 91 | 
            +
                        deleted_with_token += wrap_in_deleted_tokens(diff.last)
         | 
| 92 | 
            +
                      end
         | 
| 93 | 
            +
                    end
         | 
| 94 | 
            +
                  else
         | 
| 95 | 
            +
                    diffs.each do |diff|
         | 
| 96 | 
            +
                      if diff.first == 0 # didn't change
         | 
| 97 | 
            +
                        inserted += diff.last
         | 
| 98 | 
            +
                        deleted  += diff.last
         | 
| 99 | 
            +
                        inserted_with_token += diff.last
         | 
| 100 | 
            +
                        deleted_with_token  += diff.last
         | 
| 101 | 
            +
                      elsif diff.first == 1  # inserted
         | 
| 102 | 
            +
                        inserted += diff.last
         | 
| 103 | 
            +
                        inserted_with_token += wrap_in_inserted_tokens(diff.last)
         | 
| 104 | 
            +
                      elsif diff.first == -1 # deleted
         | 
| 105 | 
            +
                        deleted += diff.last
         | 
| 106 | 
            +
                        deleted_with_token += wrap_in_deleted_tokens(diff.last)
         | 
| 107 | 
            +
                      end
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                  [[to_utf8(deleted), to_utf8(deleted_with_token)], [to_utf8(inserted), to_utf8(inserted_with_token)]]
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                def strip(line)
         | 
| 115 | 
            +
                  line[1..-1]
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                def changed_line?(line, next_line)
         | 
| 119 | 
            +
                  (line =~ /^-/ && next_line =~ /^\+/)
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                def changed_block?(previous_line, line, next_line, after_next_line)
         | 
| 123 | 
            +
                  (previous_line =~ /^-/ && line =~ /^-/ && next_line =~ /^\+/ && after_next_line =~ /^\+/)
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                def similiar_lines?(first, second)
         | 
| 127 | 
            +
                  Levenshtein.distance(first, second) <= [first.size, second.size].max * 0.60
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
            end
         | 
    
        data/pretty_diff.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = "pretty_diff"
         | 
| 8 | 
            -
              s.version = "2.0 | 
| 8 | 
            +
              s.version = "2.1.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Ilya Sabanin"]
         | 
| 12 | 
            -
              s.date = "2014-02- | 
| 12 | 
            +
              s.date = "2014-02-21"
         | 
| 13 13 | 
             
              s.description = "PrettyDiff is a highly customizable library for creating fully featured HTML\n                     listings out of unified diff format strings.\n                     Include copy/paste-safe line numbers and built-in syntax highlighting."
         | 
| 14 14 | 
             
              s.email = "ilya.sabanin@gmail.com"
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -32,6 +32,7 @@ Gem::Specification.new do |s| | |
| 32 32 | 
             
                "lib/pretty_diff/encoding.rb",
         | 
| 33 33 | 
             
                "lib/pretty_diff/line.rb",
         | 
| 34 34 | 
             
                "lib/pretty_diff/line_numbers.rb",
         | 
| 35 | 
            +
                "lib/pretty_diff/word_diff_finder.rb",
         | 
| 35 36 | 
             
                "pretty_diff.gemspec",
         | 
| 36 37 | 
             
                "test/abstract_generator_test.rb",
         | 
| 37 38 | 
             
                "test/basic_generator_test.rb",
         | 
| @@ -46,15 +47,21 @@ Gem::Specification.new do |s| | |
| 46 47 | 
             
                "test/fixtures/csharp.diff.html",
         | 
| 47 48 | 
             
                "test/fixtures/first.diff",
         | 
| 48 49 | 
             
                "test/fixtures/first.diff.html",
         | 
| 50 | 
            +
                "test/fixtures/inline_change.diff",
         | 
| 51 | 
            +
                "test/fixtures/mid_sized_change.diff",
         | 
| 52 | 
            +
                "test/fixtures/quick_change.diff",
         | 
| 49 53 | 
             
                "test/fixtures/second.diff",
         | 
| 50 54 | 
             
                "test/fixtures/single_line.diff",
         | 
| 51 55 | 
             
                "test/fixtures/single_line.diff.html",
         | 
| 56 | 
            +
                "test/fixtures/space_change.diff",
         | 
| 57 | 
            +
                "test/fixtures/special_characters.diff",
         | 
| 52 58 | 
             
                "test/fixtures/text.diff",
         | 
| 53 59 | 
             
                "test/fixtures/text.diff.html",
         | 
| 54 60 | 
             
                "test/fixtures/windows-cp1251-lf",
         | 
| 55 61 | 
             
                "test/helper.rb",
         | 
| 56 62 | 
             
                "test/line_numbers_test.rb",
         | 
| 57 | 
            -
                "test/line_test.rb"
         | 
| 63 | 
            +
                "test/line_test.rb",
         | 
| 64 | 
            +
                "test/word_diff_finder_test.rb"
         | 
| 58 65 | 
             
              ]
         | 
| 59 66 | 
             
              s.homepage = "http://github.com/isabanin/pretty_diff"
         | 
| 60 67 | 
             
              s.require_paths = ["lib"]
         | 
| @@ -65,18 +72,21 @@ Gem::Specification.new do |s| | |
| 65 72 | 
             
                s.specification_version = 4
         | 
| 66 73 |  | 
| 67 74 | 
             
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 68 | 
            -
                  s.add_runtime_dependency(%q< | 
| 75 | 
            +
                  s.add_runtime_dependency(%q<pretty_diff>, [">= 0"])
         | 
| 69 76 | 
             
                  s.add_development_dependency(%q<jeweler>, [">= 0"])
         | 
| 70 77 | 
             
                  s.add_development_dependency(%q<builder>, [">= 0"])
         | 
| 78 | 
            +
                  s.add_development_dependency(%q<turn>, [">= 0"])
         | 
| 71 79 | 
             
                else
         | 
| 72 | 
            -
                  s.add_dependency(%q< | 
| 80 | 
            +
                  s.add_dependency(%q<pretty_diff>, [">= 0"])
         | 
| 73 81 | 
             
                  s.add_dependency(%q<jeweler>, [">= 0"])
         | 
| 74 82 | 
             
                  s.add_dependency(%q<builder>, [">= 0"])
         | 
| 83 | 
            +
                  s.add_dependency(%q<turn>, [">= 0"])
         | 
| 75 84 | 
             
                end
         | 
| 76 85 | 
             
              else
         | 
| 77 | 
            -
                s.add_dependency(%q< | 
| 86 | 
            +
                s.add_dependency(%q<pretty_diff>, [">= 0"])
         | 
| 78 87 | 
             
                s.add_dependency(%q<jeweler>, [">= 0"])
         | 
| 79 88 | 
             
                s.add_dependency(%q<builder>, [">= 0"])
         | 
| 89 | 
            +
                s.add_dependency(%q<turn>, [">= 0"])
         | 
| 80 90 | 
             
              end
         | 
| 81 91 | 
             
            end
         | 
| 82 92 |  | 
| @@ -4,26 +4,26 @@ class BasicGeneratorTest < MiniTest::Unit::TestCase | |
| 4 4 |  | 
| 5 5 | 
             
              def test_generated_html
         | 
| 6 6 | 
             
                diff = new_diff(fixture('first.diff'), :generator => PrettyDiff::BasicGenerator)
         | 
| 7 | 
            -
                assert_equal fixture('first.diff.html'), diff.to_html
         | 
| 7 | 
            +
                assert_equal fixture('first.diff.html'), strip_word_indicators(diff.to_html)
         | 
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              def test_more_generated_html
         | 
| 11 11 | 
             
                diff = new_diff(fixture('text.diff'), :generator => PrettyDiff::BasicGenerator)
         | 
| 12 | 
            -
                assert_equal fixture('text.diff.html'), diff.to_html
         | 
| 12 | 
            +
                assert_equal fixture('text.diff.html'), strip_word_indicators(diff.to_html)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 15 | 
             
              def test_another_generated_html
         | 
| 16 16 | 
             
                diff = new_diff(fixture('csharp.diff'), :generator => PrettyDiff::BasicGenerator)
         | 
| 17 | 
            -
                assert_equal fixture('csharp.diff.html'), diff.to_html
         | 
| 17 | 
            +
                assert_equal fixture('csharp.diff.html'), strip_word_indicators(diff.to_html)
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 20 | 
             
              def test_generate_html_for_blank
         | 
| 21 21 | 
             
                diff = new_diff(fixture('blank.diff'), :generator => PrettyDiff::BasicGenerator)
         | 
| 22 | 
            -
                assert_equal fixture('blank.diff.html'), diff.to_html
         | 
| 22 | 
            +
                assert_equal fixture('blank.diff.html'), strip_word_indicators(diff.to_html)
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 25 | 
             
              def test_generate_html_for_single_line_diffs
         | 
| 26 26 | 
             
                diff = new_diff(fixture('single_line.diff'), :generator => PrettyDiff::BasicGenerator)
         | 
| 27 | 
            -
                assert_equal fixture('single_line.diff.html'), diff.to_html
         | 
| 27 | 
            +
                assert_equal fixture('single_line.diff.html'), strip_word_indicators(diff.to_html)
         | 
| 28 28 | 
             
              end
         | 
| 29 29 | 
             
            end
         | 
    
        data/test/diff_test.rb
    CHANGED
    
    
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            @@ -130,7 +130,7 @@ class GroovyImage {
         | 
| 2 | 
            +
                   graph.drawImage(image,new AffineTransform(1.0d,0.0d,0.0d,1.0d,left,top),null);
         | 
| 3 | 
            +
                   def parsed Width = parseValue(width,image.width,true,"100%");
         | 
| 4 | 
            +
                   return newImage;
         | 
| 5 | 
            +
            -      
         | 
| 6 | 
            +
            +
         | 
| 7 | 
            +
               }
         | 
| 8 | 
            +
             
         | 
| 9 | 
            +
               BufferedImage parseAndFit(image,width,height) {
         | 
| 10 | 
            +
            @@ -274,15 +274,17 @@ class GroovyImage {
         | 
| 11 | 
            +
                       switch(type) {
         | 
| 12 | 
            +
                           case "px":
         | 
| 13 | 
            +
                               return decimalValue / size;
         | 
| 14 | 
            +
            -              case "%":
         | 
| 15 | 
            +
            +              case "percent":
         | 
| 16 | 
            +
                               return decimalValue / 100;
         | 
| 17 | 
            +
            +              case "%":
         | 
| 18 | 
            +
            +                  return decimalValue / 100;                 
         | 
| 19 | 
            +
                           default:
         | 
| 20 | 
            +
                               return decimalValue;
         | 
| 21 | 
            +
                       }
         | 
| 22 | 
            +
                   }
         | 
| 23 | 
            +
               }
         | 
| 24 | 
            +
             
         | 
| 25 | 
            +
            -    Object argsLength(args,length) {
         | 
| 26 | 
            +
            +    Object argsLength(args,lengths) {
         | 
| 27 | 
            +
                     if(args.size() < length) {
         | 
| 28 | 
            +
                         while(args.size() < length) {
         | 
| 29 | 
            +
                             args.add("change");
         | 
| @@ -0,0 +1,109 @@ | |
| 1 | 
            +
            diff --git a/Core/Contents/Source/PolySceneLine.cpp b/Core/Contents/Source/PolySceneLine.cpp
         | 
| 2 | 
            +
            index 6c374f2..3d3adc7 100755
         | 
| 3 | 
            +
            --- a/Core/Contents/Source/PolySceneLine.cpp
         | 
| 4 | 
            +
            +++ b/Core/Contents/Source/PolySceneLine.cpp
         | 
| 5 | 
            +
            @@ -26,43 +26,29 @@
         | 
| 6 | 
            +
             
         | 
| 7 | 
            +
             using namespace Polycode;
         | 
| 8 | 
            +
             
         | 
| 9 | 
            +
            -SceneLine::SceneLine(Vector3 start, Vector3 end) : SceneEntity() {
         | 
| 10 | 
            +
            +SceneLine::SceneLine(Vector3 start, Vector3 end) : SceneMesh(Mesh::LINE_MESH) {
         | 
| 11 | 
            +
             	this->ent1 = NULL;
         | 
| 12 | 
            +
            -	this->ent2 = NULL;	
         | 
| 13 | 
            +
            -	
         | 
| 14 | 
            +
            +	this->ent2 = NULL;
         | 
| 15 | 
            +
             	this->start = start;
         | 
| 16 | 
            +
             	this->end = end;	
         | 
| 17 | 
            +
            -	
         | 
| 18 | 
            +
            -	mesh = new Mesh(Mesh::LINE_MESH);	
         | 
| 19 | 
            +
            -	
         | 
| 20 | 
            +
            -	Polygon *poly = new Polygon();
         | 
| 21 | 
            +
            -	poly->addVertex(0,0,0);
         | 
| 22 | 
            +
            -	poly->addVertex(0,0,0);	
         | 
| 23 | 
            +
            -	mesh->addPolygon(poly);
         | 
| 24 | 
            +
            -	
         | 
| 25 | 
            +
            +	initLine();
         | 
| 26 | 
            +
             	ignoreParentMatrix = true;
         | 
| 27 | 
            +
            -	
         | 
| 28 | 
            +
            -	lineWidth = 1.0;
         | 
| 29 | 
            +
            -	lineSmooth = false;
         | 
| 30 | 
            +
            -	
         | 
| 31 | 
            +
             }
         | 
| 32 | 
            +
             
         | 
| 33 | 
            +
            -SceneLine::SceneLine(SceneEntity *ent1, SceneEntity *ent2) : SceneEntity() {
         | 
| 34 | 
            +
            +SceneLine::SceneLine(SceneEntity *ent1, SceneEntity *ent2) : SceneMesh(Mesh::LINE_MESH) {
         | 
| 35 | 
            +
             	this->ent1 = ent1;
         | 
| 36 | 
            +
             	this->ent2 = ent2;	
         | 
| 37 | 
            +
            +	initLine();
         | 
| 38 | 
            +
            +	ignoreParentMatrix = true;
         | 
| 39 | 
            +
             
         | 
| 40 | 
            +
            -	mesh = new Mesh(Mesh::LINE_MESH);	
         | 
| 41 | 
            +
            -	
         | 
| 42 | 
            +
            +}
         | 
| 43 | 
            +
            +
         | 
| 44 | 
            +
            +void SceneLine::initLine() { 
         | 
| 45 | 
            +
             	Polygon *poly = new Polygon();
         | 
| 46 | 
            +
            -	poly->addVertex(0,0,0);
         | 
| 47 | 
            +
            -	poly->addVertex(0,0,0);	
         | 
| 48 | 
            +
            +	poly->addVertex(0,0,0,0,0);
         | 
| 49 | 
            +
            +	poly->addVertex(0,0,0,1,0);	
         | 
| 50 | 
            +
             	mesh->addPolygon(poly);
         | 
| 51 | 
            +
            -	
         | 
| 52 | 
            +
            -	ignoreParentMatrix = true;
         | 
| 53 | 
            +
            -	
         | 
| 54 | 
            +
            -	lineWidth = 1.0;
         | 
| 55 | 
            +
            -	lineSmooth = false;
         | 
| 56 | 
            +
            -	
         | 
| 57 | 
            +
            +	mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;		
         | 
| 58 | 
            +
             }
         | 
| 59 | 
            +
             
         | 
| 60 | 
            +
             SceneLine *SceneLine::SceneLineWithPositions(Vector3 start, Vector3 end) {
         | 
| 61 | 
            +
            @@ -70,7 +56,6 @@ SceneLine *SceneLine::SceneLineWithPositions(Vector3 start, Vector3 end) {
         | 
| 62 | 
            +
             }
         | 
| 63 | 
            +
             
         | 
| 64 | 
            +
             SceneLine::~SceneLine() {
         | 
| 65 | 
            +
            -	delete mesh;
         | 
| 66 | 
            +
             }
         | 
| 67 | 
            +
             
         | 
| 68 | 
            +
             void SceneLine::setStart(Vector3 start) {
         | 
| 69 | 
            +
            @@ -81,11 +66,11 @@ void SceneLine::setEnd(Vector3 end) {
         | 
| 70 | 
            +
             	this->end = end;
         | 
| 71 | 
            +
             }
         | 
| 72 | 
            +
             
         | 
| 73 | 
            +
            -void SceneLine::Render() {	
         | 
| 74 | 
            +
            +void SceneLine::Update(){
         | 
| 75 | 
            +
             
         | 
| 76 | 
            +
             	Vector3 v1;
         | 
| 77 | 
            +
            -	Vector3 v2;		
         | 
| 78 | 
            +
            -
         | 
| 79 | 
            +
            +	Vector3 v2;
         | 
| 80 | 
            +
            +	
         | 
| 81 | 
            +
             	if(ent1 != NULL && ent2 != NULL) {
         | 
| 82 | 
            +
             		v1 = ent1->getConcatenatedMatrix().getPosition();
         | 
| 83 | 
            +
             		v2 = ent2->getConcatenatedMatrix().getPosition();
         | 
| 84 | 
            +
            @@ -93,22 +78,8 @@ void SceneLine::Render() {
         | 
| 85 | 
            +
             		v1 = start;
         | 
| 86 | 
            +
             		v2 = end;
         | 
| 87 | 
            +
             	}
         | 
| 88 | 
            +
            -
         | 
| 89 | 
            +
            -	
         | 
| 90 | 
            +
            -	mesh->getPolygon(0)->getVertex(0)->set(v1.x,v1.y,v1.z); 
         | 
| 91 | 
            +
            -	mesh->getPolygon(0)->getVertex(1)->set(v2.x,v2.y,v2.z); 	
         | 
| 92 | 
            +
            -	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
         | 
| 93 | 
            +
            -	
         | 
| 94 | 
            +
            -	Renderer *renderer = CoreServices::getInstance()->getRenderer();
         | 
| 95 | 
            +
            -	
         | 
| 96 | 
            +
            -	renderer->setLineSize(lineWidth);
         | 
| 97 | 
            +
            -	renderer->setLineSmooth(lineSmooth);
         | 
| 98 | 
            +
            -	
         | 
| 99 | 
            +
            -	renderer->setTexture(NULL);	
         | 
| 100 | 
            +
            -	renderer->pushDataArrayForMesh(mesh, RenderDataArray::VERTEX_DATA_ARRAY);
         | 
| 101 | 
            +
            -	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TEXCOORD_DATA_ARRAY);	
         | 
| 102 | 
            +
            -	renderer->pushDataArrayForMesh(mesh, RenderDataArray::NORMAL_DATA_ARRAY);		
         | 
| 103 | 
            +
            -	
         | 
| 104 | 
            +
            -	renderer->drawArrays(mesh->getMeshType());	
         | 
| 105 | 
            +
             	
         | 
| 106 | 
            +
            +	mesh->getPolygon(0)->getVertex(0)->set(v1.x,v1.y,v1.z);
         | 
| 107 | 
            +
            +	mesh->getPolygon(0)->getVertex(1)->set(v2.x,v2.y,v2.z);
         | 
| 108 | 
            +
            +	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;	
         | 
| 109 | 
            +
             }
         | 
| @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            @@ -127,7 +127,7 @@ class GroovyImage {
         | 
| 2 | 
            +
                   // createGraphics() needs a display, find workaround.
         | 
| 3 | 
            +
                   def graph = newImage.createGraphics();
         | 
| 4 | 
            +
                   graph.drawImage(image,new AffineTransform(1.0d,0.0d,0.0d,1.0d,left,top),null);
         | 
| 5 | 
            +
            -      def parsedWidth = parseValue(width,image.width,true,"100%");
         | 
| 6 | 
            +
            +      def parsed Width = parseValue(width,image.width,true,"100%");
         | 
| 7 | 
            +
                   return newImage;
         | 
| 8 | 
            +
               }
         | 
| 9 | 
            +
             
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            @@ -54,11 +54,12 @@ class GroovyImage {
         | 
| 2 | 
            +
             
         | 
| 3 | 
            +
                   void addOperation(command) {
         | 
| 4 | 
            +
             
         | 
| 5 | 
            +
            -        def matcher = command =~ "([a-z]+)\\((.*)\\).*";
         | 
| 6 | 
            +
            +/* 57 line */
         | 
| 7 | 
            +
            +        def matcher = command =~ "([a-z]+)\\((.*)\\).*"; 
         | 
| 8 | 
            +
                     matcher.find();
         | 
| 9 | 
            +
             
         | 
| 10 | 
            +
            -        def method = matcher.group(1);
         | 
| 11 | 
            +
            -        def args = matcher.group(2).split(",").toList();
         | 
| 12 | 
            +
            +        def method = matcher.group(1); /* 61 line */
         | 
| 13 | 
            +
            +        def args = matcher.group(62).split(",").toList();
         | 
| 14 | 
            +
             
         | 
| 15 | 
            +
                     switch(method) {
         | 
| 16 | 
            +
                         case "scale": // vertical,horizontal 
         | 
| 17 | 
            +
            @@ -79,7 +80,7 @@ class GroovyImage {
         | 
| 18 | 
            +
                     }
         | 
| 19 | 
            +
                 }
         | 
| 20 | 
            +
             
         | 
| 21 | 
            +
            -  BufferedImage parseAndRotate(image,degrees,x,y) { 
         | 
| 22 | 
            +
            +  BufferedImage parseAndRotate(images83line,degrees,x,y) { 
         | 
| 23 | 
            +
                   def parsedRadians = 0; 
         | 
| 24 | 
            +
                   try {
         | 
| 25 | 
            +
                       parsedRadians = Math.toRadians(Double.parseDouble(degrees));
         | 
    
        data/test/helper.rb
    CHANGED
    
    | @@ -1,17 +1,34 @@ | |
| 1 1 | 
             
            require 'rubygems'
         | 
| 2 2 | 
             
            require 'bundler/setup'
         | 
| 3 3 | 
             
            require 'minitest/autorun'
         | 
| 4 | 
            +
            require 'turn'
         | 
| 4 5 |  | 
| 5 6 | 
             
            require File.join(File.dirname(__FILE__), '..', 'lib', 'pretty_diff')
         | 
| 6 7 |  | 
| 7 8 | 
             
            class MiniTest::Unit::TestCase
         | 
| 9 | 
            +
              include PrettyDiff::WordDiffFinder
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              class FixtureNotFoundError < StandardError; end
         | 
| 8 12 |  | 
| 9 13 | 
             
              def new_diff(*args)
         | 
| 10 14 | 
             
                PrettyDiff::Diff.new(*args)
         | 
| 11 15 | 
             
              end
         | 
| 12 16 |  | 
| 13 17 | 
             
              def fixture(name)
         | 
| 14 | 
            -
                File. | 
| 18 | 
            +
                path = File.join(File.dirname(__FILE__), "fixtures", name)
         | 
| 19 | 
            +
                if File.exist?(path)
         | 
| 20 | 
            +
                  File.read(path)
         | 
| 21 | 
            +
                else
         | 
| 22 | 
            +
                  raise FixtureNotFoundError.new("Fixture at path '#{path}' was not found")
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def strip_word_indicators(text)
         | 
| 27 | 
            +
                text
         | 
| 28 | 
            +
                .gsub(WDIFF_INSERTED_START, '')
         | 
| 29 | 
            +
                .gsub(WDIFF_INSERTED_END, '')
         | 
| 30 | 
            +
                .gsub(WDIFF_DELETED_START, '')
         | 
| 31 | 
            +
                .gsub(WDIFF_DELETED_END, '')
         | 
| 15 32 | 
             
              end
         | 
| 16 33 |  | 
| 17 34 | 
             
            end
         | 
    
        data/test/line_test.rb
    CHANGED
    
    | @@ -8,10 +8,10 @@ class LineTest < MiniTest::Unit::TestCase | |
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              def test_contents
         | 
| 11 | 
            -
                assert_equal "     color: #999;", @lines[0].contents
         | 
| 12 | 
            -
                assert_equal "-  table.account-overview td .status {", @lines[3].contents
         | 
| 13 | 
            -
                assert_equal "+  table.account-overview td.label.top {", @lines[4].contents
         | 
| 14 | 
            -
                assert_equal "   }", @lines.last.contents
         | 
| 11 | 
            +
                assert_equal "     color: #999;", strip_word_indicators(@lines[0].contents)
         | 
| 12 | 
            +
                assert_equal "-  table.account-overview td .status {", strip_word_indicators(@lines[3].contents)
         | 
| 13 | 
            +
                assert_equal "+  table.account-overview td.label.top {", strip_word_indicators(@lines[4].contents)
         | 
| 14 | 
            +
                assert_equal "   }", strip_word_indicators(@lines.last.contents)
         | 
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 17 | 
             
              def test_ignored
         | 
| @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), 'helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class WordDiffFinderTest < MiniTest::Unit::TestCase
         | 
| 4 | 
            +
              def test_join_diff_from_dmp
         | 
| 5 | 
            +
                diffs = [[0, "    Object argsLength(args,length"], [1, "s"], [0, ") {\n"]]
         | 
| 6 | 
            +
                expected = "    Object argsLength(args,lengths) {\n"
         | 
| 7 | 
            +
                expected_with_token = "    Object argsLength(args,length#{wrap_in_inserted_tokens 's'}) {\n"
         | 
| 8 | 
            +
                assert_equal [expected, expected_with_token], join_diffs(diffs).first
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                diffs = [[0, "              case \""], [-1, "%"], [1, "percent"], [0, "\":\n"]]
         | 
| 11 | 
            +
                expected_first = "              case \"%\":\n"
         | 
| 12 | 
            +
                expected_first_with_token = "              case \"#{wrap_in_deleted_tokens '%'}\":\n"
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                expected_second = "              case \"percent\":\n"
         | 
| 15 | 
            +
                expected_second_with_token = "              case \"#{wrap_in_inserted_tokens 'percent'}\":\n"
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                first, second = join_diffs(diffs)
         | 
| 18 | 
            +
                assert_equal [expected_first, expected_first_with_token], first
         | 
| 19 | 
            +
                assert_equal [expected_second, expected_second_with_token], second
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                diffs = [[-1, "      "], [0, "\n"]]
         | 
| 22 | 
            +
                expected = "      \n"
         | 
| 23 | 
            +
                expected_with_token = "#{wrap_in_deleted_tokens '      '}\n"
         | 
| 24 | 
            +
                assert_equal [expected, expected_with_token], join_diffs(diffs).first
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              def test_highlighting_inline_diff
         | 
| 28 | 
            +
                content = fixture('inline_change.diff').lines
         | 
| 29 | 
            +
                lines_found = find_word_diffs(content)
         | 
| 30 | 
            +
                assert_equal content.size, lines_found.size
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # two inline delete highlighted
         | 
| 33 | 
            +
                assert 2, num_of_tags(WDIFF_DELETED_START, lines_found)
         | 
| 34 | 
            +
                # two inline insert highlighted
         | 
| 35 | 
            +
                assert 2, num_of_tags(WDIFF_INSERTED_START, lines_found)
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              def test_highlighting_quick_diff
         | 
| 39 | 
            +
                content = fixture('quick_change.diff').lines
         | 
| 40 | 
            +
                lines_found = find_word_diffs(content)
         | 
| 41 | 
            +
                assert_equal content.size, lines_found.size
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                assert lines_include_wrapped_content(lines_found, wrap_in_inserted_tokens('test'))
         | 
| 44 | 
            +
                # one inline insert highlighted
         | 
| 45 | 
            +
                assert_equal 1, num_of_tags(WDIFF_INSERTED_START, lines_found)
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              def test_highlighting_single_space_diff
         | 
| 49 | 
            +
                content = fixture('space_change.diff').lines
         | 
| 50 | 
            +
                lines_found = find_word_diffs(content)
         | 
| 51 | 
            +
                assert_equal content.size, lines_found.size
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                assert lines_include_wrapped_content(lines_found, "parsed#{wrap_in_inserted_tokens ' '}Width")
         | 
| 54 | 
            +
                # one inline insert highlighted
         | 
| 55 | 
            +
                assert_equal 1, num_of_tags(WDIFF_INSERTED_START, lines_found)
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              def test_highlighting_special_character_diff
         | 
| 59 | 
            +
                content = fixture('special_characters.diff').lines
         | 
| 60 | 
            +
                lines_found = find_word_diffs(content)
         | 
| 61 | 
            +
                assert_equal content.size, lines_found.size
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                assert lines_include_wrapped_content(lines_found, wrap_in_inserted_tokens("s83line"))
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                # one inline insert highlighted
         | 
| 66 | 
            +
                assert_equal 1, num_of_tags(WDIFF_INSERTED_START, lines_found)
         | 
| 67 | 
            +
                assert_equal 0, num_of_tags(WDIFF_DELETED_START, lines_found)
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              private
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              def lines_include_wrapped_content(lines, content)
         | 
| 73 | 
            +
                lines.map(&:to_s).join("\n").include?(content)
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              def num_of_tags(tag, lines)
         | 
| 77 | 
            +
                lines.join("\n").scan(/#{tag}/).size
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,29 +1,29 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: pretty_diff
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.0 | 
| 4 | 
            +
              version: 2.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ilya Sabanin
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-02- | 
| 11 | 
            +
            date: 2014-02-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            -
              name:  | 
| 14 | 
            +
              name: pretty_diff
         | 
| 15 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 16 | 
             
                requirements:
         | 
| 17 | 
            -
                - -  | 
| 17 | 
            +
                - - '>='
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: '0 | 
| 19 | 
            +
                    version: '0'
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 | 
            -
                - -  | 
| 24 | 
            +
                - - '>='
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: '0 | 
| 26 | 
            +
                    version: '0'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: jeweler
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -52,6 +52,20 @@ dependencies: | |
| 52 52 | 
             
                - - '>='
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: turn
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - '>='
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - '>='
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0'
         | 
| 55 69 | 
             
            description: |-
         | 
| 56 70 | 
             
              PrettyDiff is a highly customizable library for creating fully featured HTML
         | 
| 57 71 | 
             
                                   listings out of unified diff format strings.
         | 
| @@ -78,6 +92,7 @@ files: | |
| 78 92 | 
             
            - lib/pretty_diff/encoding.rb
         | 
| 79 93 | 
             
            - lib/pretty_diff/line.rb
         | 
| 80 94 | 
             
            - lib/pretty_diff/line_numbers.rb
         | 
| 95 | 
            +
            - lib/pretty_diff/word_diff_finder.rb
         | 
| 81 96 | 
             
            - pretty_diff.gemspec
         | 
| 82 97 | 
             
            - test/abstract_generator_test.rb
         | 
| 83 98 | 
             
            - test/basic_generator_test.rb
         | 
| @@ -92,15 +107,21 @@ files: | |
| 92 107 | 
             
            - test/fixtures/csharp.diff.html
         | 
| 93 108 | 
             
            - test/fixtures/first.diff
         | 
| 94 109 | 
             
            - test/fixtures/first.diff.html
         | 
| 110 | 
            +
            - test/fixtures/inline_change.diff
         | 
| 111 | 
            +
            - test/fixtures/mid_sized_change.diff
         | 
| 112 | 
            +
            - test/fixtures/quick_change.diff
         | 
| 95 113 | 
             
            - test/fixtures/second.diff
         | 
| 96 114 | 
             
            - test/fixtures/single_line.diff
         | 
| 97 115 | 
             
            - test/fixtures/single_line.diff.html
         | 
| 116 | 
            +
            - test/fixtures/space_change.diff
         | 
| 117 | 
            +
            - test/fixtures/special_characters.diff
         | 
| 98 118 | 
             
            - test/fixtures/text.diff
         | 
| 99 119 | 
             
            - test/fixtures/text.diff.html
         | 
| 100 120 | 
             
            - test/fixtures/windows-cp1251-lf
         | 
| 101 121 | 
             
            - test/helper.rb
         | 
| 102 122 | 
             
            - test/line_numbers_test.rb
         | 
| 103 123 | 
             
            - test/line_test.rb
         | 
| 124 | 
            +
            - test/word_diff_finder_test.rb
         | 
| 104 125 | 
             
            homepage: http://github.com/isabanin/pretty_diff
         | 
| 105 126 | 
             
            licenses: []
         | 
| 106 127 | 
             
            metadata: {}
         |