darthjee-core_ext 1.7.3 → 1.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +19 -8
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +7 -3
- data/Dockerfile +9 -0
- data/README.md +5 -6
- data/Rakefile +2 -0
- data/config/yardstick.rb +13 -0
- data/config/yardstick.yml +35 -0
- data/core_ext.gemspec +9 -7
- data/docker-compose.yml +3 -6
- data/lib/darthjee/core_ext/array.rb +2 -2
- data/lib/darthjee/core_ext/class.rb +90 -4
- data/lib/darthjee/core_ext/enumerable.rb +5 -1
- data/lib/darthjee/core_ext/hash.rb +30 -0
- data/lib/darthjee/core_ext/hash/cameliazable.rb +91 -0
- data/lib/darthjee/core_ext/hash/chain_fetcher.rb +10 -0
- data/lib/darthjee/core_ext/hash/key_changeable.rb +85 -53
- data/lib/darthjee/core_ext/hash/key_changer.rb +41 -31
- data/lib/darthjee/core_ext/hash/value_changer.rb +128 -11
- data/lib/darthjee/core_ext/version.rb +1 -1
- data/spec/integration/yard/{array → darthjee/core_ext/array}/hash_builder_spec.rb +3 -3
- data/spec/integration/yard/{array_spec.rb → darthjee/core_ext/array_spec.rb} +0 -0
- data/spec/integration/yard/darthjee/core_ext/class/default_value_spec.rb +143 -0
- data/spec/integration/yard/{date → darthjee/core_ext/date}/days_between_spec.rb +6 -6
- data/spec/integration/yard/{enumerable_spec.rb → darthjee/core_ext/enumerable_spec.rb} +0 -0
- data/spec/integration/yard/darthjee/core_ext/hash/cameliazable_spec.rb +34 -0
- data/spec/integration/yard/darthjee/core_ext/hash/chain_fetcher_spec.rb +51 -0
- data/spec/integration/yard/darthjee/core_ext/hash/key_changeable_spec.rb +48 -0
- data/spec/integration/yard/{hash → darthjee/core_ext/hash}/transformable_spec.rb +7 -3
- data/spec/integration/yard/darthjee/core_ext/hash/value_changer_spec.rb +66 -0
- data/spec/integration/yard/darthjee/core_ext/hash_spec.rb +42 -0
- data/spec/lib/array_spec.rb +27 -17
- data/spec/lib/class_spec.rb +108 -7
- data/spec/lib/darthjee/core_ext/hash/deep_hash_constructor_spec.rb +1 -1
- data/spec/lib/darthjee/core_ext/hash/key_changer_spec.rb +8 -8
- data/spec/lib/darthjee/core_ext/hash/keys_sorter_spec.rb +1 -0
- data/spec/lib/darthjee/core_ext/hash/to_hash_mapper_spec.rb +1 -0
- data/spec/lib/darthjee/core_ext/hash/value_changer_spec.rb +246 -0
- data/spec/lib/date_spec.rb +5 -4
- data/spec/lib/hash_spec.rb +45 -32
- data/spec/lib/math_spec.rb +1 -0
- data/spec/lib/numeric_spec.rb +39 -17
- data/spec/lib/object_spec.rb +7 -7
- data/spec/lib/symbol_spec.rb +2 -2
- data/spec/lib/time_spec.rb +5 -4
- data/spec/support/models/default_reader_model.rb +8 -0
- data/spec/support/models/default_value_model.rb +2 -0
- data/spec/support/models/dummy_iterator.rb +15 -0
- data/spec/support/models/dummy_transformer.rb +15 -0
- data/spec/support/shared_examples/array/array_random.rb +2 -1
- data/spec/support/shared_examples/clean.rb +20 -20
- data/spec/support/shared_examples/date.rb +18 -13
- data/spec/support/shared_examples/hash/chain_fetch.rb +4 -3
- data/spec/support/shared_examples/hash/chain_hash_keys_changer.rb +14 -7
- data/spec/support/shared_examples/hash/hash_keys_changer.rb +10 -4
- data/spec/support/shared_examples/hash/hash_transpose.rb +1 -1
- data/spec/support/shared_examples/hash/keys_appender.rb +14 -4
- data/spec/support/shared_examples/hash/keys_camelizer.rb +7 -7
- data/spec/support/shared_examples/hash/keys_sorter.rb +3 -3
- data/spec/support/shared_examples/hash/keys_underscorer.rb +2 -2
- data/spec/support/shared_examples/hash/map_to_hash.rb +14 -12
- data/spec/support/shared_examples/hash/remap.rb +4 -4
- data/spec/support/shared_examples/hash/value_changer.rb +40 -33
- metadata +70 -20
- data/spec/integration/yard/class/default_value_spec.rb +0 -58
@@ -5,13 +5,13 @@ require 'spec_helper'
|
|
5
5
|
describe Darthjee::CoreExt::Array::HashBuilder do
|
6
6
|
describe 'yard' do
|
7
7
|
describe '#build' do
|
8
|
-
subject { described_class.new(values, keys) }
|
8
|
+
subject(:builder) { described_class.new(values, keys) }
|
9
9
|
|
10
10
|
let(:values) { [10, 20, 30] }
|
11
11
|
let(:keys) { %i[a b c] }
|
12
12
|
|
13
13
|
it 'builds a hash pairing the keys and values' do
|
14
|
-
expect(
|
14
|
+
expect(builder.build).to eq(
|
15
15
|
a: 10, b: 20, c: 30
|
16
16
|
)
|
17
17
|
end
|
@@ -22,7 +22,7 @@ describe Darthjee::CoreExt::Array::HashBuilder do
|
|
22
22
|
let(:keys) { hash.keys }
|
23
23
|
|
24
24
|
it 'rebuilds the original hash' do
|
25
|
-
expect(
|
25
|
+
expect(builder.build).to eq(hash)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
File without changes
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Class do
|
6
|
+
describe 'yard' do
|
7
|
+
subject(:instance) { klass.new }
|
8
|
+
|
9
|
+
describe '#default_value' do
|
10
|
+
let(:klass) do
|
11
|
+
Class.new do
|
12
|
+
default_value :name, 'John'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when calling method' do
|
17
|
+
it 'returns the same value always' do
|
18
|
+
expect(instance.name).to eq('John')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns the same instance accros instances of the class' do
|
22
|
+
expect(instance.name).not_to be_equal('John')
|
23
|
+
expect(instance.name).to be_equal(klass.new.name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#default_values' do
|
29
|
+
let(:klass) do
|
30
|
+
Class.new do
|
31
|
+
default_values :name, :nick_name, 'John'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when calling method' do
|
36
|
+
it 'returns the same value always for first method' do
|
37
|
+
expect(instance.name).to eq('John')
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'returns the same value always for second method' do
|
41
|
+
expect(instance.nick_name).to eq('John')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns the same instance accros instances of the class' do
|
45
|
+
expect(instance.name).not_to be_equal('John')
|
46
|
+
expect(instance.name).to be_equal(klass.new.name)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns the same instance for all methods' do
|
50
|
+
expect(instance.nick_name).not_to be_equal('John')
|
51
|
+
expect(instance.name).to be_equal(instance.nick_name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#default_reader' do
|
57
|
+
let(:klass) do
|
58
|
+
Class.new do
|
59
|
+
attr_writer :name
|
60
|
+
default_reader :name, 'John Doe'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when calling method' do
|
65
|
+
it 'returns the default value' do
|
66
|
+
expect(instance.name).to eq('John Doe')
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when setting the variable' do
|
70
|
+
before { instance.name = 'Joe' }
|
71
|
+
|
72
|
+
it 'returns the new value' do
|
73
|
+
expect(instance.name).to eq('Joe')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when setting the variable to be nil' do
|
78
|
+
before { instance.name = nil }
|
79
|
+
|
80
|
+
it 'returns nil' do
|
81
|
+
expect(instance.name).to be_nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when setting a variable in one instance' do
|
86
|
+
before { klass.new.name = 'Bob' }
|
87
|
+
|
88
|
+
it 'does not change the value in the other' do
|
89
|
+
expect(instance.name).to eq('John Doe')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '.default_readers' do
|
96
|
+
let(:klass) do
|
97
|
+
Class.new do
|
98
|
+
attr_writer :cars, :houses
|
99
|
+
default_readers :cars, :houses, 'none'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when calling first method' do
|
104
|
+
it 'returns the default value' do
|
105
|
+
expect(instance.cars).to eq('none')
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when setting the variable' do
|
109
|
+
before { instance.cars = ['volvo'] }
|
110
|
+
|
111
|
+
it 'returns the new value' do
|
112
|
+
expect(instance.cars).to eq(['volvo'])
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'does not change the value of the second method' do
|
116
|
+
expect(instance.houses).to eq('none')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'when setting the variable to be nil' do
|
121
|
+
before { instance.cars = nil }
|
122
|
+
|
123
|
+
it 'returns nil' do
|
124
|
+
expect(instance.cars).to be_nil
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when setting a variable in one instance' do
|
129
|
+
before { klass.new.cars = ['volvo'] }
|
130
|
+
|
131
|
+
it 'does not change the value in the other' do
|
132
|
+
expect(instance.cars).to eq('none')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'returns the same instance for all methods' do
|
137
|
+
expect(instance.cars).not_to be_equal('none')
|
138
|
+
expect(instance.cars).to be_equal(instance.houses)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -5,21 +5,21 @@ require 'spec_helper'
|
|
5
5
|
describe Date do
|
6
6
|
describe 'yard' do
|
7
7
|
describe '#days_between' do
|
8
|
-
subject {
|
8
|
+
subject(:date) { described_class.new(2018, 11, 21) }
|
9
9
|
|
10
10
|
context 'when checking against another date' do
|
11
|
-
let(:other_date) {
|
11
|
+
let(:other_date) { described_class.new(2019, 11, 21) }
|
12
12
|
|
13
13
|
it 'returns the days between' do
|
14
|
-
expect(
|
14
|
+
expect(date.days_between(other_date)).to eq(365)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'when cheking agains a 4 years apart date' do
|
19
|
-
let(:other_date) {
|
19
|
+
let(:other_date) { described_class.new(2014, 11, 21) }
|
20
20
|
|
21
21
|
it 'returns the days between' do
|
22
|
-
expect(
|
22
|
+
expect(date.days_between(other_date)).to eq(1461)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,7 +27,7 @@ describe Date do
|
|
27
27
|
let(:time) { Time.new(2017, 11, 21, 12, 0, 0) }
|
28
28
|
|
29
29
|
it 'ignores the hours' do
|
30
|
-
expect(
|
30
|
+
expect(date.days_between(time)).to eq(365)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Darthjee::CoreExt::Hash::Cameliazable do
|
4
|
+
describe 'camlize_keys' do
|
5
|
+
subject(:hash) do
|
6
|
+
{ first_key: 1, 'second_key' => 2 }
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'when no option is given' do
|
10
|
+
it 'camelize all keys' do
|
11
|
+
result = hash.camelize_keys
|
12
|
+
expect(result).to eq(FirstKey: 1, 'SecondKey' => 2)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when passing uppercase_first_letter option' do
|
17
|
+
it 'camelize all keys' do
|
18
|
+
result = hash.camelize_keys(uppercase_first_letter: false)
|
19
|
+
expect(result).to eq(firstKey: 1, 'secondKey' => 2)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#lower_camelize_keys' do
|
25
|
+
subject(:hash) do
|
26
|
+
{ first_key: 1, 'second_key' => 2 }
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'camelize all keys' do
|
30
|
+
result = hash.lower_camelize_keys
|
31
|
+
expect(result).to eq(firstKey: 1, 'secondKey' => 2)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Darthjee::CoreExt::Hash::ChainFetcher do
|
4
|
+
let(:hash) do
|
5
|
+
{
|
6
|
+
a: {
|
7
|
+
b: { c: 1, d: 2 }
|
8
|
+
}
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'when not giving a block' do
|
13
|
+
subject(:fetcher) do
|
14
|
+
described_class.new(hash, *keys)
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when keys are found' do
|
18
|
+
let(:keys) { %i[a b c] }
|
19
|
+
|
20
|
+
it 'returns the value found' do
|
21
|
+
expect(fetcher.fetch).to eq(1)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when key is not found' do
|
26
|
+
let(:keys) { %i[a c d] }
|
27
|
+
|
28
|
+
it do
|
29
|
+
expect { fetcher.fetch }.to raise_error(KeyError)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when giving a block' do
|
35
|
+
subject(:fetcher) do
|
36
|
+
described_class.new(hash, *keys) { |*args| args }
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when keys are not found' do
|
40
|
+
let(:keys) { %i[a c d] }
|
41
|
+
|
42
|
+
it do
|
43
|
+
expect { fetcher.fetch }.not_to raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns the result of the block' do
|
47
|
+
expect(fetcher.fetch).to eq([:c, [:d]])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Darthjee::CoreExt::Hash::KeyChangeable do
|
4
|
+
describe '#remap_keys' do
|
5
|
+
subject(:hash) { { a: 1, b: 2 } }
|
6
|
+
|
7
|
+
it 'remaps the keys' do
|
8
|
+
expect(hash.remap_keys(a: :b, b: :c)).to eq(b: 1, c: 2)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#change_keys' do
|
13
|
+
subject(:hash) { { '1' => 1, '2' => { '3' => 2 } } }
|
14
|
+
|
15
|
+
context 'when not passing options' do
|
16
|
+
let(:result) do
|
17
|
+
hash.change_keys do |k|
|
18
|
+
(k.to_i + 1).to_s.to_sym
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'uses the block to change the keys' do
|
23
|
+
expect(result).to eq('2': 1, '3': { '4': 2 })
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when passing recursive option' do
|
28
|
+
let(:result) do
|
29
|
+
hash.change_keys(recursive: false) do |k|
|
30
|
+
(k.to_i + 1).to_s.to_sym
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'uses the block to change the keys' do
|
35
|
+
expect(result).to eq('2': 1, '3': { '3' => 2 })
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#chain_change_keys' do
|
41
|
+
subject(:hash) { { first: 1, second: 2 } }
|
42
|
+
|
43
|
+
it 'uses the block to change the keys' do
|
44
|
+
result = hash.chain_change_keys(:to_s, :size, :to_s, :to_sym)
|
45
|
+
expect(result).to eq('5': 1, '6': 2)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -6,6 +6,7 @@ describe Hash do
|
|
6
6
|
describe 'yard' do
|
7
7
|
describe '#exclusive_merge' do
|
8
8
|
subject(:hash) { { a: 1, b: 2, c: 3 } }
|
9
|
+
|
9
10
|
let(:other) { { b: 4, 'c' => 5, e: 6 } }
|
10
11
|
|
11
12
|
it 'merges only the existing keys' do
|
@@ -21,6 +22,7 @@ describe Hash do
|
|
21
22
|
|
22
23
|
describe '#exclusive_merge' do
|
23
24
|
subject(:hash) { { a: 1, b: 2, c: 3 } }
|
25
|
+
|
24
26
|
let(:other) { { b: 4, 'c' => 5, e: 6 } }
|
25
27
|
|
26
28
|
it 'merges only the existing keys' do
|
@@ -38,11 +40,13 @@ describe Hash do
|
|
38
40
|
describe '#map_to_hash' do
|
39
41
|
subject(:hash) { { a: 'word', b: 'bigword', c: 'c' } }
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
+
let(:new_hash) do
|
44
|
+
hash.map_to_hash do |key, value|
|
43
45
|
"#{key}->#{value.size}"
|
44
46
|
end
|
47
|
+
end
|
45
48
|
|
49
|
+
it 'remaps the values keeping the original keys' do
|
46
50
|
expect(new_hash).to eq(
|
47
51
|
a: 'a->4',
|
48
52
|
b: 'b->7',
|
@@ -60,7 +64,7 @@ describe Hash do
|
|
60
64
|
|
61
65
|
context 'when squashing the result of a deep hash' do
|
62
66
|
let(:person_data) { { 'person.name' => 'John', 'person.age' => 23 } }
|
63
|
-
let(:person)
|
67
|
+
let(:person) { person_data.to_deep_hash }
|
64
68
|
|
65
69
|
it 'is the reverse operation' do
|
66
70
|
expect(person.squash).to eq(person_data)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Darthjee::CoreExt::Hash::ValueChanger do
|
6
|
+
describe 'yard' do
|
7
|
+
subject(:changer) { described_class.new(options, &block) }
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
let(:options) { { recursive: false, skip_inner: false } }
|
11
|
+
let(:block) { proc(&:class) }
|
12
|
+
let(:hash) { { a: 1, b: { c: 2 }, d: [{ e: 1 }] } }
|
13
|
+
|
14
|
+
it 'initialize options' do
|
15
|
+
expect(changer.change(hash)).to eq(
|
16
|
+
a: Integer, b: Hash, d: Array
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#change' do
|
22
|
+
let(:options) { {} }
|
23
|
+
let(:block) { proc { |value| value.to_s.size } }
|
24
|
+
|
25
|
+
context 'when object is a Hash' do
|
26
|
+
let(:hash) { { a: 15, b: { c: 2 }, d: [{ e: 100 }] } }
|
27
|
+
|
28
|
+
it 'transforms values' do
|
29
|
+
expect(changer.change(hash)).to eq(
|
30
|
+
a: 2, b: { c: 1 }, d: [{ e: 3 }]
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when not skipping inner' do
|
35
|
+
let(:options) { { skip_inner: false } }
|
36
|
+
|
37
|
+
it 'transforms values' do
|
38
|
+
expect(changer.change(hash)).to eq(
|
39
|
+
a: 2, b: 7, d: 11
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when skipping recursive' do
|
45
|
+
let(:options) { { recursive: false } }
|
46
|
+
|
47
|
+
it 'transforms values' do
|
48
|
+
expect(changer.change(hash)).to eq(
|
49
|
+
a: 2, b: { c: 2 }, d: [{ e: 100 }]
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when object is an array' do
|
56
|
+
let(:array) { [15, { c: 2 }, [{ e: 100 }]] }
|
57
|
+
|
58
|
+
it 'transforms values' do
|
59
|
+
expect(changer.change(array)).to eq(
|
60
|
+
[2, { c: 1 }, [{ e: 3 }]]
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|