burner 1.0.0 → 1.1.0.pre.alpha
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/CHANGELOG.md +7 -0
- data/README.md +2 -0
- data/lib/burner/jobs.rb +2 -0
- data/lib/burner/library.rb +2 -0
- data/lib/burner/library/collection/coalesce.rb +73 -0
- data/lib/burner/library/collection/graph.rb +2 -1
- data/lib/burner/library/collection/group.rb +66 -0
- data/lib/burner/modeling.rb +1 -0
- data/lib/burner/modeling/key_mapping.rb +29 -0
- data/lib/burner/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dea13fe31b6e7bc97eafb25201508afc0a05d2d4e2eb86aeab00004695674f1
|
4
|
+
data.tar.gz: 6569debdcc9ad51a0e180ee6b0bac192029b95d59ad767ddae7c6711dba9830d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20cb03d16e9495edd35a9323f9507780b006f0be2ef61b0423e198ada1bdcc672e7a7fc471d606bc5cd47d3f727237922285bf71dd9648381b92bc5b90327174
|
7
|
+
data.tar.gz: 977cd155d3a717af7a4fc4876694f27b665844780fadf23556cdf1d7fb120a124741c341dbf1d4725fad8a0dbe12260f7475e36d9cd7e1415618929b73fb9794
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -234,8 +234,10 @@ This library only ships with very basic, rudimentary jobs that are meant to just
|
|
234
234
|
#### Collection
|
235
235
|
|
236
236
|
* **b/collection/arrays_to_objects** [mappings, register]: Convert an array of arrays to an array of objects.
|
237
|
+
* **b/collection/coalesce** [register, grouped_register, key_mappings, keys, separator]: Merge two datasets together based on the key values of one dataset (array) with a grouped dataset (hash).
|
237
238
|
* **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.
|
238
239
|
* **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.
|
240
|
+
* **b/collection/group** [keys, register, separator]: Take a register's value (an array of objects) and group the objects by the specified keys.
|
239
241
|
* **b/collection/objects_to_arrays** [mappings, register]: Convert an array of objects to an array of arrays.
|
240
242
|
* **b/collection/shift** [amount, register]: Remove the first N number of elements from an array.
|
241
243
|
* **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.
|
data/lib/burner/jobs.rb
CHANGED
@@ -23,8 +23,10 @@ module Burner
|
|
23
23
|
register 'b/sleep', Library::Sleep
|
24
24
|
|
25
25
|
register 'b/collection/arrays_to_objects', Library::Collection::ArraysToObjects
|
26
|
+
register 'b/collection/coalesce', Library::Collection::Coalesce
|
26
27
|
register 'b/collection/concatenate', Library::Collection::Concatenate
|
27
28
|
register 'b/collection/graph', Library::Collection::Graph
|
29
|
+
register 'b/collection/group', Library::Collection::Group
|
28
30
|
register 'b/collection/objects_to_arrays', Library::Collection::ObjectsToArrays
|
29
31
|
register 'b/collection/shift', Library::Collection::Shift
|
30
32
|
register 'b/collection/transform', Library::Collection::Transform
|
data/lib/burner/library.rb
CHANGED
@@ -14,8 +14,10 @@ require_relative 'library/nothing'
|
|
14
14
|
require_relative 'library/sleep'
|
15
15
|
|
16
16
|
require_relative 'library/collection/arrays_to_objects'
|
17
|
+
require_relative 'library/collection/coalesce'
|
17
18
|
require_relative 'library/collection/concatenate'
|
18
19
|
require_relative 'library/collection/graph'
|
20
|
+
require_relative 'library/collection/group'
|
19
21
|
require_relative 'library/collection/objects_to_arrays'
|
20
22
|
require_relative 'library/collection/shift'
|
21
23
|
require_relative 'library/collection/transform'
|
@@ -0,0 +1,73 @@
|
|
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
|
+
module Library
|
12
|
+
module Collection
|
13
|
+
# This is generally used right after the Group job has been executed on a separate
|
14
|
+
# dataset in a separate register. This job can match up specified values in its dataset
|
15
|
+
# with lookup values in another. If it finds a match then it will (shallow) copy over
|
16
|
+
# the values into the respective dataset.
|
17
|
+
#
|
18
|
+
# Expected Payload[register] input: array of objects.
|
19
|
+
# Payload[register] output: array of objects.
|
20
|
+
class Coalesce < JobWithRegister
|
21
|
+
attr_reader :grouped_register, :key_mappings, :keys, :resolver
|
22
|
+
|
23
|
+
def initialize(
|
24
|
+
name:,
|
25
|
+
grouped_register:,
|
26
|
+
key_mappings: [],
|
27
|
+
keys: [],
|
28
|
+
register: DEFAULT_REGISTER,
|
29
|
+
separator: ''
|
30
|
+
)
|
31
|
+
super(name: name, register: register)
|
32
|
+
|
33
|
+
@grouped_register = grouped_register.to_s
|
34
|
+
@key_mappings = Modeling::KeyMapping.array(key_mappings)
|
35
|
+
@keys = Array(keys)
|
36
|
+
@resolver = Objectable.resolver(separator: separator.to_s)
|
37
|
+
|
38
|
+
raise ArgumentError, 'at least one key is required' if @keys.empty?
|
39
|
+
|
40
|
+
freeze
|
41
|
+
end
|
42
|
+
|
43
|
+
def perform(output, payload)
|
44
|
+
payload[register] = array(payload[register])
|
45
|
+
count = payload[register].length
|
46
|
+
|
47
|
+
output.detail("Coalescing based on key(s): #{keys} for #{count} records(s)")
|
48
|
+
|
49
|
+
payload[register].each do |record|
|
50
|
+
key = make_key(record)
|
51
|
+
lookup = find_lookup(payload, key)
|
52
|
+
|
53
|
+
key_mappings.each do |key_mapping|
|
54
|
+
value = resolver.get(lookup, key_mapping.from)
|
55
|
+
|
56
|
+
resolver.set(record, key_mapping.to, value)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def find_lookup(payload, key)
|
64
|
+
(payload[grouped_register] || {})[key] || {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def make_key(record)
|
68
|
+
keys.map { |key| resolver.get(record, key) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,66 @@
|
|
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
|
+
module Library
|
12
|
+
module Collection
|
13
|
+
# Take a register's value (an array of objects) and group the objects by the specified keys.
|
14
|
+
# It essentially creates a hash from an array. This is useful for creating a O(1) lookup
|
15
|
+
# which can then be used in conjunction with the Coalesce Job for another array of data.
|
16
|
+
#
|
17
|
+
# An example of this specific job:
|
18
|
+
#
|
19
|
+
# input: [{ id: 1, code: 'a' }, { id: 2, code: 'b' }]
|
20
|
+
# keys: [:code]
|
21
|
+
# output: { 'a' => { id: 1, code: 'a' }, 'b' => { id: 2, code: 'b' } }
|
22
|
+
#
|
23
|
+
# Expected Payload[register] input: array of objects.
|
24
|
+
# Payload[register] output: hash.
|
25
|
+
class Group < JobWithRegister
|
26
|
+
attr_reader :keys, :resolver
|
27
|
+
|
28
|
+
def initialize(
|
29
|
+
name:,
|
30
|
+
keys: [],
|
31
|
+
register: DEFAULT_REGISTER,
|
32
|
+
separator: ''
|
33
|
+
)
|
34
|
+
super(name: name, register: register)
|
35
|
+
|
36
|
+
@keys = Array(keys)
|
37
|
+
@resolver = Objectable.resolver(separator: separator.to_s)
|
38
|
+
|
39
|
+
raise ArgumentError, 'at least one key is required' if @keys.empty?
|
40
|
+
|
41
|
+
freeze
|
42
|
+
end
|
43
|
+
|
44
|
+
def perform(output, payload)
|
45
|
+
payload[register] = array(payload[register])
|
46
|
+
count = payload[register].length
|
47
|
+
|
48
|
+
output.detail("Grouping based on key(s): #{keys} for #{count} records(s)")
|
49
|
+
|
50
|
+
grouped_records = payload[register].each_with_object({}) do |record, memo|
|
51
|
+
key = make_key(record)
|
52
|
+
memo[key] = record
|
53
|
+
end
|
54
|
+
|
55
|
+
payload[register] = grouped_records
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def make_key(record)
|
61
|
+
keys.map { |key| resolver.get(record, key) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/burner/modeling.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
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
|
+
module Modeling
|
12
|
+
# Generic mapping from a key to another key.
|
13
|
+
class KeyMapping
|
14
|
+
acts_as_hashable
|
15
|
+
|
16
|
+
attr_reader :from, :to
|
17
|
+
|
18
|
+
def initialize(from:, to:)
|
19
|
+
raise ArgumentError, 'from is required' if from.to_s.empty?
|
20
|
+
raise ArgumentError, 'to is required' if to.to_s.empty?
|
21
|
+
|
22
|
+
@from = from.to_s
|
23
|
+
@to = to.to_s
|
24
|
+
|
25
|
+
freeze
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/burner/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: burner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.1.0.pre.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Ruggio
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acts_as_hashable
|
@@ -225,8 +225,10 @@ files:
|
|
225
225
|
- lib/burner/jobs.rb
|
226
226
|
- lib/burner/library.rb
|
227
227
|
- lib/burner/library/collection/arrays_to_objects.rb
|
228
|
+
- lib/burner/library/collection/coalesce.rb
|
228
229
|
- lib/burner/library/collection/concatenate.rb
|
229
230
|
- lib/burner/library/collection/graph.rb
|
231
|
+
- lib/burner/library/collection/group.rb
|
230
232
|
- lib/burner/library/collection/objects_to_arrays.rb
|
231
233
|
- lib/burner/library/collection/shift.rb
|
232
234
|
- lib/burner/library/collection/transform.rb
|
@@ -252,6 +254,7 @@ files:
|
|
252
254
|
- lib/burner/modeling/attribute.rb
|
253
255
|
- lib/burner/modeling/attribute_renderer.rb
|
254
256
|
- lib/burner/modeling/key_index_mapping.rb
|
257
|
+
- lib/burner/modeling/key_mapping.rb
|
255
258
|
- lib/burner/modeling/validations.rb
|
256
259
|
- lib/burner/modeling/validations/base.rb
|
257
260
|
- lib/burner/modeling/validations/blank.rb
|
@@ -286,9 +289,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
286
289
|
version: '2.5'
|
287
290
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
288
291
|
requirements:
|
289
|
-
- - "
|
292
|
+
- - ">"
|
290
293
|
- !ruby/object:Gem::Version
|
291
|
-
version:
|
294
|
+
version: 1.3.1
|
292
295
|
requirements: []
|
293
296
|
rubygems_version: 3.0.3
|
294
297
|
signing_key:
|