trailblazer-activity 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGES.md +6 -0
  4. data/NOTES +3 -0
  5. data/lib/trailblazer/activity.rb +17 -15
  6. data/lib/trailblazer/activity/dsl/add_task.rb +4 -4
  7. data/lib/trailblazer/activity/dsl/helper.rb +13 -5
  8. data/lib/trailblazer/activity/dsl/magnetic.rb +36 -0
  9. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder.rb +4 -6
  10. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder/default_normalizer.rb +0 -0
  11. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder/fast_track.rb +2 -14
  12. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder/normalizer.rb +2 -2
  13. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder/path.rb +9 -15
  14. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/builder/railway.rb +1 -13
  15. data/lib/trailblazer/activity/{state.rb → dsl/magnetic/builder/state.rb} +5 -5
  16. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/finalizer.rb +0 -0
  17. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/generate.rb +0 -0
  18. data/lib/trailblazer/activity/dsl/magnetic/merge.rb +16 -0
  19. data/lib/trailblazer/activity/{magnetic/dsl.rb → dsl/magnetic/process_options.rb} +11 -28
  20. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/structure/alterations.rb +0 -0
  21. data/lib/trailblazer/activity/{magnetic → dsl/magnetic}/structure/plus_poles.rb +2 -9
  22. data/lib/trailblazer/activity/dsl/magnetic/structure/polarization.rb +23 -0
  23. data/lib/trailblazer/activity/dsl/record.rb +11 -0
  24. data/lib/trailblazer/activity/{schema → dsl/schema}/dependencies.rb +0 -0
  25. data/lib/trailblazer/activity/{schema → dsl/schema}/sequence.rb +0 -0
  26. data/lib/trailblazer/activity/{implementation → dsl/strategy}/build_state.rb +1 -1
  27. data/lib/trailblazer/activity/{implementation → dsl/strategy}/fast_track.rb +5 -0
  28. data/lib/trailblazer/activity/{implementation → dsl/strategy}/path.rb +5 -1
  29. data/lib/trailblazer/activity/{implementation → dsl/strategy}/plan.rb +0 -0
  30. data/lib/trailblazer/activity/{implementation → dsl/strategy}/railway.rb +5 -1
  31. data/lib/trailblazer/activity/{implementation/interface.rb → interface.rb} +0 -0
  32. data/lib/trailblazer/activity/introspect.rb +3 -1
  33. data/lib/trailblazer/activity/structures.rb +5 -4
  34. data/lib/trailblazer/activity/version.rb +1 -1
  35. metadata +26 -26
  36. data/NOTES_ +0 -36
  37. data/lib/trailblazer/activity/magnetic.rb +0 -36
  38. data/lib/trailblazer/activity/magnetic/merge.rb +0 -18
  39. data/lib/trailblazer/activity/subprocess.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b12275a2f1dfc9e9c90d7b3df76d2eab01db0964c453d61a23a307296cda2378
4
- data.tar.gz: 93b881493ecec9eb50516cb1185ff1129c6fbc5efe478bc429604adae077c552
3
+ metadata.gz: dab847dcaff55b44bfa62dad2a7f8e662458bc082e941dccf1e8f189b87eb6fa
4
+ data.tar.gz: f8c1782081b72b024f5fdc06e49d040825979c3cd825cd2a242270fc100d65c3
5
5
  SHA512:
6
- metadata.gz: 7245451409ba95340e9a3ef5e9404df93b3e2f7aa9325fe2132bc45f4f7fbcd49370200dfe9532fb5fa8f4307fdd3f4c6eae480920927e232228361712ac8cef
7
- data.tar.gz: a127529dea689958ff467558c6a373b37cfe0e2e2475b99b24f854488b672ff012cb8cccdfc3b02339e1b20e62eecbd92e5148fbe7e80ad5da7b8242e7f2c793
6
+ metadata.gz: acd50922b312667f892d6b73d0c39fdb5cfc136f5421af01fdbb0383e065845e332518b02d068a3279b72cc5cbec1e2f6d22c0a9cbaf77abe25af8669b31a0f9
7
+ data.tar.gz: e493008be86cff07f981fb6ab6542b14749f17dc91c542bde511f7cfabe14b8b8b0c1eb91dccc6b714a24d66567846b03fe2dbc6898bd598b48b0dd2d16c5192
data/.travis.yml CHANGED
@@ -5,7 +5,7 @@ rvm:
5
5
  - 2.1
6
6
  - 2.2
7
7
  - 2.3.3
8
- - 2.4.1
8
+ - 2.4.3
9
9
  - 2.5.0
10
10
  matrix:
11
11
  include:
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.5.0
2
+
3
+ * Rename `Nested()` to `Subprocess` and move the original one to the `operation` gem.
4
+ * Add merging: `Activity.merge!` now allows to compose an activity by merging another.
5
+ * Enforce using `Output(..) => Track(:success)` instead of just the track color `:success`. This allow having IDs both symbols and strings.
6
+
1
7
  # 0.4.3
2
8
 
3
9
  * Make `:outputs` the canonical way to define outputs, and not `:plus_poles`. The latter is computed by the DSL if not passed.
data/NOTES CHANGED
@@ -1,3 +1,6 @@
1
+ # 2.2
2
+ * The `Polarizations` classes, e.g. in `FastTrack` could be steps in the normalizer? so we wouldn't need `reverse_merge`.
3
+
1
4
  # NOT lowest level. if you need that, use your own proc.
2
5
  # TODO: how do we track what goes into the callable?
3
6
  # adjust what goes into it (e.g. without direction or with kw args)?
@@ -34,6 +34,8 @@ module Trailblazer
34
34
  def inspect
35
35
  "#<Trailblazer::Activity: {#{name || self[:options][:name]}}>"
36
36
  end
37
+
38
+ alias_method :to_s, :inspect
37
39
  end
38
40
 
39
41
 
@@ -42,7 +44,7 @@ module Trailblazer
42
44
  module DSLHelper
43
45
  extend Forwardable
44
46
  def_delegators :@builder, :Path
45
- def_delegators DSL::Helper, :Output, :End, :Nested
47
+ def_delegators DSL::Helper, :Output, :End, :Subprocess, :Track
46
48
 
47
49
  def Path(*args, &block)
48
50
  self[:builder].Path(*args, &block)
@@ -69,14 +71,14 @@ module Trailblazer
69
71
  require "trailblazer/activity/dsl/add_task"
70
72
  include DSL::AddTask
71
73
 
72
- require "trailblazer/activity/implementation/interface"
74
+ require "trailblazer/activity/interface"
73
75
  include Activity::Interface # DISCUSS
74
76
 
75
77
  include DSLHelper # DISCUSS
76
78
 
77
79
  include Activity::Inspect # DISCUSS
78
80
 
79
- require "trailblazer/activity/magnetic/merge"
81
+ require "trailblazer/activity/dsl/magnetic/merge"
80
82
  include Magnetic::Merge # Activity#merge!
81
83
 
82
84
  def call(args, argumenter: [], **circuit_options) # DISCUSS: the argumenter logic might be moved out.
@@ -92,12 +94,11 @@ require "trailblazer/circuit"
92
94
  require "trailblazer/activity/structures"
93
95
  require "trailblazer/activity/config"
94
96
 
95
- require "trailblazer/activity/implementation/build_state"
96
- require "trailblazer/activity/implementation/interface"
97
- require "trailblazer/activity/implementation/path"
98
- require "trailblazer/activity/implementation/plan"
99
- require "trailblazer/activity/implementation/railway"
100
- require "trailblazer/activity/implementation/fast_track"
97
+ require "trailblazer/activity/dsl/strategy/build_state"
98
+ require "trailblazer/activity/dsl/strategy/path"
99
+ require "trailblazer/activity/dsl/strategy/plan"
100
+ require "trailblazer/activity/dsl/strategy/railway"
101
+ require "trailblazer/activity/dsl/strategy/fast_track"
101
102
 
102
103
  require "trailblazer/activity/task_wrap"
103
104
  require "trailblazer/activity/task_wrap/call_task"
@@ -110,11 +111,12 @@ require "trailblazer/activity/present"
110
111
 
111
112
  require "trailblazer/activity/introspect"
112
113
 
113
- # require "trailblazer/activity/heritage"
114
- require "trailblazer/activity/subprocess"
114
+ require "trailblazer/activity/dsl/magnetic/builder/state"
115
+ require "trailblazer/activity/dsl/magnetic" # the "magnetic" DSL
116
+
117
+ require "trailblazer/activity/dsl/schema/sequence"
118
+ require "trailblazer/activity/dsl/schema/dependencies"
115
119
 
116
- require "trailblazer/activity/state"
117
- require "trailblazer/activity/magnetic" # the "magnetic" DSL
118
- require "trailblazer/activity/schema/sequence"
120
+ require "trailblazer/activity/dsl/magnetic/builder/normalizer" # DISCUSS: name and location are odd. This one uses Activity ;)
119
121
 
120
- require "trailblazer/activity/magnetic/builder/normalizer" # DISCUSS: name and location are odd. This one uses Activity ;)
122
+ require "trailblazer/activity/dsl/record"
@@ -1,21 +1,21 @@
1
1
  class Trailblazer::Activity < Module
2
2
  module DSL
3
3
  module AddTask
4
- def add_task!(name, task, options, &block)
4
+ def add_task!(strategy, polarizer, name, task, options, &block)
5
5
  # The beautiful thing about State.add is it doesn't mutate anything.
6
6
  # We're changing state here, on the outside, by overriding the ivars.
7
7
  # That in turn means, the only mutated entity is this module.
8
8
 
9
- _builder, adds, circuit, outputs, options = State.add( self[:builder], self[:adds], name, task, options, &block ) # this could be an extension itself.
9
+ _builder, adds, circuit, outputs, returned_options = Magnetic::Builder::State.add( self[:builder], self[:adds], strategy, polarizer, task, options, &block ) # this could be an extension itself.
10
10
 
11
11
  self[:adds] = adds
12
12
  self[:circuit] = circuit
13
13
  self[:outputs] = outputs
14
14
 
15
- task, local_options = options
15
+ _, local_options = returned_options
16
16
 
17
17
  # {Extension API} call all extensions.
18
- local_options[:extension].collect { |ext| ext.(self, *options) } if local_options[:extension]
18
+ local_options[:extension].collect { |ext| ext.( self, *returned_options, original_dsl_args: [name, task, options, block] ) } if local_options[:extension]
19
19
  end
20
20
  end
21
21
  end
@@ -4,14 +4,18 @@ module Trailblazer
4
4
  # the circuit, etc. Method comes in a module so it can be overridden via modules.
5
5
  #
6
6
  # This approach assumes you maintain a {#add_task!} method.
7
- def self.def_dsl(_name)
7
+ def self.def_dsl(_name, strategy, polarizer)
8
8
  Module.new do
9
9
  define_method(_name) do |task, options={}, &block|
10
- builder, adds, circuit, outputs, options = add_task!(_name, task, options, &block) # TODO: similar to Block.
10
+ builder, adds, circuit, outputs, options = add_task!(strategy, polarizer, _name, task, options, &block)
11
11
  end
12
12
  end
13
13
  end
14
14
 
15
+ # @api private
16
+ OutputSemantic = Struct.new(:value)
17
+ Track = Struct.new(:color)
18
+
15
19
  # Shortcut functions for the DSL. These have no state.
16
20
  module Helper
17
21
  module_function
@@ -19,7 +23,7 @@ module Trailblazer
19
23
  # Output( Left, :failure )
20
24
  # Output( :failure ) #=> Output::Semantic
21
25
  def Output(signal, semantic=nil)
22
- return Activity::Magnetic::DSL::Output::Semantic.new(signal) if semantic.nil?
26
+ return OutputSemantic.new(signal) if semantic.nil?
23
27
 
24
28
  Activity.Output(signal, semantic)
25
29
  end
@@ -28,8 +32,12 @@ module Trailblazer
28
32
  Activity.End(semantic)
29
33
  end
30
34
 
35
+ def Track(color)
36
+ Track.new(color).freeze
37
+ end
38
+
31
39
  def Path(normalizer, track_color: "track_#{rand}", end_semantic: track_color, **options)
32
- options = options.merge(track_color: track_color, end_semantic: end_semantic)
40
+ options = options.merge(track_color: track_color, end_semantic: end_semantic)
33
41
 
34
42
  # Build an anonymous class which will be where the block is evaluated in.
35
43
  # We use the same normalizer here, so DSL calls in the inner block have the same behavior.
@@ -46,7 +54,7 @@ module Trailblazer
46
54
  end
47
55
 
48
56
  # Computes the :outputs options for {activity}
49
- def Nested(activity)
57
+ def Subprocess(activity)
50
58
  {
51
59
  task: activity,
52
60
  outputs: activity.outputs
@@ -0,0 +1,36 @@
1
+ module Trailblazer
2
+ class Activity < Module # all code related to the magnetic building of a circuit hash lives in this namespace.
3
+ module Magnetic
4
+ # PlusPole "radiates" a color that MinusPoles are attracted to.
5
+ #
6
+ # This datastructure is produced by the DSL and sits in an ADDS.
7
+ PlusPole = Struct.new(:output, :color) do
8
+ private :output
9
+
10
+ def signal
11
+ output.signal
12
+ end
13
+ end # PlusPole
14
+ end
15
+ end
16
+ end
17
+
18
+ require "trailblazer/activity/dsl/magnetic/process_options"
19
+ require "trailblazer/activity/dsl/magnetic/structure/plus_poles"
20
+ require "trailblazer/activity/dsl/magnetic/structure/polarization"
21
+ require "trailblazer/activity/dsl/magnetic/structure/alterations"
22
+
23
+ require "trailblazer/activity/dsl/magnetic"
24
+ require "trailblazer/activity/dsl/magnetic/builder"
25
+ # require "trailblazer/activity/dsl/magnetic/builder/dsl_helper"
26
+ # require "trailblazer/activity/dsl/magnetic/dsl_helper"
27
+
28
+ require "trailblazer/option"
29
+ require "trailblazer/activity/task_builder"
30
+ require "trailblazer/activity/dsl/magnetic/builder/default_normalizer"
31
+ require "trailblazer/activity/dsl/magnetic/builder/path"
32
+ require "trailblazer/activity/dsl/magnetic/builder/railway"
33
+ require "trailblazer/activity/dsl/magnetic/builder/fast_track" # TODO: move to Operation gem.
34
+
35
+ require "trailblazer/activity/dsl/magnetic/generate"
36
+ require "trailblazer/activity/dsl/magnetic/finalizer"
@@ -1,5 +1,3 @@
1
- require "trailblazer/activity/magnetic/finalizer"
2
-
3
1
  module Trailblazer
4
2
  module Activity::Magnetic
5
3
 
@@ -41,21 +39,21 @@ module Trailblazer
41
39
  end
42
40
 
43
41
  # Public top-level entry point.
44
- def insert(name, task, options, &block)
42
+ def insert(strategy, polarizer, task, options, &block)
45
43
  normalizer = options[:normalizer] || @normalizer # DISCUSS: do this at a deeper point?
46
44
 
47
45
  task, local_options, connection_options, sequence_options = normalizer.(task, options)
48
46
 
49
- implementation, polarizations, task, local_options, block = send(name, task, local_options, &block) # builder.task
47
+ polarizations = strategy.send(polarizer, @builder_options) # Railway.StepPolarizations( @builder_options )
50
48
 
51
- insert_element( implementation, polarizations, task, local_options, connection_options, sequence_options, &block )
49
+ insert_element( polarizations, task, local_options, connection_options, sequence_options, &block )
52
50
  end
53
51
 
54
52
  private
55
53
 
56
54
  # Internal top-level entry point to add task(s) and connections.
57
55
  # High level interface for DSL calls like ::task or ::step.
58
- def insert_element(impl, polarizations, task, local_options, connection_options, sequence_options, &block)
56
+ def insert_element(polarizations, task, local_options, connection_options, sequence_options, &block)
59
57
  adds, *returned_options = Builder.adds_for(polarizations, task, local_options, connection_options, sequence_options, &block)
60
58
  end
61
59
 
@@ -88,7 +88,7 @@ module Trailblazer
88
88
  adds(
89
89
  pass_fast_end,
90
90
 
91
- Path::TaskPolarizations(builder_options.merge( type: :End )),
91
+ Path::EndEventPolarizations(builder_options),
92
92
 
93
93
  {},
94
94
  { group: :end },
@@ -100,7 +100,7 @@ module Trailblazer
100
100
  adds(
101
101
  fail_fast_end,
102
102
 
103
- Path::TaskPolarizations(builder_options.merge( type: :End )),
103
+ Path::EndEventPolarizations(builder_options),
104
104
 
105
105
  {},
106
106
  { group: :end },
@@ -116,18 +116,6 @@ module Trailblazer
116
116
  # Direction signals.
117
117
  FailFast = Class.new(Activity::Signal)
118
118
  PassFast = Class.new(Activity::Signal)
119
-
120
- def step(task, options={}, &block)
121
- return FastTrack, FastTrack.StepPolarizations(@builder_options), task, options, block
122
- end
123
-
124
- def fail(task, options={}, &block)
125
- return FastTrack, FastTrack.FailPolarizations(@builder_options), task, options, block
126
- end
127
-
128
- def pass(task, options={}, &block)
129
- return FastTrack, FastTrack.PassPolarizations(@builder_options), task, options, block
130
- end
131
119
  end
132
120
  end
133
121
  end
@@ -54,13 +54,13 @@ module Trailblazer
54
54
  end
55
55
 
56
56
  # Filter out connections, e.g. `Output(:fail_fast) => :success` and return only the keywords like `:id` or `:replace`.
57
- def self.extract_dsl_keywords(options, connection_classes = [Activity::Output, DSL::Output::Semantic])
57
+ def self.extract_dsl_keywords(options, connection_classes = [Activity::Output, Activity::DSL::OutputSemantic])
58
58
  options.keys - options.keys.find_all { |k| connection_classes.include?( k.class ) }
59
59
  end
60
60
 
61
61
  # FIXME; why don't we use the extensions passed into the initializer?
62
62
  def self.normalize_extension_option( ctx, local_options:, ** )
63
- local_options[:extension] = (local_options[:extension]||[]) + [ Activity::Introspect.method(:add_introspection) ] # fixme: this sucks
63
+ local_options[:extension] = (local_options[:extension]||[]) + [ Activity::Introspect.method(:add_introspection), Activity::DSL.method(:record) ] # fixme: this sucks
64
64
  end
65
65
 
66
66
  # Normalizes ctx[:options]
@@ -14,17 +14,9 @@ module Trailblazer
14
14
  )
15
15
  end
16
16
 
17
- def task(task, options={}, &block)
18
- polarizations = Path.TaskPolarizations( @builder_options.merge( type: options[:type] ) ) # DISCUSS: handle :type here? Really?
19
-
20
- return Path, polarizations, task, options, block
21
- end
22
-
23
- # @private Might be removed.
24
17
  def self.default_outputs
25
18
  {
26
- success: Activity.Output(Activity::Right, :success),
27
- # failure: Activity.Output(Activity::Left, :failure),
19
+ success: Activity.Output(Activity::Right, :success)
28
20
  }
29
21
  end
30
22
 
@@ -48,7 +40,7 @@ module Trailblazer
48
40
  end_adds = adds(
49
41
  track_end,
50
42
 
51
- TaskPolarizations(builder_options.merge( type: :End )),
43
+ EndEventPolarizations(builder_options),
52
44
 
53
45
  {}, { group: :end },
54
46
 
@@ -60,12 +52,14 @@ module Trailblazer
60
52
  start_adds + end_adds
61
53
  end
62
54
 
63
- def self.TaskPolarizations(track_color:, type: :task, **)
64
- return [EndPolarization.new( track_color: track_color )] if type == :End # DISCUSS: should this dispatch be here?
65
-
55
+ def self.TaskPolarizations(track_color:, **)
66
56
  [TaskPolarization.new( track_color: track_color )]
67
57
  end
68
58
 
59
+ def self.EndEventPolarizations(track_color:, **)
60
+ [EndEventPolarization.new( track_color: track_color )]
61
+ end
62
+
69
63
  class TaskPolarization
70
64
  def initialize(track_color:)
71
65
  @track_color = track_color
@@ -79,14 +73,14 @@ module Trailblazer
79
73
  end
80
74
  end # TaskPolarization
81
75
 
82
- class EndPolarization < TaskPolarization
76
+ class EndEventPolarization < TaskPolarization
83
77
  def call(magnetic_to, plus_poles, options)
84
78
  [
85
79
  magnetic_to || [@track_color],
86
80
  {}
87
81
  ]
88
82
  end
89
- end # EndPolarization
83
+ end # EndEventPolarization
90
84
  end # Path
91
85
  end # Builder
92
86
  end
@@ -10,18 +10,6 @@ module Trailblazer
10
10
  )
11
11
  end
12
12
 
13
- def step(task, options={}, &block)
14
- return Railway, Railway.StepPolarizations(@builder_options), task, options, block
15
- end
16
-
17
- def fail(task, options={}, &block)
18
- return Railway, Railway.FailPolarizations(@builder_options), task, options, block
19
- end
20
-
21
- def pass(task, options={}, &block)
22
- return Railway, Railway.PassPolarizations(@builder_options), task, options, block
23
- end
24
-
25
13
  def self.default_outputs
26
14
  Path.default_outputs.merge(
27
15
  :failure => Activity.Output(Activity::Left, :failure),
@@ -36,7 +24,7 @@ module Trailblazer
36
24
  end_adds = adds(
37
25
  failure_end,
38
26
 
39
- Path::TaskPolarizations(builder_options.merge( type: :End )),
27
+ Path::EndEventPolarizations(builder_options),
40
28
 
41
29
  {},
42
30
  { group: :end },
@@ -1,6 +1,6 @@
1
1
  module Trailblazer
2
- class Activity < Module # @private
3
- # Maintain Builder/Adds/Process/Outputs as immutable objects.
2
+ class Activity::Magnetic::Builder
3
+ # Maintain Builder instance plus Adds/Process/Outputs as immutable objects.
4
4
  module State
5
5
  def self.build(builder_class, normalizer, builder_options)
6
6
  builder, adds = builder_class.for(normalizer, builder_options) # e.g. Path.for(...) which creates a Builder::Path instance.
@@ -8,8 +8,8 @@ module Trailblazer
8
8
  recompile(builder.freeze, adds.freeze)
9
9
  end
10
10
 
11
- def self.add(builder, adds, name, *args, &block)
12
- new_adds, *returned_options = builder.insert(name, *args, &block) # builder.task
11
+ def self.add(builder, adds, strategy, polarizer, *args, &block)
12
+ new_adds, *returned_options = builder.insert(strategy, polarizer, *args, &block) # TODO: move that out of here.
13
13
 
14
14
  adds = adds + new_adds
15
15
 
@@ -34,7 +34,7 @@ module Trailblazer
34
34
  #
35
35
  # @return [Process, Hash] The {Process} instance and its outputs hash.
36
36
  def self.call(adds)
37
- circuit, end_events = Magnetic::Builder::Finalizer.(adds)
37
+ circuit, end_events = Finalizer.(adds)
38
38
  outputs = recompile_outputs(end_events)
39
39
 
40
40
  return circuit, outputs
@@ -0,0 +1,16 @@
1
+ class Trailblazer::Activity < Module
2
+ module Magnetic
3
+ module Merge
4
+ def merge!(merged)
5
+ merged[:record].each do |key, args|
6
+ dsl_method, *args = args
7
+
8
+ return send( dsl_method, args[0], args[1], &args[2] ) if args[2]
9
+ send( dsl_method, args[0], args[1] )
10
+ end
11
+
12
+ self
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,19 +1,6 @@
1
1
  module Trailblazer
2
2
  module Activity::Magnetic
3
3
  module DSL
4
- class Polarization
5
- def initialize( output:raise, color:raise )
6
- @output, @color = output, color
7
- end
8
-
9
- def call(magnetic_to, plus_poles, options)
10
- [
11
- magnetic_to,
12
- plus_poles.merge( @output => @color ) # this usually adds a new Output to the task.
13
- ]
14
- end
15
- end # Polarization
16
-
17
4
  # This module only processes additional "wiring" options from the DSL calls
18
5
  # Output(:success) => End("my.new")
19
6
  #
@@ -41,22 +28,16 @@ module Trailblazer
41
28
  end
42
29
 
43
30
  def process_tuple(id, output, task, plus_poles, &block)
44
- output = output_for(output, plus_poles) if output.kind_of?(DSL::Output::Semantic)
31
+ output = output_for(output, plus_poles) if output.kind_of?(Activity::DSL::OutputSemantic)
45
32
 
46
33
  if task.kind_of?(Activity::End)
34
+ # raise %{An end event with semantic `#{task.to_h[:semantic]}` has already been added. Please use an ID reference: `=> "End.#{task.to_h[:semantic]}"`} if
47
35
  new_edge = "#{id}-#{output.signal}"
48
36
 
49
37
  [
50
38
  Polarization.new( output: output, color: new_edge ),
51
39
  [ [:add, [task.to_h[:semantic], [ [new_edge], task, [] ], group: :end]] ]
52
40
  ]
53
- elsif task.is_a?(String) # let's say this means an existing step
54
- new_edge = "#{id}-#{output.signal}-#{task}"
55
-
56
- [
57
- Polarization.new( output: output, color: new_edge ),
58
- [[ :magnetic_to, [ task, [new_edge] ] ]],
59
- ]
60
41
  # procs come from DSL calls such as `Path() do ... end`.
61
42
  elsif task.is_a?(Proc)
62
43
  start_color, activity = task.(block)
@@ -69,9 +50,16 @@ module Trailblazer
69
50
  # TODO: we also need to merge all the other states such as debug.
70
51
  adds[1..-1] # drop start
71
52
  ]
72
- else # An additional plus polarization. Example: Output => :success
53
+ elsif task.is_a?(Activity::DSL::Track) # An additional plus polarization. Example: Output => :success
54
+ [
55
+ Polarization.new( output: output, color: task.color )
56
+ ]
57
+ else # ID: existing step
58
+ new_edge = "#{id}-#{output.signal}-#{task}"
59
+
73
60
  [
74
- Polarization.new( output: output, color: task )
61
+ Polarization.new( output: output, color: new_edge ),
62
+ [[ :magnetic_to, [ task, [new_edge] ] ]],
75
63
  ]
76
64
  end
77
65
  end
@@ -83,11 +71,6 @@ module Trailblazer
83
71
  output or raise("Couldn't find existing output for `#{semantic.value.inspect}`.")
84
72
  end
85
73
  end # OptionsProcessing
86
-
87
- # DSL datastructures
88
- module Output
89
- Semantic = Struct.new(:value)
90
- end
91
74
  end # DSL
92
75
  end
93
76
  end
@@ -73,20 +73,13 @@ module Trailblazer
73
73
  @plus_poles.values.collect { |output, color| PlusPole.new(output, color) }
74
74
  end
75
75
 
76
- # Builds PlusPoles from { semantic => Output }, which, surprisingly, is exactly what Activity::outputs looks like.
77
- # The plus pole's color is set to the output's semantic.
78
- def self.from_outputs(outputs)
79
- ary = outputs.collect { |semantic, output| [ output, semantic ] }
80
-
81
- new.merge(::Hash[ary])
82
- end
83
-
84
76
  # FIXME: should this be a hash or whatever?
85
77
  #
86
- # @return Hash All {Output}s mapped to their semantic: `{ Output(Right, :success) => :success }`
78
+ # @return Hash All {Output}s mapped to their (guessed) semantic: `{ Output(Right, :success) => :success }`
87
79
  def self.initial(outputs)
88
80
  new.merge(Hash[ outputs.collect { |semantic, output| [output, semantic] } ])
89
81
  end
90
82
  end
91
83
  end
92
84
  end
85
+
@@ -0,0 +1,23 @@
1
+ module Trailblazer
2
+ module Activity::Magnetic
3
+ module DSL
4
+ # Every DSL method creates a set of polarizations that are evaluated and decide about a task's
5
+ # incoming and outgoing connections.
6
+ #
7
+ # @note The API of Polarization might be simplified soon.
8
+ # @api private
9
+ class Polarization
10
+ def initialize( output:raise, color:raise )
11
+ @output, @color = output, color
12
+ end
13
+
14
+ def call(magnetic_to, plus_poles, options)
15
+ [
16
+ magnetic_to,
17
+ plus_poles.merge( @output => @color ) # this usually adds a new Output to the task.
18
+ ]
19
+ end
20
+ end # Polarization
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ module Trailblazer
2
+ class Activity < Module
3
+ module DSL
4
+ # {:extension API}
5
+ # Record each DSL call (like #step) on the activity.
6
+ def self.record(activity, *args, original_dsl_args:)
7
+ activity[:record, original_dsl_args[1]] = original_dsl_args
8
+ end
9
+ end
10
+ end
11
+ end
@@ -24,7 +24,7 @@ class Trailblazer::Activity < Module
24
24
 
25
25
  # @api private
26
26
  def self.build_state(normalizer, builder_class:, builder_options: {}, **options)
27
- builder, adds, circuit, outputs = State.build(builder_class, normalizer, options.merge(builder_options))
27
+ builder, adds, circuit, outputs = Magnetic::Builder::State.build(builder_class, normalizer, options.merge(builder_options))
28
28
 
29
29
  return builder, adds, circuit, outputs, options
30
30
  end
@@ -8,6 +8,11 @@ class Trailblazer::Activity < Module
8
8
  def self.config
9
9
  Railway.config.merge(
10
10
  builder_class: Magnetic::Builder::FastTrack,
11
+ extend: [
12
+ DSL.def_dsl(:step, Magnetic::Builder::FastTrack, :StepPolarizations),
13
+ DSL.def_dsl(:fail, Magnetic::Builder::FastTrack, :FailPolarizations),
14
+ DSL.def_dsl(:pass, Magnetic::Builder::FastTrack, :PassPolarizations)
15
+ ],
11
16
  )
12
17
  end
13
18
  end
@@ -14,7 +14,11 @@ module Trailblazer
14
14
  default_outputs: Magnetic::Builder::Path.default_outputs,
15
15
  extension: [ Introspect.method(:add_introspection) ],
16
16
 
17
- extend: [ DSL.def_dsl(:task) ],
17
+ extend: [
18
+ DSL.def_dsl(:task, Magnetic::Builder::Path, :TaskPolarizations),
19
+ DSL.def_dsl(:_end, Magnetic::Builder::Path, :EndEventPolarizations),
20
+ DSL.def_dsl(:pass, Magnetic::Builder::Railway, :PassPolarizations),
21
+ ],
18
22
  }
19
23
  end
20
24
  end # Path
@@ -10,7 +10,11 @@ module Trailblazer
10
10
  Path.config.merge(
11
11
  builder_class: Magnetic::Builder::Railway,
12
12
  default_outputs: Magnetic::Builder::Railway.default_outputs,
13
- extend: [ DSL.def_dsl(:step), DSL.def_dsl(:fail), DSL.def_dsl(:pass) ],
13
+ extend: [
14
+ DSL.def_dsl(:step, Magnetic::Builder::Railway, :StepPolarizations),
15
+ DSL.def_dsl(:fail, Magnetic::Builder::Railway, :FailPolarizations),
16
+ DSL.def_dsl(:pass, Magnetic::Builder::Railway, :PassPolarizations)
17
+ ],
14
18
  )
15
19
  end
16
20
  end
@@ -37,7 +37,9 @@ module Trailblazer
37
37
 
38
38
  def self.inspect_task_builder(task)
39
39
  proc = task.instance_variable_get(:@user_proc)
40
- %{#<TaskBuilder{#{proc}}>}
40
+ match = proc.inspect.match(/(\w+)>$/)
41
+
42
+ %{#<TaskBuilder{.#{match[1]}}>}
41
43
  end
42
44
 
43
45
  # FIXME: clean up that shit below.
@@ -1,5 +1,7 @@
1
1
  module Trailblazer
2
- class Activity < Module # End event is just another callable task.
2
+ class Activity < Module
3
+ # Generic run-time structures that are built via the DSL.
4
+
3
5
  # Builds an {Activity::End} instance.
4
6
  def self.End(semantic)
5
7
  End.new(semantic: semantic)
@@ -24,12 +26,11 @@
24
26
  @options
25
27
  end
26
28
 
27
- def inspect
28
- to_s
29
- end
30
29
  def to_s
31
30
  %{#<#{self.class.name} #{@options.collect{ |k,v| "#{k}=#{v.inspect}" }.join(" ")}>}
32
31
  end
32
+
33
+ alias_method :inspect, :to_s
33
34
  end
34
35
 
35
36
  class Start < End
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  class Activity < Module
3
- VERSION = "0.4.3"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-activity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-02 00:00:00.000000000 Z
11
+ date: 2018-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hirb
@@ -109,7 +109,6 @@ files:
109
109
  - CHANGES.md
110
110
  - Gemfile
111
111
  - NOTES
112
- - NOTES_
113
112
  - README.md
114
113
  - Rakefile
115
114
  - inspeccccccccct.rb
@@ -118,32 +117,33 @@ files:
118
117
  - lib/trailblazer/activity/config.rb
119
118
  - lib/trailblazer/activity/dsl/add_task.rb
120
119
  - lib/trailblazer/activity/dsl/helper.rb
121
- - lib/trailblazer/activity/implementation/build_state.rb
122
- - lib/trailblazer/activity/implementation/fast_track.rb
123
- - lib/trailblazer/activity/implementation/interface.rb
124
- - lib/trailblazer/activity/implementation/path.rb
125
- - lib/trailblazer/activity/implementation/plan.rb
126
- - lib/trailblazer/activity/implementation/railway.rb
120
+ - lib/trailblazer/activity/dsl/magnetic.rb
121
+ - lib/trailblazer/activity/dsl/magnetic/builder.rb
122
+ - lib/trailblazer/activity/dsl/magnetic/builder/default_normalizer.rb
123
+ - lib/trailblazer/activity/dsl/magnetic/builder/fast_track.rb
124
+ - lib/trailblazer/activity/dsl/magnetic/builder/normalizer.rb
125
+ - lib/trailblazer/activity/dsl/magnetic/builder/path.rb
126
+ - lib/trailblazer/activity/dsl/magnetic/builder/railway.rb
127
+ - lib/trailblazer/activity/dsl/magnetic/builder/state.rb
128
+ - lib/trailblazer/activity/dsl/magnetic/finalizer.rb
129
+ - lib/trailblazer/activity/dsl/magnetic/generate.rb
130
+ - lib/trailblazer/activity/dsl/magnetic/merge.rb
131
+ - lib/trailblazer/activity/dsl/magnetic/process_options.rb
132
+ - lib/trailblazer/activity/dsl/magnetic/structure/alterations.rb
133
+ - lib/trailblazer/activity/dsl/magnetic/structure/plus_poles.rb
134
+ - lib/trailblazer/activity/dsl/magnetic/structure/polarization.rb
135
+ - lib/trailblazer/activity/dsl/record.rb
136
+ - lib/trailblazer/activity/dsl/schema/dependencies.rb
137
+ - lib/trailblazer/activity/dsl/schema/sequence.rb
138
+ - lib/trailblazer/activity/dsl/strategy/build_state.rb
139
+ - lib/trailblazer/activity/dsl/strategy/fast_track.rb
140
+ - lib/trailblazer/activity/dsl/strategy/path.rb
141
+ - lib/trailblazer/activity/dsl/strategy/plan.rb
142
+ - lib/trailblazer/activity/dsl/strategy/railway.rb
143
+ - lib/trailblazer/activity/interface.rb
127
144
  - lib/trailblazer/activity/introspect.rb
128
- - lib/trailblazer/activity/magnetic.rb
129
- - lib/trailblazer/activity/magnetic/builder.rb
130
- - lib/trailblazer/activity/magnetic/builder/default_normalizer.rb
131
- - lib/trailblazer/activity/magnetic/builder/fast_track.rb
132
- - lib/trailblazer/activity/magnetic/builder/normalizer.rb
133
- - lib/trailblazer/activity/magnetic/builder/path.rb
134
- - lib/trailblazer/activity/magnetic/builder/railway.rb
135
- - lib/trailblazer/activity/magnetic/dsl.rb
136
- - lib/trailblazer/activity/magnetic/finalizer.rb
137
- - lib/trailblazer/activity/magnetic/generate.rb
138
- - lib/trailblazer/activity/magnetic/merge.rb
139
- - lib/trailblazer/activity/magnetic/structure/alterations.rb
140
- - lib/trailblazer/activity/magnetic/structure/plus_poles.rb
141
145
  - lib/trailblazer/activity/present.rb
142
- - lib/trailblazer/activity/schema/dependencies.rb
143
- - lib/trailblazer/activity/schema/sequence.rb
144
- - lib/trailblazer/activity/state.rb
145
146
  - lib/trailblazer/activity/structures.rb
146
- - lib/trailblazer/activity/subprocess.rb
147
147
  - lib/trailblazer/activity/task_builder.rb
148
148
  - lib/trailblazer/activity/task_wrap.rb
149
149
  - lib/trailblazer/activity/task_wrap/call_task.rb
data/NOTES_ DELETED
@@ -1,36 +0,0 @@
1
- # NOT lowest level. if you need that, use your own proc.
2
- # TODO: how do we track what goes into the callable?
3
- # adjust what goes into it (e.g. without direction or with kw args)?
4
- # pre contract -> step -> post contract (are these all just steps, in "mini nested pipe"?)
5
- #
6
- #
7
- # aka "Atom".
8
- def self.Task(instance: :context, method: :call, id:nil)
9
-
10
-
11
- # * ingoing contract (could be implemented as a nested pipe with 3 steps. that would allow us
12
- # to compile it to native ruby method calls later)
13
- ->(direction, options, **flow_options) {
14
- instance = flow_options[:context] if instance==:context # TODO; implement different :context (e.g. :my_context).
15
-
16
-
17
-
18
- # * incoming args
19
- # step_args = [args] # TODO: overridable.
20
- step_args = [ options, **options ]
21
-
22
- # ** call the actual thing
23
- res = instance.send(method, *step_args) # what goes in? kws?
24
-
25
- # * interpret result (e.g. true=>Right) (should we keep doing that in the tie? so the op has it easier with success, etc?)
26
- # * outgoing contract
27
- # * outgoing args
28
-
29
- [ *res, flow_options ]
30
-
31
-
32
- # * tracing: incoming, outgoing, direction, etc. - do we want that in tasks, too?
33
-
34
-
35
- }
36
- end
@@ -1,36 +0,0 @@
1
- module Trailblazer
2
- class Activity < Module # all code related to the magnetic building of a circuit hash lives in this namespace.
3
- module Magnetic
4
- # PlusPole "radiates" a color that MinusPoles are attracted to.
5
- #
6
- # This datastructure is produced by the DSL and sits in an ADDS.
7
- PlusPole = Struct.new(:output, :color) do
8
- private :output
9
-
10
- def signal
11
- output.signal
12
- end
13
- end # PlusPole
14
- end
15
- end
16
- end
17
-
18
- require "trailblazer/activity/magnetic/dsl"
19
- require "trailblazer/activity/magnetic/structure/plus_poles"
20
- require "trailblazer/activity/magnetic/structure/alterations"
21
-
22
- require "trailblazer/activity/schema/dependencies"
23
-
24
- require "trailblazer/activity/magnetic"
25
- require "trailblazer/activity/magnetic/builder"
26
- # require "trailblazer/activity/magnetic/builder/dsl_helper"
27
- # require "trailblazer/activity/magnetic/dsl_helper"
28
-
29
- require "trailblazer/option"
30
- require "trailblazer/activity/task_builder"
31
- require "trailblazer/activity/magnetic/builder/default_normalizer"
32
- require "trailblazer/activity/magnetic/builder/path"
33
- require "trailblazer/activity/magnetic/builder/railway"
34
- require "trailblazer/activity/magnetic/builder/fast_track" # TODO: move to Operation gem.
35
-
36
- require "trailblazer/activity/magnetic/generate"
@@ -1,18 +0,0 @@
1
- class Trailblazer::Activity < Module
2
- module Magnetic
3
- module Merge
4
- # THIS IS HIGHLY EXPERIMENTAL AS WE'RE NOT MERGING taskWrap etc.
5
- def merge!(merged)
6
- merged_adds = Builder.merge(self[:adds], merged[:adds])
7
- # TODO: MERGE DEBUG, TASK_WRAP
8
- builder, adds, circuit, outputs, = State.recompile(self[:builder], merged_adds)
9
-
10
- self[:adds] = adds
11
- self[:circuit] = circuit
12
- self[:outputs] = outputs
13
-
14
- self
15
- end
16
- end
17
- end
18
- end
@@ -1,41 +0,0 @@
1
- module Trailblazer
2
- class Activity < Module # A {Subprocess} is an instance of an abstract {Activity} that can be `call`ed.
3
- # It is the runtime instance that runs from a specific start event.
4
- def self.Subprocess(*args)
5
- Subprocess.new(*args)
6
- end
7
-
8
- # Subprocess allows to have tasks with a different call interface and start event.
9
- # @param activity any object with an {Activity interface}
10
- class Subprocess
11
- include Interface
12
-
13
- def initialize(activity, call: :call, **options)
14
- @activity = activity
15
- @options = options
16
- @call = call
17
- end
18
-
19
- def call(args, **circuit_options)
20
- @activity.public_send(@call, args, circuit_options.merge(@options))
21
- end
22
-
23
- # @private
24
- def to_h
25
- @activity.to_h # TODO: test explicitly
26
- end
27
-
28
- def debug
29
- @activity.debug
30
- end
31
-
32
- def to_s
33
- %{#<Trailblazer::Activity::Subprocess activity=#{@activity}>}
34
- end
35
- end
36
- end
37
- end
38
-
39
- # circuit.( args, runner: Runner, start_at: raise, **circuit_flow_options )
40
-
41
- # subprocess.( options, flow_options, *args, start_event:<Event>, last_signal: signal )