trailblazer-operation 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e11de8247c38298cb548d31fb21ca138949204da
4
- data.tar.gz: fd3a2a39355bc6e064d174e098d542f69e8f0fbc
3
+ metadata.gz: 7d1a238c8c4bb3a49a8adad7d2ffc709f1f4766d
4
+ data.tar.gz: d3495a92e3fc1519b7e847ccd8f1ad2ff84d41a7
5
5
  SHA512:
6
- metadata.gz: 2b65963cfacea4a758ee64ede04d7c67a6e84433503d0278ebf8e163509205c1a75360fad353a76a271eb2392f5bdeecba66faebe6d78438b6c9b9d1eda36834
7
- data.tar.gz: e8edfcc04c39863635ee3123e90c9ea1a024240b61b54ea3356906a687c62a4929041949dad345f9e214ef104b4a6060d655d4461ecff637966d73c495e676a5
6
+ metadata.gz: 2f922d3d9a2ebbe3abdc6eb919cf6c99dbd66ffa990f041ba9a1aea6de1a2c56c5f1c436388978c434017213d6eb370059a03846613a3704a1617615d2168435
7
+ data.tar.gz: 60eabb5de8f611edc69a9c81003dc78a29c4734ba316e4cdcc6497ba7075ff4c7d1a732dca8660af1c9a327e582bb4c27ccc494820f5495c1b2b93a5fe8022a8
data/CHANGES.md CHANGED
@@ -14,6 +14,10 @@ lots of work on the DSL specific parts.
14
14
 
15
15
  params:, rest: ..
16
16
 
17
+ ## 0.1.2
18
+
19
+ * Add @mensfeld's "Macaroni" step style for a keyword-only signature for steps.
20
+
17
21
  ## 0.1.0
18
22
 
19
23
  inspect: failure is << and success is >>
data/Gemfile CHANGED
@@ -20,5 +20,5 @@ gem "trailblazer-developer", git: "https://github.com/trailblazer/trailblazer-de
20
20
 
21
21
  # gem "declarative", path: "../declarative"
22
22
 
23
- gem "trailblazer-activity", path: "../circuit"
23
+ # gem "trailblazer-activity", path: "../circuit"
24
24
  # gem "trailblazer-activity", git: "https://github.com/trailblazer/trailblazer-activity"
@@ -50,7 +50,7 @@ module Trailblazer
50
50
  fail_fast_end: Railway::End::FailFast.new(:fail_fast, semantic: :fail_fast),
51
51
  }
52
52
 
53
- @builder, @adds = Activity::Magnetic::Builder::FastTrack.for( Railway::Normalizer, builder_options )
53
+ @builder, @adds = Activity::Magnetic::Builder::FastTrack.for( build_normalizer.freeze, builder_options )
54
54
  @debug = {}
55
55
  end
56
56
 
@@ -68,6 +68,12 @@ module Trailblazer
68
68
  def __call__(args, circuit_options={})
69
69
  @process.( args, circuit_options.merge( exec_context: new ) )
70
70
  end
71
+
72
+ private
73
+
74
+ def build_normalizer
75
+ Railway::Normalizer.new
76
+ end
71
77
  end
72
78
 
73
79
  extend Process # make ::call etc. class methods on Operation.
@@ -0,0 +1,21 @@
1
+ module Trailblazer
2
+ module Operation::Railway
3
+ # Call the user's steps with a differing API (inspired by Maciej Mensfeld) that
4
+ # only receives keyword args. The `options` keyword is the stateful context object
5
+ #
6
+ # def my_step( params:, ** )
7
+ # def my_step( params:, options:, ** )
8
+ module Macaroni
9
+ def self.call(user_proc)
10
+ Task.new( Trailblazer::Option.build( Macaroni::Option, user_proc ), user_proc )
11
+ end
12
+
13
+ class Option < Trailblazer::Option
14
+ # The Option#call! method prepares the arguments.
15
+ def self.call!(proc, options, *)
16
+ proc.( **options.to_hash.merge( options: options ) )
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -5,8 +5,12 @@ module Trailblazer
5
5
  # task via {TaskBuilder} in order to translate true/false to `Right` or `Left`.
6
6
  #
7
7
  # The Normalizer sits in the `@builder`, which receives all DSL calls from the Operation subclass.
8
- module Normalizer
9
- def self.call(task, options, unknown_options, sequence_options)
8
+ class Normalizer
9
+ def initialize(task_builder: TaskBuilder, **options)
10
+ @task_builder = task_builder
11
+ end
12
+
13
+ def call(task, options, unknown_options, sequence_options)
10
14
  wrapped_task, options =
11
15
  if task.is_a?(::Hash) # macro.
12
16
  [
@@ -17,7 +21,7 @@ module Trailblazer
17
21
  Operation::DeprecatedMacro.( *task )
18
22
  else # user step
19
23
  [
20
- TaskBuilder.(task),
24
+ @task_builder.(task),
21
25
  { id: task }.merge(options) # default :id
22
26
  ]
23
27
  end
@@ -35,28 +39,28 @@ module Trailblazer
35
39
  end
36
40
 
37
41
  # Merge user options over defaults.
38
- def self.defaultize(task, options)
42
+ def defaultize(task, options)
39
43
  {
40
44
  plus_poles: InitialPlusPoles(),
41
45
  }.merge(options)
42
46
  end
43
47
 
44
48
  # Handle the :override option which is specific to Operation.
45
- def self.override(task, options, sequence_options)
49
+ def override(task, options, sequence_options)
46
50
  options, locals = Activity::Magnetic::Builder.normalize(options, [:override])
47
51
  sequence_options = sequence_options.merge( replace: options[:id] ) if locals[:override]
48
52
 
49
53
  return options, locals, sequence_options
50
54
  end
51
55
 
52
- def self.InitialPlusPoles
56
+ def InitialPlusPoles
53
57
  Activity::Magnetic::DSL::PlusPoles.new.merge(
54
58
  Activity.Output(Activity::Right, :success) => nil,
55
59
  Activity.Output(Activity::Left, :failure) => nil,
56
60
  )
57
61
  end
58
62
 
59
- def self.deprecate_name(options, unknown_options) # TODO remove in 2.2
63
+ def deprecate_name(options, unknown_options) # TODO remove in 2.2
60
64
  unknown_options, deprecated_options = Activity::Magnetic::Builder.normalize(unknown_options, [:name])
61
65
 
62
66
  options = options.merge( name: deprecated_options[:name] ) if deprecated_options[:name]
@@ -5,39 +5,33 @@ module Trailblazer
5
5
  # Output direction binary: true=>Right, false=>Left.
6
6
  # Passes through all subclasses of Direction.~~~~~~~~~~~~~~~~~
7
7
  module TaskBuilder
8
- class Task < Proc
9
- def initialize(source_location, &block)
10
- @source_location = source_location
11
- super &block
12
- end
13
-
14
- def to_s
15
- "<Railway::Task{#{@source_location}}>"
16
- end
8
+ def self.call(user_proc)
9
+ Task.new( Trailblazer::Option::KW( user_proc ), user_proc )
10
+ end
17
11
 
18
- def inspect
19
- to_s
20
- end
12
+ # Translates the return value of the user step into a valid signal.
13
+ # Note that it passes through subclasses of {Signal}.
14
+ def self.binary_direction_for(result, on_true, on_false)
15
+ result.is_a?(Class) && result < Activity::Signal ? result : (result ? on_true : on_false)
21
16
  end
17
+ end
22
18
 
23
- # TODO: make this class replaceable so @Mensfeld gets his own call style. :trollface:
19
+ class Task
20
+ def initialize(task, user_proc)
21
+ @task = task
22
+ @user_proc = user_proc
24
23
 
25
- def self.call(step, on_true=Activity::Right, on_false=Activity::Left)
26
- Task.new step, &->( (options, *args), **circuit_args ) do
27
- # Execute the user step with TRB's kw args.
28
- result = Trailblazer::Option::KW(step).(options, **circuit_args) # circuit_args contains :exec_context.
24
+ freeze
25
+ end
29
26
 
30
- # Return an appropriate signal which direction to go next.
31
- direction = binary_direction_for(result, on_true, on_false)
27
+ def call( (options, *args), **circuit_args )
28
+ # Execute the user step with TRB's kw args.
29
+ result = @task.( options, **circuit_args ) # circuit_args contains :exec_context.
32
30
 
33
- [ direction, [ options, *args ], **circuit_args ]
34
- end
35
- end
31
+ # Return an appropriate signal which direction to go next.
32
+ direction = TaskBuilder.binary_direction_for( result, Activity::Right, Activity::Left )
36
33
 
37
- # Translates the return value of the user step into a valid signal.
38
- # Note that it passes through subclasses of {Signal}.
39
- def self.binary_direction_for(result, on_true, on_false)
40
- result.is_a?(Class) && result < Activity::Signal ? result : (result ? on_true : on_false)
34
+ [ direction, [ options, *args ], **circuit_args ]
41
35
  end
42
36
  end
43
37
  end
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  class Operation
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+
3
+ require "trailblazer/operation/railway/macaroni"
4
+
5
+ class MacaroniTaskBuilderTest < Minitest::Spec
6
+ module Memo; end
7
+
8
+ class Memo::Create < Trailblazer::Operation
9
+ Normalizer = Railway::Normalizer.new( task_builder: Railway::Macaroni )
10
+
11
+ step :create_model, normalizer: Normalizer
12
+ step :save, normalizer: Normalizer
13
+
14
+ def create_model(params:, options:, **)
15
+ options[:model] = params[:title]
16
+ end
17
+
18
+ def save(model:, **)
19
+ model.reverse!
20
+ end
21
+ end
22
+
23
+ it "allows optional macaroni call style" do
24
+ Memo::Create.( params: { title: "Wow!" } ).inspect(:model).must_equal %{<Result:true ["!woW"] >}
25
+ end
26
+ end
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "trailblazer-activity", ">= 0.3.0", "< 0.4.0"
20
+ spec.add_dependency "trailblazer-activity", ">= 0.3.1", "< 0.4.0"
21
21
  spec.add_dependency "trailblazer-context", ">= 0.1.1", "< 0.3.0"
22
22
 
23
23
  spec.add_development_dependency "bundler"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-operation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.0
19
+ version: 0.3.1
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: 0.4.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.3.0
29
+ version: 0.3.1
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.4.0
@@ -112,6 +112,7 @@ files:
112
112
  - lib/trailblazer/operation/public_call.rb
113
113
  - lib/trailblazer/operation/railway.rb
114
114
  - lib/trailblazer/operation/railway/fast_track.rb
115
+ - lib/trailblazer/operation/railway/macaroni.rb
115
116
  - lib/trailblazer/operation/railway/normalizer.rb
116
117
  - lib/trailblazer/operation/railway/task_builder.rb
117
118
  - lib/trailblazer/operation/result.rb
@@ -124,6 +125,7 @@ files:
124
125
  - test/call_test.rb
125
126
  - test/class_dependencies_test.rb
126
127
  - test/docs/doormat_test.rb
128
+ - test/docs/macaroni_test.rb
127
129
  - test/docs/wiring_test.rb
128
130
  - test/dry_container_test.rb
129
131
  - test/fast_track_test.rb
@@ -178,6 +180,7 @@ test_files:
178
180
  - test/call_test.rb
179
181
  - test/class_dependencies_test.rb
180
182
  - test/docs/doormat_test.rb
183
+ - test/docs/macaroni_test.rb
181
184
  - test/docs/wiring_test.rb
182
185
  - test/dry_container_test.rb
183
186
  - test/fast_track_test.rb