iteraptor 0.3.5 → 0.4.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/.codeclimate.yml +3 -0
- data/.travis.yml +4 -1
- data/Gemfile +2 -1
- data/README.md +48 -18
- data/lib/iteraptor.rb +27 -3
- data/lib/iteraptor/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0e8cc46b604659e350fd66dd26157c0a0810373c
|
|
4
|
+
data.tar.gz: 10105442b0e2c0a807e55ff1decf52fbef0d5772
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ff5aade1285567f7bf58d422316db68b3e42627c828c13ad54d6c1f533d7542b3c15ca666b8a0b33ff175e6f83363c17ad591c4b7351f031808019938c8e348f
|
|
7
|
+
data.tar.gz: bd271aae4e66a0528f0efb9eba9b5e2bd0cc87082ffee878e5a134fc5bf57358f498cb968c9fce0d81dca90a0cc384f877d0252c97b0c191825cdebde7024502
|
data/.codeclimate.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
|
@@ -2,4 +2,5 @@ source 'https://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in iteraptor.gemspec
|
|
4
4
|
gemspec
|
|
5
|
-
gem '
|
|
5
|
+
gem 'simplecov', require: false, group: :test
|
|
6
|
+
# gem 'codeclimate-test-reporter', group: :test, require: nil
|
data/README.md
CHANGED
|
@@ -10,27 +10,10 @@ This small mixin allows the deep iteration / mapping of `Enumerable`s instances.
|
|
|
10
10
|
Adopted to be used with hashes/arrays. It **is not** intended to be used with
|
|
11
11
|
large objects.
|
|
12
12
|
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
Add this line to your application's Gemfile:
|
|
16
|
-
|
|
17
|
-
```ruby
|
|
18
|
-
gem 'iteraptor'
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
And then execute:
|
|
22
|
-
|
|
23
|
-
$ bundle
|
|
24
|
-
|
|
25
|
-
Or install it yourself as:
|
|
26
|
-
|
|
27
|
-
$ gem install iteraptor
|
|
28
|
-
|
|
29
13
|
## Usage
|
|
30
14
|
|
|
31
15
|
```ruby
|
|
32
16
|
require 'iteraptor'
|
|
33
|
-
require 'iteraptor/greedy' # to patch Array and Hash
|
|
34
17
|
```
|
|
35
18
|
|
|
36
19
|
`Iteraptor` is intended to be used for iteration of complex nested structures.
|
|
@@ -42,6 +25,22 @@ Nested `Enumerable`s are called with a compound key, represented as a “breadcr
|
|
|
42
25
|
which is a path to current key, joined with `Iteraptor::DELIMITER` constant. The
|
|
43
26
|
latter is just a dot in current release.
|
|
44
27
|
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
* `cada` (_sp._ `each`) iterates through all the levels of the nested `Enumerable`,
|
|
31
|
+
yielding `parent, element` tuple; parent is returned as a delimiter-joined string
|
|
32
|
+
* `mapa` (_sp._ `map`) iterates all the elements, yielding `parent, (key, value)`;
|
|
33
|
+
the mapper should return either `[key, value]` array or `nil` to remove this
|
|
34
|
+
element;
|
|
35
|
+
* _NB_ this method always maps to `Hash`, to map to `Array` use `plana_mapa`
|
|
36
|
+
* _NB_ this method will raise if the returned value is neither `[key, value]` tuple nor `nil`
|
|
37
|
+
* `plana_mapa` iterates yielding `key, value`, maps to the yielded value,
|
|
38
|
+
whatever it is; `nil`s are not treated in some special way
|
|
39
|
+
* `aplanar` (_sp._ `flatten`) the analogue of `Array#flatten`, but flattens
|
|
40
|
+
the deep enumerable into `Hash` instance
|
|
41
|
+
* `segar` (_sp._ `yield`), alias `escoger` (_sp._ `select`) allows to filter
|
|
42
|
+
and collect elelements.
|
|
43
|
+
|
|
45
44
|
### Iteration
|
|
46
45
|
|
|
47
46
|
`Iteraptor#cada` iterates all the `Enumerable` elements, recursively. As it meets
|
|
@@ -97,7 +96,9 @@ iterated as `Enumerable`s.
|
|
|
97
96
|
In the example below we yield all keys, that matches the regexp given as parameter.
|
|
98
97
|
|
|
99
98
|
```ruby
|
|
100
|
-
▶ hash.segar(/[abc]/)
|
|
99
|
+
▶ hash.segar(/[abc]/) do |parent, elem|
|
|
100
|
+
▷ puts "Parent: #{parent.inspect}, Element: #{elem.inspect}"
|
|
101
|
+
▷ end
|
|
101
102
|
# Parent: "a", Element: true
|
|
102
103
|
# Parent: "b", Element: {:c=>"", :d=>42}
|
|
103
104
|
# Parent: "b.c", Element: ""
|
|
@@ -115,6 +116,35 @@ In the example below we yield all keys, that matches the regexp given as paramet
|
|
|
115
116
|
#⇒ {:a=>true, :b=>{:c=>"N/A", :d=>42}, :e=>"N/A"}
|
|
116
117
|
```
|
|
117
118
|
|
|
119
|
+
#### Flatten the deeply nested hash:
|
|
120
|
+
|
|
121
|
+
```ruby
|
|
122
|
+
▶ hash = {a: true, b: {c: '', d: 42}, e: ''}
|
|
123
|
+
#⇒ {:a=>true, :b=>{:c=>"", :d=>42}, :e=>""}
|
|
124
|
+
▶ hash.aplanar(delimiter: '_', symbolize_keys: true)
|
|
125
|
+
#⇒ {:a=>true, :b_c=>"", :b_d=>42, :e=>""}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Installation
|
|
129
|
+
|
|
130
|
+
Add this line to your application's Gemfile:
|
|
131
|
+
|
|
132
|
+
```ruby
|
|
133
|
+
gem 'iteraptor'
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
And then execute:
|
|
137
|
+
|
|
138
|
+
$ bundle
|
|
139
|
+
|
|
140
|
+
Or install it yourself as:
|
|
141
|
+
|
|
142
|
+
$ gem install iteraptor
|
|
143
|
+
|
|
144
|
+
## Changelog
|
|
145
|
+
|
|
146
|
+
#### 0.4.0 `aplanar` and `plana_mapa`
|
|
147
|
+
|
|
118
148
|
## Development
|
|
119
149
|
|
|
120
150
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/iteraptor.rb
CHANGED
|
@@ -7,7 +7,7 @@ module Iteraptor
|
|
|
7
7
|
raise "This module might be included into Enumerables only" unless base.ancestors.include? Enumerable
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
%i
|
|
10
|
+
%i[cada mapa].each do |m|
|
|
11
11
|
define_method m do |root = nil, parent = nil, &λ|
|
|
12
12
|
return enum_for(m, root, parent) unless λ
|
|
13
13
|
send_to = [Hash, Array, Enumerable].detect(&method(:is_a?))
|
|
@@ -15,6 +15,7 @@ module Iteraptor
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
# rubocop:disable Style/MultilineIfModifier
|
|
18
19
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
19
20
|
# rubocop:disable Metrics/MethodLength
|
|
20
21
|
def segar filter
|
|
@@ -33,8 +34,31 @@ module Iteraptor
|
|
|
33
34
|
end
|
|
34
35
|
end
|
|
35
36
|
end
|
|
37
|
+
|
|
38
|
+
def aplanar delimiter: DELIMITER, symbolize_keys: false
|
|
39
|
+
cada.with_object({}) do |(parent, element), acc|
|
|
40
|
+
key = parent.tr(DELIMITER, delimiter)
|
|
41
|
+
key = key.to_sym if symbolize_keys
|
|
42
|
+
acc[key] = element unless element.is_a?(Enumerable)
|
|
43
|
+
yield key, element if block_given?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def plana_mapa delimiter: DELIMITER, symbolize_keys: false
|
|
48
|
+
return enum_for(
|
|
49
|
+
:plana_mapa, delimiter: delimiter, symbolize_keys: symbolize_keys
|
|
50
|
+
) unless block_given?
|
|
51
|
+
|
|
52
|
+
cada.with_object([]) do |(parent, element), acc|
|
|
53
|
+
key = parent.tr(DELIMITER, delimiter)
|
|
54
|
+
key = key.to_sym if symbolize_keys
|
|
55
|
+
acc << yield(key, element) unless element.is_a?(Enumerable)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
36
59
|
# rubocop:enable Metrics/MethodLength
|
|
37
60
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
61
|
+
# rubocop:enable Style/MultilineIfModifier
|
|
38
62
|
|
|
39
63
|
private
|
|
40
64
|
|
|
@@ -70,7 +94,7 @@ module Iteraptor
|
|
|
70
94
|
|
|
71
95
|
##############################################################################
|
|
72
96
|
### mapa
|
|
73
|
-
def mapa_in_array root = nil, parent = nil
|
|
97
|
+
def mapa_in_array root = nil, parent = nil, with_index: false
|
|
74
98
|
λ = Proc.new
|
|
75
99
|
|
|
76
100
|
map.with_index do |e, idx|
|
|
@@ -79,7 +103,7 @@ module Iteraptor
|
|
|
79
103
|
case e
|
|
80
104
|
when Iteraptor then e.mapa(root, p, &λ)
|
|
81
105
|
when Enumerable then e.map(&λ.curry[p])
|
|
82
|
-
else yield p, e
|
|
106
|
+
else yield p, (with_index ? [idx.to_s, e] : e)
|
|
83
107
|
end
|
|
84
108
|
end
|
|
85
109
|
end
|
data/lib/iteraptor/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: iteraptor
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Aleksei Matiushkin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2018-03-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|