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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8fbd09ac23c1b1b27633ad25bd1da7375c58987cc9d705aaa3cad826f5bd5467
|
4
|
+
data.tar.gz: a99e5277b29b7d2423ed106494ce5939c9f29789aae9571c32fdfdfd80a21719
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cf4d9f163f3a7b43638fc9b5a7a50eaadd36c3bbe6c29946748c9cd69dcedba7fab0399982b05456a3bdbfb4efd97986f15eb03dba60011d330f35e9e53dd204
|
7
|
+
data.tar.gz: a697eacd1a5fb4997903a7ad362710bf0fa12e76aaf60dc6a6ce084a37c36c019dbdbb514bf18caa00c403578a15bcb014dae85a23b35638bc3d964a5f5dc56a
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGES.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Copyright (c) 2018 Trailblazer GmbH
|
2
|
+
|
3
|
+
Trailblazer is an Open Source project licensed under the terms of
|
4
|
+
the LGPLv3 license. Please see <http://www.gnu.org/licenses/lgpl-3.0.html>
|
5
|
+
for license text.
|
6
|
+
|
7
|
+
Trailblazer Enterprise has a commercial-friendly license allowing private forks
|
8
|
+
and modifications of Trailblazer. Please see http://trailblazer.to/enterprise/ for
|
9
|
+
more detail. You can find the commercial license terms in COMM-LICENSE.
|
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Trailblazer::Future
|
2
|
+
[![Build Status](https://travis-ci.org/trailblazer/trailblazer-future.svg)](https://travis-ci.org/trailblazer/trailblazer-future)
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/trailblazer-future.svg)](http://badge.fury.io/rb/trailblazer-future)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
- Step 1
|
8
|
+
|
9
|
+
Update `trailblazer` to it latest patch version `~> 2.0.7`
|
10
|
+
|
11
|
+
- Step 2
|
12
|
+
|
13
|
+
Test your build and remove any deprecation warning
|
14
|
+
|
15
|
+
- Optional step (recommended)
|
16
|
+
|
17
|
+
Feed a homeless person
|
18
|
+
|
19
|
+
- Step 3
|
20
|
+
|
21
|
+
Add this line to your application's Gemfile:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
gem 'trailblazer-future'
|
25
|
+
```
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
1) Inherit operation from `Trailblazer::V2_1::Operation`
|
30
|
+
```ruby
|
31
|
+
class MyOP < Trailblazer::V2_1::Operation
|
32
|
+
end
|
33
|
+
```
|
34
|
+
2) Migrate to TRB 2.1 following the [migration path](http://trailblazer.to/api-docs/#trailblazer-migration-path), here a quick summary of the breaking changes:
|
35
|
+
- new API using keyword arguments: `MyOP.(params)` -> `MyOp.(params: params)` (more [here](http://trailblazer.to/api-docs/#operation-call))
|
36
|
+
- using `symbol` instead of `string` for `:model` and `:current_user`: `result['model']` -> `result[:model]`
|
37
|
+
- Replace `Railway::Right/Left` with `Trailblazer::Activity::Right/Left`
|
38
|
+
- Add option `fast_track: true` for the steps that uses `pass_fast!` or `fail_fast!` (check the new [wiring API](http://trailblazer.to/api-docs/#activity-wiring-api))
|
39
|
+
- Nested macro now gets the all result object so use `:input` and `:output` to filter data in/out
|
40
|
+
|
41
|
+
## Notes
|
42
|
+
|
43
|
+
1) Operations of different versions cannot be nested
|
44
|
+
2) Rails controller's `run` is for V2.0. Use `run_v21` for the migrated operations
|
45
|
+
|
46
|
+
## License
|
47
|
+
|
48
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "trailblazer/future"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/gems.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require "trailblazer/future/version"
|
2
|
+
require "trailblazer"
|
3
|
+
require "trailblazer/v2_1/macro"
|
4
|
+
require "trailblazer/v2_1/macro/contract"
|
5
|
+
require "trailblazer/v2_1/dsl"
|
6
|
+
|
7
|
+
require "trailblazer/v2_1/operation/deprecations"
|
8
|
+
require "trailblazer/v2_1/operation/inject"
|
9
|
+
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
class Activity < Module
|
3
|
+
attr_reader :initial_state
|
4
|
+
|
5
|
+
def initialize(implementation, options)
|
6
|
+
builder, adds, circuit, outputs, options = BuildState.build_state_for( implementation.config, options)
|
7
|
+
|
8
|
+
@initial_state = State::Config.build(
|
9
|
+
builder: builder,
|
10
|
+
options: options,
|
11
|
+
adds: adds,
|
12
|
+
circuit: circuit,
|
13
|
+
outputs: outputs,
|
14
|
+
)
|
15
|
+
|
16
|
+
include *options[:extend] # include the DSL methods.
|
17
|
+
include PublicAPI
|
18
|
+
end
|
19
|
+
|
20
|
+
# Injects the initial configuration into the module defining a new activity.
|
21
|
+
def extended(extended)
|
22
|
+
super
|
23
|
+
extended.instance_variable_set(:@state, initial_state)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
module Inspect
|
28
|
+
def inspect
|
29
|
+
"#<Trailblazer::V2_1::Activity: {#{name || self[:options][:name]}}>"
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :to_s, :inspect
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
require "trailblazer/v2_1/activity/dsl/helper"
|
37
|
+
# Helpers such as Path, Output, End to be included into {Activity}.
|
38
|
+
module DSLHelper
|
39
|
+
extend Forwardable
|
40
|
+
def_delegators :@builder, :Path
|
41
|
+
def_delegators DSL, :Output, :End, :Subprocess, :Track
|
42
|
+
|
43
|
+
def Path(*args, &block)
|
44
|
+
self[:builder].Path(*args, &block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Reader and writer method for DSL objects.
|
49
|
+
# The writer {dsl[:key] = "value"} exposes immutable behavior and will replace the old
|
50
|
+
# @state with a new, modified copy.
|
51
|
+
#
|
52
|
+
# Always use the DSL::Accessor accessors to avoid leaking state to other components
|
53
|
+
# due to mutable write operations.
|
54
|
+
module Accessor
|
55
|
+
def []=(*args)
|
56
|
+
@state = State::Config.send(:[]=, @state, *args)
|
57
|
+
end
|
58
|
+
|
59
|
+
def [](*args)
|
60
|
+
State::Config[@state, *args]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# FIXME: still to be decided
|
65
|
+
# By including those modules, we create instance methods.
|
66
|
+
# Later, this module is `extended` in Path, Railway and FastTrack, and
|
67
|
+
# imports the DSL methods as class methods.
|
68
|
+
module PublicAPI
|
69
|
+
include Accessor
|
70
|
+
|
71
|
+
require "trailblazer/v2_1/activity/dsl/add_task"
|
72
|
+
include DSL::AddTask
|
73
|
+
|
74
|
+
require "trailblazer/v2_1/activity/interface"
|
75
|
+
include Activity::Interface # DISCUSS
|
76
|
+
|
77
|
+
include DSLHelper # DISCUSS
|
78
|
+
|
79
|
+
include Activity::Inspect # DISCUSS
|
80
|
+
|
81
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/merge"
|
82
|
+
include Magnetic::Merge # Activity#merge!
|
83
|
+
|
84
|
+
# @private Note that {Activity.call} is considered private until the public API is stable.
|
85
|
+
def call(args, circuit_options={})
|
86
|
+
self[:circuit].( args, circuit_options.merge(activity: self) )
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end # Activity
|
91
|
+
end
|
92
|
+
|
93
|
+
require "trailblazer/v2_1/circuit"
|
94
|
+
require "trailblazer/v2_1/activity/structures"
|
95
|
+
require "trailblazer/v2_1/activity/config"
|
96
|
+
|
97
|
+
require "trailblazer/v2_1/activity/dsl/strategy/build_state"
|
98
|
+
require "trailblazer/v2_1/activity/dsl/strategy/path"
|
99
|
+
require "trailblazer/v2_1/activity/dsl/strategy/plan"
|
100
|
+
require "trailblazer/v2_1/activity/dsl/strategy/railway"
|
101
|
+
require "trailblazer/v2_1/activity/dsl/strategy/fast_track"
|
102
|
+
|
103
|
+
require "trailblazer/v2_1/activity/task_wrap"
|
104
|
+
require "trailblazer/v2_1/activity/task_wrap/call_task"
|
105
|
+
require "trailblazer/v2_1/activity/task_wrap/trace"
|
106
|
+
require "trailblazer/v2_1/activity/task_wrap/runner"
|
107
|
+
require "trailblazer/v2_1/activity/task_wrap/merge"
|
108
|
+
require "trailblazer/v2_1/activity/task_wrap/variable_mapping"
|
109
|
+
|
110
|
+
require "trailblazer/v2_1/activity/trace"
|
111
|
+
require "trailblazer/v2_1/activity/present"
|
112
|
+
|
113
|
+
require "trailblazer/v2_1/activity/introspect"
|
114
|
+
|
115
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/state"
|
116
|
+
require "trailblazer/v2_1/activity/dsl/magnetic" # the "magnetic" DSL
|
117
|
+
|
118
|
+
require "trailblazer/v2_1/activity/dsl/schema/sequence"
|
119
|
+
require "trailblazer/v2_1/activity/dsl/schema/dependencies"
|
120
|
+
|
121
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/normalizer" # DISCUSS: name and location are odd. This one uses Activity ;)
|
122
|
+
|
123
|
+
require "trailblazer/v2_1/activity/dsl/record"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
module Activity::State
|
3
|
+
# Compile-time
|
4
|
+
#
|
5
|
+
# DISCUSS: we could replace parts with Hamster::Hash.
|
6
|
+
class Config
|
7
|
+
def self.build(variables={})
|
8
|
+
Hash[ variables.collect { |k,v| [k, v.freeze] } ].freeze
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.[]=(state, *args)
|
12
|
+
if args.size == 2
|
13
|
+
key, value = *args
|
14
|
+
|
15
|
+
state = state.merge(key => value)
|
16
|
+
else
|
17
|
+
directive, key, value = *args
|
18
|
+
|
19
|
+
state = state.merge( directive => {}.freeze ) unless state.key?(directive)
|
20
|
+
|
21
|
+
directive_hash = state[directive].merge(key => value)
|
22
|
+
state = state.merge( directive => directive_hash.freeze )
|
23
|
+
end
|
24
|
+
|
25
|
+
state
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.[](state, *args)
|
29
|
+
directive, key = *args
|
30
|
+
|
31
|
+
return state[directive] if args.size == 1
|
32
|
+
return state[directive][key] if state.key?(directive)
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Trailblazer::V2_1::Activity < Module
|
2
|
+
module DSL
|
3
|
+
module AddTask
|
4
|
+
def add_task!(strategy, polarizer, name, task, options, &block)
|
5
|
+
# The beautiful thing about State.add is it doesn't mutate anything.
|
6
|
+
# We're changing state here, on the outside, by overriding the ivars.
|
7
|
+
# That in turn means, the only mutated entity is this module.
|
8
|
+
|
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
|
+
|
11
|
+
self[:adds] = adds
|
12
|
+
self[:circuit] = circuit
|
13
|
+
self[:outputs] = outputs
|
14
|
+
|
15
|
+
_, local_options, connections, sequence_options, extension_options = returned_options
|
16
|
+
|
17
|
+
# {Extension API} call all extensions.
|
18
|
+
extension_options.keys.collect { |ext| ext.( self, *returned_options, original_dsl_args: [name, task, options, block] ) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Trailblazer::V2_1
|
2
|
+
module Activity::DSL
|
3
|
+
# Create a new method (e.g. Activity::step) that delegates to its builder, recompiles
|
4
|
+
# the circuit, etc. Method comes in a module so it can be overridden via modules.
|
5
|
+
#
|
6
|
+
# This approach assumes you maintain a {#add_task!} method.
|
7
|
+
def self.def_dsl(_name, strategy, polarizer)
|
8
|
+
Module.new do
|
9
|
+
define_method(_name) do |task, options={}, &block|
|
10
|
+
builder, adds, circuit, outputs, options = add_task!(strategy, polarizer, _name, task, options, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
OutputSemantic = Struct.new(:value)
|
17
|
+
Track = Struct.new(:color)
|
18
|
+
Extension = Struct.new(:callable) do
|
19
|
+
def call(*args, &block)
|
20
|
+
callable.(*args, &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Shortcut functions for the DSL. These have no state.
|
25
|
+
module_function
|
26
|
+
|
27
|
+
# Output( Left, :failure )
|
28
|
+
# Output( :failure ) #=> Output::Semantic
|
29
|
+
def Output(signal, semantic=nil)
|
30
|
+
return OutputSemantic.new(signal) if semantic.nil?
|
31
|
+
|
32
|
+
Activity.Output(signal, semantic)
|
33
|
+
end
|
34
|
+
|
35
|
+
def End(semantic)
|
36
|
+
Activity.End(semantic)
|
37
|
+
end
|
38
|
+
|
39
|
+
def Track(color)
|
40
|
+
Track.new(color).freeze
|
41
|
+
end
|
42
|
+
|
43
|
+
def Path(normalizer, track_color: "track_#{rand}", end_semantic: track_color, **options)
|
44
|
+
options = options.merge(track_color: track_color, end_semantic: end_semantic)
|
45
|
+
|
46
|
+
# Build an anonymous class which will be where the block is evaluated in.
|
47
|
+
# We use the same normalizer here, so DSL calls in the inner block have the same behavior.
|
48
|
+
path = Module.new do
|
49
|
+
extend Activity::Path( options.merge( normalizer: normalizer ) )
|
50
|
+
end
|
51
|
+
|
52
|
+
# this block is called in DSL::ProcessTuples. This could be improved somehow.
|
53
|
+
->(block) {
|
54
|
+
path.instance_exec(&block)
|
55
|
+
|
56
|
+
[ track_color, path ]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
# Computes the :outputs options for {activity}
|
61
|
+
def Subprocess(activity)
|
62
|
+
{
|
63
|
+
task: activity,
|
64
|
+
outputs: activity.outputs
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Trailblazer::V2_1
|
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/v2_1/activity/dsl/magnetic/process_options"
|
19
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/structure/plus_poles"
|
20
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/structure/polarization"
|
21
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/structure/alterations"
|
22
|
+
|
23
|
+
require "trailblazer/v2_1/activity/dsl/magnetic"
|
24
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder"
|
25
|
+
# require "trailblazer/v2_1/activity/dsl/magnetic/builder/dsl_helper"
|
26
|
+
# require "trailblazer/v2_1/activity/dsl/magnetic/dsl_helper"
|
27
|
+
|
28
|
+
require "trailblazer/v2_1/option"
|
29
|
+
require "trailblazer/v2_1/activity/task_builder"
|
30
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/default_normalizer"
|
31
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/path"
|
32
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/railway"
|
33
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/builder/fast_track" # TODO: move to Operation gem.
|
34
|
+
|
35
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/generate"
|
36
|
+
require "trailblazer/v2_1/activity/dsl/magnetic/finalizer"
|