burner 1.0.0.pre.alpha.5 → 1.0.0.pre.alpha.6

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -12
  3. data/exe/burner +2 -3
  4. data/lib/burner.rb +2 -0
  5. data/lib/burner/cli.rb +2 -0
  6. data/lib/burner/job.rb +25 -5
  7. data/lib/burner/jobs.rb +21 -41
  8. data/lib/burner/library.rb +30 -0
  9. data/lib/burner/library/collection/arrays_to_objects.rb +77 -0
  10. data/lib/burner/{jobs → library}/collection/graph.rb +3 -2
  11. data/lib/burner/{jobs → library}/collection/objects_to_arrays.rb +40 -4
  12. data/lib/burner/{jobs → library}/collection/shift.rb +5 -4
  13. data/lib/burner/{jobs → library}/collection/transform.rb +13 -9
  14. data/lib/burner/{jobs → library}/collection/unpivot.rb +7 -5
  15. data/lib/burner/{jobs → library}/collection/values.rb +5 -4
  16. data/lib/burner/{jobs → library}/deserialize/csv.rb +2 -1
  17. data/lib/burner/{jobs → library}/deserialize/json.rb +4 -1
  18. data/lib/burner/{jobs → library}/deserialize/yaml.rb +8 -2
  19. data/lib/burner/{jobs → library}/dummy.rb +3 -1
  20. data/lib/burner/{jobs → library}/echo.rb +3 -1
  21. data/lib/burner/{jobs → library}/io/base.rb +1 -1
  22. data/lib/burner/{jobs → library}/io/exist.rb +3 -1
  23. data/lib/burner/{jobs → library}/io/read.rb +4 -1
  24. data/lib/burner/{jobs → library}/io/write.rb +7 -2
  25. data/lib/burner/{jobs → library}/serialize/csv.rb +3 -2
  26. data/lib/burner/{jobs → library}/serialize/json.rb +4 -1
  27. data/lib/burner/{jobs → library}/serialize/yaml.rb +4 -1
  28. data/lib/burner/{jobs/set.rb → library/set_value.rb} +5 -2
  29. data/lib/burner/{jobs → library}/sleep.rb +3 -1
  30. data/lib/burner/modeling.rb +2 -0
  31. data/lib/burner/modeling/attribute.rb +29 -0
  32. data/lib/burner/modeling/attribute_renderer.rb +32 -0
  33. data/lib/burner/payload.rb +15 -12
  34. data/lib/burner/pipeline.rb +20 -1
  35. data/lib/burner/side_effects.rb +10 -0
  36. data/lib/burner/side_effects/written_file.rb +28 -0
  37. data/lib/burner/util.rb +10 -0
  38. data/lib/burner/util/arrayable.rb +30 -0
  39. data/lib/burner/version.rb +1 -1
  40. metadata +30 -26
  41. data/lib/burner/jobs/collection/arrays_to_objects.rb +0 -43
  42. data/lib/burner/jobs/collection/transform/attribute.rb +0 -33
  43. data/lib/burner/jobs/collection/transform/attribute_renderer.rb +0 -36
  44. data/lib/burner/written_file.rb +0 -28
@@ -19,11 +19,16 @@ module Burner
19
19
  acts_as_hashable
20
20
 
21
21
  class JobNotFoundError < StandardError; end
22
+ class DuplicateJobNameError < StandardError; end
22
23
 
23
24
  attr_reader :steps
24
25
 
25
26
  def initialize(jobs: [], steps: [])
26
- jobs_by_name = Jobs.array(jobs).map { |job| [job.name, job] }.to_h
27
+ jobs = Jobs.array(jobs)
28
+
29
+ assert_unique_job_names(jobs)
30
+
31
+ jobs_by_name = jobs.map { |job| [job.name, job] }.to_h
27
32
 
28
33
  @steps = Array(steps).map do |step_name|
29
34
  job = jobs_by_name[step_name.to_s]
@@ -60,6 +65,20 @@ module Burner
60
65
 
61
66
  private
62
67
 
68
+ def assert_unique_job_names(jobs)
69
+ unique_job_names = Set.new
70
+
71
+ jobs.each do |job|
72
+ if unique_job_names.include?(job.name)
73
+ raise DuplicateJobNameError, "job with name: #{job.name} already declared"
74
+ end
75
+
76
+ unique_job_names << job.name
77
+ end
78
+
79
+ nil
80
+ end
81
+
63
82
  def output_params(params, output)
64
83
  if params.keys.any?
65
84
  output.write('Parameters:')
@@ -0,0 +1,10 @@
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 'side_effects/written_file'
@@ -0,0 +1,28 @@
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 SideEffects
12
+ # Describes a file that was generated by a Job. If a Job emits a file, it should also add the
13
+ # file details to the Payload#side_effects array using the Payload#add_side_effect method.
14
+ class WrittenFile
15
+ attr_reader :logical_filename,
16
+ :physical_filename,
17
+ :time_in_seconds
18
+
19
+ def initialize(logical_filename:, physical_filename:, time_in_seconds:)
20
+ @logical_filename = logical_filename.to_s
21
+ @physical_filename = physical_filename.to_s
22
+ @time_in_seconds = time_in_seconds.to_f
23
+
24
+ freeze
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
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 'util/arrayable'
@@ -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
+ module Burner
11
+ module Util
12
+ # Provide helper methods for dealing with Arrays.
13
+ module Arrayable
14
+ # Since Ruby's Kernel#Array will properly call #to_a for scalar Hash objects, this could
15
+ # return something funky in the context of this library. In this library, Hash instances
16
+ # are typically viewed as an atomic key-value-based "object". This library likes to deal
17
+ # with object-like things, treating Hash, OpenStruct, Struct, or Object subclasses as
18
+ # basically the same thing. In this vein, this library leverages Objectable to help
19
+ # unify access data from objects. See the Objectable library for more information:
20
+ # https://github.com/bluemarblepayroll/objectable
21
+ def array(value)
22
+ if value.is_a?(Hash)
23
+ [value]
24
+ else
25
+ Array(value)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module Burner
11
- VERSION = '1.0.0-alpha.5'
11
+ VERSION = '1.0.0-alpha.6'
12
12
  end
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.0.pre.alpha.5
4
+ version: 1.0.0.pre.alpha.6
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-10-20 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts_as_hashable
@@ -221,38 +221,42 @@ files:
221
221
  - lib/burner/cli.rb
222
222
  - lib/burner/job.rb
223
223
  - lib/burner/jobs.rb
224
- - lib/burner/jobs/collection/arrays_to_objects.rb
225
- - lib/burner/jobs/collection/graph.rb
226
- - lib/burner/jobs/collection/objects_to_arrays.rb
227
- - lib/burner/jobs/collection/shift.rb
228
- - lib/burner/jobs/collection/transform.rb
229
- - lib/burner/jobs/collection/transform/attribute.rb
230
- - lib/burner/jobs/collection/transform/attribute_renderer.rb
231
- - lib/burner/jobs/collection/unpivot.rb
232
- - lib/burner/jobs/collection/values.rb
233
- - lib/burner/jobs/deserialize/csv.rb
234
- - lib/burner/jobs/deserialize/json.rb
235
- - lib/burner/jobs/deserialize/yaml.rb
236
- - lib/burner/jobs/dummy.rb
237
- - lib/burner/jobs/echo.rb
238
- - lib/burner/jobs/io/base.rb
239
- - lib/burner/jobs/io/exist.rb
240
- - lib/burner/jobs/io/read.rb
241
- - lib/burner/jobs/io/write.rb
242
- - lib/burner/jobs/serialize/csv.rb
243
- - lib/burner/jobs/serialize/json.rb
244
- - lib/burner/jobs/serialize/yaml.rb
245
- - lib/burner/jobs/set.rb
246
- - lib/burner/jobs/sleep.rb
224
+ - lib/burner/library.rb
225
+ - lib/burner/library/collection/arrays_to_objects.rb
226
+ - lib/burner/library/collection/graph.rb
227
+ - lib/burner/library/collection/objects_to_arrays.rb
228
+ - lib/burner/library/collection/shift.rb
229
+ - lib/burner/library/collection/transform.rb
230
+ - lib/burner/library/collection/unpivot.rb
231
+ - lib/burner/library/collection/values.rb
232
+ - lib/burner/library/deserialize/csv.rb
233
+ - lib/burner/library/deserialize/json.rb
234
+ - lib/burner/library/deserialize/yaml.rb
235
+ - lib/burner/library/dummy.rb
236
+ - lib/burner/library/echo.rb
237
+ - lib/burner/library/io/base.rb
238
+ - lib/burner/library/io/exist.rb
239
+ - lib/burner/library/io/read.rb
240
+ - lib/burner/library/io/write.rb
241
+ - lib/burner/library/serialize/csv.rb
242
+ - lib/burner/library/serialize/json.rb
243
+ - lib/burner/library/serialize/yaml.rb
244
+ - lib/burner/library/set_value.rb
245
+ - lib/burner/library/sleep.rb
247
246
  - lib/burner/modeling.rb
247
+ - lib/burner/modeling/attribute.rb
248
+ - lib/burner/modeling/attribute_renderer.rb
248
249
  - lib/burner/modeling/key_index_mapping.rb
249
250
  - lib/burner/output.rb
250
251
  - lib/burner/payload.rb
251
252
  - lib/burner/pipeline.rb
253
+ - lib/burner/side_effects.rb
254
+ - lib/burner/side_effects/written_file.rb
252
255
  - lib/burner/step.rb
253
256
  - lib/burner/string_template.rb
257
+ - lib/burner/util.rb
258
+ - lib/burner/util/arrayable.rb
254
259
  - lib/burner/version.rb
255
- - lib/burner/written_file.rb
256
260
  homepage: https://github.com/bluemarblepayroll/burner
257
261
  licenses:
258
262
  - MIT
@@ -1,43 +0,0 @@
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
- class Jobs
12
- module Collection
13
- # Convert an array of arrays to an array of objects.
14
- # Expected Payload#value input: array of arrays.
15
- # Payload#value output: An array of hashes.
16
- class ArraysToObjects < Job
17
- attr_reader :mappings
18
-
19
- def initialize(name:, mappings: [])
20
- super(name: name)
21
-
22
- @mappings = Modeling::KeyIndexMapping.array(mappings)
23
-
24
- freeze
25
- end
26
-
27
- def perform(_output, payload)
28
- payload.value = (payload.value || []).map { |array| index_to_key_map(array) }
29
-
30
- nil
31
- end
32
-
33
- private
34
-
35
- def index_to_key_map(array)
36
- mappings.each_with_object({}) do |mapping, memo|
37
- memo[mapping.key] = array[mapping.index]
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,33 +0,0 @@
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
- class Jobs
12
- module Collection
13
- class Transform < Job
14
- # Defines a top-level key and the associated transformers for deriving the final value
15
- # to set the key to.
16
- class Attribute
17
- acts_as_hashable
18
-
19
- attr_reader :key, :transformers
20
-
21
- def initialize(key:, transformers: [])
22
- raise ArgumentError, 'key is required' if key.to_s.empty?
23
-
24
- @key = key.to_s
25
- @transformers = Realize::Transformers.array(transformers)
26
-
27
- freeze
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,36 +0,0 @@
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
- class Jobs
12
- module Collection
13
- class Transform < Job
14
- # Composed of an Attribute instance and a Pipeline instance. It knows how to
15
- # render/transform an Attribute. Since this library is data-first, these intermediary
16
- # objects are necessary for non-data-centric modeling.
17
- class AttributeRenderer
18
- extend Forwardable
19
-
20
- attr_reader :attribute, :pipeline
21
-
22
- def_delegators :attribute, :key
23
-
24
- def_delegators :pipeline, :transform
25
-
26
- def initialize(attribute, resolver)
27
- @attribute = attribute
28
- @pipeline = Realize::Pipeline.new(attribute.transformers, resolver: resolver)
29
-
30
- freeze
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,28 +0,0 @@
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
- # Describes a file that was generated by a Job. If a Job emits a file, it should also add the
12
- # file details to the Payload#written_files array using the Payload#add_written_file method.
13
- class WrittenFile
14
- acts_as_hashable
15
-
16
- attr_reader :logical_filename,
17
- :physical_filename,
18
- :time_in_seconds
19
-
20
- def initialize(logical_filename:, physical_filename:, time_in_seconds:)
21
- @logical_filename = logical_filename.to_s
22
- @physical_filename = physical_filename.to_s
23
- @time_in_seconds = time_in_seconds.to_f
24
-
25
- freeze
26
- end
27
- end
28
- end