transproc 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca6a7b97e58a3d28f1c9ebeb9303a52926c94d39
4
- data.tar.gz: f1255fcec0934e3f096a6b47252d1ab6937df70e
3
+ metadata.gz: cd81b477e8c02b0e1644d7dd91c0dd798a09d24f
4
+ data.tar.gz: 6dde0346785ecc1de03f0beb9458cee9c427b5e1
5
5
  SHA512:
6
- metadata.gz: f9a87bded9276d2be3f4847bd59528a29e26c54333518ead773f304b8c342a9dc63b8f18bc681483e10cd70c7717194cbc56d74b921d7228fd28b991339ec949
7
- data.tar.gz: 6ef8c827fd903e226c3c1660091aac9fa231108ab7b7cecda5c438d142b633b81428000fa43802b51258d4033d774ac4f5ba90e0c97dbf77bbe42d66b30955da
6
+ metadata.gz: da55a09ce5a269141913ef066754d2e49a6e0cd45debdac119df3aff3788d0a287e654b43590c9c73223fd2b8ccfed48e4a6c850889259747414517c4eef21ad
7
+ data.tar.gz: 37c85578845d113c1f792cc02d83c9b697c585c8426fe8f76dc3b913a7ff307b97bc226cf039a95f40a1861d091e9a339b13016f71a512a7557e0a2428592a11
@@ -1,4 +1,11 @@
1
- ## v1.0.0 2017-01-29
1
+ # v1.0.1 2017-02-25
2
+
3
+ * `combine` is now multiple times faster, depending on the level of nesting (Kukunin + splattael)
4
+ * `nest` (thus `wrap` too) is ~2x faster now (solnic)
5
+
6
+ [Compare v1.0.0...v1.0.1](https://github.com/solnic/transproc/compare/v1.0.0...v1.0.1)
7
+
8
+ # v1.0.0 2017-01-29
2
9
 
3
10
  ## Added
4
11
 
@@ -14,7 +21,7 @@
14
21
 
15
22
  [Compare v0.4.2...v1.0.0](https://github.com/solnic/transproc/compare/v0.4.2...v1.0.0)
16
23
 
17
- ## v0.4.2 2017-01-12
24
+ # v0.4.2 2017-01-12
18
25
 
19
26
  ## Added
20
27
 
@@ -26,7 +33,7 @@
26
33
 
27
34
  [Compare v0.4.1...v0.4.2](https://github.com/solnic/transproc/compare/v0.4.1...v0.4.2)
28
35
 
29
- ## v0.4.1 2016-11-08
36
+ # v0.4.1 2016-11-08
30
37
 
31
38
  ## Added
32
39
 
@@ -38,7 +45,7 @@
38
45
 
39
46
  [Compare v0.4.0...v0.4.1](https://github.com/solnic/transproc/compare/v0.4.0...v0.4.1)
40
47
 
41
- ## v0.4.0 2015-11-23
48
+ # v0.4.0 2015-11-23
42
49
 
43
50
  ## Fixed
44
51
 
@@ -50,7 +57,7 @@
50
57
 
51
58
  [Compare v0.3.2...v0.4.0](https://github.com/solnic/transproc/compare/v0.3.2...v0.4.0)
52
59
 
53
- ## v0.3.2 2015-08-17
60
+ # v0.3.2 2015-08-17
54
61
 
55
62
  ## Changed
56
63
 
@@ -62,7 +69,7 @@
62
69
 
63
70
  [Compare v0.3.1...v0.3.2](https://github.com/solnic/transproc/compare/v0.3.1...v0.3.2)
64
71
 
65
- ## v0.3.1 2015-08-06
72
+ # v0.3.1 2015-08-06
66
73
 
67
74
  ### Added
68
75
 
@@ -74,7 +81,7 @@
74
81
 
75
82
  [Compare v0.3.0...v0.3.1](https://github.com/solnic/transproc/compare/v0.3.0...v0.3.1)
76
83
 
77
- ## v0.3.0 2015-07-12
84
+ # v0.3.0 2015-07-12
78
85
 
79
86
  This release deprecates a couple of APIs and changes the way functions can be
80
87
  accessed. The global `Transproc()` function registry is now deprecated and you
@@ -104,7 +111,7 @@ in 1.0.0.
104
111
 
105
112
  [Compare v0.2.4...v0.3.0](https://github.com/solnic/transproc/compare/v0.2.4...v0.3.0)
106
113
 
107
- ## v0.2.4 2015-06-20
114
+ # v0.2.4 2015-06-20
108
115
 
109
116
  ### Added
110
117
 
@@ -118,7 +125,7 @@ in 1.0.0.
118
125
 
119
126
  [Compare v0.2.3...v0.2.4](https://github.com/solnic/transproc/compare/v0.2.3...v0.2.4)
120
127
 
121
- ## v0.2.3 2015-06-02
128
+ # v0.2.3 2015-06-02
122
129
 
123
130
  ### Added
124
131
 
@@ -134,7 +141,7 @@ in 1.0.0.
134
141
 
135
142
  [Compare v0.2.2...v0.2.3](https://github.com/solnic/transproc/compare/v0.2.2...v0.2.3)
136
143
 
137
- ## v0.2.2 2015-05-22
144
+ # v0.2.2 2015-05-22
138
145
 
139
146
  ### Added
140
147
 
@@ -148,7 +155,7 @@ in 1.0.0.
148
155
 
149
156
  [Compare v0.2.1...v0.2.2](https://github.com/solnic/transproc/compare/v0.2.1...v0.2.2)
150
157
 
151
- ## v0.2.1 2015-05-17
158
+ # v0.2.1 2015-05-17
152
159
 
153
160
  ### Added
154
161
 
@@ -177,7 +184,7 @@ in 1.0.0.
177
184
 
178
185
  [Compare v0.2.0...v0.2.1](https://github.com/solnic/transproc/compare/v0.2.0...v0.2.1)
179
186
 
180
- ## v0.2.0 2015-04-14
187
+ # v0.2.0 2015-04-14
181
188
 
182
189
  ### Added
183
190
 
@@ -199,7 +206,7 @@ in 1.0.0.
199
206
 
200
207
  [Compare v0.1.3...v0.2.0](https://github.com/solnic/transproc/compare/v0.1.3...v0.2.0)
201
208
 
202
- ## v0.1.3 2015-04-07
209
+ # v0.1.3 2015-04-07
203
210
 
204
211
  ### Added
205
212
 
@@ -212,7 +219,7 @@ in 1.0.0.
212
219
 
213
220
  [Compare v0.1.2...v0.1.3](https://github.com/solnic/transproc/compare/v0.1.2...v0.1.3)
214
221
 
215
- ## v0.1.2 2015-03-14
222
+ # v0.1.2 2015-03-14
216
223
 
217
224
  ### Changed
218
225
 
@@ -220,7 +227,7 @@ in 1.0.0.
220
227
 
221
228
  [Compare v0.1.1...v0.1.2](https://github.com/solnic/transproc/compare/v0.1.1...v0.1.2)
222
229
 
223
- ## v0.1.1 2015-03-13
230
+ # v0.1.1 2015-03-13
224
231
 
225
232
  ### Changed
226
233
 
@@ -234,7 +241,7 @@ in 1.0.0.
234
241
 
235
242
  [Compare v0.1.0...v0.1.1](https://github.com/solnic/transproc/compare/v0.1.0...v0.1.1)
236
243
 
237
- ## v0.1.0 2014-12-28
244
+ # v0.1.0 2014-12-28
238
245
 
239
246
  ### Added
240
247
 
@@ -247,6 +254,6 @@ in 1.0.0.
247
254
 
248
255
  [Compare v0.0.1...v0.1.0](https://github.com/solnic/transproc/compare/v0.0.1...v0.1.0)
249
256
 
250
- ## v0.0.1 2014-12-24
257
+ # v0.0.1 2014-12-24
251
258
 
252
259
  First public release \o/
data/README.md CHANGED
@@ -45,15 +45,15 @@ Or install it yourself as:
45
45
  Simple transformations are defined as easy as:
46
46
 
47
47
  ```ruby
48
- increament = Transproc::Function.new(-> (data) { data + 1 })
49
- increament[1] # => 2
48
+ increment = Transproc::Function.new(-> (data) { data + 1 })
49
+ increment[1] # => 2
50
50
  ```
51
51
 
52
52
  It's easy to compose transformations:
53
53
 
54
54
  ```ruby
55
55
  to_string = Transproc::Function.new(:to_s.to_proc)
56
- (increament >> to_string)[1] => '2'
56
+ (increment >> to_string)[1] => '2'
57
57
  ```
58
58
 
59
59
  It's easy to pass additional arguments to transformations:
@@ -1,5 +1,6 @@
1
1
  require 'transproc/coercions'
2
2
  require 'transproc/hash'
3
+ require 'transproc/array/combine'
3
4
 
4
5
  module Transproc
5
6
  # Transformation functions for Array objects
@@ -58,7 +59,7 @@ module Transproc
58
59
  # @api public
59
60
  def self.wrap(array, key, keys)
60
61
  nest = HashTransformations[:nest, key, keys]
61
- map_array(array, nest)
62
+ array.map { |element| nest.call(element) }
62
63
  end
63
64
 
64
65
  # Group array values using provided root key and value keys
@@ -118,53 +119,8 @@ module Transproc
118
119
  array.flat_map { |item| HashTransformations.split(item, key, keys) }
119
120
  end
120
121
 
121
- CACHE = Hash.new { |h, k| h[k] = {} }
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
122
+ def self.combine(array, mappings)
123
+ Combine.combine(array, mappings)
168
124
  end
169
125
 
170
126
  # Converts the array of hashes to array of values, extracted by given key
@@ -0,0 +1,56 @@
1
+ module Transproc
2
+ module ArrayTransformations
3
+ class Combine
4
+ class << self
5
+ def combine(array, mappings)
6
+ root, nodes = array
7
+ return root if nodes.nil?
8
+ groups = group_nodes(nodes, mappings)
9
+
10
+ root.map do |element|
11
+ element.dup.tap { |copy| add_groups_to_element(copy, groups, mappings) }
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def add_groups_to_element(element, groups, mappings)
18
+ groups.each_with_index do |candidates, index|
19
+ mapping = mappings[index]
20
+ resource_key = mapping[0]
21
+ element[resource_key] = element_candidates(element, candidates, mapping[1].keys)
22
+ end
23
+ end
24
+
25
+ def element_candidates(element, candidates, keys)
26
+ candidates[element_candidates_key(element, keys)] || []
27
+ end
28
+
29
+ def group_nodes(nodes, mappings)
30
+ nodes.each_with_index.map do |candidates, index|
31
+ mapping = mappings[index]
32
+ group_candidates(candidates, mapping)
33
+ end
34
+ end
35
+
36
+ def group_candidates(candidates, mapping)
37
+ nested_mapping = mapping[2]
38
+ candidates = combine(candidates, nested_mapping) unless nested_mapping.nil?
39
+ group_candidates_by_keys(candidates, mapping[1].values)
40
+ end
41
+
42
+ def group_candidates_by_keys(candidates, keys)
43
+ return candidates.group_by { |a| a.values_at(*keys) } if keys.size > 1
44
+
45
+ key = keys.first
46
+ candidates.group_by { |a| a[key] }
47
+ end
48
+
49
+ def element_candidates_key(element, keys)
50
+ return element.values_at(*keys) if keys.size > 1
51
+ element[keys.first]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -85,7 +85,8 @@ module Transproc
85
85
  #
86
86
  # @api public
87
87
  def to_ast
88
- [name, args]
88
+ args_ast = args.map { |arg| arg.respond_to?(:to_ast) ? arg.to_ast : arg }
89
+ [name, args_ast]
89
90
  end
90
91
 
91
92
  # Converts a transproc to a simple proc
@@ -209,18 +209,26 @@ module Transproc
209
209
  # @return [Hash]
210
210
  #
211
211
  # @api public
212
- def self.nest(source_hash, root, keys)
213
- nest_keys = source_hash.keys & keys
212
+ def self.nest(hash, root, keys)
213
+ child = {}
214
214
 
215
- if !nest_keys.empty?
216
- hash = Hash[source_hash]
217
- child = Hash[nest_keys.zip(nest_keys.map { |key| hash.delete(key) })]
218
- old_nest = hash[root]
219
- new_nest = old_nest.is_a?(Hash) ? old_nest.merge(child) : child
220
- hash.merge(root => new_nest)
215
+ keys.each do |key|
216
+ child[key] = hash[key] if hash.key?(key)
217
+ end
218
+
219
+ output = Hash[hash]
220
+
221
+ child.each_key { |key| output.delete(key) }
222
+
223
+ old_root = hash[root]
224
+
225
+ if old_root.is_a?(Hash)
226
+ output[root] = old_root.merge(child)
221
227
  else
222
- source_hash.merge(root => {})
228
+ output[root] = child
223
229
  end
230
+
231
+ output
224
232
  end
225
233
 
226
234
  # Collapse a nested hash from a specified key
@@ -46,8 +46,9 @@ module Transproc
46
46
  #
47
47
  def [](fn, *args)
48
48
  fetched = fetch(fn)
49
- return fetched if already_wrapped?(fetched)
50
- Function.new(fetched, args: args, name: fn)
49
+
50
+ return Function.new(fetched, args: args, name: fn) unless already_wrapped?(fetched)
51
+ args.empty? ? fetched : fetched.with(*args)
51
52
  end
52
53
  alias_method :t, :[]
53
54
 
@@ -1,3 +1,3 @@
1
1
  module Transproc
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
@@ -0,0 +1,214 @@
1
+ require 'spec_helper'
2
+
3
+ describe Transproc::ArrayTransformations do
4
+ describe '.combine' do
5
+ subject(:result) { described_class.t(:combine, mappings)[input] }
6
+
7
+ let(:input) { [[]] }
8
+ let(:mappings) { [] }
9
+
10
+ it { is_expected.to be_a(Array) }
11
+
12
+ it { is_expected.to eq([]) }
13
+
14
+ context 'without groups' do
15
+ let(:input) do
16
+ [
17
+ [
18
+ {name: 'Jane', email: 'jane@doe.org'}.freeze,
19
+ {name: 'Joe', email: 'joe@doe.org'}.freeze
20
+ ].freeze
21
+ ].freeze
22
+ end
23
+
24
+ it { is_expected.to eq input.first }
25
+ end
26
+
27
+ it 'does not modify its input' do
28
+ input = [
29
+ [{ name: 'Jane' }],
30
+ [[{ user: 'Jane', title: 'One' }]]
31
+ ]
32
+
33
+ output = [
34
+ { name: 'Jane', tasks: [{ user: 'Jane', title: 'One' }] }
35
+ ]
36
+
37
+ combined = described_class.combine(input, [[:tasks, name: :user]])
38
+
39
+ expect(combined).to eql(output)
40
+ end
41
+
42
+ context 'with one group' do
43
+ let(:input) do
44
+ [
45
+ [
46
+ {name: 'Jane', email: 'jane@doe.org'}.freeze,
47
+ {name: 'Joe', email: 'joe@doe.org'}.freeze
48
+ ].freeze,
49
+ [
50
+ [
51
+ {user: 'Jane', title: 'One'}.freeze,
52
+ {user: 'Jane', title: 'Two'}.freeze,
53
+ {user: 'Joe', title: 'Three'}.freeze
54
+ ]
55
+ ]
56
+ ].freeze
57
+ end
58
+ let(:mappings) { [[:tasks, {name: :user}]] }
59
+
60
+ it 'merges hashes from arrays using provided join keys' do
61
+ output = [
62
+ {name: 'Jane', email: 'jane@doe.org', tasks: [
63
+ {user: 'Jane', title: 'One'},
64
+ {user: 'Jane', title: 'Two'}
65
+ ]},
66
+ {name: 'Joe', email: 'joe@doe.org', tasks: [
67
+ {user: 'Joe', title: 'Three'}
68
+ ]}
69
+ ]
70
+ is_expected.to eql(output)
71
+ end
72
+ end
73
+
74
+ context 'with empty nodes' do
75
+ let(:input) do
76
+ [
77
+ [{name: 'Jane', email: 'jane@doe.org'}.freeze].freeze,
78
+ [
79
+ []
80
+ ]
81
+ ].freeze
82
+ end
83
+
84
+ let(:mappings) { [[:tasks, {name: :user}]] }
85
+
86
+ it { is_expected.to eq([{name: 'Jane', email: 'jane@doe.org', tasks: []}]) }
87
+ end
88
+
89
+ context 'with double mapping' do
90
+ let(:input) do
91
+ [
92
+ [
93
+ {name: 'Jane', email: 'jane@doe.org'}.freeze
94
+ ].freeze,
95
+ [
96
+ [
97
+ {user: 'Jane', user_email: 'jane@doe.org', title: 'One'}.freeze,
98
+ {user: 'Jane', user_email: '', title: 'Two'}.freeze
99
+ ].freeze
100
+ ].freeze
101
+ ].freeze
102
+ end
103
+
104
+ let(:mappings) { [[:tasks, {name: :user, email: :user_email}]] }
105
+
106
+ it 'searches by two keys simultaneously' do
107
+ output = [
108
+ {name: 'Jane', email: 'jane@doe.org', tasks: [
109
+ {user: 'Jane', user_email: 'jane@doe.org', title: 'One'}
110
+ ]}
111
+ ]
112
+ is_expected.to eql(output)
113
+ end
114
+ end
115
+
116
+ describe 'integration test' do
117
+ let(:input) do
118
+ [
119
+ [
120
+ {name: 'Jane', email: 'jane@doe.org'},
121
+ {name: 'Joe', email: 'joe@doe.org'}
122
+ ],
123
+ [
124
+ [
125
+ # user tasks
126
+ [
127
+ {user: 'Jane', title: 'One'},
128
+ {user: 'Jane', title: 'Two'},
129
+ {user: 'Joe', title: 'Three'}
130
+ ],
131
+ [
132
+ # task tags
133
+ [
134
+ {task: 'One', tag: 'red'},
135
+ {task: 'Three', tag: 'blue'}
136
+ ]
137
+ ]
138
+ ]
139
+ ]
140
+ ]
141
+ end
142
+
143
+ let(:mappings) { [[:tasks, {name: :user}, [[:tags, title: :task]]]] }
144
+
145
+ it 'merges hashes from arrays using provided join keys' do
146
+ output = [
147
+ {name: 'Jane', email: 'jane@doe.org', tasks: [
148
+ {user: 'Jane', title: 'One', tags: [{task: 'One', tag: 'red'}]},
149
+ {user: 'Jane', title: 'Two', tags: []}
150
+ ]},
151
+ {
152
+ name: 'Joe', email: 'joe@doe.org', tasks: [
153
+ {
154
+ user: 'Joe', title: 'Three', tags: [
155
+ {task: 'Three', tag: 'blue'}
156
+ ]
157
+ }
158
+ ]
159
+ }
160
+ ]
161
+ is_expected.to eql(output)
162
+ end
163
+ end
164
+
165
+ it 'merges hashes from arrays using provided join keys' do
166
+ input = [
167
+ # parent users
168
+ [
169
+ { name: 'Jane', email: 'jane@doe.org' }.freeze,
170
+ { name: 'Joe', email: 'joe@doe.org' }.freeze
171
+ ].freeze,
172
+ [
173
+ [
174
+ # user tasks
175
+ [
176
+ { user: 'Jane', title: 'One' }.freeze,
177
+ { user: 'Jane', title: 'Two' }.freeze,
178
+ { user: 'Joe', title: 'Three' }.freeze
179
+ ].freeze,
180
+ [
181
+ # task tags
182
+ [
183
+ { task: 'One', tag: 'red' }.freeze,
184
+ { task: 'Three', tag: 'blue' }.freeze
185
+ ].freeze
186
+ ].freeze
187
+ ].freeze
188
+ ].freeze
189
+ ].freeze
190
+
191
+ output = [
192
+ { name: 'Jane', email: 'jane@doe.org', tasks: [
193
+ { user: 'Jane', title: 'One', tags: [{ task: 'One', tag: 'red' }] },
194
+ { user: 'Jane', title: 'Two', tags: [] }]
195
+ },
196
+ {
197
+ name: 'Joe', email: 'joe@doe.org', tasks: [
198
+ {
199
+ user: 'Joe', title: 'Three', tags: [
200
+ { task: 'Three', tag: 'blue' }
201
+ ]
202
+ }
203
+ ]
204
+ }
205
+ ]
206
+
207
+ combine = described_class.t(:combine, [
208
+ [:tasks, { name: :user }, [[:tags, title: :task]]]
209
+ ])
210
+
211
+ expect(combine[input]).to eql(output)
212
+ end
213
+ end
214
+ end
@@ -230,55 +230,4 @@ describe Transproc::ArrayTransformations do
230
230
  expect(ungroup[input]).to eql(output)
231
231
  end
232
232
  end
233
-
234
- describe '.combine' do
235
- it 'merges hashes from arrays using provided join keys' do
236
- input = [
237
- # parent users
238
- [
239
- { name: 'Jane', email: 'jane@doe.org' },
240
- { name: 'Joe', email: 'joe@doe.org' }
241
- ],
242
- [
243
- [
244
- # user tasks
245
- [
246
- { user: 'Jane', title: 'One' },
247
- { user: 'Jane', title: 'Two' },
248
- { user: 'Joe', title: 'Three' }
249
- ],
250
- [
251
- # task tags
252
- [
253
- { task: 'One', tag: 'red' },
254
- { task: 'Three', tag: 'blue' }
255
- ]
256
- ]
257
- ]
258
- ]
259
- ]
260
-
261
- output = [
262
- { name: 'Jane', email: 'jane@doe.org', tasks: [
263
- { user: 'Jane', title: 'One', tags: [{ task: 'One', tag: 'red' }] },
264
- { user: 'Jane', title: 'Two', tags: [] }]
265
- },
266
- {
267
- name: 'Joe', email: 'joe@doe.org', tasks: [
268
- {
269
- user: 'Joe', title: 'Three', tags: [
270
- { task: 'Three', tag: 'blue' }
271
- ]
272
- }
273
- ]
274
- }
275
- ]
276
-
277
- combine = described_class.t(:combine, [
278
- [:tasks, { name: :user }, [[:tags, title: :task]]]
279
- ])
280
-
281
- expect(combine[input]).to eql(output)
282
- end
283
- end
284
233
  end
@@ -98,6 +98,21 @@ describe Transproc::Function do
98
98
  expect(fn[:ok]).to eql('ok')
99
99
  expect(fn.to_ast).to eql([:to_string, []])
100
100
  end
101
+
102
+ it 'plays well with functions as arguments' do
103
+ container.register(:map_array, Transproc::ArrayTransformations.t(:map_array))
104
+ container.register(:to_symbol, Transproc::Coercions.t(:to_symbol))
105
+ fn = container.t(:map_array, container.t(:to_symbol))
106
+
107
+ expect(fn.call(%w(a b c))).to eql([:a, :b, :c])
108
+ expect(fn.to_ast).to eql(
109
+ [
110
+ :map_array, [
111
+ [:to_symbol, []]
112
+ ]
113
+ ]
114
+ )
115
+ end
101
116
  end
102
117
 
103
118
  describe '#==' do
@@ -100,6 +100,14 @@ describe Transproc::Registry do
100
100
  expect(foo[:prefix_one]).to eq function
101
101
  end
102
102
 
103
+ it 'allows to overwrite function arguments' do
104
+ foo.register(:map_array, Transproc::ArrayTransformations.t(:map_array))
105
+
106
+ fn = foo[:map_array, ->(value) { value.to_sym }]
107
+
108
+ expect(fn.call(%w(a b c))).to eq([:a, :b, :c])
109
+ end
110
+
103
111
  it 'registers and fetches composite' do
104
112
  composite = foo[:prefix, '1'] + foo[:prefix, '2']
105
113
  foo.register(:double_prefix, composite)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transproc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-29 00:00:00.000000000 Z
11
+ date: 2017-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,6 +73,7 @@ files:
73
73
  - lib/transproc.rb
74
74
  - lib/transproc/all.rb
75
75
  - lib/transproc/array.rb
76
+ - lib/transproc/array/combine.rb
76
77
  - lib/transproc/class.rb
77
78
  - lib/transproc/coercions.rb
78
79
  - lib/transproc/composer.rb
@@ -94,6 +95,7 @@ files:
94
95
  - rakelib/rubocop.rake
95
96
  - spec/spec_helper.rb
96
97
  - spec/support/mutant.rb
98
+ - spec/unit/array/combine_spec.rb
97
99
  - spec/unit/array_transformations_spec.rb
98
100
  - spec/unit/class_transformations_spec.rb
99
101
  - spec/unit/coercions_spec.rb
@@ -129,13 +131,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  version: '0'
130
132
  requirements: []
131
133
  rubyforge_project:
132
- rubygems_version: 2.5.1
134
+ rubygems_version: 2.6.9
133
135
  signing_key:
134
136
  specification_version: 4
135
137
  summary: Transform Ruby objects in functional style
136
138
  test_files:
137
139
  - spec/spec_helper.rb
138
140
  - spec/support/mutant.rb
141
+ - spec/unit/array/combine_spec.rb
139
142
  - spec/unit/array_transformations_spec.rb
140
143
  - spec/unit/class_transformations_spec.rb
141
144
  - spec/unit/coercions_spec.rb