rekey 2.0.1 → 3.0.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/lib/rekey.rb +2 -116
- data/lib/rekey/rekey.rb +78 -0
- data/test/test_array_block.rb +2 -34
- data/test/test_empty_input.rb +0 -4
- data/test/test_hash_block.rb +3 -29
- data/test/test_monkey_patching.rb +34 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ca96460968d77a1bd8dd2c0ae8ccc75d1dd1a70
|
4
|
+
data.tar.gz: 3c66def36a31e036dcd2d655d96f2a0c89ae9cc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a93381b89113f30a4144eeba0e0a94c9127edf053d381a1c15981d24a410013343af7c00637742f32df6d64b3640ccb986f6f22db91b605785cee73a196055f
|
7
|
+
data.tar.gz: d88d014185adfc737ff1b3c9b66873d8c108a575e1fb1824007c0846c771600efb958ac5930279da4c19aabb47a7ff413913fe37d698d060c560dbfd9b4817ec
|
data/lib/rekey.rb
CHANGED
@@ -1,122 +1,8 @@
|
|
1
|
-
|
1
|
+
require_relative 'rekey/rekey'
|
2
2
|
|
3
3
|
|
4
4
|
module Rekey
|
5
|
-
VERSION = '
|
6
|
-
|
7
|
-
class << self
|
8
|
-
|
9
|
-
def rekey(enumerable, key_handle = nil, value_handle = nil, &block)
|
10
|
-
# validate input
|
11
|
-
validate_input key_handle, value_handle, &block
|
12
|
-
|
13
|
-
key_fn = if enumerable.respond_to?(:keys)
|
14
|
-
proc {|k, v| k}
|
15
|
-
else
|
16
|
-
proc {|v| nil}
|
17
|
-
end
|
18
|
-
|
19
|
-
value_fn = if enumerable.respond_to?(:values)
|
20
|
-
proc {|k, v| v}
|
21
|
-
else
|
22
|
-
proc {|v| v}
|
23
|
-
end
|
24
|
-
|
25
|
-
res = get_return_type enumerable, key_handle, value_handle, &block
|
26
|
-
|
27
|
-
# rekey input
|
28
|
-
enumerable.each do |*args|
|
29
|
-
key = key_fn.call *args
|
30
|
-
value = value_fn.call *args
|
31
|
-
new_key = key
|
32
|
-
new_value = value
|
33
|
-
|
34
|
-
if block
|
35
|
-
if block.arity <= 0
|
36
|
-
# function pointer, eg. &:to_i
|
37
|
-
new_key = block.call value
|
38
|
-
elsif block.arity == 1
|
39
|
-
# standard block
|
40
|
-
new_key = block.call value
|
41
|
-
else
|
42
|
-
# block that wants both key and value
|
43
|
-
data = block.call key, value
|
44
|
-
if data.is_a? Array
|
45
|
-
new_key, new_value = data
|
46
|
-
else
|
47
|
-
# only returned a new key value
|
48
|
-
new_key = data
|
49
|
-
end
|
50
|
-
end
|
51
|
-
else
|
52
|
-
new_key = PluckIt.pluck value, key_handle if key_handle
|
53
|
-
new_value = PluckIt.pluck value, value_handle if value_handle
|
54
|
-
end
|
55
|
-
|
56
|
-
# collect results
|
57
|
-
|
58
|
-
unless res
|
59
|
-
# determine return type based on the first
|
60
|
-
# computed key value
|
61
|
-
res = new_key ? {} : []
|
62
|
-
end
|
63
|
-
|
64
|
-
if res.is_a? Array
|
65
|
-
unless new_key.nil?
|
66
|
-
# safeguard against stupidity
|
67
|
-
raise ArgumentError.new(
|
68
|
-
"not expecting a key value, got: #{new_key}"
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
res.push new_value
|
73
|
-
else
|
74
|
-
res[new_key] = new_value
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
res
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
def validate_input key_handle, value_handle, &block
|
85
|
-
if block
|
86
|
-
if (key_handle or value_handle)
|
87
|
-
raise ArgumentError.new 'expected key / value handles, *or* block'
|
88
|
-
end
|
89
|
-
else
|
90
|
-
unless key_handle or value_handle
|
91
|
-
raise ArgumentError.new 'expected 1 or 2 args, got 0'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
def get_return_type enumerable, key_handle, value_handle, &block
|
98
|
-
# determine return type
|
99
|
-
res = if block
|
100
|
-
# no way to determine type...do it dynamically,
|
101
|
-
# based on block return type
|
102
|
-
|
103
|
-
if enumerable.empty?
|
104
|
-
raise TypeError.new(
|
105
|
-
'unable to determine return type for empty input'
|
106
|
-
)
|
107
|
-
end
|
108
|
-
|
109
|
-
nil
|
110
|
-
else
|
111
|
-
if key_handle or enumerable.respond_to?(:keys)
|
112
|
-
{}
|
113
|
-
else
|
114
|
-
[]
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
5
|
+
VERSION = '3.0.0'
|
120
6
|
end
|
121
7
|
|
122
8
|
|
data/lib/rekey/rekey.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'pluckit/pluck'
|
2
|
+
|
3
|
+
|
4
|
+
module Rekey
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def rekey(enumerable, key_handle = nil, value_handle = nil, &block)
|
8
|
+
validate_input key_handle, value_handle, &block
|
9
|
+
|
10
|
+
key_value_fn = if enumerable.respond_to?(:keys)
|
11
|
+
proc {|k, v| [k, v]}
|
12
|
+
else
|
13
|
+
proc {|v| [nil, v]}
|
14
|
+
end
|
15
|
+
|
16
|
+
# determine return type
|
17
|
+
res = if key_handle or block or enumerable.respond_to?(:keys)
|
18
|
+
{}
|
19
|
+
else
|
20
|
+
[]
|
21
|
+
end
|
22
|
+
|
23
|
+
# rekey input
|
24
|
+
enumerable.each_with_object(res) do |*args, res|
|
25
|
+
key, value = key_value_fn.call *args
|
26
|
+
new_key = key
|
27
|
+
new_value = value
|
28
|
+
|
29
|
+
if block
|
30
|
+
if block.arity <= 0
|
31
|
+
# function pointer, eg. &:to_i
|
32
|
+
new_key = block.call value
|
33
|
+
elsif block.arity == 1
|
34
|
+
# standard block
|
35
|
+
new_key = block.call value
|
36
|
+
else
|
37
|
+
# block that wants both key and value
|
38
|
+
new_key = block.call key, value
|
39
|
+
end
|
40
|
+
else
|
41
|
+
new_key = PluckIt.pluck value, key_handle if key_handle
|
42
|
+
new_value = PluckIt.pluck value, value_handle if value_handle
|
43
|
+
end
|
44
|
+
|
45
|
+
# collect results
|
46
|
+
if res.is_a? Array
|
47
|
+
unless new_key.nil?
|
48
|
+
# safeguard against stupidity
|
49
|
+
raise ArgumentError.new(
|
50
|
+
"not expecting a key value, got: #{new_key}"
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
res.push new_value
|
55
|
+
else
|
56
|
+
res[new_key] = new_value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def validate_input key_handle, value_handle, &block
|
65
|
+
if block
|
66
|
+
if (key_handle or value_handle)
|
67
|
+
raise ArgumentError.new 'expected key / value handles, *or* block'
|
68
|
+
end
|
69
|
+
else
|
70
|
+
unless key_handle or value_handle
|
71
|
+
raise ArgumentError.new 'key_handle and/or value_handle are required'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
data/test/test_array_block.rb
CHANGED
@@ -8,24 +8,6 @@ class RekeyArrayBlockTest < Minitest::Test
|
|
8
8
|
@input = [*1..3]
|
9
9
|
end
|
10
10
|
|
11
|
-
def test_both
|
12
|
-
assert_equal({
|
13
|
-
1 => 1,
|
14
|
-
2 => 2,
|
15
|
-
3 => 3,
|
16
|
-
},
|
17
|
-
@input.rekey {|k, v| [v, v] }
|
18
|
-
)
|
19
|
-
|
20
|
-
assert_equal({
|
21
|
-
'1' => 1.0,
|
22
|
-
'2' => 2.0,
|
23
|
-
'3' => 3.0,
|
24
|
-
},
|
25
|
-
@input.rekey {|k, v| [v.to_s, v.to_f] }
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
11
|
def test_keys
|
30
12
|
assert_equal({
|
31
13
|
1 => 1,
|
@@ -54,22 +36,8 @@ class RekeyArrayBlockTest < Minitest::Test
|
|
54
36
|
|
55
37
|
def test_nil_key
|
56
38
|
assert_equal(
|
57
|
-
|
58
|
-
@input.rekey {|k, v|
|
59
|
-
)
|
60
|
-
|
61
|
-
assert_equal(
|
62
|
-
@input,
|
63
|
-
# k is nil because input is array
|
64
|
-
@input.rekey {|k, v| [k, v.to_i] }
|
65
|
-
)
|
66
|
-
|
67
|
-
assert_equal([
|
68
|
-
'1',
|
69
|
-
'2',
|
70
|
-
'3',
|
71
|
-
],
|
72
|
-
@input.rekey {|k, v| [nil, v.to_s] }
|
39
|
+
{ nil => 3 },
|
40
|
+
@input.rekey {|k, v| nil }
|
73
41
|
)
|
74
42
|
end
|
75
43
|
|
data/test/test_empty_input.rb
CHANGED
data/test/test_hash_block.rb
CHANGED
@@ -11,29 +11,6 @@ class RekeyHashBlockTest < Minitest::Test
|
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
14
|
-
def test_both
|
15
|
-
assert_equal(
|
16
|
-
@input,
|
17
|
-
@input.rekey {|k, v| [k, v] }
|
18
|
-
)
|
19
|
-
|
20
|
-
assert_equal({
|
21
|
-
1 => 1,
|
22
|
-
2 => 2,
|
23
|
-
3 => 3,
|
24
|
-
},
|
25
|
-
@input.rekey {|k, v| [v, v] }
|
26
|
-
)
|
27
|
-
|
28
|
-
assert_equal({
|
29
|
-
'1' => 1.0,
|
30
|
-
'2' => 2.0,
|
31
|
-
'3' => 3.0,
|
32
|
-
},
|
33
|
-
@input.rekey {|k, v| [v.to_s, v.to_f] }
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
14
|
def test_arity1_keys
|
38
15
|
assert_equal({
|
39
16
|
1 => 1,
|
@@ -88,12 +65,9 @@ class RekeyHashBlockTest < Minitest::Test
|
|
88
65
|
end
|
89
66
|
|
90
67
|
def test_nil_key
|
91
|
-
assert_equal(
|
92
|
-
|
93
|
-
|
94
|
-
3,
|
95
|
-
],
|
96
|
-
@input.rekey {|k, v| [nil, v] }
|
68
|
+
assert_equal(
|
69
|
+
{ nil => 3 },
|
70
|
+
@input.rekey {|k, v| nil }
|
97
71
|
)
|
98
72
|
end
|
99
73
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift 'lib'
|
5
|
+
require 'rekey/rekey'
|
6
|
+
|
7
|
+
|
8
|
+
class MonkeyPatchingTest < Minitest::Test
|
9
|
+
def test_not_installed
|
10
|
+
if defined? Rekey::VERSION
|
11
|
+
# entire library was loaded, so these tests are invalid.
|
12
|
+
# this happens when run through `rake`
|
13
|
+
skip
|
14
|
+
end
|
15
|
+
|
16
|
+
# `require 'pluckit/pluck'` should load PluckIt
|
17
|
+
# but not monkey patch
|
18
|
+
assert_raises NoMethodError do
|
19
|
+
[ 1, 2, 3 ].rekey 0
|
20
|
+
end
|
21
|
+
|
22
|
+
assert_raises NoMethodError do
|
23
|
+
{ a: 1 }.rekey 0
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_raises NoMethodError do
|
27
|
+
Set.new([ 1, 2, 3 ]).rekey 0
|
28
|
+
end
|
29
|
+
|
30
|
+
puts 'no monkey patching'
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rekey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pluckit
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1'
|
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: '
|
26
|
+
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,15 +59,17 @@ extensions: []
|
|
59
59
|
extra_rdoc_files: []
|
60
60
|
files:
|
61
61
|
- lib/rekey.rb
|
62
|
+
- lib/rekey/rekey.rb
|
62
63
|
- test/test_array_block.rb
|
63
64
|
- test/test_array_handlers.rb
|
64
65
|
- test/test_empty_input.rb
|
65
66
|
- test/test_hash_block.rb
|
66
67
|
- test/test_hash_handlers.rb
|
67
68
|
- test/test_invalid_input.rb
|
69
|
+
- test/test_monkey_patching.rb
|
68
70
|
- test/test_range.rb
|
69
71
|
- test/test_regexp.rb
|
70
|
-
homepage: https://github.com/dpep/
|
72
|
+
homepage: https://github.com/dpep/rb_rekey
|
71
73
|
licenses:
|
72
74
|
- MIT
|
73
75
|
metadata: {}
|
@@ -87,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
89
|
version: '0'
|
88
90
|
requirements: []
|
89
91
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.6.
|
92
|
+
rubygems_version: 2.6.11
|
91
93
|
signing_key:
|
92
94
|
specification_version: 4
|
93
95
|
summary: Rekey
|
@@ -98,5 +100,6 @@ test_files:
|
|
98
100
|
- test/test_hash_block.rb
|
99
101
|
- test/test_hash_handlers.rb
|
100
102
|
- test/test_invalid_input.rb
|
103
|
+
- test/test_monkey_patching.rb
|
101
104
|
- test/test_range.rb
|
102
105
|
- test/test_regexp.rb
|