burner 1.0.0.pre.alpha.5 → 1.0.0.pre.alpha.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -12
- data/exe/burner +2 -3
- data/lib/burner.rb +2 -0
- data/lib/burner/cli.rb +2 -0
- data/lib/burner/job.rb +25 -5
- data/lib/burner/jobs.rb +21 -41
- data/lib/burner/library.rb +30 -0
- data/lib/burner/library/collection/arrays_to_objects.rb +77 -0
- data/lib/burner/{jobs → library}/collection/graph.rb +3 -2
- data/lib/burner/{jobs → library}/collection/objects_to_arrays.rb +40 -4
- data/lib/burner/{jobs → library}/collection/shift.rb +5 -4
- data/lib/burner/{jobs → library}/collection/transform.rb +13 -9
- data/lib/burner/{jobs → library}/collection/unpivot.rb +7 -5
- data/lib/burner/{jobs → library}/collection/values.rb +5 -4
- data/lib/burner/{jobs → library}/deserialize/csv.rb +2 -1
- data/lib/burner/{jobs → library}/deserialize/json.rb +4 -1
- data/lib/burner/{jobs → library}/deserialize/yaml.rb +8 -2
- data/lib/burner/{jobs → library}/dummy.rb +3 -1
- data/lib/burner/{jobs → library}/echo.rb +3 -1
- data/lib/burner/{jobs → library}/io/base.rb +1 -1
- data/lib/burner/{jobs → library}/io/exist.rb +3 -1
- data/lib/burner/{jobs → library}/io/read.rb +4 -1
- data/lib/burner/{jobs → library}/io/write.rb +7 -2
- data/lib/burner/{jobs → library}/serialize/csv.rb +3 -2
- data/lib/burner/{jobs → library}/serialize/json.rb +4 -1
- data/lib/burner/{jobs → library}/serialize/yaml.rb +4 -1
- data/lib/burner/{jobs/set.rb → library/set_value.rb} +5 -2
- data/lib/burner/{jobs → library}/sleep.rb +3 -1
- data/lib/burner/modeling.rb +2 -0
- data/lib/burner/modeling/attribute.rb +29 -0
- data/lib/burner/modeling/attribute_renderer.rb +32 -0
- data/lib/burner/payload.rb +15 -12
- data/lib/burner/pipeline.rb +20 -1
- data/lib/burner/side_effects.rb +10 -0
- data/lib/burner/side_effects/written_file.rb +28 -0
- data/lib/burner/util.rb +10 -0
- data/lib/burner/util/arrayable.rb +30 -0
- data/lib/burner/version.rb +1 -1
- metadata +30 -26
- data/lib/burner/jobs/collection/arrays_to_objects.rb +0 -43
- data/lib/burner/jobs/collection/transform/attribute.rb +0 -33
- data/lib/burner/jobs/collection/transform/attribute_renderer.rb +0 -36
- data/lib/burner/written_file.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73263c161bce669b99286160acb7129d33c529162da964b72fd34321cc7e3724
|
4
|
+
data.tar.gz: 18fd59799a73d9a8a3bf691a9dd3f8a004d442b37862bf83cbe347fbddd7e49a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7db0c2be13a882885b97681ec7c9fd60b6702368d673d97ba0aa484b446db0c77c9f823adf03c8d9e970b2078b43a99d2d159ba97df345124a461497718b7046
|
7
|
+
data.tar.gz: 509382aa7fb48e116b8b3eb145a8b8226c1e4d4282eec1aabb10dcc9f7b333b906a7887d97cee4a96ae730dd7c02a0b0d4cd4a7b06dbfcc90349cfd82767e048
|
data/README.md
CHANGED
@@ -133,23 +133,23 @@ The value of `log` should now look similar to:
|
|
133
133
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - input_file: input.json
|
134
134
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - output_file: output.yaml
|
135
135
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] --------------------------------------------------------------------------------
|
136
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [1] Burner::
|
136
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [1] Burner::Library::IO::Read::read
|
137
137
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Reading: spec/fixtures/input.json
|
138
138
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
139
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [2] Burner::
|
139
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [2] Burner::Library::Echo::output_id
|
140
140
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - The job id is:
|
141
141
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
142
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [3] Burner::
|
142
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [3] Burner::Library::Echo::output_value
|
143
143
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - The current value is:
|
144
144
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
145
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [4] Burner::
|
145
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [4] Burner::Library::Deserialize::Json::parse
|
146
146
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
147
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [5] Burner::
|
147
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [5] Burner::Library::Serialize::Yaml::convert
|
148
148
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
149
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [6] Burner::
|
149
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [6] Burner::Library::Echo::output_value
|
150
150
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - The current value is:
|
151
151
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
152
|
-
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [7] Burner::
|
152
|
+
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] [7] Burner::Library::IO::Write::write
|
153
153
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Writing: output.yaml
|
154
154
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] - Completed in: 0.0 second(s)
|
155
155
|
[8bdc394e-7047-4a1a-87ed-6c54ed690ed5 | 2020-10-14 13:49:59 UTC] --------------------------------------------------------------------------------
|
@@ -163,7 +163,7 @@ Notes:
|
|
163
163
|
|
164
164
|
### Command Line Pipeline Processing
|
165
165
|
|
166
|
-
This library also ships with a built-in script `
|
166
|
+
This library also ships with a built-in script `burner` that illustrates using the `Burner::Cli` API. This class can take in an array of arguments (similar to a command-line) and execute a pipeline. The first argument is the path to a YAML file with the pipeline's configuration and each subsequent argument is a param in `key=value` form. Here is how the json-to-yaml example can utilize this interface:
|
167
167
|
|
168
168
|
#### Create YAML Pipeline Configuration File
|
169
169
|
|
@@ -234,10 +234,10 @@ This library only ships with very basic, rudimentary jobs that are meant to just
|
|
234
234
|
#### Collection
|
235
235
|
|
236
236
|
* **collection/arrays_to_objects** [mappings]: Convert an array of arrays to an array of objects.
|
237
|
-
* **collection/graph** [config, key]: Use (
|
237
|
+
* **collection/graph** [config, key]: Use [Hashematics](https://github.com/bluemarblepayroll/hashematics) to turn a flat array of objects into a deeply nested object tree.
|
238
238
|
* **collection/objects_to_arrays** [mappings]: Convert an array of objects to an array of arrays.
|
239
239
|
* **collection/shift** [amount]: Remove the first N number of elements from an array.
|
240
|
-
* **collection/transform** [attributes, exclusive, separator]: 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 (
|
240
|
+
* **collection/transform** [attributes, exclusive, separator]: 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.
|
241
241
|
* **collection/unpivot** [pivot_set]: Take an array of objects and unpivot specific sets of keys into rows. Under the hood it uses [HashMath's Unpivot class](https://github.com/bluemarblepayroll/hash_math#unpivot-hash-key-coalescence-and-row-extrapolation).
|
242
242
|
* **collection/values** [include_keys]: Take an array of objects and call `#values` on each object. If include_keys is true (it is false by default), then call `#keys` on the first object and inject that as a "header" object.
|
243
243
|
|
@@ -245,7 +245,7 @@ This library only ships with very basic, rudimentary jobs that are meant to just
|
|
245
245
|
|
246
246
|
* **deserialize/csv** []: Take a CSV string and de-serialize into object(s). Currently it will return an array of arrays, with each nested array representing one row.
|
247
247
|
* **deserialize/json** []: Treat input as a string and de-serialize it to JSON.
|
248
|
-
* **deserialize/yaml** [safe]: Treat input as a string and de-serialize it to YAML. By default it will try and
|
248
|
+
* **deserialize/yaml** [safe]: Treat input as a string and de-serialize it to YAML. By default it will try and [safely de-serialize](https://ruby-doc.org/stdlib-2.6.1/libdoc/psych/rdoc/Psych.html#method-c-safe_load) it (only using core classes). If you wish to de-serialize it to any class type, pass in `safe: false`
|
249
249
|
|
250
250
|
#### IO
|
251
251
|
|
@@ -269,7 +269,7 @@ This library only ships with very basic, rudimentary jobs that are meant to just
|
|
269
269
|
|
270
270
|
### Adding & Registering Jobs
|
271
271
|
|
272
|
-
Where this library shines is when additional jobs are plugged in. Burner uses its `Burner::Jobs` class as its class-level registry built with (
|
272
|
+
Where this library shines is when additional jobs are plugged in. Burner uses its `Burner::Jobs` class as its class-level registry built with [acts_as_hashable](https://github.com/bluemarblepayroll/acts_as_hashable)'s acts_as_hashable_factory directive.
|
273
273
|
|
274
274
|
Let's say we would like to register a job to parse a CSV:
|
275
275
|
|
data/exe/burner
CHANGED
@@ -10,11 +10,10 @@
|
|
10
10
|
|
11
11
|
require 'bundler/setup'
|
12
12
|
require 'burner'
|
13
|
-
require 'pry'
|
14
13
|
|
15
14
|
if ARGV.empty?
|
16
|
-
|
17
|
-
exit
|
15
|
+
warn('Usage: ./exe/burner package.yaml key=value key=value ...')
|
16
|
+
exit 2 # Do not return 1, that is reserved for hard errors.
|
18
17
|
end
|
19
18
|
|
20
19
|
# This should return exit code of 1 if it raises any hard errors.
|
data/lib/burner.rb
CHANGED
data/lib/burner/cli.rb
CHANGED
data/lib/burner/job.rb
CHANGED
@@ -15,23 +15,43 @@ module Burner
|
|
15
15
|
# the Burner::Jobs factory class method #register. An example of a registration:
|
16
16
|
# Burner::Jobs.register('your_class', YourClass)
|
17
17
|
class Job
|
18
|
+
include Util::Arrayable
|
18
19
|
acts_as_hashable
|
19
20
|
|
20
|
-
attr_reader :name
|
21
|
+
attr_reader :name
|
21
22
|
|
22
23
|
def initialize(name:)
|
23
24
|
raise ArgumentError, 'name is required' if name.to_s.empty?
|
24
25
|
|
25
|
-
@name
|
26
|
-
@string_template = StringTemplate.instance
|
26
|
+
@name = name.to_s
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
# There are only two requirements to be considered a valid Burner Job:
|
30
|
+
# 1. The class responds to #name
|
31
|
+
# 2. The class responds to #perform(output, payload)
|
32
|
+
#
|
33
|
+
# The #perform method takes in two arguments: output (an instance of Burner::Output)
|
34
|
+
# and payload (an instance of Burner::Payload). Jobs can leverage output to emit
|
35
|
+
# information to the pipeline's log(s). The payload is utilized to pass data from job to job,
|
36
|
+
# with its most important attribute being #value. The value attribute is mutable
|
37
|
+
# per the individual job's context (meaning of it is unknown without understanding a job's
|
38
|
+
# input and output value of #value.). Therefore #value can mean anything and it is up to the
|
39
|
+
# engineers to clearly document the assumptions of its use.
|
40
|
+
#
|
41
|
+
# Returning false will short-circuit the pipeline right after the job method exits.
|
42
|
+
# Returning anything else besides false just means "continue".
|
43
|
+
def perform(output, _payload)
|
44
|
+
output.detail("#perform not implemented for: #{self.class.name}")
|
45
|
+
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
30
50
|
|
31
51
|
def job_string_template(expression, output, payload)
|
32
52
|
templatable_params = payload.params.merge(__id: output.id, __value: payload.value)
|
33
53
|
|
34
|
-
|
54
|
+
StringTemplate.instance.evaluate(expression, templatable_params)
|
35
55
|
end
|
36
56
|
end
|
37
57
|
end
|
data/lib/burner/jobs.rb
CHANGED
@@ -7,27 +7,7 @@
|
|
7
7
|
# LICENSE file in the root directory of this source tree.
|
8
8
|
#
|
9
9
|
|
10
|
-
require_relative '
|
11
|
-
require_relative 'jobs/collection/arrays_to_objects'
|
12
|
-
require_relative 'jobs/collection/graph'
|
13
|
-
require_relative 'jobs/collection/objects_to_arrays'
|
14
|
-
require_relative 'jobs/collection/shift'
|
15
|
-
require_relative 'jobs/collection/transform'
|
16
|
-
require_relative 'jobs/collection/unpivot'
|
17
|
-
require_relative 'jobs/collection/values'
|
18
|
-
require_relative 'jobs/deserialize/csv'
|
19
|
-
require_relative 'jobs/deserialize/json'
|
20
|
-
require_relative 'jobs/deserialize/yaml'
|
21
|
-
require_relative 'jobs/dummy'
|
22
|
-
require_relative 'jobs/echo'
|
23
|
-
require_relative 'jobs/io/exist'
|
24
|
-
require_relative 'jobs/io/read'
|
25
|
-
require_relative 'jobs/io/write'
|
26
|
-
require_relative 'jobs/serialize/csv'
|
27
|
-
require_relative 'jobs/serialize/json'
|
28
|
-
require_relative 'jobs/serialize/yaml'
|
29
|
-
require_relative 'jobs/set'
|
30
|
-
require_relative 'jobs/sleep'
|
10
|
+
require_relative 'library'
|
31
11
|
|
32
12
|
module Burner
|
33
13
|
# Main library of jobs. This file contains all the basic/default jobs. All other consumer
|
@@ -36,25 +16,25 @@ module Burner
|
|
36
16
|
class Jobs
|
37
17
|
acts_as_hashable_factory
|
38
18
|
|
39
|
-
register 'collection/arrays_to_objects', Collection::ArraysToObjects
|
40
|
-
register 'collection/graph', Collection::Graph
|
41
|
-
register 'collection/objects_to_arrays', Collection::ObjectsToArrays
|
42
|
-
register 'collection/shift', Collection::Shift
|
43
|
-
register 'collection/transform', Collection::Transform
|
44
|
-
register 'collection/unpivot', Collection::Unpivot
|
45
|
-
register 'collection/values', Collection::Values
|
46
|
-
register 'deserialize/csv', Deserialize::Csv
|
47
|
-
register 'deserialize/json', Deserialize::Json
|
48
|
-
register 'deserialize/yaml', Deserialize::Yaml
|
49
|
-
register 'dummy', '', Dummy
|
50
|
-
register 'echo', Echo
|
51
|
-
register 'io/exist', IO::Exist
|
52
|
-
register 'io/read', IO::Read
|
53
|
-
register 'io/write', IO::Write
|
54
|
-
register 'serialize/csv', Serialize::Csv
|
55
|
-
register 'serialize/json', Serialize::Json
|
56
|
-
register 'serialize/yaml', Serialize::Yaml
|
57
|
-
register '
|
58
|
-
register 'sleep', Sleep
|
19
|
+
register 'collection/arrays_to_objects', Library::Collection::ArraysToObjects
|
20
|
+
register 'collection/graph', Library::Collection::Graph
|
21
|
+
register 'collection/objects_to_arrays', Library::Collection::ObjectsToArrays
|
22
|
+
register 'collection/shift', Library::Collection::Shift
|
23
|
+
register 'collection/transform', Library::Collection::Transform
|
24
|
+
register 'collection/unpivot', Library::Collection::Unpivot
|
25
|
+
register 'collection/values', Library::Collection::Values
|
26
|
+
register 'deserialize/csv', Library::Deserialize::Csv
|
27
|
+
register 'deserialize/json', Library::Deserialize::Json
|
28
|
+
register 'deserialize/yaml', Library::Deserialize::Yaml
|
29
|
+
register 'dummy', '', Library::Dummy
|
30
|
+
register 'echo', Library::Echo
|
31
|
+
register 'io/exist', Library::IO::Exist
|
32
|
+
register 'io/read', Library::IO::Read
|
33
|
+
register 'io/write', Library::IO::Write
|
34
|
+
register 'serialize/csv', Library::Serialize::Csv
|
35
|
+
register 'serialize/json', Library::Serialize::Json
|
36
|
+
register 'serialize/yaml', Library::Serialize::Yaml
|
37
|
+
register 'set_value', Library::SetValue
|
38
|
+
register 'sleep', Library::Sleep
|
59
39
|
end
|
60
40
|
end
|
@@ -0,0 +1,30 @@
|
|
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 'job'
|
11
|
+
require_relative 'library/collection/arrays_to_objects'
|
12
|
+
require_relative 'library/collection/graph'
|
13
|
+
require_relative 'library/collection/objects_to_arrays'
|
14
|
+
require_relative 'library/collection/shift'
|
15
|
+
require_relative 'library/collection/transform'
|
16
|
+
require_relative 'library/collection/unpivot'
|
17
|
+
require_relative 'library/collection/values'
|
18
|
+
require_relative 'library/deserialize/csv'
|
19
|
+
require_relative 'library/deserialize/json'
|
20
|
+
require_relative 'library/deserialize/yaml'
|
21
|
+
require_relative 'library/dummy'
|
22
|
+
require_relative 'library/echo'
|
23
|
+
require_relative 'library/io/exist'
|
24
|
+
require_relative 'library/io/read'
|
25
|
+
require_relative 'library/io/write'
|
26
|
+
require_relative 'library/serialize/csv'
|
27
|
+
require_relative 'library/serialize/json'
|
28
|
+
require_relative 'library/serialize/yaml'
|
29
|
+
require_relative 'library/set_value'
|
30
|
+
require_relative 'library/sleep'
|
@@ -0,0 +1,77 @@
|
|
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
|
+
# Convert an array of arrays to an array of objects. Pass in an array of
|
14
|
+
# Burner::Modeling::KeyIndexMapping instances or hashable configurations which specifies
|
15
|
+
# the index-to-key mappings to use.
|
16
|
+
#
|
17
|
+
# Expected Payload#value input: array of arrays.
|
18
|
+
# Payload#value output: An array of hashes.
|
19
|
+
#
|
20
|
+
# An example using a configuration-first pipeline:
|
21
|
+
#
|
22
|
+
# config = {
|
23
|
+
# jobs: [
|
24
|
+
# {
|
25
|
+
# name: 'set',
|
26
|
+
# type: 'set_value',
|
27
|
+
# value: [
|
28
|
+
# [1, 'funky']
|
29
|
+
# ]
|
30
|
+
# },
|
31
|
+
# {
|
32
|
+
# name: 'map',
|
33
|
+
# type: 'collection/arrays_to_objects',
|
34
|
+
# mappings: [
|
35
|
+
# { index: 0, key: 'id' },
|
36
|
+
# { index: 1, key: 'name' }
|
37
|
+
# ]
|
38
|
+
# },
|
39
|
+
# {
|
40
|
+
# name: 'output',
|
41
|
+
# type: 'echo',
|
42
|
+
# message: 'value is currently: {__value}'
|
43
|
+
# },
|
44
|
+
#
|
45
|
+
# ],
|
46
|
+
# steps: %w[set map output]
|
47
|
+
# }
|
48
|
+
#
|
49
|
+
# Burner::Pipeline.make(config).execute
|
50
|
+
class ArraysToObjects < Job
|
51
|
+
attr_reader :mappings
|
52
|
+
|
53
|
+
def initialize(name:, mappings: [])
|
54
|
+
super(name: name)
|
55
|
+
|
56
|
+
@mappings = Modeling::KeyIndexMapping.array(mappings)
|
57
|
+
|
58
|
+
freeze
|
59
|
+
end
|
60
|
+
|
61
|
+
def perform(_output, payload)
|
62
|
+
payload.value = array(payload.value).map { |array| index_to_key_map(array) }
|
63
|
+
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def index_to_key_map(array)
|
70
|
+
mappings.each_with_object({}) do |mapping, memo|
|
71
|
+
memo[mapping.key] = array[mapping.index]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -8,10 +8,11 @@
|
|
8
8
|
#
|
9
9
|
|
10
10
|
module Burner
|
11
|
-
|
11
|
+
module Library
|
12
12
|
module Collection
|
13
13
|
# Take an array of (denormalized) objects and create an object hierarchy from them.
|
14
14
|
# Under the hood it uses Hashematics: https://github.com/bluemarblepayroll/hashematics.
|
15
|
+
#
|
15
16
|
# Expected Payload#value input: array of objects.
|
16
17
|
# Payload#value output: An array of objects.
|
17
18
|
class Graph < Job
|
@@ -29,7 +30,7 @@ module Burner
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def perform(output, payload)
|
32
|
-
graph = Hashematics::Graph.new(groups).add(payload.value
|
33
|
+
graph = Hashematics::Graph.new(groups).add(array(payload.value))
|
33
34
|
|
34
35
|
output.detail("Graphing: #{key}")
|
35
36
|
|
@@ -8,18 +8,54 @@
|
|
8
8
|
#
|
9
9
|
|
10
10
|
module Burner
|
11
|
-
|
11
|
+
module Library
|
12
12
|
module Collection
|
13
13
|
# Convert an array of objects to an array of arrays. You can leverage the separator
|
14
|
-
# option to support key paths and nested objects.
|
14
|
+
# option to support key paths and nested objects. Pass in an array of
|
15
|
+
# Burner::Modeling::KeyIndexMapping instances or hashable configurations which specifies
|
16
|
+
# the key-to-index mappings to use.
|
17
|
+
#
|
15
18
|
# Expected Payload#value input: array of hashes.
|
16
19
|
# Payload#value output: An array of arrays.
|
20
|
+
#
|
21
|
+
# An example using a configuration-first pipeline:
|
22
|
+
#
|
23
|
+
# config = {
|
24
|
+
# jobs: [
|
25
|
+
# {
|
26
|
+
# name: 'set',
|
27
|
+
# type: 'set_value',
|
28
|
+
# value: [
|
29
|
+
# [1, 'funky']
|
30
|
+
# ]
|
31
|
+
# },
|
32
|
+
# {
|
33
|
+
# name: 'map',
|
34
|
+
# type: 'collection/objects_to_arrays',
|
35
|
+
# mappings: [
|
36
|
+
# { index: 0, key: 'id' },
|
37
|
+
# { index: 1, key: 'name' }
|
38
|
+
# ]
|
39
|
+
# },
|
40
|
+
# {
|
41
|
+
# name: 'output',
|
42
|
+
# type: 'echo',
|
43
|
+
# message: 'value is currently: {__value}'
|
44
|
+
# },
|
45
|
+
#
|
46
|
+
# ],
|
47
|
+
# steps: %w[set map output]
|
48
|
+
# }
|
49
|
+
#
|
50
|
+
# Burner::Pipeline.make(config).execute
|
17
51
|
class ObjectsToArrays < Job
|
18
52
|
attr_reader :mappings
|
19
53
|
|
20
54
|
# If you wish to support nested objects you can pass in a string to use as a
|
21
55
|
# key path separator. For example: if you would like to recognize dot-notation for
|
22
|
-
# nested hashes then set separator to '.'.
|
56
|
+
# nested hashes then set separator to '.'. For more information, see the underlying
|
57
|
+
# library that supports this dot-notation concept:
|
58
|
+
# https://github.com/bluemarblepayroll/objectable
|
23
59
|
def initialize(name:, mappings: [], separator: '')
|
24
60
|
super(name: name)
|
25
61
|
|
@@ -30,7 +66,7 @@ module Burner
|
|
30
66
|
end
|
31
67
|
|
32
68
|
def perform(_output, payload)
|
33
|
-
payload.value = (payload.value
|
69
|
+
payload.value = array(payload.value).map { |object| key_to_index_map(object) }
|
34
70
|
|
35
71
|
nil
|
36
72
|
end
|
@@ -8,10 +8,12 @@
|
|
8
8
|
#
|
9
9
|
|
10
10
|
module Burner
|
11
|
-
|
11
|
+
module Library
|
12
12
|
module Collection
|
13
13
|
# Take an array and remove the first N elements, where N is specified by the amount
|
14
|
-
# attribute.
|
14
|
+
# attribute. The initial use case for this was to remove "header" rows from arrays,
|
15
|
+
# like you would expect when parsing CSV files.
|
16
|
+
#
|
15
17
|
# Expected Payload#value input: nothing.
|
16
18
|
# Payload#value output: An array with N beginning elements removed.
|
17
19
|
class Shift < Job
|
@@ -32,8 +34,7 @@ module Burner
|
|
32
34
|
def perform(output, payload)
|
33
35
|
output.detail("Shifting #{amount} entries.")
|
34
36
|
|
35
|
-
payload.value
|
36
|
-
payload.value.shift(amount)
|
37
|
+
payload.value = array(payload.value).slice(amount..-1)
|
37
38
|
|
38
39
|
nil
|
39
40
|
end
|