iteraptor 0.5.1 → 0.5.2
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/README.md +44 -0
- data/lib/iteraptor/version.rb +1 -1
- data/lib/iteraptor.rb +25 -27
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc9af3898925670c691fd396f57a315f73ca71e5
|
4
|
+
data.tar.gz: 2a34471621ddb6cabfaa0f9c4c77af2feecef7de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cdef9589e987494eb07b316cac128d196ebe087d60ccd483aaa39d38334f16ddc283a8bbd8a18b3c5305a045ff3b9ad163c0b358d6a062665fb8203d906c6cb
|
7
|
+
data.tar.gz: f656e2dcebaa9788a93eda98c8be6e05ff01decef8e25d284fb2aff810772be744622f2c036aa15141e2457f0f0296e80f94c89f7070c85dee5f76635e6484d9
|
data/README.md
CHANGED
@@ -44,6 +44,50 @@ the nested structure out of flattened hash
|
|
44
44
|
and collect elelements
|
45
45
|
* `rechazar` (_sp._ `reject`) allows to filter out and collect elelements.
|
46
46
|
|
47
|
+
### Words are cheap, show me the code
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
▶ require 'iteraptor'
|
51
|
+
#⇒ true
|
52
|
+
|
53
|
+
▶ hash = {company: {name: "Me", currencies: ["A", "B", "C"],
|
54
|
+
▷ password: "12345678",
|
55
|
+
▷ details: {another_password: "QWERTYUI"}}}
|
56
|
+
#⇒ {:company=>{:name=>"Me", :currencies=>["A", "B", "C"],
|
57
|
+
# :password=>"12345678",
|
58
|
+
# :details=>{:another_password=>"QWERTYUI"}}}
|
59
|
+
|
60
|
+
▶ hash.segar(/password/i) { "*" * 8 }
|
61
|
+
#⇒ {"company"=>{"password"=>"********",
|
62
|
+
# "details"=>{"another_password"=>"********"}}}
|
63
|
+
|
64
|
+
▶ hash.segar(/password/i) { |*args| puts args.inspect }
|
65
|
+
["company.password", "12345678"]
|
66
|
+
["company.details.another_password", "QWERTYUI"]
|
67
|
+
#⇒ {"company"=>{"password"=>nil, "details"=>{"another_password"=>nil}}}
|
68
|
+
|
69
|
+
▶ hash.rechazar(/password/)
|
70
|
+
#⇒ {"company"=>{"name"=>"Me", "currencies"=>["A", "B", "C"]}}
|
71
|
+
|
72
|
+
▶ hash.aplanar
|
73
|
+
#⇒ {"company.name"=>"Me",
|
74
|
+
# "company.currencies.0"=>"A",
|
75
|
+
# "company.currencies.1"=>"B",
|
76
|
+
# "company.currencies.2"=>"C",
|
77
|
+
# "company.password"=>"12345678",
|
78
|
+
# "company.details.another_password"=>"QWERTYUI"}
|
79
|
+
|
80
|
+
▶ hash.aplanar.recoger
|
81
|
+
#⇒ {"company"=>{"name"=>"Me", "currencies"=>["A", "B", "C"],
|
82
|
+
# "password"=>"12345678",
|
83
|
+
# "details"=>{"another_password"=>"QWERTYUI"}}}
|
84
|
+
|
85
|
+
▶ hash.aplanar.recoger(symbolize_keys: true)
|
86
|
+
#⇒ {:company=>{:name=>"Me", :currencies=>["A", "B", "C"],
|
87
|
+
# :password=>"12345678",
|
88
|
+
# :details=>{:another_password=>"QWERTYUI"}}}
|
89
|
+
```
|
90
|
+
|
47
91
|
### Iteration
|
48
92
|
|
49
93
|
`Iteraptor#cada` iterates all the `Enumerable` elements, recursively. As it meets
|
data/lib/iteraptor/version.rb
CHANGED
data/lib/iteraptor.rb
CHANGED
@@ -10,12 +10,12 @@ module Iteraptor
|
|
10
10
|
end
|
11
11
|
|
12
12
|
%i[cada mapa].each do |m|
|
13
|
-
define_method m do |
|
14
|
-
return enum_for(m,
|
13
|
+
define_method m do |key = nil, value = nil, **params, &λ|
|
14
|
+
return enum_for(m, key, value, **params) unless λ
|
15
15
|
return self if empty?
|
16
16
|
|
17
17
|
send_to = [Hash, Array, Enumerable].detect(&method(:is_a?))
|
18
|
-
send_to && send("#{m}_in_#{send_to.name.downcase}",
|
18
|
+
send_to && send("#{m}_in_#{send_to.name.downcase}", key || self, value, **params, &λ)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -33,23 +33,22 @@ module Iteraptor
|
|
33
33
|
alias_method :segar, :escoger
|
34
34
|
# rubocop:enable Style/Alias
|
35
35
|
|
36
|
-
def aplanar
|
36
|
+
def aplanar **params
|
37
37
|
return self if empty?
|
38
|
-
cada.with_object({}) do |(
|
39
|
-
key = parent.tr(DELIMITER, delimiter)
|
38
|
+
cada(**params).with_object({}) do |(key, value), acc|
|
40
39
|
key = key.to_sym if params[:symbolize_keys]
|
41
|
-
acc[key] =
|
42
|
-
yield key,
|
40
|
+
acc[key] = value unless value.is_a?(Enumerable)
|
41
|
+
yield key, value if block_given?
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
|
-
def recoger
|
45
|
+
def recoger **params
|
47
46
|
return self if empty?
|
48
47
|
# rubocop:disable Style/MultilineBlockChain
|
49
|
-
aplanar.each_with_object(
|
48
|
+
aplanar(**params).each_with_object(
|
50
49
|
Hash.new { |h, k| h[k] = h.clone.clear }
|
51
50
|
) do |(k, v), acc|
|
52
|
-
keys = k.split(delimiter)
|
51
|
+
keys = k.to_s.split(params[:delimiter] || DELIMITER)
|
53
52
|
parent = keys[0..-2].reduce(acc){ |h, kk| h[kk] }
|
54
53
|
parent[keys.last] = v
|
55
54
|
end.mapa(yield_all: true, **params) do |_parent, (k, v)|
|
@@ -58,14 +57,13 @@ module Iteraptor
|
|
58
57
|
# rubocop:enable Style/MultilineBlockChain
|
59
58
|
end
|
60
59
|
|
61
|
-
def plana_mapa
|
62
|
-
return enum_for(:plana_mapa, delimiter: delimiter, **params) unless block_given?
|
60
|
+
def plana_mapa **params
|
61
|
+
return enum_for(:plana_mapa, delimiter: params[:delimiter], **params) unless block_given?
|
63
62
|
return self if empty?
|
64
63
|
|
65
|
-
cada.with_object([]) do |(
|
66
|
-
key = parent.tr(DELIMITER, delimiter)
|
64
|
+
cada(**params).with_object([]) do |(key, value), acc|
|
67
65
|
key = key.to_sym if params[:symbolize_keys]
|
68
|
-
acc << yield(key,
|
66
|
+
acc << yield(key, value) unless value.is_a?(Enumerable)
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
@@ -73,30 +71,30 @@ module Iteraptor
|
|
73
71
|
|
74
72
|
##############################################################################
|
75
73
|
### cada
|
76
|
-
CADA_PROC = lambda do |e, root, p, &λ|
|
74
|
+
CADA_PROC = lambda do |e, root, p, **params, &λ|
|
77
75
|
case e
|
78
|
-
when Iteraptor then e.cada(root, p, &λ)
|
76
|
+
when Iteraptor then e.cada(root, p, **params, &λ)
|
79
77
|
when Enumerable then e.each(&λ.curry[p])
|
80
78
|
end
|
81
79
|
end
|
82
80
|
|
83
|
-
def cada_in_array root = nil, parent = nil, **
|
81
|
+
def cada_in_array root = nil, parent = nil, **params
|
84
82
|
λ = Proc.new
|
85
83
|
each.with_index do |e, idx|
|
86
|
-
[parent, idx].compact.join(DELIMITER).tap do |p|
|
84
|
+
[parent, idx].compact.join(params[:delimiter] || DELIMITER).tap do |p|
|
87
85
|
yield p, e
|
88
|
-
CADA_PROC.call(e, root, p, &λ)
|
86
|
+
CADA_PROC.call(e, root, p, **params, &λ)
|
89
87
|
end
|
90
88
|
end
|
91
89
|
end
|
92
90
|
alias cada_in_enumerable cada_in_array
|
93
91
|
|
94
|
-
def cada_in_hash root = nil, parent = nil, **
|
92
|
+
def cada_in_hash root = nil, parent = nil, **params
|
95
93
|
λ = Proc.new
|
96
94
|
each do |k, v|
|
97
|
-
[parent, k].compact.join(DELIMITER).tap do |p|
|
95
|
+
[parent, k].compact.join(params[:delimiter] || DELIMITER).tap do |p|
|
98
96
|
yield p, v
|
99
|
-
CADA_PROC.call(v, root, p, &λ)
|
97
|
+
CADA_PROC.call(v, root, p, **params, &λ)
|
100
98
|
end
|
101
99
|
end
|
102
100
|
end
|
@@ -112,7 +110,7 @@ module Iteraptor
|
|
112
110
|
λ = Proc.new
|
113
111
|
|
114
112
|
map.with_index do |e, idx|
|
115
|
-
p = [parent, idx].compact.join(DELIMITER)
|
113
|
+
p = [parent, idx].compact.join(params[:delimiter] || DELIMITER)
|
116
114
|
|
117
115
|
e = yield p, (params[:with_index] ? [idx.to_s, e] : e) if !e.is_a?(Enumerable) || params[:yield_all]
|
118
116
|
|
@@ -132,7 +130,7 @@ module Iteraptor
|
|
132
130
|
λ = Proc.new
|
133
131
|
|
134
132
|
map do |k, v|
|
135
|
-
p = [parent, k].compact.join(DELIMITER)
|
133
|
+
p = [parent, k].compact.join(params[:delimiter] || DELIMITER)
|
136
134
|
|
137
135
|
k, v = yield p, [k, v] if !v.is_a?(Enumerable) || params[:yield_all]
|
138
136
|
|
@@ -179,7 +177,7 @@ module Iteraptor
|
|
179
177
|
|
180
178
|
plough = method ? :none? : :any?
|
181
179
|
aplanar.each_with_object({}) do |(key, value), acc|
|
182
|
-
to_match = key.split(DELIMITER)
|
180
|
+
to_match = key.split(params[:delimiter] || DELIMITER)
|
183
181
|
to_match = to_match.flat_map { |k| [k.to_s, k.to_s.to_sym] } if params[:soft_keys]
|
184
182
|
|
185
183
|
next if filter.public_send(plough, &->(f){ to_match.any?(&f.method(:===)) })
|