transproc 1.0.0 → 1.1.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/.codeclimate.yml +15 -0
- data/.gitignore +3 -0
- data/.travis.yml +14 -10
- data/CHANGELOG.md +61 -17
- data/Gemfile +9 -18
- data/README.md +17 -19
- data/Rakefile +1 -0
- data/lib/transproc.rb +3 -4
- data/lib/transproc/all.rb +2 -0
- data/lib/transproc/array.rb +9 -51
- data/lib/transproc/array/combine.rb +61 -0
- data/lib/transproc/class.rb +2 -0
- data/lib/transproc/coercions.rb +2 -0
- data/lib/transproc/compiler.rb +45 -0
- data/lib/transproc/composer.rb +2 -0
- data/lib/transproc/composite.rb +2 -0
- data/lib/transproc/conditional.rb +2 -0
- data/lib/transproc/constants.rb +5 -0
- data/lib/transproc/error.rb +2 -0
- data/lib/transproc/function.rb +4 -1
- data/lib/transproc/functions.rb +2 -0
- data/lib/transproc/hash.rb +105 -45
- data/lib/transproc/proc.rb +2 -0
- data/lib/transproc/recursion.rb +2 -0
- data/lib/transproc/registry.rb +4 -2
- data/lib/transproc/store.rb +1 -0
- data/lib/transproc/support/deprecations.rb +2 -0
- data/lib/transproc/transformer.rb +7 -1
- data/lib/transproc/transformer/class_interface.rb +32 -65
- data/lib/transproc/transformer/deprecated/class_interface.rb +81 -0
- data/lib/transproc/transformer/dsl.rb +51 -0
- data/lib/transproc/version.rb +3 -1
- data/spec/spec_helper.rb +21 -10
- data/spec/unit/array/combine_spec.rb +224 -0
- data/spec/unit/array_transformations_spec.rb +1 -52
- data/spec/unit/class_transformations_spec.rb +10 -7
- data/spec/unit/coercions_spec.rb +1 -1
- data/spec/unit/composer_spec.rb +1 -1
- data/spec/unit/conditional_spec.rb +1 -1
- data/spec/unit/function_not_found_error_spec.rb +1 -1
- data/spec/unit/function_spec.rb +16 -1
- data/spec/unit/hash_transformations_spec.rb +12 -1
- data/spec/unit/proc_transformations_spec.rb +3 -1
- data/spec/unit/recursion_spec.rb +1 -1
- data/spec/unit/registry_spec.rb +9 -1
- data/spec/unit/store_spec.rb +2 -1
- data/spec/unit/transformer/class_interface_spec.rb +364 -0
- data/spec/unit/transformer/dsl_spec.rb +15 -0
- data/spec/unit/transformer/instance_methods_spec.rb +25 -0
- data/spec/unit/transformer_spec.rb +128 -40
- data/spec/unit/transproc_spec.rb +1 -1
- data/transproc.gemspec +1 -5
- metadata +19 -54
- data/.rubocop.yml +0 -66
- data/.rubocop_todo.yml +0 -11
- data/rakelib/mutant.rake +0 -16
- data/rakelib/rubocop.rake +0 -18
- data/spec/support/mutant.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c5e373dbeb3ba726459c3cf12238ba1e9fd096e308bdfcbf9799045653c053db
|
4
|
+
data.tar.gz: b761e23e9e7c630db6e08ee7e317758fe2bd53cb6a8a49bb7799902b657ffbc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3aee819e93702794f280d6f5578670494fb28e3661f7c2bac311530363ac52aa83897cdc00ee2c591eadae86d3dcf4147805bfc9805f24dc6034314df2d8aacd
|
7
|
+
data.tar.gz: 55eb18ed05667309ee936ac75b6146940ca45c64cc215225a894e42b84ffddaea571d1a7675554cc8802f31b197dc2810886cdb0685c2473c9902e5c0aacf6bb
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
version: "2"
|
2
|
+
|
3
|
+
prepare:
|
4
|
+
fetch:
|
5
|
+
- url: "https://raw.githubusercontent.com/dry-rb/devtools/master/.rubocop.yml"
|
6
|
+
path: ".rubocop.yml"
|
7
|
+
|
8
|
+
exclude_patterns:
|
9
|
+
- "benchmarks/"
|
10
|
+
- "examples/"
|
11
|
+
- "spec/"
|
12
|
+
|
13
|
+
plugins:
|
14
|
+
rubocop:
|
15
|
+
enabled: true
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,18 +1,22 @@
|
|
1
|
-
dist: trusty
|
2
1
|
language: ruby
|
3
|
-
sudo: required
|
4
2
|
cache: bundler
|
5
3
|
bundler_args: --without tools
|
4
|
+
before_script:
|
5
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
6
|
+
- chmod +x ./cc-test-reporter
|
7
|
+
- ./cc-test-reporter before-build
|
8
|
+
after_script:
|
9
|
+
- "[ -d coverage ] && ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
|
6
10
|
script: 'bundle exec rake spec'
|
7
|
-
after_success:
|
8
|
-
- '[ "$TRAVIS_RUBY_VERSION" = "2.3.1" ] && [ "$TRAVIS_BRANCH" = "master" ] && bundle exec codeclimate-test-reporter'
|
9
11
|
rvm:
|
10
|
-
- 2.
|
11
|
-
- 2.
|
12
|
-
- 2.
|
13
|
-
- 2.
|
14
|
-
-
|
15
|
-
|
12
|
+
- 2.3.8
|
13
|
+
- 2.6.3
|
14
|
+
- 2.5.5
|
15
|
+
- 2.4.6
|
16
|
+
- jruby-9.2.7.0
|
17
|
+
env:
|
18
|
+
global:
|
19
|
+
- COVERAGE='true'
|
16
20
|
notifications:
|
17
21
|
webhooks:
|
18
22
|
urls:
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,48 @@
|
|
1
|
-
|
1
|
+
# v1.1.1 2019-12-21
|
2
|
+
|
3
|
+
## Fixed
|
4
|
+
|
5
|
+
- Keyword warnings on Ruby 2.7 (flash-gordon)
|
6
|
+
|
7
|
+
[Compare v1.1.0...v1.1.1](https://github.com/solnic/transproc/compare/v1.1.0...v1.1.1)
|
8
|
+
|
9
|
+
# v1.1.0 2019-07-18
|
10
|
+
|
11
|
+
This is the last transproc release before the project will be forked to `dry-transformer`.
|
12
|
+
|
13
|
+
## Added
|
14
|
+
|
15
|
+
* New DSL for defining transformers using `define!` method, which now supports instance methods as transformation functions (@solnic)
|
16
|
+
* Simplified transformer class definition - registry is auto-configured and you can use `import` at the transformer class level (@solnic)
|
17
|
+
* New `HashTransformation.deep_stringify_keys` function
|
18
|
+
|
19
|
+
[Compare v1.0.3...v1.1.0](https://github.com/solnic/transproc/compare/v1.0.3...v1.1.0)
|
20
|
+
|
21
|
+
# v1.0.3 2018-12-01
|
22
|
+
|
23
|
+
## Changed
|
24
|
+
|
25
|
+
* [BREAKING] Added minimal Ruby version to the gemspec file. Transproc now works with Ruby 2.3 and above (flash-gordon)
|
26
|
+
* Performance improvements introduced by using new built-in methods in `Hash` (v-kolesnikov + flash-gordon)
|
27
|
+
|
28
|
+
[Compare v1.0.2...v1.0.3](https://github.com/solnic/transproc/compare/v1.0.2...v1.0.3)
|
29
|
+
|
30
|
+
# v1.0.2 2017-02-25
|
31
|
+
|
32
|
+
## Fixed
|
33
|
+
|
34
|
+
* `combine` works fine when there are missing nodes for deeply nested arrays (Kukunin)
|
35
|
+
|
36
|
+
[Compare v1.0.1...v1.0.2](https://github.com/solnic/transproc/compare/v1.0.1...v1.0.2)
|
37
|
+
|
38
|
+
# v1.0.1 2017-02-25
|
39
|
+
|
40
|
+
* `combine` is now multiple times faster, depending on the level of nesting (Kukunin + splattael)
|
41
|
+
* `nest` (thus `wrap` too) is ~2x faster now (solnic)
|
42
|
+
|
43
|
+
[Compare v1.0.0...v1.0.1](https://github.com/solnic/transproc/compare/v1.0.0...v1.0.1)
|
44
|
+
|
45
|
+
# v1.0.0 2017-01-29
|
2
46
|
|
3
47
|
## Added
|
4
48
|
|
@@ -14,7 +58,7 @@
|
|
14
58
|
|
15
59
|
[Compare v0.4.2...v1.0.0](https://github.com/solnic/transproc/compare/v0.4.2...v1.0.0)
|
16
60
|
|
17
|
-
|
61
|
+
# v0.4.2 2017-01-12
|
18
62
|
|
19
63
|
## Added
|
20
64
|
|
@@ -26,7 +70,7 @@
|
|
26
70
|
|
27
71
|
[Compare v0.4.1...v0.4.2](https://github.com/solnic/transproc/compare/v0.4.1...v0.4.2)
|
28
72
|
|
29
|
-
|
73
|
+
# v0.4.1 2016-11-08
|
30
74
|
|
31
75
|
## Added
|
32
76
|
|
@@ -38,7 +82,7 @@
|
|
38
82
|
|
39
83
|
[Compare v0.4.0...v0.4.1](https://github.com/solnic/transproc/compare/v0.4.0...v0.4.1)
|
40
84
|
|
41
|
-
|
85
|
+
# v0.4.0 2015-11-23
|
42
86
|
|
43
87
|
## Fixed
|
44
88
|
|
@@ -50,7 +94,7 @@
|
|
50
94
|
|
51
95
|
[Compare v0.3.2...v0.4.0](https://github.com/solnic/transproc/compare/v0.3.2...v0.4.0)
|
52
96
|
|
53
|
-
|
97
|
+
# v0.3.2 2015-08-17
|
54
98
|
|
55
99
|
## Changed
|
56
100
|
|
@@ -62,7 +106,7 @@
|
|
62
106
|
|
63
107
|
[Compare v0.3.1...v0.3.2](https://github.com/solnic/transproc/compare/v0.3.1...v0.3.2)
|
64
108
|
|
65
|
-
|
109
|
+
# v0.3.1 2015-08-06
|
66
110
|
|
67
111
|
### Added
|
68
112
|
|
@@ -74,7 +118,7 @@
|
|
74
118
|
|
75
119
|
[Compare v0.3.0...v0.3.1](https://github.com/solnic/transproc/compare/v0.3.0...v0.3.1)
|
76
120
|
|
77
|
-
|
121
|
+
# v0.3.0 2015-07-12
|
78
122
|
|
79
123
|
This release deprecates a couple of APIs and changes the way functions can be
|
80
124
|
accessed. The global `Transproc()` function registry is now deprecated and you
|
@@ -104,7 +148,7 @@ in 1.0.0.
|
|
104
148
|
|
105
149
|
[Compare v0.2.4...v0.3.0](https://github.com/solnic/transproc/compare/v0.2.4...v0.3.0)
|
106
150
|
|
107
|
-
|
151
|
+
# v0.2.4 2015-06-20
|
108
152
|
|
109
153
|
### Added
|
110
154
|
|
@@ -118,7 +162,7 @@ in 1.0.0.
|
|
118
162
|
|
119
163
|
[Compare v0.2.3...v0.2.4](https://github.com/solnic/transproc/compare/v0.2.3...v0.2.4)
|
120
164
|
|
121
|
-
|
165
|
+
# v0.2.3 2015-06-02
|
122
166
|
|
123
167
|
### Added
|
124
168
|
|
@@ -134,7 +178,7 @@ in 1.0.0.
|
|
134
178
|
|
135
179
|
[Compare v0.2.2...v0.2.3](https://github.com/solnic/transproc/compare/v0.2.2...v0.2.3)
|
136
180
|
|
137
|
-
|
181
|
+
# v0.2.2 2015-05-22
|
138
182
|
|
139
183
|
### Added
|
140
184
|
|
@@ -148,7 +192,7 @@ in 1.0.0.
|
|
148
192
|
|
149
193
|
[Compare v0.2.1...v0.2.2](https://github.com/solnic/transproc/compare/v0.2.1...v0.2.2)
|
150
194
|
|
151
|
-
|
195
|
+
# v0.2.1 2015-05-17
|
152
196
|
|
153
197
|
### Added
|
154
198
|
|
@@ -177,7 +221,7 @@ in 1.0.0.
|
|
177
221
|
|
178
222
|
[Compare v0.2.0...v0.2.1](https://github.com/solnic/transproc/compare/v0.2.0...v0.2.1)
|
179
223
|
|
180
|
-
|
224
|
+
# v0.2.0 2015-04-14
|
181
225
|
|
182
226
|
### Added
|
183
227
|
|
@@ -199,7 +243,7 @@ in 1.0.0.
|
|
199
243
|
|
200
244
|
[Compare v0.1.3...v0.2.0](https://github.com/solnic/transproc/compare/v0.1.3...v0.2.0)
|
201
245
|
|
202
|
-
|
246
|
+
# v0.1.3 2015-04-07
|
203
247
|
|
204
248
|
### Added
|
205
249
|
|
@@ -212,7 +256,7 @@ in 1.0.0.
|
|
212
256
|
|
213
257
|
[Compare v0.1.2...v0.1.3](https://github.com/solnic/transproc/compare/v0.1.2...v0.1.3)
|
214
258
|
|
215
|
-
|
259
|
+
# v0.1.2 2015-03-14
|
216
260
|
|
217
261
|
### Changed
|
218
262
|
|
@@ -220,7 +264,7 @@ in 1.0.0.
|
|
220
264
|
|
221
265
|
[Compare v0.1.1...v0.1.2](https://github.com/solnic/transproc/compare/v0.1.1...v0.1.2)
|
222
266
|
|
223
|
-
|
267
|
+
# v0.1.1 2015-03-13
|
224
268
|
|
225
269
|
### Changed
|
226
270
|
|
@@ -234,7 +278,7 @@ in 1.0.0.
|
|
234
278
|
|
235
279
|
[Compare v0.1.0...v0.1.1](https://github.com/solnic/transproc/compare/v0.1.0...v0.1.1)
|
236
280
|
|
237
|
-
|
281
|
+
# v0.1.0 2014-12-28
|
238
282
|
|
239
283
|
### Added
|
240
284
|
|
@@ -247,6 +291,6 @@ in 1.0.0.
|
|
247
291
|
|
248
292
|
[Compare v0.0.1...v0.1.0](https://github.com/solnic/transproc/compare/v0.0.1...v0.1.0)
|
249
293
|
|
250
|
-
|
294
|
+
# v0.0.1 2014-12-24
|
251
295
|
|
252
296
|
First public release \o/
|
data/Gemfile
CHANGED
@@ -2,28 +2,19 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
if RUBY_VERSION >= '2.1'
|
9
|
-
gem 'anima'
|
10
|
-
platform :mri do
|
11
|
-
gem 'mutant', github: 'mbj/mutant', branch: 'master'
|
12
|
-
gem 'mutant-rspec'
|
5
|
+
gem 'rake'
|
6
|
+
gem 'rspec', '~> 3.8'
|
7
|
+
gem 'dry-equalizer', '~> 0.2'
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
else
|
18
|
-
gem 'anima', '~> 0.2.0'
|
19
|
-
end
|
9
|
+
platform :mri do
|
10
|
+
gem 'simplecov', require: false
|
20
11
|
end
|
21
12
|
|
22
13
|
group :tools do
|
23
|
-
gem 'rubocop', '~> 0.30.0'
|
24
14
|
gem 'byebug', platform: :mri
|
25
15
|
gem 'benchmark-ips'
|
26
|
-
|
27
|
-
|
28
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
group :test do
|
19
|
+
gem 'warning' if defined? Warning
|
29
20
|
end
|
data/README.md
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
[gem]: https://rubygems.org/gems/transproc
|
2
2
|
[travis]: https://travis-ci.org/solnic/transproc
|
3
|
-
[gemnasium]: https://gemnasium.com/solnic/transproc
|
4
3
|
[codeclimate]: https://codeclimate.com/github/solnic/transproc
|
5
4
|
[coveralls]: https://coveralls.io/r/solnic/transproc
|
6
|
-
[inchpages]:
|
5
|
+
[inchpages]: https://inch-ci.org/github/solnic/transproc
|
7
6
|
|
8
7
|
# Transproc
|
9
8
|
|
10
9
|
[][gem]
|
11
10
|
[][travis]
|
12
|
-
[][gemnasium]
|
13
11
|
[][codeclimate]
|
14
12
|
[][codeclimate]
|
15
|
-
[][inchpages]
|
16
14
|
|
17
15
|
Transproc is a small library that allows you to compose procs into a functional pipeline using left-to-right function composition.
|
18
16
|
|
@@ -22,7 +20,7 @@ or `>>` in F#.
|
|
22
20
|
`transproc` provides a mechanism to define and compose transformations,
|
23
21
|
along with a number of built-in transformations.
|
24
22
|
|
25
|
-
It's currently used as the data mapping backend in [Ruby Object Mapper](
|
23
|
+
It's currently used as the data mapping backend in [Ruby Object Mapper](https://rom-rb.org).
|
26
24
|
|
27
25
|
## Installation
|
28
26
|
|
@@ -45,15 +43,15 @@ Or install it yourself as:
|
|
45
43
|
Simple transformations are defined as easy as:
|
46
44
|
|
47
45
|
```ruby
|
48
|
-
|
49
|
-
|
46
|
+
increment = Transproc::Function.new(-> (data) { data + 1 })
|
47
|
+
increment[1] # => 2
|
50
48
|
```
|
51
49
|
|
52
50
|
It's easy to compose transformations:
|
53
51
|
|
54
52
|
```ruby
|
55
53
|
to_string = Transproc::Function.new(:to_s.to_proc)
|
56
|
-
(
|
54
|
+
(increment >> to_string)[1] # => '2'
|
57
55
|
```
|
58
56
|
|
59
57
|
It's easy to pass additional arguments to transformations:
|
@@ -94,13 +92,13 @@ M[:map_array, M[:to_string]].([1, 2, 3]) # => ['1', '2', '3']
|
|
94
92
|
`transproc` comes with a lot of built-in functions. They come in the form of
|
95
93
|
modules with class methods, which you can import into a registry:
|
96
94
|
|
97
|
-
* [Coercions](
|
98
|
-
* [Array transformations](
|
99
|
-
* [Hash transformations](
|
100
|
-
* [Class transformations](
|
101
|
-
* [Proc transformations](
|
102
|
-
* [Conditional](
|
103
|
-
* [Recursion](
|
95
|
+
* [Coercions](https://www.rubydoc.info/gems/transproc/Transproc/Coercions)
|
96
|
+
* [Array transformations](https://www.rubydoc.info/gems/transproc/Transproc/ArrayTransformations)
|
97
|
+
* [Hash transformations](https://www.rubydoc.info/gems/transproc/Transproc/HashTransformations)
|
98
|
+
* [Class transformations](https://www.rubydoc.info/gems/transproc/Transproc/ClassTransformations)
|
99
|
+
* [Proc transformations](https://www.rubydoc.info/gems/transproc/Transproc/ProcTransformations)
|
100
|
+
* [Conditional](https://www.rubydoc.info/gems/transproc/Transproc/Conditional)
|
101
|
+
* [Recursion](https://www.rubydoc.info/gems/transproc/Transproc/Recursion)
|
104
102
|
|
105
103
|
You can import everything with:
|
106
104
|
|
@@ -197,9 +195,9 @@ transformation = t(:camel_case)
|
|
197
195
|
transformation.call 'i_am_a_camel'
|
198
196
|
# => "IAmACamel"
|
199
197
|
|
200
|
-
transformation = t(:map_array,
|
201
|
-
|
202
|
-
|
198
|
+
transformation = t(:map_array, (
|
199
|
+
t(:symbolize_keys).>> t(:rename_keys, user_name: :user)
|
200
|
+
)).>> t(:wrap, :address, [:city, :street, :zipcode])
|
203
201
|
|
204
202
|
transformation.call(
|
205
203
|
[
|
@@ -237,7 +235,7 @@ transformation.call('[{"name":"Jane"}]')
|
|
237
235
|
|
238
236
|
## Credits
|
239
237
|
|
240
|
-
This project is inspired by the work of following people:
|
238
|
+
This project is inspired by the work of the following people:
|
241
239
|
|
242
240
|
* [Markus Schirp](https://github.com/mbj) and [morpher](https://github.com/mbj/morpher) project
|
243
241
|
* [Josep M. Bach](https://github.com/txus) and [kleisli](https://github.com/txus/kleisli) project
|
data/Rakefile
CHANGED
data/lib/transproc.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'transproc/version'
|
4
|
+
require 'transproc/constants'
|
2
5
|
require 'transproc/function'
|
3
6
|
require 'transproc/functions'
|
4
7
|
require 'transproc/composer'
|
@@ -8,9 +11,5 @@ require 'transproc/registry'
|
|
8
11
|
require 'transproc/transformer'
|
9
12
|
require 'transproc/support/deprecations'
|
10
13
|
|
11
|
-
module Transproc
|
12
|
-
Undefined = Object.new.freeze
|
13
|
-
end
|
14
|
-
|
15
14
|
require 'transproc/array'
|
16
15
|
require 'transproc/hash'
|
data/lib/transproc/all.rb
CHANGED
data/lib/transproc/array.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'transproc/coercions'
|
2
4
|
require 'transproc/hash'
|
5
|
+
require 'transproc/array/combine'
|
3
6
|
|
4
7
|
module Transproc
|
5
8
|
# Transformation functions for Array objects
|
@@ -58,13 +61,13 @@ module Transproc
|
|
58
61
|
# @api public
|
59
62
|
def self.wrap(array, key, keys)
|
60
63
|
nest = HashTransformations[:nest, key, keys]
|
61
|
-
|
64
|
+
array.map { |element| nest.call(element) }
|
62
65
|
end
|
63
66
|
|
64
67
|
# Group array values using provided root key and value keys
|
65
68
|
#
|
66
69
|
# @example
|
67
|
-
# fn = Transproc(:group, :tags, [:
|
70
|
+
# fn = Transproc(:group, :tags, [:tag])
|
68
71
|
#
|
69
72
|
# fn.call [
|
70
73
|
# { task: 'Group it', tag: 'task' },
|
@@ -97,10 +100,10 @@ module Transproc
|
|
97
100
|
# Ungroup array values using provided root key and value keys
|
98
101
|
#
|
99
102
|
# @example
|
100
|
-
# fn = Transproc(:
|
103
|
+
# fn = Transproc(:ungroup, :tags, [:tag])
|
101
104
|
#
|
102
105
|
# fn.call [
|
103
|
-
# { task: 'Group it', tags: [{ tag: 'task' }, { tag: 'important' }]
|
106
|
+
# { task: 'Group it', tags: [{ tag: 'task' }, { tag: 'important' }] }
|
104
107
|
# ]
|
105
108
|
# # => [
|
106
109
|
# { task: 'Group it', tag: 'task' },
|
@@ -118,53 +121,8 @@ module Transproc
|
|
118
121
|
array.flat_map { |item| HashTransformations.split(item, key, keys) }
|
119
122
|
end
|
120
123
|
|
121
|
-
|
122
|
-
|
123
|
-
def self.combine(array, mappings, cache = CACHE.dup)
|
124
|
-
root, groups = array
|
125
|
-
|
126
|
-
root.map do |parent|
|
127
|
-
child_hash = {}
|
128
|
-
|
129
|
-
for candidates in groups
|
130
|
-
index = groups.index(candidates)
|
131
|
-
data = mappings[index]
|
132
|
-
|
133
|
-
key = data[0]
|
134
|
-
keys = data[1]
|
135
|
-
|
136
|
-
children =
|
137
|
-
if data.size == 2
|
138
|
-
candidates
|
139
|
-
else
|
140
|
-
combine(candidates, data[2])
|
141
|
-
end
|
142
|
-
|
143
|
-
child_keys = keys.size > 1 ? keys.values : keys.values[0]
|
144
|
-
pk_names = keys.size > 1 ? keys.keys : keys.keys[0]
|
145
|
-
|
146
|
-
pkey_value =
|
147
|
-
if pk_names.is_a?(Array)
|
148
|
-
parent.values_at(*pk_names)
|
149
|
-
else
|
150
|
-
parent[pk_names]
|
151
|
-
end
|
152
|
-
|
153
|
-
cache[key][child_keys] ||= children.group_by do |child|
|
154
|
-
if child_keys.is_a?(Array)
|
155
|
-
child.values_at(*child_keys)
|
156
|
-
else
|
157
|
-
child[child_keys]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
child_arr = cache[key][child_keys][pkey_value] || []
|
162
|
-
|
163
|
-
child_hash[key] = child_arr
|
164
|
-
end
|
165
|
-
|
166
|
-
parent.merge(child_hash)
|
167
|
-
end
|
124
|
+
def self.combine(array, mappings)
|
125
|
+
Combine.combine(array, mappings)
|
168
126
|
end
|
169
127
|
|
170
128
|
# Converts the array of hashes to array of values, extracted by given key
|