trailblazer-future 2.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +6 -0
- data/CHANGES.md +4 -0
- data/LICENSE.txt +9 -0
- data/README.md +48 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/gems.rb +3 -0
- data/lib/trailblazer/future.rb +9 -0
- data/lib/trailblazer/future/version.rb +5 -0
- data/lib/trailblazer/v2_1/activity.rb +123 -0
- data/lib/trailblazer/v2_1/activity/config.rb +37 -0
- data/lib/trailblazer/v2_1/activity/dsl/add_task.rb +22 -0
- data/lib/trailblazer/v2_1/activity/dsl/helper.rb +68 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic.rb +36 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder.rb +101 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/default_normalizer.rb +26 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/fast_track.rb +118 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/normalizer.rb +113 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/path.rb +105 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/railway.rb +97 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/state.rb +58 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/finalizer.rb +51 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/generate.rb +62 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/merge.rb +16 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/process_options.rb +76 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/alterations.rb +44 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/plus_poles.rb +85 -0
- data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/polarization.rb +23 -0
- data/lib/trailblazer/v2_1/activity/dsl/record.rb +11 -0
- data/lib/trailblazer/v2_1/activity/dsl/schema/dependencies.rb +46 -0
- data/lib/trailblazer/v2_1/activity/dsl/schema/sequence.rb +46 -0
- data/lib/trailblazer/v2_1/activity/dsl/strategy/build_state.rb +32 -0
- data/lib/trailblazer/v2_1/activity/dsl/strategy/fast_track.rb +24 -0
- data/lib/trailblazer/v2_1/activity/dsl/strategy/path.rb +26 -0
- data/lib/trailblazer/v2_1/activity/dsl/strategy/plan.rb +36 -0
- data/lib/trailblazer/v2_1/activity/dsl/strategy/railway.rb +23 -0
- data/lib/trailblazer/v2_1/activity/interface.rb +16 -0
- data/lib/trailblazer/v2_1/activity/introspect.rb +167 -0
- data/lib/trailblazer/v2_1/activity/present.rb +95 -0
- data/lib/trailblazer/v2_1/activity/structures.rb +57 -0
- data/lib/trailblazer/v2_1/activity/task_builder.rb +41 -0
- data/lib/trailblazer/v2_1/activity/task_wrap.rb +40 -0
- data/lib/trailblazer/v2_1/activity/task_wrap/call_task.rb +19 -0
- data/lib/trailblazer/v2_1/activity/task_wrap/merge.rb +23 -0
- data/lib/trailblazer/v2_1/activity/task_wrap/runner.rb +62 -0
- data/lib/trailblazer/v2_1/activity/task_wrap/trace.rb +44 -0
- data/lib/trailblazer/v2_1/activity/task_wrap/variable_mapping.rb +162 -0
- data/lib/trailblazer/v2_1/activity/testing.rb +32 -0
- data/lib/trailblazer/v2_1/activity/trace.rb +97 -0
- data/lib/trailblazer/v2_1/circuit.rb +71 -0
- data/lib/trailblazer/v2_1/container_chain.rb +45 -0
- data/lib/trailblazer/v2_1/context.rb +79 -0
- data/lib/trailblazer/v2_1/deprecation/call.rb +46 -0
- data/lib/trailblazer/v2_1/deprecation/context.rb +43 -0
- data/lib/trailblazer/v2_1/dsl.rb +47 -0
- data/lib/trailblazer/v2_1/macro.rb +11 -0
- data/lib/trailblazer/v2_1/macro/contract.rb +5 -0
- data/lib/trailblazer/v2_1/operation.rb +91 -0
- data/lib/trailblazer/v2_1/operation/auto_inject.rb +47 -0
- data/lib/trailblazer/v2_1/operation/callable.rb +42 -0
- data/lib/trailblazer/v2_1/operation/class_dependencies.rb +25 -0
- data/lib/trailblazer/v2_1/operation/contract.rb +61 -0
- data/lib/trailblazer/v2_1/operation/deprecated_macro.rb +19 -0
- data/lib/trailblazer/v2_1/operation/deprecations.rb +21 -0
- data/lib/trailblazer/v2_1/operation/guard.rb +18 -0
- data/lib/trailblazer/v2_1/operation/heritage.rb +30 -0
- data/lib/trailblazer/v2_1/operation/inject.rb +36 -0
- data/lib/trailblazer/v2_1/operation/inspect.rb +79 -0
- data/lib/trailblazer/v2_1/operation/model.rb +50 -0
- data/lib/trailblazer/v2_1/operation/module.rb +29 -0
- data/lib/trailblazer/v2_1/operation/nested.rb +98 -0
- data/lib/trailblazer/v2_1/operation/persist.rb +14 -0
- data/lib/trailblazer/v2_1/operation/policy.rb +44 -0
- data/lib/trailblazer/v2_1/operation/public_call.rb +55 -0
- data/lib/trailblazer/v2_1/operation/pundit.rb +38 -0
- data/lib/trailblazer/v2_1/operation/railway.rb +32 -0
- data/lib/trailblazer/v2_1/operation/railway/fast_track.rb +13 -0
- data/lib/trailblazer/v2_1/operation/railway/macaroni.rb +23 -0
- data/lib/trailblazer/v2_1/operation/railway/normalizer.rb +58 -0
- data/lib/trailblazer/v2_1/operation/railway/task_builder.rb +37 -0
- data/lib/trailblazer/v2_1/operation/rescue.rb +42 -0
- data/lib/trailblazer/v2_1/operation/responder.rb +18 -0
- data/lib/trailblazer/v2_1/operation/result.rb +30 -0
- data/lib/trailblazer/v2_1/operation/test.rb +17 -0
- data/lib/trailblazer/v2_1/operation/trace.rb +46 -0
- data/lib/trailblazer/v2_1/operation/validate.rb +76 -0
- data/lib/trailblazer/v2_1/operation/wrap.rb +83 -0
- data/lib/trailblazer/v2_1/option.rb +78 -0
- data/lib/trailblazer/v2_1/rails.rb +12 -0
- data/lib/trailblazer/v2_1/rails/cell.rb +22 -0
- data/lib/trailblazer/v2_1/rails/controller.rb +66 -0
- data/lib/trailblazer/v2_1/rails/form.rb +21 -0
- data/lib/trailblazer/v2_1/rails/railtie.rb +31 -0
- data/lib/trailblazer/v2_1/rails/railtie/extend_application_controller.rb +28 -0
- data/lib/trailblazer/v2_1/rails/railtie/loader.rb +58 -0
- data/lib/trailblazer/v2_1/rails/test/integration.rb +6 -0
- data/lib/trailblazer/v2_1/versions.txt +7 -0
- data/test/rails5.0/.gitignore +17 -0
- data/test/rails5.0/Gemfile +21 -0
- data/test/rails5.0/Rakefile +3 -0
- data/test/rails5.0/app/concepts/artist/cell/dashboard.rb +7 -0
- data/test/rails5.0/app/concepts/artist/cell/show.rb +4 -0
- data/test/rails5.0/app/concepts/artist/view/dashboard.erb +4 -0
- data/test/rails5.0/app/concepts/artist/view/show.erb +1 -0
- data/test/rails5.0/app/concepts/params/operation/with_args.rb +5 -0
- data/test/rails5.0/app/concepts/song/contract/form.rb +6 -0
- data/test/rails5.0/app/concepts/song/operation/create.rb +15 -0
- data/test/rails5.0/app/concepts/song/operation/show.rb +3 -0
- data/test/rails5.0/app/concepts/song/operation/update.rb +15 -0
- data/test/rails5.0/app/controllers/application_controller.rb +46 -0
- data/test/rails5.0/app/controllers/args_controller.rb +5 -0
- data/test/rails5.0/app/controllers/artists_controller.rb +24 -0
- data/test/rails5.0/app/controllers/params_controller.rb +11 -0
- data/test/rails5.0/app/controllers/songs_controller.rb +35 -0
- data/test/rails5.0/app/models/artist.rb +2 -0
- data/test/rails5.0/app/models/song.rb +2 -0
- data/test/rails5.0/app/views/args/with_args.html.erb +1 -0
- data/test/rails5.0/app/views/layouts/application.html.erb +2 -0
- data/test/rails5.0/app/views/songs/edit.html.erb +4 -0
- data/test/rails5.0/app/views/songs/new.html.erb +5 -0
- data/test/rails5.0/app/views/songs/new_with_result.html.erb +3 -0
- data/test/rails5.0/app/views/songs/show.html.erb +3 -0
- data/test/rails5.0/bin/bundle +3 -0
- data/test/rails5.0/bin/rails +4 -0
- data/test/rails5.0/bin/rake +4 -0
- data/test/rails5.0/bin/setup +29 -0
- data/test/rails5.0/config.ru +4 -0
- data/test/rails5.0/config/application.rb +25 -0
- data/test/rails5.0/config/boot.rb +3 -0
- data/test/rails5.0/config/database.yml +21 -0
- data/test/rails5.0/config/environment.rb +5 -0
- data/test/rails5.0/config/environments/development.rb +41 -0
- data/test/rails5.0/config/environments/test.rb +42 -0
- data/test/rails5.0/config/initializers/assets.rb +11 -0
- data/test/rails5.0/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails5.0/config/initializers/cookies_serializer.rb +3 -0
- data/test/rails5.0/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/rails5.0/config/initializers/inflections.rb +16 -0
- data/test/rails5.0/config/initializers/mime_types.rb +4 -0
- data/test/rails5.0/config/initializers/session_store.rb +3 -0
- data/test/rails5.0/config/initializers/wrap_parameters.rb +14 -0
- data/test/rails5.0/config/locales/en.yml +23 -0
- data/test/rails5.0/config/routes.rb +15 -0
- data/test/rails5.0/config/secrets.yml +17 -0
- data/test/rails5.0/db/migrate/20161122145124_create_songs.rb +8 -0
- data/test/rails5.0/db/schema.rb +19 -0
- data/test/rails5.0/log/.keep +0 -0
- data/test/rails5.0/test/concepts/song/operation/create_test.rb +11 -0
- data/test/rails5.0/test/concepts/song/operation/update_test.rb +34 -0
- data/test/rails5.0/test/integration/.keep +0 -0
- data/test/rails5.0/test/integration/args_controller_test.rb +8 -0
- data/test/rails5.0/test/integration/artists_controller_test.rb +28 -0
- data/test/rails5.0/test/integration/params_controller_test.rb +8 -0
- data/test/rails5.0/test/integration/songs_controller_test.rb +40 -0
- data/test/rails5.0/test/test_helper.rb +7 -0
- data/test/test_helper.rb +5 -0
- data/trailblazer-future.gemspec +25 -0
- metadata +246 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module Trailblazer::V2_1
|
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::V2_1
|
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
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
module Activity::Schema
|
3
|
+
# Helps organizing the structure of the circuit and allows to define steps that
|
4
|
+
# might be inserted in a completely different order, but it's experimental.
|
5
|
+
#
|
6
|
+
# Translates linear DSL calls that might refer to the same task several times into a linear "drawing instruction"
|
7
|
+
# that can be consumed by Schema.bla.
|
8
|
+
#
|
9
|
+
# This class is experimental.
|
10
|
+
class Dependencies
|
11
|
+
def initialize
|
12
|
+
@groups = {
|
13
|
+
start: Sequence.new,
|
14
|
+
main: Sequence.new, # normal steps
|
15
|
+
end: Sequence.new, # ends
|
16
|
+
unresolved: Sequence.new, # div
|
17
|
+
}
|
18
|
+
|
19
|
+
@order = [ :start, :main, :end, :unresolved ]
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(id, seq_options, group: :main, **sequence_options)
|
23
|
+
group = @groups[group] or raise "unknown group #{group}, implement me"
|
24
|
+
|
25
|
+
group.add(id, seq_options, **sequence_options) # handles
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_a
|
29
|
+
@order.collect{ |name| @groups[name].to_a }.flatten(1)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
def find(id)
|
34
|
+
@groups.find do |name, group|
|
35
|
+
index = group.send( :find_index, id )
|
36
|
+
return group, index if index
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def self.sequence_keywords
|
42
|
+
[ :group, :before, :after, :replace, :delete ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
module Activity::Schema
|
3
|
+
# the list of what tasks to add to the graph, for the "drawer"
|
4
|
+
# produces immutable list of: (node, magnetic_to (incoming colors), outgoing colors)
|
5
|
+
# via #to_a
|
6
|
+
|
7
|
+
#mutable, for DSL
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
class Sequence < ::Array
|
11
|
+
Element = Struct.new(:id, :configuration)
|
12
|
+
|
13
|
+
# Insert the task into {Sequence} array by respecting options such as `:before`.
|
14
|
+
# This mutates the object per design.
|
15
|
+
#
|
16
|
+
# @param wiring [ [:success, :special_1], A, [ Output, Output ] ]
|
17
|
+
def add(id, wiring, before:nil, after:nil, replace:nil, delete:nil)
|
18
|
+
element = Element.new(id, wiring).freeze
|
19
|
+
|
20
|
+
return insert(find_index!(before), element) if before
|
21
|
+
return insert(find_index!(after)+1, element) if after
|
22
|
+
return self[find_index!(replace)] = element if replace
|
23
|
+
return delete_at(find_index!(delete)) if delete
|
24
|
+
|
25
|
+
self << element
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_a
|
29
|
+
collect { |element| element.configuration }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def find_index(id)
|
35
|
+
element = find { |el| el.id == id }
|
36
|
+
index(element)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_index!(id)
|
40
|
+
find_index(id) or raise IndexError.new(id)
|
41
|
+
end
|
42
|
+
|
43
|
+
class IndexError < IndexError; end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Trailblazer::V2_1::Activity < Module
|
2
|
+
module BuildState
|
3
|
+
# Compute all objects that need to be passed into the new Activity module.
|
4
|
+
# 1. Build the normalizer (unless passed with :normalizer)
|
5
|
+
# 2. Build the builder (in State)
|
6
|
+
# 3. Let State compute all state variables (that implies recompiling the Process)
|
7
|
+
#
|
8
|
+
# @return [Builder, Adds, Process, Outputs, remaining options]
|
9
|
+
# @api private
|
10
|
+
def self.build_state_for(default_options, options)
|
11
|
+
options = default_options.merge(options) # TODO: use Variables::Merge() here.
|
12
|
+
normalizer, options = build_normalizer(options)
|
13
|
+
builder, adds, circuit, outputs, options = build_state(normalizer, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Builds the normalizer (to process options in DSL calls) unless {:normalizer} is already set.
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
def self.build_normalizer(normalizer_class:, normalizer: false, **options)
|
20
|
+
normalizer, options = normalizer_class.build( options ) unless normalizer
|
21
|
+
|
22
|
+
return normalizer, options
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def self.build_state(normalizer, builder_class:, builder_options: {}, **options)
|
27
|
+
builder, adds, circuit, outputs = Magnetic::Builder::State.build(builder_class, normalizer, options.merge(builder_options))
|
28
|
+
|
29
|
+
return builder, adds, circuit, outputs, options
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Trailblazer::V2_1::Activity < Module
|
2
|
+
def self.FastTrack(options={})
|
3
|
+
FastTrack.new(FastTrack, options)
|
4
|
+
end
|
5
|
+
|
6
|
+
# Implementation module that can be passed to `Activity[]`.
|
7
|
+
class FastTrack < Trailblazer::V2_1::Activity
|
8
|
+
def self.config
|
9
|
+
Railway.config.merge(
|
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
|
+
DSL.def_dsl(:_end, Magnetic::Builder::Path, :EndEventPolarizations), # TODO: TEST ME
|
16
|
+
],
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Signals
|
21
|
+
FailFast = Class.new(Signal)
|
22
|
+
PassFast = Class.new(Signal)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
class Activity < Module
|
3
|
+
def self.Path(options={})
|
4
|
+
Activity::Path.new(Path, options)
|
5
|
+
end
|
6
|
+
|
7
|
+
# Implementation module that can be passed to `Activity[]`.
|
8
|
+
class Path < Activity
|
9
|
+
# Default variables, called in {Activity::initialize}.
|
10
|
+
def self.config
|
11
|
+
{
|
12
|
+
builder_class: Magnetic::Builder::Path, # we use the Activity-based Normalizer
|
13
|
+
normalizer_class: Magnetic::Normalizer,
|
14
|
+
default_outputs: Magnetic::Builder::Path.default_outputs, # binary outputs
|
15
|
+
|
16
|
+
extend: [
|
17
|
+
# DSL.def_dsl(:task, Magnetic::Builder::Path, :PassPolarizations),
|
18
|
+
DSL.def_dsl(:_end, Magnetic::Builder::Path, :EndEventPolarizations),
|
19
|
+
DSL.def_dsl(:task, Magnetic::Builder::Railway, :PassPolarizations),
|
20
|
+
],
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end # Path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
class Activity::Path < Activity
|
3
|
+
def self.Plan()
|
4
|
+
Plan
|
5
|
+
end
|
6
|
+
|
7
|
+
module Plan
|
8
|
+
def self.extended(extended)
|
9
|
+
extended.singleton_class.send :attr_accessor, :record
|
10
|
+
extended.record = []
|
11
|
+
extended.extend(Methods)
|
12
|
+
end
|
13
|
+
|
14
|
+
module Methods
|
15
|
+
def task(*args, &block)
|
16
|
+
record << [:task, args, block]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.merge!(activity, plan)
|
21
|
+
plan.record.each { |(dsl_method, args, block)| activity.send(dsl_method, *args, &block) }
|
22
|
+
activity
|
23
|
+
end
|
24
|
+
|
25
|
+
# Creates a copy of the {activity} module and merges the {Plan} into it.
|
26
|
+
#
|
27
|
+
# @params activity [Activity] The activity to extend
|
28
|
+
# @params plan [Plan] The plan providing additional steps
|
29
|
+
# @return [Activity] A new, merged activity
|
30
|
+
def self.merge(activity, plan)
|
31
|
+
merge!(activity.clone, plan)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
# Implementation module that can be passed to `Activity[]`.
|
3
|
+
class Activity < Module
|
4
|
+
def self.Railway(options={})
|
5
|
+
Railway.new(Railway, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
class Railway < Activity
|
9
|
+
def self.config
|
10
|
+
Path.config.merge(
|
11
|
+
builder_class: Magnetic::Builder::Railway,
|
12
|
+
default_outputs: Magnetic::Builder::Path.default_outputs,
|
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
|
+
DSL.def_dsl(:_end, Magnetic::Builder::Path, :EndEventPolarizations), # TODO: TEST ME
|
18
|
+
],
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Trailblazer::V2_1::Activity < Module
|
2
|
+
module Interface
|
3
|
+
# @return [Process, Hash, Adds] Adds is private and should not be used in your application as it might get removed.
|
4
|
+
def to_h # TODO: test me
|
5
|
+
@state.to_h
|
6
|
+
end
|
7
|
+
|
8
|
+
def debug # TODO: TEST ME
|
9
|
+
to_h[:debug]
|
10
|
+
end
|
11
|
+
|
12
|
+
def outputs
|
13
|
+
to_h[:outputs]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
class Activity < Module
|
3
|
+
# Compile-time.
|
4
|
+
# Introspection is not used at run-time except for rendering diagrams, tracing, and the like.
|
5
|
+
module Introspect
|
6
|
+
def self.Graph(*args)
|
7
|
+
Graph.new(*args)
|
8
|
+
end
|
9
|
+
|
10
|
+
# @private This API is still under construction.
|
11
|
+
class Graph
|
12
|
+
def initialize(activity)
|
13
|
+
@activity = activity
|
14
|
+
@circuit = activity.to_h[:circuit]
|
15
|
+
@adds = activity.to_h[:adds].compact # FIXME: why are there nils in Adds?
|
16
|
+
end
|
17
|
+
|
18
|
+
def find(id=nil, &block)
|
19
|
+
return find_by_id(id) unless block_given?
|
20
|
+
find_with_block(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def find_by_id(id)
|
26
|
+
(_, (id, triplett)) = @adds.find { |(op, (_id, triplett))| _id == id }
|
27
|
+
|
28
|
+
Node(triplett[1], id, triplett[0])
|
29
|
+
end
|
30
|
+
|
31
|
+
def find_with_block(&block)
|
32
|
+
adds = @adds.find { |(op, (id, triplett))| yield( Node(triplett[1], id, triplett[0]) ) }
|
33
|
+
return nil unless adds
|
34
|
+
|
35
|
+
(op, (id, triplett)) = adds
|
36
|
+
|
37
|
+
Node(triplett[1], id, triplett[0])
|
38
|
+
end
|
39
|
+
|
40
|
+
def Node(*args)
|
41
|
+
Node.new(*args).freeze
|
42
|
+
end
|
43
|
+
|
44
|
+
Node = Struct.new(:task, :id, :magnetic_to)
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# FIXME: remove this
|
49
|
+
# @private This will be removed shortly.
|
50
|
+
def self.collect(activity, options={}, &block)
|
51
|
+
circuit = activity.to_h[:circuit]
|
52
|
+
circuit_hash = circuit.to_h[:map]
|
53
|
+
|
54
|
+
locals = circuit_hash.collect do |task, connections|
|
55
|
+
[
|
56
|
+
yield(task, connections),
|
57
|
+
*options[:recursive] && task.is_a?(Activity::Interface) ? collect(task, options, &block) : []
|
58
|
+
]
|
59
|
+
end.flatten(1)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def self.inspect_task_builder(task)
|
64
|
+
proc = task.instance_variable_get(:@user_proc)
|
65
|
+
match = proc.inspect.match(/(\w+)>$/)
|
66
|
+
|
67
|
+
%{#<TaskBuilder{.#{match[1]}}>}
|
68
|
+
end
|
69
|
+
|
70
|
+
# FIXME: clean up that shit below.
|
71
|
+
|
72
|
+
# render
|
73
|
+
def self.Cct(circuit, **options)
|
74
|
+
circuit_hash( circuit.to_h[:map], **options )
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.circuit_hash(circuit_hash, show_ids:false, **options)
|
78
|
+
content =
|
79
|
+
circuit_hash.collect do |task, connections|
|
80
|
+
conns = connections.collect do |signal, target|
|
81
|
+
" {#{signal}} => #{inspect_with_matcher(target, **options)}"
|
82
|
+
end
|
83
|
+
|
84
|
+
[ inspect_with_matcher(task, **options), conns.join("\n") ]
|
85
|
+
end
|
86
|
+
|
87
|
+
content = content.join("\n")
|
88
|
+
|
89
|
+
return "\n#{content}" if show_ids
|
90
|
+
return "\n#{content}".gsub(/0x\w+/, "0x").gsub(/0.\d+/, "0.")
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.Ends(activity)
|
94
|
+
end_events = activity.to_h[:end_events]
|
95
|
+
ends = end_events.collect { |evt| inspect_end(evt) }.join(",")
|
96
|
+
"[#{ends}]".gsub(/\d\d+/, "")
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def self.Outputs(outputs)
|
101
|
+
outputs.collect { |semantic, output| "#{semantic}=> (#{output.signal}, #{output.semantic})" }.
|
102
|
+
join("\n").gsub(/0x\w+/, "").gsub(/\d\d+/, "")
|
103
|
+
end
|
104
|
+
|
105
|
+
# If Ruby had pattern matching, this function wasn't necessary.
|
106
|
+
def self.inspect_with_matcher(task, inspect_task: method(:inspect_task), inspect_end: method(:inspect_end))
|
107
|
+
return inspect_task.(task) unless task.kind_of?(Trailblazer::V2_1::Activity::End)
|
108
|
+
inspect_end.(task)
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.inspect_task(task)
|
112
|
+
task.inspect
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.inspect_end(task)
|
116
|
+
class_name = strip(task.class)
|
117
|
+
options = task.to_h
|
118
|
+
|
119
|
+
"#<#{class_name}/#{options[:semantic].inspect}>"
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.strip(string)
|
123
|
+
string.to_s.sub("Trailblazer::V2_1::Activity::", "")
|
124
|
+
end
|
125
|
+
end #Introspect
|
126
|
+
end
|
127
|
+
|
128
|
+
module Activity::Magnetic
|
129
|
+
module Introspect
|
130
|
+
def self.seq(activity)
|
131
|
+
adds = activity.instance_variable_get(:@adds)
|
132
|
+
tripletts = Builder::Finalizer.adds_to_tripletts(adds)
|
133
|
+
|
134
|
+
Seq(tripletts)
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.cct(builder)
|
138
|
+
adds = builder.instance_variable_get(:@adds)
|
139
|
+
circuit, _ = Builder::Finalizer.(adds)
|
140
|
+
|
141
|
+
Cct(circuit)
|
142
|
+
end
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def self.Seq(sequence)
|
147
|
+
content =
|
148
|
+
sequence.collect do |(magnetic_to, task, plus_poles)|
|
149
|
+
pluses = plus_poles.collect { |plus_pole| PlusPole(plus_pole) }
|
150
|
+
|
151
|
+
%{#{magnetic_to.inspect} ==> #{Activity::Introspect.inspect_with_matcher(task)}
|
152
|
+
#{pluses.empty? ? " []" : pluses.join("\n")}}
|
153
|
+
end.join("\n")
|
154
|
+
|
155
|
+
"\n#{content}\n".gsub(/\d\d+/, "").gsub(/0x\w+/, "0x")
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.PlusPole(plus_pole)
|
159
|
+
signal = plus_pole.signal.to_s.sub("Trailblazer::V2_1::Activity::", "")
|
160
|
+
semantic = plus_pole.send(:output).semantic
|
161
|
+
" (#{semantic})/#{signal} ==> #{plus_pole.color.inspect}"
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|