trailblazer-activity 0.2.1 → 0.3.0
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/CHANGES.md +4 -0
- data/NOTES_ +36 -0
- data/README.md +7 -7
- data/Rakefile +1 -1
- data/lib/trailblazer/activity.rb +137 -96
- data/lib/trailblazer/activity/heritage.rb +30 -0
- data/lib/trailblazer/activity/introspection.rb +105 -0
- data/lib/trailblazer/activity/magnetic.rb +47 -0
- data/lib/trailblazer/activity/magnetic/builder.rb +161 -0
- data/lib/trailblazer/activity/magnetic/builder/block.rb +37 -0
- data/lib/trailblazer/activity/magnetic/builder/fast_track.rb +141 -0
- data/lib/trailblazer/activity/magnetic/builder/path.rb +98 -0
- data/lib/trailblazer/activity/magnetic/builder/railway.rb +123 -0
- data/lib/trailblazer/activity/magnetic/dsl.rb +90 -0
- data/lib/trailblazer/activity/magnetic/dsl/alterations.rb +44 -0
- data/lib/trailblazer/activity/magnetic/dsl/plus_poles.rb +59 -0
- data/lib/trailblazer/activity/magnetic/finalizer.rb +55 -0
- data/lib/trailblazer/activity/magnetic/generate.rb +62 -0
- data/lib/trailblazer/activity/present.rb +12 -19
- data/lib/trailblazer/activity/process.rb +16 -0
- data/lib/trailblazer/activity/schema/dependencies.rb +41 -0
- data/lib/trailblazer/activity/schema/sequence.rb +46 -0
- data/lib/trailblazer/activity/structures.rb +41 -0
- data/lib/trailblazer/activity/subprocess.rb +9 -1
- data/lib/trailblazer/activity/trace.rb +25 -16
- data/lib/trailblazer/activity/version.rb +1 -1
- data/lib/trailblazer/activity/wrap.rb +4 -13
- data/lib/trailblazer/circuit.rb +4 -35
- data/lib/trailblazer/wrap/call_task.rb +2 -2
- data/lib/trailblazer/wrap/runner.rb +7 -1
- data/lib/trailblazer/wrap/trace.rb +6 -5
- metadata +21 -10
- data/lib/trailblazer/activity/graph.rb +0 -157
- data/lib/trailblazer/circuit/testing.rb +0 -58
- data/lib/trailblazer/container_chain.rb +0 -45
- data/lib/trailblazer/context.rb +0 -68
- data/lib/trailblazer/option.rb +0 -78
- data/lib/trailblazer/wrap/inject.rb +0 -32
- data/lib/trailblazer/wrap/variable_mapping.rb +0 -92
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8acff4e1b4e5f3e922e9e368cf5885de56dcc2b5
|
4
|
+
data.tar.gz: 3a1a10d63d5cbe7236f0ffac21f4774add92954a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e13c839f0ca6215fe069299de99ead0910557412fb24b40ecc4a1c9e25884108f105bdaa2cc6302a1ad96b83d425932d0cad0d1a2c5e016177eeb087e8278ea
|
7
|
+
data.tar.gz: f6a774594e754bb0c4ba4082b4a285421850e6d79450d00a5729d96c85c171627aa35dfc14fead7b47190069cebab893eb6ad57150cf10c186f63bd566842107
|
data/CHANGES.md
CHANGED
data/NOTES_
ADDED
@@ -0,0 +1,36 @@
|
|
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
|
data/README.md
CHANGED
@@ -67,12 +67,12 @@ Instead of using an operation, you can manually define activities by using the `
|
|
67
67
|
```ruby
|
68
68
|
activity = Activity.from_hash do |start, _end|
|
69
69
|
{
|
70
|
-
start => { Trailblazer::
|
71
|
-
Blog::Write => { Trailblazer::
|
72
|
-
Blog::SpellCheck => { Trailblazer::
|
73
|
-
Trailblazer::
|
74
|
-
Blog::Correct => { Trailblazer::
|
75
|
-
Blog::Publish => { Trailblazer::
|
70
|
+
start => { Trailblazer::Activity::Right => Blog::Write },
|
71
|
+
Blog::Write => { Trailblazer::Activity::Right => Blog::SpellCheck },
|
72
|
+
Blog::SpellCheck => { Trailblazer::Activity::Right => Blog::Publish,
|
73
|
+
Trailblazer::Activity::Left => Blog::Correct },
|
74
|
+
Blog::Correct => { Trailblazer::Activity::Right => Blog::SpellCheck },
|
75
|
+
Blog::Publish => { Trailblazer::Activity::Right => _end }
|
76
76
|
}
|
77
77
|
end
|
78
78
|
```
|
@@ -89,7 +89,7 @@ my_options = {}
|
|
89
89
|
last_signal, options, flow_options, _ = activity.( nil, my_options, {} )
|
90
90
|
```
|
91
91
|
|
92
|
-
1. The `start` event is `call`ed and per default returns the generic _signal_`Trailblazer::
|
92
|
+
1. The `start` event is `call`ed and per default returns the generic _signal_`Trailblazer::Activity::Right`.
|
93
93
|
2. This emitted (or returned) signal is connected to the next task `Blog::Write`, which is now `call`ed.
|
94
94
|
3. `Blog::Write` emits another `Right` signal that leads to `Blog::SpellCheck` being `call`ed.
|
95
95
|
4. `Blog::SpellCheck` defines two outgoing signals and hence can decide what next task to call by emitting either `Right` if the spell check was ok, or `Left` if the post contains typos.
|
data/Rakefile
CHANGED
data/lib/trailblazer/activity.rb
CHANGED
@@ -1,136 +1,177 @@
|
|
1
1
|
require "trailblazer/circuit"
|
2
2
|
|
3
|
-
# TODO: move to separate gem.
|
4
|
-
require "trailblazer/option"
|
5
|
-
require "trailblazer/context"
|
6
|
-
require "trailblazer/container_chain"
|
7
|
-
|
8
3
|
module Trailblazer
|
9
4
|
class Activity
|
5
|
+
module Interface
|
6
|
+
def decompose # TODO: test me
|
7
|
+
@process.instance_variable_get(:@circuit).to_fields
|
8
|
+
end
|
9
|
+
|
10
|
+
def debug # TODO: TEST ME
|
11
|
+
@debug
|
12
|
+
end
|
13
|
+
end
|
10
14
|
|
11
|
-
|
12
|
-
require "trailblazer/activity/graph"
|
13
|
-
require "trailblazer/activity/subprocess"
|
15
|
+
extend Interface
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
require "trailblazer/wrap/call_task"
|
18
|
-
require "trailblazer/wrap/trace"
|
19
|
-
require "trailblazer/wrap/inject"
|
20
|
-
require "trailblazer/wrap/runner"
|
17
|
+
require "trailblazer/activity/version"
|
18
|
+
require "trailblazer/activity/structures"
|
21
19
|
|
22
|
-
|
23
|
-
require "trailblazer/activity/present"
|
20
|
+
require "trailblazer/activity/subprocess"
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
require "trailblazer/activity/wrap"
|
23
|
+
require "trailblazer/wrap/call_task"
|
24
|
+
require "trailblazer/wrap/trace"
|
25
|
+
require "trailblazer/wrap/runner"
|
29
26
|
|
30
|
-
|
27
|
+
require "trailblazer/activity/trace"
|
28
|
+
require "trailblazer/activity/present"
|
31
29
|
|
32
|
-
wirings.each do |wiring|
|
33
|
-
start.send(*wiring)
|
34
|
-
end
|
35
30
|
|
36
|
-
|
31
|
+
require "trailblazer/activity/magnetic" # the "magnetic" DSL
|
32
|
+
require "trailblazer/activity/schema/sequence"
|
33
|
+
|
34
|
+
require "trailblazer/activity/process"
|
35
|
+
require "trailblazer/activity/introspection"
|
36
|
+
|
37
|
+
require "trailblazer/activity/heritage"
|
38
|
+
|
39
|
+
def self.call(args, circuit_options={})
|
40
|
+
@process.( args, circuit_options )
|
37
41
|
end
|
38
42
|
|
39
|
-
|
40
|
-
#
|
41
|
-
# activity = Trailblazer::Activity.from_hash do |start, _end|
|
42
|
-
# {
|
43
|
-
# start => { Circuit::Right => Blog::Write },
|
44
|
-
# Blog::Write => { Circuit::Right => Blog::SpellCheck },
|
45
|
-
# Blog::SpellCheck => { Circuit::Right => Blog::Publish, Circuit::Left => Blog::Correct },
|
46
|
-
# Blog::Correct => { Circuit::Right => Blog::SpellCheck },
|
47
|
-
# Blog::Publish => { Circuit::Right => _end }
|
48
|
-
# }
|
49
|
-
# end
|
50
|
-
def self.from_hash(end_evt=Circuit::End.new(:default), start_evt=Circuit::Start.new(:default), &block)
|
51
|
-
hash = yield(start_evt, end_evt)
|
52
|
-
graph = Graph::Start( start_evt, id: "Start.default" )
|
53
|
-
|
54
|
-
hash.each do |source_task, connections|
|
55
|
-
source = graph.find_all { |node| node[:_wrapped] == source_task }.first or raise "#{source_task} unknown"
|
56
|
-
|
57
|
-
connections.each do |signal, task| # FIXME: id sucks
|
58
|
-
if existing = graph.find_all { |node| node[:_wrapped] == task }.first
|
59
|
-
graph.connect!( source: source[:id], target: existing, edge: [signal, {}] )
|
60
|
-
else
|
61
|
-
graph.attach!( source: source[:id], target: [task, id: task], edge: [signal, {}] )
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
43
|
+
#- modelling
|
65
44
|
|
66
|
-
|
45
|
+
# @private
|
46
|
+
# DISCUSS: #each instead?
|
47
|
+
# FIXME: move to Introspection
|
48
|
+
def self.find(&block)
|
49
|
+
@process.instance_variable_get(:@circuit).instance_variable_get(:@map).find(&block)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.outputs
|
53
|
+
@outputs
|
67
54
|
end
|
68
55
|
|
69
|
-
|
70
|
-
graph = activity.graph
|
56
|
+
#- DSL part
|
71
57
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
old_start_connections = cloned_graph_ary.delete_at(0)[1] # FIXME: what if some connection goes back to start?
|
58
|
+
def self.build(&block)
|
59
|
+
Class.new(self, &block)
|
60
|
+
end
|
76
61
|
|
77
|
-
|
78
|
-
cloned_graph_ary.unshift [ start_node, old_start_connections ] # push new start node onto the graph.
|
62
|
+
private
|
79
63
|
|
80
|
-
|
81
|
-
|
64
|
+
def self.inherited(subclass)
|
65
|
+
super
|
66
|
+
subclass.initialize!(*subclass.config)
|
67
|
+
heritage.(subclass)
|
82
68
|
end
|
83
69
|
|
84
|
-
def initialize(
|
85
|
-
|
86
|
-
|
87
|
-
@circuit = to_circuit( @graph ) # graph is an immutable object.
|
70
|
+
def self.initialize!(builder_class, normalizer)
|
71
|
+
initialize_activity_dsl!(builder_class, normalizer)
|
72
|
+
recompile_process!
|
88
73
|
end
|
89
74
|
|
90
|
-
|
91
|
-
|
75
|
+
# builder is stateless, it's up to you to save @adds somewhere.
|
76
|
+
def self.initialize_activity_dsl!(builder_class, normalizer)
|
77
|
+
@builder, @adds = builder_class.for( normalizer ) # e.g. Path.for(...) which creates a Builder::Path instance.
|
78
|
+
@debug = {} # only @adds and @debug are mutable
|
92
79
|
end
|
93
80
|
|
94
|
-
|
95
|
-
|
96
|
-
# activity.outputs #=> { #<End ..> => { role: :success }, #<End ..> => { role: :failure } }
|
97
|
-
def outputs
|
98
|
-
# DISCUSS: add more meta data?
|
99
|
-
::Hash[ graph.find_all { |node| graph.successors(node).size == 0 }.collect { |node| [ node[:_wrapped], { role: node[:role] } ] } ]
|
81
|
+
def self.recompile_process!
|
82
|
+
@process, @outputs = Recompile.( @adds )
|
100
83
|
end
|
101
84
|
|
102
|
-
def
|
103
|
-
|
104
|
-
args,
|
105
|
-
circuit_options.merge( task: start_event) , # this passes :runner to the {Circuit}.
|
106
|
-
)
|
85
|
+
def self.config # FIXME: the normalizer is the same we have in Builder::plan.
|
86
|
+
return Magnetic::Builder::Path, Magnetic::Builder::DefaultNormalizer.new(plus_poles: Magnetic::Builder::Path.default_plus_poles)
|
107
87
|
end
|
108
88
|
|
109
|
-
#
|
110
|
-
attr_reader :circuit
|
111
|
-
# @private
|
112
|
-
attr_reader :graph
|
89
|
+
# DSL part
|
113
90
|
|
114
|
-
|
91
|
+
# DISCUSS: make this functions and don't include?
|
92
|
+
module DSL
|
93
|
+
|
94
|
+
# Create a new method (e.g. Activity::step) that delegates to its builder, recompiles
|
95
|
+
# the process, etc. Method comes in a module so it can be overridden via modules.
|
96
|
+
#
|
97
|
+
# This approach assumes you maintain a @adds and a @debug instance variable. and #heritage
|
98
|
+
def self.def_dsl!(_name)
|
99
|
+
Module.new do
|
100
|
+
define_method(_name) do |*args, &block|
|
101
|
+
_task(_name, *args, &block) # TODO: similar to Block.
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def _task(name, *args, &block)
|
109
|
+
heritage.record(name, *args, &block)
|
110
|
+
|
111
|
+
adds, *returned_options = @builder.send(name, *args, &block)
|
112
|
+
|
113
|
+
@adds += adds
|
114
|
+
@adds.freeze
|
115
115
|
|
116
|
-
|
116
|
+
recompile_process!
|
117
|
+
|
118
|
+
add_introspection!(adds, *returned_options)
|
119
|
+
|
120
|
+
return adds, returned_options
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_introspection!(adds, task, local_options, *)
|
124
|
+
@debug[task] = { id: local_options[:id] }.freeze
|
125
|
+
end
|
126
|
+
end
|
117
127
|
|
118
|
-
|
119
|
-
|
128
|
+
# delegate as much as possible to Builder
|
129
|
+
# let us process options and e.g. do :id
|
130
|
+
class << self
|
131
|
+
extend Forwardable # TODO: test those helpers
|
132
|
+
def_delegators :@builder, :Path#, :task
|
120
133
|
end
|
121
134
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
135
|
+
extend DSL # _task, :add_introspection
|
136
|
+
extend DSL.def_dsl!(:task) # define Activity::task.
|
137
|
+
|
138
|
+
extend Heritage::Accessor
|
139
|
+
|
140
|
+
|
141
|
+
# MOVE ME TO ADDS
|
142
|
+
module Recompile
|
143
|
+
# Recompile the process and outputs from the {ADDS} instance that collects circuit tasks and connections.
|
144
|
+
def self.call(adds)
|
145
|
+
process, end_events = Magnetic::Builder::Finalizer.(adds)
|
146
|
+
outputs = recompile_outputs(end_events)
|
147
|
+
|
148
|
+
return process, outputs
|
128
149
|
end
|
129
150
|
|
130
|
-
|
131
|
-
|
132
|
-
|
151
|
+
private
|
152
|
+
|
153
|
+
def self.recompile_outputs(end_events)
|
154
|
+
ary = end_events.collect do |evt|
|
155
|
+
[
|
156
|
+
semantic = evt.instance_variable_get(:@options)[:semantic], # DISCUSS: better API here?
|
157
|
+
Activity::Output(evt, semantic)
|
158
|
+
]
|
159
|
+
end
|
160
|
+
|
161
|
+
::Hash[ ary ]
|
133
162
|
end
|
134
163
|
end
|
164
|
+
|
165
|
+
# TODO: hm
|
166
|
+
class Railway < Activity
|
167
|
+
def self.config # FIXME: the normalizer is the same we have in Builder::plan.
|
168
|
+
return Magnetic::Builder::Railway, Magnetic::Builder::DefaultNormalizer.new(plus_poles: Magnetic::Builder::Railway.default_plus_poles)
|
169
|
+
end
|
170
|
+
|
171
|
+
extend DSL
|
172
|
+
extend DSL.def_dsl!(:step)
|
173
|
+
extend DSL.def_dsl!(:fail)
|
174
|
+
extend DSL.def_dsl!(:pass)
|
175
|
+
end
|
135
176
|
end
|
136
177
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Trailblazer
|
2
|
+
# This is copied from the Declarative gem. This might get removed in favor of a real heritage gem.
|
3
|
+
class Activity
|
4
|
+
class Heritage < Array
|
5
|
+
# Record inheritable assignments for replay in an inheriting class.
|
6
|
+
def record(method, *args, &block)
|
7
|
+
self << { method: method, args: args, block: block }
|
8
|
+
end
|
9
|
+
|
10
|
+
# Replay the recorded assignments on inheritor.
|
11
|
+
# Accepts a block that will allow processing the arguments for every recorded statement.
|
12
|
+
def call(inheritor, &block)
|
13
|
+
each { |cfg| call!(inheritor, cfg, &block) }
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def call!(inheritor, cfg)
|
18
|
+
yield cfg if block_given? # allow messing around with recorded arguments.
|
19
|
+
|
20
|
+
inheritor.send(cfg[:method], *cfg[:args], &cfg[:block])
|
21
|
+
end
|
22
|
+
|
23
|
+
module Accessor
|
24
|
+
def heritage
|
25
|
+
@heritage ||= Heritage.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Trailblazer
|
2
|
+
class Activity
|
3
|
+
# Introspection is not used at run-time except for rendering diagrams, tracing, and the like.
|
4
|
+
module Introspect
|
5
|
+
|
6
|
+
def self.collect(activity, options={}, &block)
|
7
|
+
circuit_hash, _ = activity.decompose
|
8
|
+
|
9
|
+
locals = circuit_hash.collect do |task, connections|
|
10
|
+
[
|
11
|
+
yield(task, connections),
|
12
|
+
*options[:recursive] && task.is_a?(Activity::Interface) ? collect(task, options, &block) : []
|
13
|
+
]
|
14
|
+
end.flatten(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# render
|
19
|
+
def self.Cct(process, **options)
|
20
|
+
circuit_hash( process.instance_variable_get(:@circuit).to_fields[0], **options )
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.circuit_hash(circuit_hash, show_ids:false)
|
24
|
+
content =
|
25
|
+
circuit_hash.collect do |task, connections|
|
26
|
+
conns = connections.collect do |signal, target|
|
27
|
+
" {#{signal}} => #{Task(target)}"
|
28
|
+
end
|
29
|
+
|
30
|
+
[ Task(task), conns.join("\n") ]
|
31
|
+
end
|
32
|
+
|
33
|
+
content = content.join("\n")
|
34
|
+
|
35
|
+
return "\n#{content}" if show_ids
|
36
|
+
return "\n#{content}".gsub(/\d\d+/, "")
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.Ends(process)
|
40
|
+
end_events = process.instance_variable_get(:@circuit).to_fields[1]
|
41
|
+
ends = end_events.collect { |evt| Task(evt) }.join(",")
|
42
|
+
"[#{ends}]".gsub(/\d\d+/, "")
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def self.Outputs(outputs)
|
47
|
+
outputs.collect { |semantic, output| "#{semantic}=> (#{output.signal}, #{output.semantic})" }.
|
48
|
+
join("\n").gsub(/0x\w+/, "").gsub(/\d\d+/, "")
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.Task(task)
|
52
|
+
return task.inspect unless task.kind_of?(Trailblazer::Activity::End)
|
53
|
+
|
54
|
+
class_name = strip(task.class)
|
55
|
+
name = task.instance_variable_get(:@name)
|
56
|
+
semantic = task.instance_variable_get(:@options)[:semantic]
|
57
|
+
"#<#{class_name}:#{name}/#{semantic.inspect}>"
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.strip(string)
|
61
|
+
string.to_s.sub("Trailblazer::Activity::", "")
|
62
|
+
end
|
63
|
+
end #Introspect
|
64
|
+
end
|
65
|
+
|
66
|
+
module Activity::Magnetic
|
67
|
+
module Introspect
|
68
|
+
def self.seq(activity)
|
69
|
+
adds = activity.instance_variable_get(:@adds)
|
70
|
+
tripletts = Builder::Finalizer.adds_to_tripletts(adds)
|
71
|
+
|
72
|
+
Seq(tripletts)
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.cct(builder)
|
76
|
+
adds = builder.instance_variable_get(:@adds)
|
77
|
+
process, _ = Builder::Finalizer.(adds)
|
78
|
+
|
79
|
+
Cct(process)
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def self.Seq(sequence)
|
85
|
+
content =
|
86
|
+
sequence.collect do |(magnetic_to, task, plus_poles)|
|
87
|
+
pluses = plus_poles.collect { |plus_pole| PlusPole(plus_pole) }
|
88
|
+
|
89
|
+
%{#{magnetic_to.inspect} ==> #{Activity::Introspect.Task(task)}
|
90
|
+
#{pluses.empty? ? " []" : pluses.join("\n")}}
|
91
|
+
end.join("\n")
|
92
|
+
|
93
|
+
"\n#{content}\n".gsub(/\d\d+/, "")
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.PlusPole(plus_pole)
|
97
|
+
signal = plus_pole.signal.to_s.sub("Trailblazer::Activity::", "")
|
98
|
+
semantic = plus_pole.send(:output).semantic
|
99
|
+
" (#{semantic})/#{signal} ==> #{plus_pole.color.inspect}"
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|