trailblazer-activity 0.10.1 → 0.11.5

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
  SHA256:
3
- metadata.gz: c94f3dbe368043f005ec5d68fc099246c8f302dd6e1b366989b321665d5f2b98
4
- data.tar.gz: 28f0b58b9d2de3b7adffd543860baed3e47eb25945161cbe7cc5f45a8f907abd
3
+ metadata.gz: c765281f7fa2902f9cc47fb4a2045b54de89fb48ef536d4696a497f947b3f9bb
4
+ data.tar.gz: 8a4f24aacb4da6b80e12a3edcd3698cb7583e014b489293d29938a003a27d084
5
5
  SHA512:
6
- metadata.gz: 78eaabeff700dd6b22ff61efe8efe993287875c02e7a80197ca6880c435bba2732d61ebaa41acc4da3737ad556ae669b8dc03f6dad445394486e7a1298d62569
7
- data.tar.gz: '08b7cbeea9a42fc99a8d38f95439d6e265f0fe4051ccfa8e95a18f18c117e34bf6ae2824e07a8eb139db32e4559bd094c30d621e1fb82cc2c8e80916e7c6ee88'
6
+ metadata.gz: 4388f3be8e6c4f902537b5febdec0b36b5a15e143f2da5f1a9b0aba4a0cb73e0066ef825ca4f285e040e36d25ff77ce9031114f85198e70779dee9359e75df2d
7
+ data.tar.gz: 71c58c25da986267e69c37e50a5a1b0de0083c58cf47def17b2c63eb44af7f8498d0f4f2b121be1d46b545b7c937bb85cf0156e32d642c73750e086232b96c98
data/.travis.yml CHANGED
@@ -1,10 +1,12 @@
1
- sudo: false
2
1
  language: ruby
3
- rvm:
4
- - 2.6.0
5
- - 2.5.1
6
- - 2.4.4
7
- # - 2.3.7
8
- # - 2.2.10
9
- # - 2.1.10
10
2
  before_install: gem install bundler
3
+ cache: bundler
4
+ rvm:
5
+ - ruby-head
6
+ - 2.7
7
+ - 2.6
8
+ - 2.5
9
+ - 2.4
10
+ jobs:
11
+ allow_failures:
12
+ - rvm: ruby-head
data/CHANGES.md CHANGED
@@ -1,3 +1,28 @@
1
+ # 0.11.5
2
+
3
+ * Bug fix: `:output` filter from `TaskWrap::VariableMapping` wasn't returning the correct `flow_options`. If the wrapped task changed
4
+ its `flow_options`, the original one was still returned from the taskWrap run, not the updated one.
5
+
6
+ # 0.11.4
7
+
8
+ * Introduce the `config_wrap:` option in `Intermediate.call(intermediate, implementation, config_merge: {})` to allow injecting data into the activity's `:config` field.
9
+
10
+ # 0.11.3
11
+
12
+ * Allow `Testing.def_task` & `Testing.def_tasks` to return custom signals
13
+
14
+ # 0.11.2
15
+
16
+ * Updrading `trailblazer-context` version :drum:
17
+
18
+ # 0.11.1
19
+
20
+ * Internal warning fixes.
21
+
22
+ # 0.11.0
23
+
24
+ * Support for Ruby 2.7. Most warnings are gone.
25
+
1
26
  # 0.10.1
2
27
 
3
28
  * Update IllegalSignalError exception for more clarity
data/Gemfile CHANGED
@@ -6,8 +6,5 @@ gemspec
6
6
  gem "benchmark-ips"
7
7
  gem "minitest-line"
8
8
 
9
- gem "rubocop", require: false
10
-
11
9
  # gem "trailblazer-context", path: "../trailblazer-context"
12
10
  # gem "trailblazer-developer", path: "../trailblazer-developer"
13
- # gem "trailblazer-developer", github: "trailblazer/trailblazer-developer", branch: "exception-tracing"
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2018 Trailblazer GmbH
1
+ Copyright (c) 2018-2020 Trailblazer GmbH
2
2
 
3
3
  Trailblazer is an Open Source project licensed under the terms of
4
4
  the LGPLv3 license. Please see <http://www.gnu.org/licenses/lgpl-3.0.html>
data/Rakefile CHANGED
@@ -1,13 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
- require "rubocop/rake_task"
4
3
 
5
4
  Rake::TestTask.new(:test) do |t|
6
5
  t.libs << "test"
7
6
  t.libs << "lib"
8
- t.test_files = FileList["**/*_test.rb"] - FileList["test/docs/*"] + ["test/docs/activity_test.rb"]
7
+ t.test_files = FileList["test/**/*_test.rb"] - FileList["test/docs/*"] + ["test/docs/activity_test.rb"]
9
8
  end
10
9
 
11
- RuboCop::RakeTask.new
12
-
13
- task :default => :test
10
+ task default: %i[test]
@@ -7,10 +7,10 @@ module Trailblazer
7
7
  @schema = schema
8
8
  end
9
9
 
10
- def call(args, circuit_options={})
10
+ def call(args, **circuit_options)
11
11
  @schema[:circuit].(
12
12
  args,
13
- circuit_options.merge(activity: self)
13
+ **(circuit_options.merge(activity: self))
14
14
  )
15
15
  end
16
16
 
@@ -34,24 +34,15 @@ module Trailblazer
34
34
  end # Activity
35
35
  end
36
36
 
37
- # require "trailblazer/activity/interface"
38
37
  require "trailblazer/activity/structures"
39
38
  require "trailblazer/activity/schema"
40
- require "trailblazer/activity/schema/implementation"
41
- require "trailblazer/activity/schema/intermediate"
42
39
  require "trailblazer/activity/circuit"
43
40
  require "trailblazer/activity/config"
44
41
  require "trailblazer/activity/introspect"
45
-
46
42
  require "trailblazer/activity/task_wrap"
47
- require "trailblazer/activity/task_wrap/pipeline"
48
- require "trailblazer/activity/task_wrap/call_task"
49
- require "trailblazer/activity/task_wrap/runner"
50
- require "trailblazer/activity/task_wrap/variable_mapping"
51
- require "trailblazer/activity/task_wrap/inject"
43
+ require "trailblazer/activity/task_builder"
52
44
 
53
45
  require "trailblazer/option"
54
46
  require "trailblazer/context"
55
- require "trailblazer/activity/task_builder"
56
47
 
57
48
 
@@ -45,7 +45,7 @@ module Trailblazer
45
45
  last_signal, args, _discarded_circuit_options = runner.(
46
46
  task,
47
47
  args,
48
- circuit_options
48
+ **circuit_options
49
49
  )
50
50
 
51
51
  # Stop execution of the circuit when we hit a stop event (< End). This could be an task's End or Suspend.
@@ -28,6 +28,7 @@ module Trailblazer
28
28
 
29
29
  return state[directive] if args.size == 1
30
30
  return state[directive][key] if state.key?(directive)
31
+
31
32
  nil
32
33
  end
33
34
  end
@@ -4,10 +4,6 @@ module Trailblazer
4
4
  # It abstracts internals about circuits and provides a convenient API to third-parties such as
5
5
  # tracing, rendering an activity, or finding particular tasks.
6
6
  module Introspect
7
- def self.Graph(*args)
8
- Graph.new(*args)
9
- end
10
-
11
7
  # TODO: order of step/fail/pass in Node would be cool to have
12
8
 
13
9
  # @private This API is still under construction.
@@ -20,13 +16,14 @@ module Trailblazer
20
16
  @configs = @schema[:nodes]
21
17
  end
22
18
 
23
- def find(id=nil, &block)
19
+ def find(id = nil, &block)
24
20
  return find_by_id(id) unless block_given?
21
+
25
22
  find_with_block(&block)
26
23
  end
27
24
 
28
- def collect(strategy: :circuit, &block)
29
- @map.keys.each_with_index.collect { |task, i| yield find_with_block { |node| node.task==task }, i }
25
+ def collect(strategy: :circuit)
26
+ @map.keys.each_with_index.collect { |task, i| yield find_with_block { |node| node.task == task }, i }
30
27
  end
31
28
 
32
29
  def stop_events
@@ -36,11 +33,11 @@ module Trailblazer
36
33
  private
37
34
 
38
35
  def find_by_id(id)
39
- node = @configs.find { |node| node.id == id } or return
36
+ node = @configs.find { |_node| _node.id == id } or return
40
37
  node_for(node)
41
38
  end
42
39
 
43
- def find_with_block(&block)
40
+ def find_with_block
44
41
  existing = @configs.find { |node| yield Node(node.task, node.id, node.outputs, node.data) } or return
45
42
 
46
43
  node_for(existing)
@@ -67,6 +64,10 @@ module Trailblazer
67
64
  end
68
65
  end
69
66
  end
70
- end #Introspect
67
+
68
+ def self.Graph(*args)
69
+ Graph.new(*args)
70
+ end
71
+ end # Introspect
71
72
  end
72
73
  end
@@ -11,3 +11,5 @@ module Trailblazer
11
11
  end # Schema
12
12
  end
13
13
  end
14
+ require "trailblazer/activity/schema/implementation"
15
+ require "trailblazer/activity/schema/intermediate"
@@ -12,15 +12,17 @@ class Trailblazer::Activity
12
12
  # Compiles a {Schema} instance from an {intermediate} structure and
13
13
  # the {implementation} object references.
14
14
  #
15
- # Intermediate structure, Implementation, calls extensions, passes {}config # TODO
16
- def self.call(intermediate, implementation)
17
- config_default = {wrap_static: Hash.new(TaskWrap.initial_wrap_static)}.freeze # DISCUSS: this really doesn't have to be here, but works for now and we want it in 99%.
15
+ # Intermediate structure, Implementation, calls extensions, passes {config} # TODO
16
+ def self.call(intermediate, implementation, config_merge: {})
17
+ config_default = {wrap_static: Hash.new(TaskWrap.initial_wrap_static)} # DISCUSS: this really doesn't have to be here, but works for now and we want it in 99%.
18
+ config = config_default.merge(config_merge)
19
+ config.freeze
18
20
 
19
21
  circuit = circuit(intermediate, implementation)
20
22
  nodes = node_attributes(intermediate, implementation)
21
23
  outputs = outputs(intermediate.stop_task_ids, nodes)
22
- config = config(implementation, config: config_default)
23
- schema = Schema.new(circuit, outputs, nodes, config)
24
+ config = config(implementation, config: config)
25
+ Schema.new(circuit, outputs, nodes, config)
24
26
  end
25
27
 
26
28
  # From the intermediate "template" and the actual implementation, compile a {Circuit} instance.
@@ -83,10 +85,10 @@ class Trailblazer::Activity
83
85
  config
84
86
  end
85
87
 
86
- private
88
+
87
89
 
88
90
  # Apply to any array.
89
- def self.for_semantic(outputs, semantic)
91
+ private_class_method def self.for_semantic(outputs, semantic)
90
92
  outputs.find { |out| out.semantic == semantic } or raise "`#{semantic}` not found"
91
93
  end
92
94
  end # Intermediate
@@ -2,13 +2,7 @@ module Trailblazer
2
2
  class Activity
3
3
  # Generic run-time structures that are built via the DSL.
4
4
 
5
- # Builds an {Activity::End} instance.
6
- def self.End(semantic)
7
- End.new(semantic: semantic)
8
- end
9
-
10
5
  # Any instance of subclass of End will halt the circuit's execution when hit.
11
-
12
6
  # An End event is a simple structure typically found as the last task invoked
13
7
  # in an activity. The special behavior is that it
14
8
  # a) maintains a semantic that is used to further connect that very event
@@ -18,8 +12,8 @@ module Trailblazer
18
12
  @options = options.merge(semantic: semantic)
19
13
  end
20
14
 
21
- def call(args, circuit_options)
22
- return self, args, circuit_options
15
+ def call(args, **circuit_options)
16
+ return self, args, **circuit_options
23
17
  end
24
18
 
25
19
  def to_h
@@ -27,15 +21,15 @@ module Trailblazer
27
21
  end
28
22
 
29
23
  def to_s
30
- %{#<#{self.class.name} #{@options.collect{ |k,v| "#{k}=#{v.inspect}" }.join(" ")}>}
24
+ %{#<#{self.class.name} #{@options.collect { |k, v| "#{k}=#{v.inspect}" }.join(" ")}>}
31
25
  end
32
26
 
33
- alias_method :inspect, :to_s
27
+ alias inspect to_s
34
28
  end
35
29
 
36
30
  class Start < End
37
- def call(args, circuit_options)
38
- return Activity::Right, args, circuit_options
31
+ def call(args, **circuit_options)
32
+ return Activity::Right, args, **circuit_options
39
33
  end
40
34
  end
41
35
 
@@ -53,5 +47,10 @@ module Trailblazer
53
47
  def self.Output(signal, semantic)
54
48
  Output.new(signal, semantic).freeze
55
49
  end
50
+
51
+ # Builds an {Activity::End} instance.
52
+ def self.End(semantic)
53
+ End.new(semantic: semantic)
54
+ end
56
55
  end
57
56
  end
@@ -11,7 +11,11 @@ module Trailblazer
11
11
  # Translates the return value of the user step into a valid signal.
12
12
  # Note that it passes through subclasses of {Signal}.
13
13
  def self.binary_signal_for(result, on_true, on_false)
14
- result.is_a?(Class) && result < Activity::Signal ? result : (result ? on_true : on_false)
14
+ if result.is_a?(Class) && result < Activity::Signal
15
+ result
16
+ else
17
+ result ? on_true : on_false
18
+ end
15
19
  end
16
20
 
17
21
  class Task
@@ -3,12 +3,12 @@ module Trailblazer
3
3
  #
4
4
  # Example with tracing:
5
5
  #
6
- # Call the task_wrap circuit:
7
- # |-- Start
8
- # |-- Trace.capture_args [optional]
9
- # |-- Call (call actual task) id: "task_wrap.call_task"
10
- # |-- Trace.capture_return [optional]
11
- # |-- Wrap::End
6
+ # Call the task_wrap circuit:
7
+ # |-- Start
8
+ # |-- Trace.capture_args [optional]
9
+ # |-- Call (call actual task) id: "task_wrap.call_task"
10
+ # |-- Trace.capture_return [optional]
11
+ # |-- Wrap::End
12
12
  module TaskWrap
13
13
  module_function
14
14
 
@@ -21,7 +21,7 @@ module Trailblazer
21
21
  )
22
22
 
23
23
  # signal, (ctx, flow), circuit_options =
24
- Runner.(activity, args, circuit_options)
24
+ Runner.(activity, args, **circuit_options)
25
25
  end
26
26
 
27
27
  # {:extension} API
@@ -29,7 +29,8 @@ module Trailblazer
29
29
  # Gets executed in {Intermediate.call} which also provides {config}.
30
30
 
31
31
  def initial_wrap_static(*)
32
- initial_sequence = TaskWrap::Pipeline.new([["task_wrap.call_task", TaskWrap.method(:call_task)]])
32
+ # return initial_sequence
33
+ TaskWrap::Pipeline.new([["task_wrap.call_task", TaskWrap.method(:call_task)]])
33
34
  end
34
35
 
35
36
  # Use this in your macros if you want to extend the {taskWrap}.
@@ -51,3 +52,8 @@ module Trailblazer
51
52
  end # TaskWrap
52
53
  end
53
54
  end
55
+ require "trailblazer/activity/task_wrap/pipeline"
56
+ require "trailblazer/activity/task_wrap/call_task"
57
+ require "trailblazer/activity/task_wrap/runner"
58
+ require "trailblazer/activity/task_wrap/variable_mapping"
59
+ require "trailblazer/activity/task_wrap/inject"
@@ -13,10 +13,10 @@ class Trailblazer::Activity
13
13
 
14
14
  ctx = original_ctx.merge(defaulted_options)
15
15
 
16
- Trailblazer::Context.for_circuit(ctx, {}, [original_ctx, flow_options], circuit_options) # TODO: test if Inject and :context_class work.
16
+ Trailblazer::Context(ctx, {}, flow_options[:context_options])
17
17
  end
18
18
 
19
- output = ->(new_ctx, (original_ctx, flow_options), circuit_options) { # FIXME: use Unscope
19
+ output = ->(new_ctx, (original_ctx, _flow_options), _circuit_options) { # FIXME: use Unscope
20
20
  _, mutable_data = new_ctx.decompose
21
21
 
22
22
  # we are only interested in the {mutable_data} part since the disposed part
@@ -9,7 +9,7 @@ class Trailblazer::Activity
9
9
  end
10
10
 
11
11
  def call(wrap_ctx, original_args)
12
- @sequence.each { |(id, task)| wrap_ctx, original_args = task.(wrap_ctx, original_args) }
12
+ @sequence.each { |(_id, task)| wrap_ctx, original_args = task.(wrap_ctx, original_args) }
13
13
 
14
14
  return wrap_ctx, original_args
15
15
  end
@@ -9,11 +9,11 @@ class Trailblazer::Activity
9
9
  #
10
10
  # @api private
11
11
  # @interface Runner
12
- def self.call(task, args, circuit_options)
12
+ def self.call(task, args, **circuit_options)
13
13
  wrap_ctx = { task: task }
14
14
 
15
15
  # this pipeline is "wrapped around" the actual `task`.
16
- task_wrap_pipeline = merge_static_with_runtime(task, circuit_options) || raise
16
+ task_wrap_pipeline = merge_static_with_runtime(task, **circuit_options) || raise
17
17
 
18
18
  # We save all original args passed into this Runner.call, because we want to return them later after this wrap
19
19
  # is finished.
@@ -28,15 +28,14 @@ class Trailblazer::Activity
28
28
  return wrap_ctx[:return_signal], wrap_ctx[:return_args]
29
29
  end
30
30
 
31
- private
32
31
 
33
32
  # Compute the task's wrap by applying alterations both static and from runtime.
34
33
  #
35
34
  # NOTE: this is for performance reasons: we could have only one hash containing everything but that'd mean
36
35
  # unnecessary computations at `call`-time since steps might not even be executed.
37
36
  # TODO: make this faster.
38
- def self.merge_static_with_runtime(task, wrap_runtime:, **circuit_options)
39
- static_wrap = TaskWrap.wrap_static_for(task, circuit_options) # find static wrap for this specific task [, or default wrap activity].
37
+ private_class_method def self.merge_static_with_runtime(task, wrap_runtime:, **circuit_options)
38
+ static_wrap = TaskWrap.wrap_static_for(task, **circuit_options) # find static wrap for this specific task [, or default wrap activity].
40
39
 
41
40
  # Apply runtime alterations.
42
41
  # Grab the additional wirings for the particular `task` from `wrap_runtime`.
@@ -38,7 +38,7 @@ class Trailblazer::Activity
38
38
  end
39
39
 
40
40
  # {input.call()} is invoked in the circuit.
41
- # `original_args` are the actual args passed to the wrapped task: [ [options, ..], circuit_options ]
41
+ # `original_args` are the actual args passed to the wrapped task: [ [ctx, ..], circuit_options ]
42
42
  #
43
43
  def call(wrap_ctx, original_args)
44
44
  # let user compute new ctx for the wrapped task.
@@ -73,12 +73,14 @@ class Trailblazer::Activity
73
73
  def call(wrap_ctx, original_args)
74
74
  (original_ctx, original_flow_options), original_circuit_options = original_args
75
75
 
76
- returned_ctx, _ = wrap_ctx[:return_args] # this is the Context returned from {call}ing the wrapped user task.
77
- original_ctx = wrap_ctx[@id] # grab the original ctx from before which was set in the {:input} filter.
76
+ return_args = wrap_ctx[:return_args]
77
+
78
+ returned_ctx, returned_flow_options = wrap_ctx[:return_args] # this is the Context returned from {call}ing the wrapped user task.
79
+ original_ctx = wrap_ctx[@id] # grab the original ctx from before which was set in the {:input} filter.
78
80
  # let user compute the output.
79
- output_ctx = @filter.(returned_ctx, [original_ctx, original_flow_options], original_circuit_options)
81
+ output_ctx = @filter.(returned_ctx, [original_ctx, returned_flow_options], original_circuit_options) # FIXME: shouldn't we pass {returned_ctx} instead of {original_ctx}?
80
82
 
81
- wrap_ctx = wrap_ctx.merge( return_args: [output_ctx, original_flow_options] )
83
+ wrap_ctx = wrap_ctx.merge( return_args: [output_ctx, returned_flow_options] )
82
84
 
83
85
  # and then pass on the "new" context.
84
86
  return wrap_ctx, original_args