nuggets 1.4.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/ChangeLog +14 -0
- data/README +4 -4
- data/lib/nuggets/array/format.rb +1 -1
- data/lib/nuggets/array/histogram_mixin.rb +4 -4
- data/lib/nuggets/file/sub_mixin.rb +8 -8
- data/lib/nuggets/hash/in_order.rb +2 -2
- data/lib/nuggets/hash/nest_mixin.rb +5 -9
- data/lib/nuggets/hash/unroll_mixin.rb +4 -4
- data/lib/nuggets/io/modes.rb +15 -15
- data/lib/nuggets/io/redirect_mixin.rb +2 -4
- data/lib/nuggets/json/canonical.rb +5 -0
- data/lib/nuggets/{io/null_mixin.rb → json/canonical_mixin.rb} +31 -12
- data/lib/nuggets/json/multi.rb +5 -0
- data/lib/nuggets/json/multi_mixin.rb +71 -0
- data/lib/nuggets/log_parser/rails.rb +18 -18
- data/lib/nuggets/string/format.rb +5 -0
- data/lib/nuggets/string/format_mixin.rb +59 -0
- data/lib/nuggets/string/highlight.rb +5 -0
- data/lib/nuggets/string/highlight_mixin.rb +62 -0
- data/lib/nuggets/version.rb +2 -2
- data/spec/nuggets/array/format_spec.rb +2 -1
- data/spec/nuggets/enumerable/minmax_spec.rb +2 -2
- data/spec/nuggets/env/set_spec.rb +2 -2
- data/spec/nuggets/env/user_home_spec.rb +1 -21
- data/spec/nuggets/hash/at_spec.rb +1 -1
- data/spec/nuggets/hash/deep_fetch_spec.rb +1 -1
- data/spec/nuggets/hash/deep_merge_spec.rb +16 -16
- data/spec/nuggets/hash/seen_spec.rb +1 -1
- data/spec/nuggets/hash/unroll_spec.rb +6 -18
- data/spec/nuggets/json/canonical_spec.rb +74 -0
- data/spec/nuggets/json/multi_spec.rb +67 -0
- data/spec/nuggets/object/blank_spec.rb +2 -2
- data/spec/nuggets/object/singleton_class_spec.rb +3 -2
- data/spec/nuggets/string/format_spec.rb +85 -0
- data/spec/nuggets/string/highlight_spec.rb +47 -0
- metadata +25 -16
- data/lib/nuggets/io/null.rb +0 -5
@@ -0,0 +1,62 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# nuggets -- Extending Ruby #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2007-2016 Jens Wille #
|
7
|
+
# #
|
8
|
+
# Authors: #
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
10
|
+
# #
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
14
|
+
# any later version. #
|
15
|
+
# #
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
19
|
+
# more details. #
|
20
|
+
# #
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
23
|
+
# #
|
24
|
+
###############################################################################
|
25
|
+
#++
|
26
|
+
|
27
|
+
module Nuggets
|
28
|
+
class String
|
29
|
+
module HighlightMixin
|
30
|
+
|
31
|
+
# call-seq:
|
32
|
+
# str.highlight(needle[, prefix[, postfix]]) => new_string
|
33
|
+
#
|
34
|
+
# Highlight occurrences of +needle+ (String(s) and/or Regexp(s))
|
35
|
+
# in _str_ by surrounding them with +prefix+ and +postfix+.
|
36
|
+
def highlight(needle, prefix = '|', postfix = prefix)
|
37
|
+
offsets = []
|
38
|
+
|
39
|
+
Array(needle).each { |arg|
|
40
|
+
while index = index(arg, index || 0)
|
41
|
+
offsets << [index, index += ($& || arg).length]
|
42
|
+
end
|
43
|
+
}
|
44
|
+
|
45
|
+
flattened = [current = offsets.sort!.shift]
|
46
|
+
|
47
|
+
offsets.each { |offset|
|
48
|
+
i1, j1 = current
|
49
|
+
i2, j2 = offset
|
50
|
+
|
51
|
+
i2 > j1 ? flattened << current = offset :
|
52
|
+
j2 > j1 ? current[-1] = j2 : nil
|
53
|
+
}
|
54
|
+
|
55
|
+
dup.tap { |result| flattened.reverse_each { |i, j|
|
56
|
+
result.insert(j, postfix).insert(i, prefix)
|
57
|
+
} }
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/nuggets/version.rb
CHANGED
@@ -3,6 +3,7 @@ require 'nuggets/array/format'
|
|
3
3
|
describe Array, 'format' do
|
4
4
|
|
5
5
|
def self.test_format(*f)
|
6
|
+
return if RUBY_ENGINE == 'jruby' && JRUBY_VERSION.include?('pre')
|
6
7
|
f.pop.each { |x, y| example { (f.dup % x).should == y } }
|
7
8
|
end
|
8
9
|
|
@@ -30,7 +31,7 @@ describe Array, 'format' do
|
|
30
31
|
['', '', '' ] => ''
|
31
32
|
)
|
32
33
|
|
33
|
-
test_format({ :
|
34
|
+
test_format({ sep: ':' },
|
34
35
|
['1', '2', '3', '4'] => '1:2:3:4',
|
35
36
|
['1', '2', '3', '' ] => '1:2:3',
|
36
37
|
['1', '2', '', '4'] => '1:2:4',
|
@@ -7,7 +7,7 @@ describe Enumerable, 'minmax' do
|
|
7
7
|
|
8
8
|
e.max.should == 'quux'
|
9
9
|
e.max_by(:length).should == 'quuux'
|
10
|
-
e.max(:length).should == 5
|
10
|
+
e.max(:length).should == 5 if RUBY_VERSION < '2.4' && RUBY_ENGINE != 'jruby'
|
11
11
|
}
|
12
12
|
|
13
13
|
example {
|
@@ -15,7 +15,7 @@ describe Enumerable, 'minmax' do
|
|
15
15
|
|
16
16
|
e.max.should == 222
|
17
17
|
e.max_by(b).should == 45
|
18
|
-
e.max(b).should == 5
|
18
|
+
e.max(b).should == 5 if RUBY_VERSION < '2.4' && RUBY_ENGINE != 'jruby'
|
19
19
|
}
|
20
20
|
|
21
21
|
end
|
@@ -12,12 +12,12 @@ describe_extended ENV, Nuggets::Env::SetMixin, true do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
example do
|
15
|
-
ENV.with(:
|
15
|
+
ENV.with(lang: 'C') { ENV['LANG'].should == 'C' }
|
16
16
|
ENV['LANG'].should == @original['LANG']
|
17
17
|
end
|
18
18
|
|
19
19
|
example do
|
20
|
-
ENV.set(:
|
20
|
+
ENV.set(lang: 'C').to_hash.should == @original
|
21
21
|
ENV.to_hash.should == { 'LANG' => 'C' }
|
22
22
|
end
|
23
23
|
|
@@ -7,36 +7,16 @@ describe_extended ENV, Nuggets::Env::UserHomeMixin, true do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
after do
|
10
|
-
ENV.clear
|
11
|
-
ENV.update(@old_env)
|
10
|
+
ENV.clear.update(@old_env)
|
12
11
|
end
|
13
12
|
|
14
13
|
example do
|
15
14
|
ENV.user_home.should be_an_instance_of(String)
|
16
15
|
end
|
17
16
|
|
18
|
-
example do
|
19
|
-
ENV.clear
|
20
|
-
ENV.user_home.should be_an_instance_of(String)
|
21
|
-
end
|
22
|
-
|
23
17
|
example do
|
24
18
|
ENV['HOME'] = 'foo'
|
25
19
|
ENV.user_home.should == 'foo'
|
26
20
|
end
|
27
21
|
|
28
|
-
unless RUBY_ENGINE == 'jruby'
|
29
|
-
|
30
|
-
example do
|
31
|
-
ENV.clear
|
32
|
-
ENV.user_home('bar').should == 'bar'
|
33
|
-
end
|
34
|
-
|
35
|
-
example do
|
36
|
-
ENV.clear
|
37
|
-
ENV.user_home(nil).should be_nil
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
22
|
end
|
@@ -54,7 +54,7 @@ describe_extended Hash, Nuggets::Hash::DeepFetchMixin do
|
|
54
54
|
|
55
55
|
context do
|
56
56
|
|
57
|
-
let(:hash) { { :
|
57
|
+
let(:hash) { { foo: { bar: { baz: 42 } } } }
|
58
58
|
|
59
59
|
example do
|
60
60
|
lambda { hash.deep_fetch('foo/bar/baz') }.should raise_error(KeyError)
|
@@ -3,58 +3,58 @@ require 'nuggets/hash/deep_merge'
|
|
3
3
|
describe_extended Hash, Nuggets::Hash::DeepMergeMixin do
|
4
4
|
|
5
5
|
example do
|
6
|
-
{ :
|
6
|
+
{ a: 1 }.deep_merge(a: 2).should == { a: 2 }
|
7
7
|
end
|
8
8
|
|
9
9
|
example do
|
10
|
-
{ :
|
10
|
+
{ a: 1 }.deep_merge(b: 2).should == { a: 1, b: 2 }
|
11
11
|
end
|
12
12
|
|
13
13
|
example do
|
14
|
-
{ :
|
14
|
+
{ a: { b: 1 } }.deep_merge(b: 2).should == { a: { b: 1 }, b: 2 }
|
15
15
|
end
|
16
16
|
|
17
17
|
example do
|
18
|
-
{ :
|
18
|
+
{ a: { b: 1 } }.deep_merge(a: { b: 2 }).should == { a: { b: 2 } }
|
19
19
|
end
|
20
20
|
|
21
21
|
example do
|
22
|
-
lambda { { :
|
22
|
+
lambda { { a: { b: { c: 1 } } }.deep_merge(a: { b: 2 }) }.should raise_error(TypeError)
|
23
23
|
end
|
24
24
|
|
25
25
|
example do
|
26
|
-
{ :
|
26
|
+
{ a: { b: { c: 1 } } }.deep_merge(a: { b: { c: 2 } }).should == { a: { b: { c: 2 } } }
|
27
27
|
end
|
28
28
|
|
29
29
|
example do
|
30
|
-
{ :
|
30
|
+
{ a: { b: { c: 1 } } }.deep_merge(a: { b: { d: 2 } }).should == { a: { b: { c: 1, d: 2 } } }
|
31
31
|
end
|
32
32
|
|
33
33
|
example do
|
34
|
-
{ :
|
34
|
+
{ a: { b: { c: 1 } } }.deep_merge(a: { b: { c: 2 }, d: 3 }).should == { a: { b: { c: 2 }, d: 3 } }
|
35
35
|
end
|
36
36
|
|
37
37
|
example do
|
38
|
-
{ :
|
38
|
+
{ a: { b: { c: 1 }, d: 2 } }.deep_merge(a: { b: { c: 2 }, d: 3 }).should == { a: { b: { c: 2 }, d: 3 } }
|
39
39
|
end
|
40
40
|
|
41
41
|
example do
|
42
|
-
{ :
|
42
|
+
{ a: { b: { c: 1 }, d: 2 }, e: 3 }.deep_merge(a: { b: { c: 2 }, d: 3 }).should == { a: { b: { c: 2 }, d: 3 }, e: 3 }
|
43
43
|
end
|
44
44
|
|
45
45
|
example do
|
46
|
-
{ :
|
46
|
+
{ a: { b: { c: 1 } }, d: { e: 3 } }.deep_merge(a: { b: { c: 2 } }, d: { e: 4 }).should == { a: { b: { c: 2 } }, d: { e: 4 } }
|
47
47
|
end
|
48
48
|
|
49
49
|
context do
|
50
50
|
|
51
51
|
before :each do
|
52
|
-
@sub_hash1 = { :
|
53
|
-
@sub_hash2 = { :
|
52
|
+
@sub_hash1 = { b: 1 }
|
53
|
+
@sub_hash2 = { b: 2 }
|
54
54
|
|
55
|
-
@hash1 = { :
|
56
|
-
@hash2 = { :
|
57
|
-
@hash3 = { :
|
55
|
+
@hash1 = { a: @sub_hash1 }
|
56
|
+
@hash2 = { a: @sub_hash2 }
|
57
|
+
@hash3 = { a: { b: 2} }
|
58
58
|
end
|
59
59
|
|
60
60
|
example do
|
@@ -18,12 +18,12 @@ describe_extended Hash, Nuggets::Hash::UnrollMixin do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
example do
|
21
|
-
hash = { :
|
21
|
+
hash = { a: { b: 1 } }
|
22
22
|
hash.unroll.should == [[:a, 1]]
|
23
23
|
end
|
24
24
|
|
25
25
|
example do
|
26
|
-
hash = { :
|
26
|
+
hash = { a: { b: 1, c: 2 } }
|
27
27
|
|
28
28
|
result = hash.unroll.first
|
29
29
|
result.size.should == 3
|
@@ -33,36 +33,24 @@ describe_extended Hash, Nuggets::Hash::UnrollMixin do
|
|
33
33
|
result.should include(2)
|
34
34
|
end
|
35
35
|
|
36
|
-
if RUBY_VERSION < '1.9'
|
37
|
-
example do
|
38
|
-
hash = { :a => { :b => 1, :c => 2 } }
|
39
|
-
lambda { hash.unroll(:sort => true) }.should raise_error(NoMethodError, /<=>/)
|
40
|
-
end
|
41
|
-
|
42
|
-
example do
|
43
|
-
hash = { :a => { :b => 1, :c => 2 } }
|
44
|
-
lambda { hash.unroll(:sort_by => lambda { |h| h.to_s }) }.should_not raise_error(NoMethodError)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
36
|
example do
|
49
37
|
hash = { 'a' => { 'b' => 1, 'c' => 2 } }
|
50
|
-
hash.unroll(:
|
38
|
+
hash.unroll(sort: true).should == [['a', 1, 2]]
|
51
39
|
end
|
52
40
|
|
53
41
|
example do
|
54
42
|
hash = { 'a' => { 'b' => 1, 'c' => 2 }, 'd' => { 'b' => 0, 'c' => 3 } }
|
55
|
-
hash.unroll('b', 'c', :
|
43
|
+
hash.unroll('b', 'c', sort: true).should == [['a', 1, 2], ['d', 0, 3]]
|
56
44
|
end
|
57
45
|
|
58
46
|
example do
|
59
47
|
hash = { 'z' => { 'a' => { 'b' => 1, 'c' => 2 }, 'd' => { 'b' => 0, 'c' => 3 } } }
|
60
|
-
hash.unroll('b', :
|
48
|
+
hash.unroll('b', sort_by: lambda { |h| h.to_s }).should == [['z', 'a', 1], ['z', 'd', 0]]
|
61
49
|
end
|
62
50
|
|
63
51
|
example do
|
64
52
|
hash = { 'z' => { 'a' => { 'b' => 1, 'c' => 2 }, 'd' => { 'b' => 0, 'c' => 3 } } }
|
65
|
-
hash.unroll(:
|
53
|
+
hash.unroll(sort: true) { |h| h['b'] = nil; h['c'] *= 2 }.should == [['z', 'a', nil, 4], ['z', 'd', nil, 6]]
|
66
54
|
end
|
67
55
|
|
68
56
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'nuggets/json/canonical'
|
2
|
+
require 'nuggets/json/multi'
|
3
|
+
|
4
|
+
describe_extended JSON, Nuggets::JSON::CanonicalMixin, true do
|
5
|
+
|
6
|
+
let(:source) { '{"a":1,"b":[42,23],"a":{"b":2,"a":[3,5,4]}}' }
|
7
|
+
|
8
|
+
subject { JSON.parse(source) }
|
9
|
+
|
10
|
+
describe 'plain' do
|
11
|
+
|
12
|
+
example { expect(JSON.generate(subject)).to eq('{"a":{"b":2,"a":[3,5,4]},"b":[42,23]}') }
|
13
|
+
|
14
|
+
example { expect(JSON.pretty_generate(subject)).to eq(<<-EOT.chomp) }
|
15
|
+
{
|
16
|
+
"a": {
|
17
|
+
"b": 2,
|
18
|
+
"a": [
|
19
|
+
3,
|
20
|
+
5,
|
21
|
+
4
|
22
|
+
]
|
23
|
+
},
|
24
|
+
"b": [
|
25
|
+
42,
|
26
|
+
23
|
27
|
+
]
|
28
|
+
}
|
29
|
+
EOT
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'canonical' do
|
34
|
+
|
35
|
+
example { expect(JSON.generate_canonical(subject)).to eq('{"a":{"a":[3,4,5],"b":2},"b":[23,42]}') }
|
36
|
+
|
37
|
+
example { expect(JSON.pretty_generate_canonical(subject)).to eq(<<-EOT.chomp) }
|
38
|
+
{
|
39
|
+
"a": {
|
40
|
+
"a": [
|
41
|
+
3,
|
42
|
+
4,
|
43
|
+
5
|
44
|
+
],
|
45
|
+
"b": 2
|
46
|
+
},
|
47
|
+
"b": [
|
48
|
+
23,
|
49
|
+
42
|
50
|
+
]
|
51
|
+
}
|
52
|
+
EOT
|
53
|
+
|
54
|
+
example { expect(JSON.pretty_print_canonical(source)).to eq(<<-EOT.chomp) }
|
55
|
+
{
|
56
|
+
"a": 1,
|
57
|
+
"a": {
|
58
|
+
"a": [
|
59
|
+
3,
|
60
|
+
4,
|
61
|
+
5
|
62
|
+
],
|
63
|
+
"b": 2
|
64
|
+
},
|
65
|
+
"b": [
|
66
|
+
23,
|
67
|
+
42
|
68
|
+
]
|
69
|
+
}
|
70
|
+
EOT
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'nuggets/json/multi'
|
2
|
+
|
3
|
+
describe_extended JSON, Nuggets::JSON::MultiMixin, true do
|
4
|
+
|
5
|
+
let(:source) { '{"a":1,"b":[42,23],"a":{"b":2}}' }
|
6
|
+
|
7
|
+
describe 'plain' do
|
8
|
+
|
9
|
+
subject { JSON.parse(source) }
|
10
|
+
|
11
|
+
example { expect(subject).to be_a(Hash) }
|
12
|
+
example { expect(subject.size).to eq(2) }
|
13
|
+
example { expect(subject.keys).to eq(%w[a b]) }
|
14
|
+
|
15
|
+
example { expect(subject['a']).to eq('b' => 2) }
|
16
|
+
example { expect(subject['b']).to eq([42, 23]) }
|
17
|
+
|
18
|
+
example { expect(JSON.pretty_generate(subject)).to eq(<<-EOT.chomp) }
|
19
|
+
{
|
20
|
+
"a": {
|
21
|
+
"b": 2
|
22
|
+
},
|
23
|
+
"b": [
|
24
|
+
42,
|
25
|
+
23
|
26
|
+
]
|
27
|
+
}
|
28
|
+
EOT
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'multi' do
|
33
|
+
|
34
|
+
subject { JSON.parse_multi(source) }
|
35
|
+
|
36
|
+
let(:multi) { subject.fetch_multi('a') }
|
37
|
+
|
38
|
+
let(:pretty) { <<-EOT.chomp }
|
39
|
+
{
|
40
|
+
"a": 1,
|
41
|
+
"b": [
|
42
|
+
42,
|
43
|
+
23
|
44
|
+
],
|
45
|
+
"a": {
|
46
|
+
"b": 2
|
47
|
+
}
|
48
|
+
}
|
49
|
+
EOT
|
50
|
+
|
51
|
+
example { expect(subject).to be_a(Hash) }
|
52
|
+
example { expect(subject.size).to eq(3) }
|
53
|
+
example { expect(subject.keys).to eq(%w[a b a]) }
|
54
|
+
|
55
|
+
example { expect(subject['a']).to eq(1) } unless RUBY_ENGINE == 'jruby'
|
56
|
+
example { expect(subject['b']).to eq([42, 23]) }
|
57
|
+
|
58
|
+
example { expect(multi[0]).to eq(1) }
|
59
|
+
example { expect(multi[1]).to be_a(Hash) }
|
60
|
+
example { expect(multi[1]['b']).to eq(2) }
|
61
|
+
|
62
|
+
example { expect(JSON.pretty_generate(subject)).to eq(pretty) }
|
63
|
+
example { expect(JSON.pretty_print_multi(source)).to eq(pretty) }
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -23,11 +23,11 @@ describe_extended Object, Nuggets::Object::BlankMixin do
|
|
23
23
|
example { o.should be_vain }
|
24
24
|
}
|
25
25
|
|
26
|
-
[['', [], [nil], {}], { :
|
26
|
+
[['', [], [nil], {}], { x: nil, y: [], z: { zz: nil } }].each { |o|
|
27
27
|
example { o.should_not be_void }
|
28
28
|
}
|
29
29
|
|
30
|
-
[['', [], [nil], {}], { :
|
30
|
+
[['', [], [nil], {}], { x: nil, y: [], z: { zz: nil } }].each { |o|
|
31
31
|
example { o.should be_vain }
|
32
32
|
}
|
33
33
|
|
@@ -2,12 +2,13 @@ require 'nuggets/object/singleton_class'
|
|
2
2
|
|
3
3
|
describe_extended Object, Nuggets::Object::SingletonClassMixin do
|
4
4
|
|
5
|
-
objects = [Class, Object.new, Class.new, 's', [1, 2], { :
|
5
|
+
objects = [Class, Object.new, Class.new, 's', [1, 2], { a: 'b' }]
|
6
6
|
objects.unshift(Object) unless %w[jruby rbx].include?(RUBY_ENGINE)
|
7
7
|
|
8
8
|
objects.each { |o|
|
9
9
|
example { o.should_not be_a_singleton_class }
|
10
|
-
example
|
10
|
+
example(nil, if: o != Object || RUBY_VERSION < '2.3') {
|
11
|
+
lambda { o.singleton_object }.should raise_error(TypeError) }
|
11
12
|
|
12
13
|
s = o.singleton_class
|
13
14
|
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'nuggets/string/format'
|
2
|
+
|
3
|
+
describe_extended String, Nuggets::String::FormatMixin do
|
4
|
+
|
5
|
+
example do
|
6
|
+
expect{'a%bc'.format}.to raise_error(ArgumentError, 'wrong number of arguments (given 0, expected 1)')
|
7
|
+
end
|
8
|
+
|
9
|
+
example do
|
10
|
+
expect('a%bc'.format('b' => 'foo')).to eq('afooc')
|
11
|
+
end
|
12
|
+
|
13
|
+
example do
|
14
|
+
expect('a%bc'.format(b: 'foo')).to eq('afooc')
|
15
|
+
end
|
16
|
+
|
17
|
+
example do
|
18
|
+
expect('a%bc'.format(b: :foo)).to eq('afooc')
|
19
|
+
end
|
20
|
+
|
21
|
+
example do
|
22
|
+
expect('a%bc'.format(b: 42)).to eq('a42c')
|
23
|
+
end
|
24
|
+
|
25
|
+
example do
|
26
|
+
expect('a%bc'.format(b: '')).to eq('ac')
|
27
|
+
end
|
28
|
+
|
29
|
+
example do
|
30
|
+
expect('a%bc'.format(b: nil)).to eq('ac')
|
31
|
+
end
|
32
|
+
|
33
|
+
example do
|
34
|
+
expect('a%{foo}c'.format('foo' => 'bar')).to eq('abarc')
|
35
|
+
end
|
36
|
+
|
37
|
+
example do
|
38
|
+
expect('a%{foo}c'.format(foo: 'bar')).to eq('abarc')
|
39
|
+
end
|
40
|
+
|
41
|
+
example do
|
42
|
+
expect('a%{foo}c'.format(foo: :bar)).to eq('abarc')
|
43
|
+
end
|
44
|
+
|
45
|
+
example do
|
46
|
+
expect(''.format({})).to eq('')
|
47
|
+
end
|
48
|
+
|
49
|
+
example do
|
50
|
+
expect('%'.format({})).to eq('%')
|
51
|
+
end
|
52
|
+
|
53
|
+
example do
|
54
|
+
expect('%%'.format({})).to eq('%')
|
55
|
+
end
|
56
|
+
|
57
|
+
example do
|
58
|
+
expect{'%a'.format({})}.to raise_error(KeyError, 'key not found: a')
|
59
|
+
end
|
60
|
+
|
61
|
+
example do
|
62
|
+
expect{'%a'.format('b' => 'foo')}.to raise_error(KeyError, 'key not found: a')
|
63
|
+
end
|
64
|
+
|
65
|
+
example do
|
66
|
+
expect{'%a'.format(Hash.new(42))}.to raise_error(KeyError, 'key not found: a')
|
67
|
+
end
|
68
|
+
|
69
|
+
example do
|
70
|
+
expect('a%bc'.format(&:upcase)).to eq('aBc')
|
71
|
+
end
|
72
|
+
|
73
|
+
example do
|
74
|
+
expect('a%bc'.format{''}).to eq('ac')
|
75
|
+
end
|
76
|
+
|
77
|
+
example do
|
78
|
+
expect{'a%bc'.format{}}.to raise_error(ArgumentError, 'malformed format string - %b')
|
79
|
+
end
|
80
|
+
|
81
|
+
example do
|
82
|
+
expect('a%bc%d%{foo}%%{baz}'.format(b: 42, d: 'D', 'foo' => :bar)).to eq('a42cDbar%{baz}')
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'nuggets/string/highlight'
|
2
|
+
|
3
|
+
describe_extended String, Nuggets::String::HighlightMixin do
|
4
|
+
|
5
|
+
unless RUBY_ENGINE == 'jruby' && JRUBY_VERSION.include?('pre')
|
6
|
+
|
7
|
+
example do
|
8
|
+
s = 'lingo go do the go go'; t = s.dup
|
9
|
+
expect(s.highlight('lingo')).to eq('|lingo| go do the go go')
|
10
|
+
expect(s).to eq(t)
|
11
|
+
|
12
|
+
expect(s.highlight(/lingo/)).to eq('|lingo| go do the go go')
|
13
|
+
expect(s.highlight(/l.*ngo?/)).to eq('|lingo| go do the go go')
|
14
|
+
|
15
|
+
q = ['lingo', 'go', 'go go']
|
16
|
+
expect(s.highlight(q)).to eq('|lingo go| do the |go go|')
|
17
|
+
end
|
18
|
+
|
19
|
+
example do
|
20
|
+
s = 'lingö go do the go go'
|
21
|
+
q = ['lingö', 'go', 'go go']
|
22
|
+
expect(s.highlight(q)).to eq('|lingö| |go| do the |go go|')
|
23
|
+
end
|
24
|
+
|
25
|
+
example do
|
26
|
+
s = 'lingo go do the go go'
|
27
|
+
q = ['lingo', 'go', 'go go']
|
28
|
+
expect(s.highlight(q, '^')).to eq('^lingo go^ do the ^go go^')
|
29
|
+
expect(s.highlight(q, '<', '>')).to eq('<lingo go> do the <go go>')
|
30
|
+
expect(s.highlight(q, '<i>', '</i>')).to eq('<i>lingo go</i> do the <i>go go</i>')
|
31
|
+
end
|
32
|
+
|
33
|
+
example do
|
34
|
+
s = 'The fox went out on a chilly night'
|
35
|
+
q = [/[eo]n/]
|
36
|
+
expect(s.highlight(q)).to eq('The fox w|en|t out |on| a chilly night')
|
37
|
+
q << 'went'
|
38
|
+
expect(s.highlight(q)).to eq('The fox |went| out |on| a chilly night')
|
39
|
+
q << /ou.*a/
|
40
|
+
expect(s.highlight(q)).to eq('The fox |went| |out on a| chilly night')
|
41
|
+
q << 'went out'
|
42
|
+
expect(s.highlight(q)).to eq('The fox |went out on a| chilly night')
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|