lovely_rufus 0.2.1 → 0.3.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/.rubocop.yml +4 -7
- data/.ruby-version +1 -1
- data/Gemfile.lock +41 -26
- data/README.md +2 -2
- data/Rakefile +5 -6
- data/bin/lovely-rufus +1 -1
- data/config/reek.yml +7 -7
- data/lib/lovely_rufus.rb +9 -6
- data/lib/lovely_rufus/cli_wrapper.rb +1 -2
- data/lib/lovely_rufus/layers/basic_wrapper.rb +14 -0
- data/lib/lovely_rufus/layers/code_comment_stripper.rb +13 -0
- data/lib/lovely_rufus/layers/email_quote_stripper.rb +15 -0
- data/lib/lovely_rufus/layers/hangout_wrapper.rb +57 -0
- data/lib/lovely_rufus/layers/layer.rb +15 -0
- data/lib/lovely_rufus/layers/one_letter_gluer.rb +14 -0
- data/lib/lovely_rufus/layers/quote_stripper.rb +29 -0
- data/lib/lovely_rufus/text_wrapper.rb +11 -7
- data/lovely_rufus.gemspec +6 -4
- data/{spec/lovely_rufus/cli_wrapper_spec.rb → test/lovely_rufus/cli_wrapper_test.rb} +5 -5
- data/test/lovely_rufus/layers/basic_wrapper_test.rb +55 -0
- data/test/lovely_rufus/layers/code_comment_stripper_test.rb +90 -0
- data/test/lovely_rufus/layers/email_quote_stripper_test.rb +101 -0
- data/test/lovely_rufus/layers/hangout_wrapper_test.rb +40 -0
- data/test/lovely_rufus/layers/one_letter_gluer_test.rb +33 -0
- data/{spec/lovely_rufus/settings_spec.rb → test/lovely_rufus/settings_test.rb} +1 -1
- data/{spec/lovely_rufus/text_wrapper_spec.rb → test/lovely_rufus/text_wrapper_test.rb} +2 -2
- data/{spec/lovely_rufus/text_wrapper_spec.yml → test/lovely_rufus/text_wrapper_test.yml} +0 -0
- data/{spec/lovely_rufus/wrap_spec.rb → test/lovely_rufus/wrap_test.rb} +3 -3
- data/{spec/lovely_rufus_spec.rb → test/lovely_rufus_test.rb} +1 -1
- data/test/test_helper.rb +37 -0
- metadata +51 -33
- data/lib/lovely_rufus/basic_wrapper.rb +0 -12
- data/lib/lovely_rufus/hangout_wrapper.rb +0 -56
- data/lib/lovely_rufus/layer.rb +0 -14
- data/lib/lovely_rufus/one_letter_gluer.rb +0 -12
- data/lib/lovely_rufus/quote_stripper.rb +0 -32
- data/spec/lovely_rufus/basic_wrapper_spec.rb +0 -53
- data/spec/lovely_rufus/hangout_wrapper_spec.rb +0 -38
- data/spec/lovely_rufus/one_letter_gluer_spec.rb +0 -31
- data/spec/lovely_rufus/quote_stripper_spec.rb +0 -131
- data/spec/spec_helper.rb +0 -14
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1b3be99e51553764b5a5005a42751f9e635f6a12
         | 
| 4 | 
            +
              data.tar.gz: e047b3674363d4c3a1a0b9bf3a879958bae57c8b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6247aac218976d4fba0dd11bdc85d22d33c746fed1ee7b11d8bf5556817d895992507d56e281503a376d1d8acf24ab0ab2d5bbabdf2a14a675b74a3aa9df71c6
         | 
| 7 | 
            +
              data.tar.gz: 4ab4714a2b7a0a074792399234a4161552ddb2ee3036d44f7f2d83c5d00810809ff003d8920bdf7fe328a9647af7dbb1cd6c0fe3f8b4fa57355ca36cf9230d53
         | 
    
        data/.rubocop.yml
    CHANGED
    
    | @@ -1,15 +1,12 @@ | |
| 1 | 
            -
            AndOr:
         | 
| 1 | 
            +
            Style/AndOr:
         | 
| 2 2 | 
             
              Enabled: false
         | 
| 3 3 |  | 
| 4 | 
            -
            Documentation:
         | 
| 4 | 
            +
            Style/Documentation:
         | 
| 5 5 | 
             
              Enabled: false
         | 
| 6 6 |  | 
| 7 | 
            -
            FileName:
         | 
| 7 | 
            +
            Style/FileName:
         | 
| 8 8 | 
             
              Exclude:
         | 
| 9 9 | 
             
                - bin/lovely-rufus
         | 
| 10 10 |  | 
| 11 | 
            -
            SingleLineBlockParams:
         | 
| 12 | 
            -
              Enabled: false
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            SingleSpaceBeforeFirstArg:
         | 
| 11 | 
            +
            Style/SingleLineBlockParams:
         | 
| 15 12 | 
             
              Enabled: false
         | 
    
        data/.ruby-version
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            2. | 
| 1 | 
            +
            2.2
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,60 +1,75 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                lovely_rufus (0. | 
| 4 | 
            +
                lovely_rufus (0.3.0)
         | 
| 5 | 
            +
                  private_attr (~> 1.0)
         | 
| 5 6 |  | 
| 6 7 | 
             
            GEM
         | 
| 7 8 | 
             
              remote: https://rubygems.org/
         | 
| 8 9 | 
             
              specs:
         | 
| 10 | 
            +
                abstract_type (0.0.7)
         | 
| 11 | 
            +
                adamantium (0.2.0)
         | 
| 12 | 
            +
                  ice_nine (~> 0.11.0)
         | 
| 13 | 
            +
                  memoizable (~> 0.4.0)
         | 
| 9 14 | 
             
                ast (2.0.0)
         | 
| 10 15 | 
             
                astrolabe (1.3.0)
         | 
| 11 16 | 
             
                  parser (>= 2.2.0.pre.3, < 3.0)
         | 
| 12 | 
            -
                bogus (0.1. | 
| 17 | 
            +
                bogus (0.1.6)
         | 
| 13 18 | 
             
                  dependor (>= 0.0.4)
         | 
| 14 19 | 
             
                celluloid (0.16.0)
         | 
| 15 20 | 
             
                  timers (~> 4.0.0)
         | 
| 21 | 
            +
                concord (0.1.5)
         | 
| 22 | 
            +
                  adamantium (~> 0.2.0)
         | 
| 23 | 
            +
                  equalizer (~> 0.0.9)
         | 
| 16 24 | 
             
                dependor (1.0.1)
         | 
| 25 | 
            +
                diff-lcs (1.2.5)
         | 
| 26 | 
            +
                equalizer (0.0.9)
         | 
| 17 27 | 
             
                ffi (1.9.6)
         | 
| 18 28 | 
             
                hitimes (1.2.2)
         | 
| 19 | 
            -
                 | 
| 29 | 
            +
                ice_nine (0.11.1)
         | 
| 30 | 
            +
                listen (2.8.5)
         | 
| 20 31 | 
             
                  celluloid (>= 0.15.2)
         | 
| 21 32 | 
             
                  rb-fsevent (>= 0.9.3)
         | 
| 22 33 | 
             
                  rb-inotify (>= 0.9)
         | 
| 23 | 
            -
                 | 
| 34 | 
            +
                memoizable (0.4.2)
         | 
| 35 | 
            +
                  thread_safe (~> 0.3, >= 0.3.1)
         | 
| 36 | 
            +
                minitest (5.5.1)
         | 
| 24 37 | 
             
                minitest-focus (1.1.0)
         | 
| 25 38 | 
             
                  minitest (>= 4, < 6)
         | 
| 26 | 
            -
                parser (2.2.0. | 
| 39 | 
            +
                parser (2.2.0.2)
         | 
| 27 40 | 
             
                  ast (>= 1.1, < 3.0)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                 | 
| 41 | 
            +
                powerpack (0.1.0)
         | 
| 42 | 
            +
                private_attr (1.0.0)
         | 
| 43 | 
            +
                procto (0.0.2)
         | 
| 30 44 | 
             
                rainbow (2.0.0)
         | 
| 31 | 
            -
                rake (10. | 
| 45 | 
            +
                rake (10.4.2)
         | 
| 32 46 | 
             
                rb-fsevent (0.9.4)
         | 
| 33 47 | 
             
                rb-inotify (0.9.5)
         | 
| 34 48 | 
             
                  ffi (>= 0.5.0)
         | 
| 35 | 
            -
                reek ( | 
| 36 | 
            -
                   | 
| 37 | 
            -
                   | 
| 38 | 
            -
                   | 
| 39 | 
            -
                  sexp_processor (~> 4.4)
         | 
| 49 | 
            +
                reek (2.0.0)
         | 
| 50 | 
            +
                  parser (~> 2.2)
         | 
| 51 | 
            +
                  rainbow (~> 2.0)
         | 
| 52 | 
            +
                  unparser (~> 0.2.2)
         | 
| 40 53 | 
             
                rerun (0.10.0)
         | 
| 41 54 | 
             
                  listen (~> 2.7, >= 2.7.3)
         | 
| 42 | 
            -
                rubocop (0. | 
| 55 | 
            +
                rubocop (0.29.0)
         | 
| 43 56 | 
             
                  astrolabe (~> 1.3)
         | 
| 44 | 
            -
                  parser (>= 2.2.0. | 
| 45 | 
            -
                  powerpack (~> 0. | 
| 57 | 
            +
                  parser (>= 2.2.0.1, < 3.0)
         | 
| 58 | 
            +
                  powerpack (~> 0.1)
         | 
| 46 59 | 
             
                  rainbow (>= 1.99.1, < 3.0)
         | 
| 47 60 | 
             
                  ruby-progressbar (~> 1.4)
         | 
| 48 | 
            -
                ruby-progressbar (1.7. | 
| 49 | 
            -
                 | 
| 50 | 
            -
                  ruby_parser (~> 3.1)
         | 
| 51 | 
            -
                  sexp_processor (~> 4.0)
         | 
| 52 | 
            -
                ruby_parser (3.6.3)
         | 
| 53 | 
            -
                  sexp_processor (~> 4.1)
         | 
| 54 | 
            -
                sexp_processor (4.4.4)
         | 
| 55 | 
            -
                slop (3.6.0)
         | 
| 61 | 
            +
                ruby-progressbar (1.7.1)
         | 
| 62 | 
            +
                thread_safe (0.3.4)
         | 
| 56 63 | 
             
                timers (4.0.1)
         | 
| 57 64 | 
             
                  hitimes
         | 
| 65 | 
            +
                unparser (0.2.2)
         | 
| 66 | 
            +
                  abstract_type (~> 0.0.7)
         | 
| 67 | 
            +
                  adamantium (~> 0.2.0)
         | 
| 68 | 
            +
                  concord (~> 0.1.5)
         | 
| 69 | 
            +
                  diff-lcs (~> 1.2.5)
         | 
| 70 | 
            +
                  equalizer (~> 0.0.9)
         | 
| 71 | 
            +
                  parser (~> 2.2.0.2)
         | 
| 72 | 
            +
                  procto (~> 0.0.2)
         | 
| 58 73 |  | 
| 59 74 | 
             
            PLATFORMS
         | 
| 60 75 | 
             
              ruby
         | 
| @@ -65,6 +80,6 @@ DEPENDENCIES | |
| 65 80 | 
             
              minitest (~> 5.0)
         | 
| 66 81 | 
             
              minitest-focus (~> 1.1)
         | 
| 67 82 | 
             
              rake (~> 10.1)
         | 
| 68 | 
            -
              reek (~>  | 
| 83 | 
            +
              reek (~> 2.0)
         | 
| 69 84 | 
             
              rerun (~> 0.10.0)
         | 
| 70 | 
            -
              rubocop (~> 0. | 
| 85 | 
            +
              rubocop (~> 0.29.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -58,10 +58,10 @@ Currently, Lovely Rufus sports the following features: | |
| 58 58 | 
             
            Name and history
         | 
| 59 59 | 
             
            ----------------
         | 
| 60 60 |  | 
| 61 | 
            -
            Lovely Rufus was created as a [Ruby Mendicant University](http://blog.majesticseacreature.com/tag/rubymendicant) project and is named after [a certain _Love Actually_ character](http://en.wikipedia.org/wiki/Love_Actually#Rufus) who’s [exceptionally good at wrapping]( | 
| 61 | 
            +
            Lovely Rufus was created as a [Ruby Mendicant University](http://blog.majesticseacreature.com/tag/rubymendicant) project and is named after [a certain _Love Actually_ character](http://en.wikipedia.org/wiki/Love_Actually#Rufus) who’s [exceptionally good at wrapping](https://www.youtube.com/watch?v=E3rB_qx0wRM).
         | 
| 62 62 |  | 
| 63 63 |  | 
| 64 64 |  | 
| 65 65 | 
             
            ---
         | 
| 66 66 |  | 
| 67 | 
            -
            © MMX- | 
| 67 | 
            +
            © MMX-MMXV Piotr Szotkowski <chastell@chastell.net>, licensed under AGPL-3.0 (see LICENCE)
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -2,17 +2,16 @@ require 'rake/testtask' | |
| 2 2 | 
             
            require 'reek/rake/task'
         | 
| 3 3 | 
             
            require 'rubocop/rake_task'
         | 
| 4 4 |  | 
| 5 | 
            -
            task default: %i( | 
| 5 | 
            +
            task default: %i(test rubocop reek)
         | 
| 6 6 |  | 
| 7 | 
            -
            Rake::TestTask.new | 
| 8 | 
            -
              task. | 
| 9 | 
            -
              task.warning | 
| 7 | 
            +
            Rake::TestTask.new do |task|
         | 
| 8 | 
            +
              task.pattern = 'test/**/*_test.rb'
         | 
| 9 | 
            +
              task.warning = true
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 12 | 
             
            Reek::Rake::Task.new do |task|
         | 
| 13 | 
            -
              task. | 
| 13 | 
            +
              task.config_file   = 'config/reek.yml'
         | 
| 14 14 | 
             
              task.fail_on_error = false
         | 
| 15 | 
            -
              task.reek_opts     = '--quiet'
         | 
| 16 15 | 
             
            end
         | 
| 17 16 |  | 
| 18 17 | 
             
            RuboCop::RakeTask.new do |task|
         | 
    
        data/bin/lovely-rufus
    CHANGED
    
    
    
        data/config/reek.yml
    CHANGED
    
    | @@ -1,23 +1,23 @@ | |
| 1 1 | 
             
            DuplicateMethodCall:
         | 
| 2 2 | 
             
              exclude:
         | 
| 3 | 
            -
                - LovelyRufus::BasicWrapper#call
         | 
| 3 | 
            +
                - LovelyRufus::Layers::BasicWrapper#call
         | 
| 4 4 |  | 
| 5 5 | 
             
            FeatureEnvy:
         | 
| 6 6 | 
             
              exclude:
         | 
| 7 | 
            -
                - LovelyRufus::BasicWrapper#call
         | 
| 8 | 
            -
                - LovelyRufus::OneLetterGluer#call
         | 
| 9 | 
            -
                - LovelyRufus::QuoteStripper#quote
         | 
| 7 | 
            +
                - LovelyRufus::Layers::BasicWrapper#call
         | 
| 8 | 
            +
                - LovelyRufus::Layers::OneLetterGluer#call
         | 
| 9 | 
            +
                - LovelyRufus::Layers::QuoteStripper#quote
         | 
| 10 10 | 
             
                # https://github.com/troessner/reek/issues/53
         | 
| 11 | 
            -
                - LovelyRufus::HangoutWrapper::HangoutFinder
         | 
| 11 | 
            +
                - LovelyRufus::Layers::HangoutWrapper::HangoutFinder
         | 
| 12 12 |  | 
| 13 13 | 
             
            IrresponsibleModule:
         | 
| 14 14 | 
             
              enabled: false
         | 
| 15 15 |  | 
| 16 16 | 
             
            UncommunicativeVariableName:
         | 
| 17 17 | 
             
              exclude:
         | 
| 18 | 
            -
                - LovelyRufus::HangoutWrapper#hangout_line
         | 
| 18 | 
            +
                - LovelyRufus::Layers::HangoutWrapper#hangout_line
         | 
| 19 19 |  | 
| 20 20 | 
             
            UtilityFunction:
         | 
| 21 21 | 
             
              exclude:
         | 
| 22 22 | 
             
                # https://github.com/troessner/reek/issues/27
         | 
| 23 | 
            -
                - LovelyRufus::HangoutWrapper::HangoutFinder
         | 
| 23 | 
            +
                - LovelyRufus::Layers::HangoutWrapper::HangoutFinder
         | 
    
        data/lib/lovely_rufus.rb
    CHANGED
    
    | @@ -1,11 +1,14 @@ | |
| 1 | 
            +
            require 'private_attr'
         | 
| 2 | 
            +
            Class.include PrivateAttr
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require_relative 'lovely_rufus/text_wrapper'
         | 
| 5 | 
            +
             | 
| 1 6 | 
             
            module LovelyRufus
         | 
| 2 | 
            -
              NBSP | 
| 3 | 
            -
              QUOTES = /^([>\/#])(\1| )*/
         | 
| 7 | 
            +
              NBSP = "\u00A0"
         | 
| 4 8 |  | 
| 5 | 
            -
               | 
| 9 | 
            +
              module_function
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def wrap(text, text_wrapper: TextWrapper, width: 72)
         | 
| 6 12 | 
             
                text_wrapper.wrap(text, width: width)
         | 
| 7 13 | 
             
              end
         | 
| 8 14 | 
             
            end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            require_relative 'lovely_rufus/cli_wrapper'
         | 
| 11 | 
            -
            require_relative 'lovely_rufus/text_wrapper'
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require_relative '../wrap'
         | 
| 2 | 
            +
            require_relative 'layer'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module LovelyRufus
         | 
| 5 | 
            +
              module Layers
         | 
| 6 | 
            +
                class BasicWrapper < Layer
         | 
| 7 | 
            +
                  def call(wrap)
         | 
| 8 | 
            +
                    unwrapped = wrap.text.tr("\n", ' ').strip
         | 
| 9 | 
            +
                    wrapped   = unwrapped.gsub(/(.{1,#{wrap.width}})( |$\n?)/, "\\1\n")
         | 
| 10 | 
            +
                    next_layer.call(Wrap[wrapped, width: wrap.width])
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require_relative '../wrap'
         | 
| 2 | 
            +
            require_relative 'basic_wrapper'
         | 
| 3 | 
            +
            require_relative 'layer'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module LovelyRufus
         | 
| 6 | 
            +
              module Layers
         | 
| 7 | 
            +
                class HangoutWrapper < Layer
         | 
| 8 | 
            +
                  def call(wrap)
         | 
| 9 | 
            +
                    @wrap = wrap
         | 
| 10 | 
            +
                    final = hangout_line ? rewrapped : wrap
         | 
| 11 | 
            +
                    next_layer.call(final)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  private_attr_reader :wrap
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  module HangoutFinder
         | 
| 19 | 
            +
                    module_function
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    def between?(line_a, line_b)
         | 
| 22 | 
            +
                      last_space = line_a.chomp.rindex(/\p{space}/)
         | 
| 23 | 
            +
                      last_space and last_space >= line_b.chomp.size
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def reverse?(line_a, line_b)
         | 
| 27 | 
            +
                      cut = line_a.chomp.rindex(/\p{space}/)
         | 
| 28 | 
            +
                      a_after = line_a[0...cut] + "\n"
         | 
| 29 | 
            +
                      b_after = line_a[(cut + 1)..-1] + line_b
         | 
| 30 | 
            +
                      b_after.chomp.rindex(/\p{space}/) > a_after.size
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def hangout_line
         | 
| 35 | 
            +
                    lines.each_cons(2).with_index do |(a, b), i|
         | 
| 36 | 
            +
                      if HangoutFinder.between?(a, b)
         | 
| 37 | 
            +
                        return a unless i == lines.size - 2 and HangoutFinder.reverse?(a, b)
         | 
| 38 | 
            +
                      end
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def lines
         | 
| 43 | 
            +
                    @lines ||= wrap.lines
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def rewrapped
         | 
| 47 | 
            +
                    hangout_line[-1] = NBSP
         | 
| 48 | 
            +
                    HangoutWrapper.new.call(wrapped)
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  def wrapped
         | 
| 52 | 
            +
                    unfolded = Wrap[lines.join, width: wrap.width]
         | 
| 53 | 
            +
                    BasicWrapper.new.call(unfolded)
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module LovelyRufus
         | 
| 2 | 
            +
              module Layers
         | 
| 3 | 
            +
                class Layer
         | 
| 4 | 
            +
                  def initialize(next_layer = -> (wrap) { wrap })
         | 
| 5 | 
            +
                    @next_layer = next_layer
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def call(_wrap)
         | 
| 9 | 
            +
                    fail 'Layer subclasses must define #call that takes a Wrap'
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private_attr_reader :next_layer
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require_relative '../wrap'
         | 
| 2 | 
            +
            require_relative 'layer'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module LovelyRufus
         | 
| 5 | 
            +
              module Layers
         | 
| 6 | 
            +
                class OneLetterGluer < Layer
         | 
| 7 | 
            +
                  def call(wrap)
         | 
| 8 | 
            +
                    pattern = /(?<=\p{space})(&|\p{letter})\p{space}/
         | 
| 9 | 
            +
                    text    = wrap.text.gsub(pattern, "\\1\\2#{NBSP}")
         | 
| 10 | 
            +
                    next_layer.call(Wrap[text, width: wrap.width])
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require_relative '../wrap'
         | 
| 2 | 
            +
            require_relative 'layer'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module LovelyRufus
         | 
| 5 | 
            +
              module Layers
         | 
| 6 | 
            +
                class QuoteStripper < Layer
         | 
| 7 | 
            +
                  def call(wrap)
         | 
| 8 | 
            +
                    @wrap   = wrap
         | 
| 9 | 
            +
                    wrapped = next_layer.call(stripped_wrap)
         | 
| 10 | 
            +
                    quoted  = wrapped.lines.map { |line| fixed_quote + line }.join
         | 
| 11 | 
            +
                    Wrap[quoted, width: wrapped.width + fixed_quote.size]
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  private_attr_reader :wrap
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def quote
         | 
| 19 | 
            +
                    starts = wrap.lines.map { |line| line[self.class::QUOTES] }.uniq
         | 
| 20 | 
            +
                    starts.size == 1 ? starts.first || '' : ''
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def stripped_wrap
         | 
| 24 | 
            +
                    stripped_text = wrap.lines.map { |line| line[quote.size..-1] }.join
         | 
| 25 | 
            +
                    Wrap[stripped_text, width: wrap.width - fixed_quote.size]
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -1,11 +1,14 @@ | |
| 1 | 
            -
            require_relative 'basic_wrapper'
         | 
| 2 | 
            -
            require_relative ' | 
| 3 | 
            -
            require_relative ' | 
| 4 | 
            -
            require_relative ' | 
| 1 | 
            +
            require_relative 'layers/basic_wrapper'
         | 
| 2 | 
            +
            require_relative 'layers/code_comment_stripper'
         | 
| 3 | 
            +
            require_relative 'layers/email_quote_stripper'
         | 
| 4 | 
            +
            require_relative 'layers/hangout_wrapper'
         | 
| 5 | 
            +
            require_relative 'layers/one_letter_gluer'
         | 
| 5 6 | 
             
            require_relative 'wrap'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module LovelyRufus
         | 
| 8 9 | 
             
              class TextWrapper
         | 
| 10 | 
            +
                QUOTES = /^([>\/#])(\1| )*/
         | 
| 11 | 
            +
             | 
| 9 12 | 
             
                def self.wrap(text, width: 72)
         | 
| 10 13 | 
             
                  new(Wrap[text, width: width]).call
         | 
| 11 14 | 
             
                end
         | 
| @@ -20,13 +23,14 @@ module LovelyRufus | |
| 20 23 | 
             
                  end.join("\n")
         | 
| 21 24 | 
             
                end
         | 
| 22 25 |  | 
| 23 | 
            -
                 | 
| 24 | 
            -
                private     :wrap
         | 
| 26 | 
            +
                private_attr_reader :wrap
         | 
| 25 27 |  | 
| 26 28 | 
             
                private
         | 
| 27 29 |  | 
| 28 30 | 
             
                def chain
         | 
| 29 | 
            -
                  layers = [ | 
| 31 | 
            +
                  layers = [Layers::CodeCommentStripper, Layers::EmailQuoteStripper,
         | 
| 32 | 
            +
                            Layers::OneLetterGluer, Layers::BasicWrapper,
         | 
| 33 | 
            +
                            Layers::HangoutWrapper]
         | 
| 30 34 | 
             
                  identity = -> (wrap) { wrap }
         | 
| 31 35 | 
             
                  layers.reverse.reduce(identity) { |inner, outer| outer.new(inner) }
         | 
| 32 36 | 
             
                end
         |