lovely_rufus 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|