burner 1.5.0 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.tool-versions +1 -0
- data/CHANGELOG.md +36 -0
- data/README.md +59 -3
- data/lib/burner/data.rb +46 -0
- data/lib/burner/job.rb +2 -10
- data/lib/burner/job_set.rb +64 -0
- data/lib/burner/job_with_register.rb +8 -1
- data/lib/burner/jobs.rb +6 -0
- data/lib/burner/library.rb +6 -0
- data/lib/burner/library/collection/arrays_to_objects.rb +1 -1
- data/lib/burner/library/collection/coalesce.rb +14 -9
- data/lib/burner/library/collection/concatenate.rb +1 -1
- data/lib/burner/library/collection/graph.rb +1 -1
- data/lib/burner/library/collection/group.rb +15 -11
- data/lib/burner/library/collection/nested_aggregate.rb +1 -1
- data/lib/burner/library/collection/number.rb +51 -0
- data/lib/burner/library/collection/objects_to_arrays.rb +1 -1
- data/lib/burner/library/collection/shift.rb +1 -1
- data/lib/burner/library/collection/transform.rb +1 -1
- data/lib/burner/library/collection/unpivot.rb +1 -1
- data/lib/burner/library/collection/validate.rb +1 -1
- data/lib/burner/library/collection/values.rb +1 -1
- data/lib/burner/library/collection/zip.rb +1 -1
- data/lib/burner/library/compress/row_reader.rb +1 -1
- data/lib/burner/library/deserialize/yaml.rb +1 -1
- data/lib/burner/library/echo.rb +1 -1
- data/lib/burner/library/io/exist.rb +1 -1
- data/lib/burner/library/io/open_file_base.rb +1 -1
- data/lib/burner/library/io/row_reader.rb +1 -1
- data/lib/burner/library/io/write.rb +28 -1
- data/lib/burner/library/param/base.rb +29 -0
- data/lib/burner/library/param/from_register.rb +30 -0
- data/lib/burner/library/param/to_register.rb +28 -0
- data/lib/burner/library/serialize/csv.rb +1 -1
- data/lib/burner/library/sleep.rb +1 -1
- data/lib/burner/library/value/copy.rb +1 -1
- data/lib/burner/library/value/nest.rb +37 -0
- data/lib/burner/library/value/static.rb +1 -1
- data/lib/burner/library/value/transform.rb +38 -0
- data/lib/burner/payload.rb +39 -15
- data/lib/burner/pipeline.rb +6 -34
- data/lib/burner/util.rb +1 -0
- data/lib/burner/util/keyable.rb +23 -0
- data/lib/burner/version.rb +1 -1
- metadata +15 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f7acc476043a573e329d1f0dc07e3b6f8a90f456517d4b98c66ac3e370f26fe
|
4
|
+
data.tar.gz: 8317c42ba254babbb8b72c7468dab2ca132e809a812625241d8f393077a8ba2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93a1a11b8b7506c2e5508e9e34c34224a1b988cf49364f29a487103e331396a0852636fc83615bf53a963df29f34393e9f69fd4a66c2062ede0ec4620680a6db
|
7
|
+
data.tar.gz: c82edbbe587a36c30573720908688cebf046ef7a13c864682a16b14fd14de5e6f19bc48d676fe568ccc35cdbdae25e4c64b2f835249d819d1bc2c415c330ad45
|
data/.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 2.6.6
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,40 @@
|
|
1
|
+
# 1.8.0 (March 31st, 2021)
|
1
2
|
|
3
|
+
Added Jobs:
|
4
|
+
|
5
|
+
* b/param/from_register
|
6
|
+
* b/param/to_register
|
7
|
+
|
8
|
+
Other:
|
9
|
+
|
10
|
+
* Payload#param was added to access a param key's value.
|
11
|
+
* Payload#update_param was added to update a param key's value.
|
12
|
+
|
13
|
+
Internal Notes:
|
14
|
+
|
15
|
+
Payload#register and Payload#params data stores have been internally consolidated while still maintaining the same public API surface area.
|
16
|
+
|
17
|
+
# 1.7.0 (January 22nd, 2021)
|
18
|
+
|
19
|
+
Added Jobs:
|
20
|
+
|
21
|
+
* b/collection/number
|
22
|
+
* b/value/nest
|
23
|
+
* b/value/transform
|
24
|
+
|
25
|
+
Enhanced Jobs:
|
26
|
+
|
27
|
+
* b/collection/coalesce and b/collection/group now support the notion of case and type-insensitivity (insensitive option).
|
28
|
+
|
29
|
+
Changes:
|
30
|
+
|
31
|
+
* Job names derived from Burner::Job are now optional. Pipelines themselves now can handle jobs without names.
|
32
|
+
|
33
|
+
# 1.6.0 (December 22nd, 2020)
|
34
|
+
|
35
|
+
Additions:
|
36
|
+
|
37
|
+
* b/io/write now provides an optional `supress_side_effect` option.
|
2
38
|
# 1.5.0 (December 21st, 2020)
|
3
39
|
|
4
40
|
Added Jobs:
|
data/README.md
CHANGED
@@ -93,6 +93,54 @@ Some notes:
|
|
93
93
|
* Jobs can be re-used (just like the output_id and output_value jobs).
|
94
94
|
* If steps is nil then all jobs will execute in their declared order.
|
95
95
|
|
96
|
+
### Omitting Job Names and Steps
|
97
|
+
|
98
|
+
Job names are optional, but steps can only correspond to named jobs. This means if steps is declared then anonymous jobs will have no way to be executed. Here is the same pipeline as above, but without job names and steps:
|
99
|
+
|
100
|
+
````ruby
|
101
|
+
pipeline = {
|
102
|
+
jobs: [
|
103
|
+
{
|
104
|
+
type: 'b/io/read',
|
105
|
+
path: '{input_file}'
|
106
|
+
},
|
107
|
+
{
|
108
|
+
type: 'b/echo',
|
109
|
+
message: 'The job id is: {__id}'
|
110
|
+
},
|
111
|
+
{
|
112
|
+
type: 'b/echo',
|
113
|
+
message: 'The current value is: {__default_register}'
|
114
|
+
},
|
115
|
+
{
|
116
|
+
type: 'b/deserialize/json'
|
117
|
+
},
|
118
|
+
{
|
119
|
+
type: 'b/serialize/yaml'
|
120
|
+
},
|
121
|
+
{
|
122
|
+
type: 'b/echo',
|
123
|
+
message: 'The current value is: {__default_register}'
|
124
|
+
},
|
125
|
+
{
|
126
|
+
type: 'b/io/write',
|
127
|
+
path: '{output_file}'
|
128
|
+
}
|
129
|
+
]
|
130
|
+
}
|
131
|
+
|
132
|
+
params = {
|
133
|
+
input_file: 'input.json',
|
134
|
+
output_file: 'output.yaml'
|
135
|
+
}
|
136
|
+
|
137
|
+
payload = Burner::Payload.new(params: params)
|
138
|
+
|
139
|
+
Burner::Pipeline.make(pipeline).execute(payload: payload)
|
140
|
+
````
|
141
|
+
|
142
|
+
Like everything in software, there are trade-offs to the above two equivalent pipelines. The former (one with steps and job names) has less jobs but is more verbose. The latter (without steps and job names) has more jobs but reads terser. Names also can aid in self-documenting your code/configuration so it may be a good idea to enforce at least names are used.
|
143
|
+
|
96
144
|
### Capturing Feedback / Output
|
97
145
|
|
98
146
|
By default, output will be emitted to `$stdout`. You can add or change listeners by passing in optional values into Pipeline#execute. For example, say we wanted to capture the output from our json-to-yaml example:
|
@@ -216,11 +264,12 @@ This library only ships with very basic, rudimentary jobs that are meant to just
|
|
216
264
|
#### Collection
|
217
265
|
|
218
266
|
* **b/collection/arrays_to_objects** [mappings, register]: Convert an array of arrays to an array of objects.
|
219
|
-
* **b/collection/coalesce** [
|
267
|
+
* **b/collection/coalesce** [grouped_register, insensitive, key_mappings, keys, register, separator]: Merge two datasets together based on the key values of one dataset (array) with a grouped dataset (hash). If insensitive (false by default) is true then each key's value will be converted/coerced to a lowercase string.
|
220
268
|
* **b/collection/concatenate** [from_registers, to_register]: Concatenate each from_register's value and place the newly concatenated array into the to_register. Note: this does not do any deep copying and should be assumed it is shallow copying all objects.
|
221
269
|
* **b/collection/graph** [config, key, register]: Use [Hashematics](https://github.com/bluemarblepayroll/hashematics) to turn a flat array of objects into a deeply nested object tree.
|
222
|
-
* **b/collection/group** [keys, register, separator]: Take a register's value (an array of objects) and group the objects by the specified keys.
|
270
|
+
* **b/collection/group** [insensitive, keys, register, separator]: Take a register's value (an array of objects) and group the objects by the specified keys. If insensitive (false by default) is true then each key's value will be converted/coerced to a lowercase string.
|
223
271
|
* **b/collection/nested_aggregate** [register, key_mappings, key, separator]: Traverse a set of objects, resolving key's value for each object, optionally copying down key_mappings to the child records, then merging all the inner records together.
|
272
|
+
* **b/collection/number** [key, register, separator, start_at]: This job can iterate over a set of records and sequence them (set the specified key to a sequential index value.)
|
224
273
|
* **b/collection/objects_to_arrays** [mappings, register]: Convert an array of objects to an array of arrays.
|
225
274
|
* **b/collection/shift** [amount, register]: Remove the first N number of elements from an array.
|
226
275
|
* **b/collection/transform** [attributes, exclusive, separator, register]: Iterate over all objects and transform each key per the attribute transformers specifications. If exclusive is set to false then the current object will be overridden/merged. Separator can also be set for key path support. This job uses [Realize](https://github.com/bluemarblepayroll/realize), which provides its own extendable value-transformation pipeline. If an attribute is not set with `explicit: true` then it will automatically start from the key's value from the record. If `explicit: true` is started, then it will start from the record itself.
|
@@ -246,7 +295,12 @@ By default all jobs will use the `Burner::Disks::Local` disk for its persistence
|
|
246
295
|
* **b/io/exist** [disk, path, short_circuit]: Check to see if a file exists. The path parameter can be interpolated using `Payload#params`. If short_circuit was set to true (defaults to false) and the file does not exist then the pipeline will be short-circuited.
|
247
296
|
* **b/io/read** [binary, disk, path, register]: Read in a local file. The path parameter can be interpolated using `Payload#params`. If the contents are binary, pass in `binary: true` to open it up in binary+read mode.
|
248
297
|
* **b/io/row_reader** [data_key, disk, ignore_blank_path, ignore_file_not_found, path_key, register, separator]: Iterates over an array of objects, extracts a filepath from a key in each object, and attempts to load the file's content for each record. The file's content will be stored at the specified data_key. By default missing paths or files will be treated as hard errors. If you wish to ignore these then pass in true for ignore_blank_path and/or ignore_file_not_found.
|
249
|
-
* **b/io/write** [binary, disk, path, register]: Write to a local file. The path parameter can be interpolated using `Payload#params`. If the contents are binary, pass in `binary: true` to open it up in binary+write mode.
|
298
|
+
* **b/io/write** [binary, disk, path, register, supress_side_effect]: Write to a local file. The path parameter can be interpolated using `Payload#params`. If the contents are binary, pass in `binary: true` to open it up in binary+write mode. By default, written files are also logged as WrittenFile instances to the Payload#side_effects array. You can pass in supress_side_effect: true to disable this behavior.
|
299
|
+
|
300
|
+
#### Parameters
|
301
|
+
|
302
|
+
* **b/param/from_register** [param_key, register]: Copy the value of a register to a param key.
|
303
|
+
* **b/param/to_register** [param_key, register]: Copy the value of a param key to a register.
|
250
304
|
|
251
305
|
#### Serialization
|
252
306
|
|
@@ -257,7 +311,9 @@ By default all jobs will use the `Burner::Disks::Local` disk for its persistence
|
|
257
311
|
#### Value
|
258
312
|
|
259
313
|
* **b/value/copy** [from_register, to_register]: Copy from_register's value into the to_register. Note: this does not do any deep copying and should be assumed it is shallow copying all objects.
|
314
|
+
* **b/value/nest** [key, register]: This job will nest the current value within a new outer hash. The specified key passed in will be the corresponding new hash key entry for the existing value.
|
260
315
|
* **b/value/static** [register, value]: Set the value to any arbitrary value.
|
316
|
+
* **b/value/transform** [register, separator, transformers]: Transform the current value of the register through a Realize::Pipeline. This will transform the entire value, as opposed to the b/collection/transform job, which will iterate over each row/record in a dataset and transform each row/record.
|
261
317
|
|
262
318
|
#### General
|
263
319
|
|
data/lib/burner/data.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Burner
|
11
|
+
# Defines a key value pair data store per our library. It is basically a composite
|
12
|
+
# object around a hash with indifferent key typing.
|
13
|
+
class Data
|
14
|
+
extend Forwardable
|
15
|
+
|
16
|
+
def_delegators :internal_hash, :transform_keys
|
17
|
+
|
18
|
+
def initialize(hash = {})
|
19
|
+
@internal_hash = {}
|
20
|
+
|
21
|
+
(hash || {}).each { |k, v| self[k] = v }
|
22
|
+
end
|
23
|
+
|
24
|
+
def []=(key, value)
|
25
|
+
internal_hash[key.to_s] = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](key)
|
29
|
+
internal_hash[key.to_s]
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_h
|
33
|
+
internal_hash
|
34
|
+
end
|
35
|
+
|
36
|
+
def ==(other)
|
37
|
+
other.instance_of?(self.class) &&
|
38
|
+
to_h == other.to_h
|
39
|
+
end
|
40
|
+
alias eql? ==
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
attr_reader :internal_hash
|
45
|
+
end
|
46
|
+
end
|
data/lib/burner/job.rb
CHANGED
@@ -18,9 +18,7 @@ module Burner
|
|
18
18
|
|
19
19
|
attr_reader :name
|
20
20
|
|
21
|
-
def initialize(name:)
|
22
|
-
raise ArgumentError, 'name is required' if name.to_s.empty?
|
23
|
-
|
21
|
+
def initialize(name: '')
|
24
22
|
@name = name.to_s
|
25
23
|
end
|
26
24
|
|
@@ -48,15 +46,9 @@ module Burner
|
|
48
46
|
protected
|
49
47
|
|
50
48
|
def job_string_template(expression, output, payload)
|
51
|
-
templatable_params = payload.
|
52
|
-
.merge(__id: output.id)
|
53
|
-
.merge(templatable_register_values(payload))
|
49
|
+
templatable_params = payload.params_and_registers_hash.merge(__id: output.id)
|
54
50
|
|
55
51
|
Util::StringTemplate.instance.evaluate(expression, templatable_params)
|
56
52
|
end
|
57
|
-
|
58
|
-
def templatable_register_values(payload)
|
59
|
-
payload.registers.transform_keys { |key| "__#{key}_register" }
|
60
|
-
end
|
61
53
|
end
|
62
54
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require_relative 'jobs'
|
11
|
+
|
12
|
+
module Burner
|
13
|
+
# This class understands how jobs fit together as a cohesive unit. It does not know how to
|
14
|
+
# use them, but it knows how to group them together in a logical manner following some simple
|
15
|
+
# rules, such as:
|
16
|
+
# - Jobs in a set should have unique names (unless the name is blank)
|
17
|
+
# - Subsets of jobs can be extracted, by name, in constant time.
|
18
|
+
class JobSet
|
19
|
+
class DuplicateJobNameError < StandardError; end
|
20
|
+
class JobNotFoundError < StandardError; end
|
21
|
+
|
22
|
+
def initialize(jobs = [])
|
23
|
+
@jobs = Jobs.array(jobs).freeze
|
24
|
+
|
25
|
+
assert_unique_job_names
|
26
|
+
end
|
27
|
+
|
28
|
+
def jobs(names = nil)
|
29
|
+
return @jobs unless names
|
30
|
+
|
31
|
+
Array(names).map do |name|
|
32
|
+
job = named_jobs_by_name[name.to_s]
|
33
|
+
|
34
|
+
raise JobNotFoundError, "#{name} was not declared as a job" unless job
|
35
|
+
|
36
|
+
job
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def named_jobs_by_name
|
43
|
+
@named_jobs_by_name ||= named_jobs.each_with_object({}) { |job, memo| memo[job.name] = job }
|
44
|
+
end
|
45
|
+
|
46
|
+
def named_jobs
|
47
|
+
@named_jobs ||= @jobs.reject { |job| job.name == '' }
|
48
|
+
end
|
49
|
+
|
50
|
+
def assert_unique_job_names
|
51
|
+
unique_job_names = Set.new
|
52
|
+
|
53
|
+
named_jobs.each do |job|
|
54
|
+
if unique_job_names.include?(job.name)
|
55
|
+
raise DuplicateJobNameError, "job with name: #{job.name} already declared"
|
56
|
+
end
|
57
|
+
|
58
|
+
unique_job_names << job.name
|
59
|
+
end
|
60
|
+
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -15,10 +15,17 @@ module Burner
|
|
15
15
|
class JobWithRegister < Job
|
16
16
|
attr_reader :register
|
17
17
|
|
18
|
-
def initialize(name
|
18
|
+
def initialize(name: '', register: DEFAULT_REGISTER)
|
19
19
|
super(name: name)
|
20
20
|
|
21
21
|
@register = register.to_s
|
22
22
|
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
# Helper method that knows how to ensure the register is an array.
|
27
|
+
def ensure_array(payload)
|
28
|
+
payload[register] = array(payload[register])
|
29
|
+
end
|
23
30
|
end
|
24
31
|
end
|
data/lib/burner/jobs.rb
CHANGED
@@ -28,6 +28,7 @@ module Burner
|
|
28
28
|
register 'b/collection/graph', Library::Collection::Graph
|
29
29
|
register 'b/collection/group', Library::Collection::Group
|
30
30
|
register 'b/collection/nested_aggregate', Library::Collection::NestedAggregate
|
31
|
+
register 'b/collection/number', Library::Collection::Number
|
31
32
|
register 'b/collection/objects_to_arrays', Library::Collection::ObjectsToArrays
|
32
33
|
register 'b/collection/shift', Library::Collection::Shift
|
33
34
|
register 'b/collection/transform', Library::Collection::Transform
|
@@ -47,11 +48,16 @@ module Burner
|
|
47
48
|
register 'b/io/row_reader', Library::IO::RowReader
|
48
49
|
register 'b/io/write', Library::IO::Write
|
49
50
|
|
51
|
+
register 'b/param/from_register', Library::Param::FromRegister
|
52
|
+
register 'b/param/to_register', Library::Param::ToRegister
|
53
|
+
|
50
54
|
register 'b/serialize/csv', Library::Serialize::Csv
|
51
55
|
register 'b/serialize/json', Library::Serialize::Json
|
52
56
|
register 'b/serialize/yaml', Library::Serialize::Yaml
|
53
57
|
|
54
58
|
register 'b/value/copy', Library::Value::Copy
|
59
|
+
register 'b/value/nest', Library::Value::Nest
|
55
60
|
register 'b/value/static', Library::Value::Static
|
61
|
+
register 'b/value/transform', Library::Value::Transform
|
56
62
|
end
|
57
63
|
end
|
data/lib/burner/library.rb
CHANGED
@@ -19,6 +19,7 @@ require_relative 'library/collection/concatenate'
|
|
19
19
|
require_relative 'library/collection/graph'
|
20
20
|
require_relative 'library/collection/group'
|
21
21
|
require_relative 'library/collection/nested_aggregate'
|
22
|
+
require_relative 'library/collection/number'
|
22
23
|
require_relative 'library/collection/objects_to_arrays'
|
23
24
|
require_relative 'library/collection/shift'
|
24
25
|
require_relative 'library/collection/transform'
|
@@ -38,9 +39,14 @@ require_relative 'library/io/read'
|
|
38
39
|
require_relative 'library/io/row_reader'
|
39
40
|
require_relative 'library/io/write'
|
40
41
|
|
42
|
+
require_relative 'library/param/from_register'
|
43
|
+
require_relative 'library/param/to_register'
|
44
|
+
|
41
45
|
require_relative 'library/serialize/csv'
|
42
46
|
require_relative 'library/serialize/json'
|
43
47
|
require_relative 'library/serialize/yaml'
|
44
48
|
|
45
49
|
require_relative 'library/value/copy'
|
50
|
+
require_relative 'library/value/nest'
|
46
51
|
require_relative 'library/value/static'
|
52
|
+
require_relative 'library/value/transform'
|
@@ -55,7 +55,7 @@ module Burner
|
|
55
55
|
class ArraysToObjects < JobWithRegister
|
56
56
|
attr_reader :mappings
|
57
57
|
|
58
|
-
def initialize(
|
58
|
+
def initialize(mappings: [], name: '', register: DEFAULT_REGISTER)
|
59
59
|
super(name: name, register: register)
|
60
60
|
|
61
61
|
@mappings = Modeling::KeyIndexMapping.array(mappings)
|
@@ -18,19 +18,27 @@ module Burner
|
|
18
18
|
# Expected Payload[register] input: array of objects.
|
19
19
|
# Payload[register] output: array of objects.
|
20
20
|
class Coalesce < JobWithRegister
|
21
|
-
|
21
|
+
include Util::Keyable
|
22
|
+
|
23
|
+
attr_reader :grouped_register,
|
24
|
+
:insensitive,
|
25
|
+
:key_mappings,
|
26
|
+
:keys,
|
27
|
+
:resolver
|
22
28
|
|
23
29
|
def initialize(
|
24
|
-
name:,
|
25
30
|
grouped_register:,
|
31
|
+
insensitive: false,
|
26
32
|
key_mappings: [],
|
27
33
|
keys: [],
|
34
|
+
name: '',
|
28
35
|
register: DEFAULT_REGISTER,
|
29
36
|
separator: ''
|
30
37
|
)
|
31
38
|
super(name: name, register: register)
|
32
39
|
|
33
40
|
@grouped_register = grouped_register.to_s
|
41
|
+
@insensitive = insensitive || false
|
34
42
|
@key_mappings = Modeling::KeyMapping.array(key_mappings)
|
35
43
|
@keys = Array(keys)
|
36
44
|
@resolver = Objectable.resolver(separator: separator.to_s)
|
@@ -41,13 +49,14 @@ module Burner
|
|
41
49
|
end
|
42
50
|
|
43
51
|
def perform(output, payload)
|
44
|
-
|
45
|
-
|
52
|
+
ensure_array(payload)
|
53
|
+
|
54
|
+
count = payload[register].length
|
46
55
|
|
47
56
|
output.detail("Coalescing based on key(s): #{keys} for #{count} records(s)")
|
48
57
|
|
49
58
|
payload[register].each do |record|
|
50
|
-
key = make_key(record)
|
59
|
+
key = make_key(record, keys, resolver, insensitive)
|
51
60
|
lookup = find_lookup(payload, key)
|
52
61
|
|
53
62
|
key_mappings.each do |key_mapping|
|
@@ -63,10 +72,6 @@ module Burner
|
|
63
72
|
def find_lookup(payload, key)
|
64
73
|
(payload[grouped_register] || {})[key] || {}
|
65
74
|
end
|
66
|
-
|
67
|
-
def make_key(record)
|
68
|
-
keys.map { |key| resolver.get(record, key) }
|
69
|
-
end
|
70
75
|
end
|
71
76
|
end
|
72
77
|
end
|
@@ -18,7 +18,7 @@ module Burner
|
|
18
18
|
class Concatenate < Job
|
19
19
|
attr_reader :from_registers, :to_register
|
20
20
|
|
21
|
-
def initialize(
|
21
|
+
def initialize(from_registers: [], name: '', to_register: DEFAULT_REGISTER)
|
22
22
|
super(name: name)
|
23
23
|
|
24
24
|
@from_registers = Array(from_registers)
|