nxt_pipeline 0.2.8 → 0.4.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3905e37feab9967d3cf749542c69adaa64280b788a7b862348e6002eff0e863f
4
- data.tar.gz: d899cfc62cda30aaef508168130884ed1150f49120aae8b2ffe6552a03a61929
3
+ metadata.gz: 0ddc6f3289300268adabdfda7f6b0a2c50561e9127f6951f0a29ebfb26d48298
4
+ data.tar.gz: 13af4e35b2014025fb33d16bd9ed1cf74048d6e20404035c5001fedf7db18b02
5
5
  SHA512:
6
- metadata.gz: 3de1e8ee02aa0778e673f97a2a58701ec548a6546f84d0bf2d63db5bf339fa267d61a6ff5193353e83f2ce3cfeb259b2ce2f08cab52150ca675364d018c83611
7
- data.tar.gz: 65eec50438f474ae1d54c70e4baa6648e91cd8a28a662ece2efcec1a30eaf66350252541049995c66ef221fe77ba4f8bcd1f5a56aa97d9b59d96d731639ba801
6
+ metadata.gz: c174e7fae2b76cb47b0b2bd1388ad50796603d49283c94056e5af96fbbf46d5d51c745c2cf09015967ac5aa92057f94ec3e6b86412e93686b6b1728db4058c7a
7
+ data.tar.gz: b9e44023b319bd809e71b83eae038676f51e06aae032c40686ed9c1eee6ee9093b7fe38814c22db9139cf4e2ba5d2bfefeda258d70fb883a7a3e738e27429f46
@@ -7,7 +7,9 @@ jobs:
7
7
  build:
8
8
  docker:
9
9
  # specify the version you desire here
10
- - image: circleci/ruby:2.6.1-node
10
+ - image: circleci/ruby:2.7.0-node
11
+ environment:
12
+ BUNDLER_VERSION: 2.1.4
11
13
 
12
14
  working_directory: ~/repo
13
15
 
@@ -19,6 +21,8 @@ jobs:
19
21
  keys:
20
22
  - v1-dependencies-{{ checksum "Gemfile.lock" }}
21
23
 
24
+ - run: gem install bundler --version $BUNDLER_VERSION
25
+
22
26
  - run:
23
27
  name: install dependencies
24
28
  command: |
data/.pryrc ADDED
@@ -0,0 +1,6 @@
1
+ if defined?(PryByebug)
2
+ Pry.commands.alias_command 'c', 'continue'
3
+ Pry.commands.alias_command 's', 'step'
4
+ Pry.commands.alias_command 'n', 'next'
5
+ Pry.commands.alias_command 'f', 'finish'
6
+ end
@@ -1 +1 @@
1
- 2.6.3
1
+ 2.7.0
@@ -1,4 +1,10 @@
1
- ## Unreleased
1
+ ## nxt_pipeline 0.4.2 (October 12, 2020)
2
+
3
+ * Fix bug when registering an error without passing arguments in which case the callback didn't get executed. More info: https://github.com/nxt-insurance/nxt_pipeline/issues/39
4
+
5
+ ## nxt_pipeline 0.4.1 (March 13, 2020)
6
+
7
+ * Fix deprecation warnings for Ruby 2.7
2
8
 
3
9
  ## nxt_pipeline 0.2.0 (March 10, 2019)
4
10
 
@@ -14,7 +20,7 @@
14
20
  Renamed `NxtPipeline::Pipeline#burst?` to `NxtPipeline::Pipeline#failed?`.
15
21
  Renamed `NxtPipeline::Pipeline#burst_segment` to `NxtPipeline::Pipeline#failed_step`.
16
22
  Renamed `NxtPipeline::Pipeline::rescue_segment_burst` to `NxtPipeline::Pipeline::rescue_errors`.
17
-
23
+
18
24
  *Nils Sommer*
19
25
 
20
26
  * Setup [guard](https://github.com/guard/guard) to run specs upon file changes during development.
@@ -1,19 +1,21 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_pipeline (0.2.8)
4
+ nxt_pipeline (0.4.2)
5
5
  activesupport
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (5.2.3)
10
+ activesupport (6.0.3.4)
11
11
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
12
  i18n (>= 0.7, < 2)
13
13
  minitest (~> 5.1)
14
14
  tzinfo (~> 1.1)
15
+ zeitwerk (~> 2.2, >= 2.2.2)
16
+ byebug (11.1.1)
15
17
  coderay (1.1.2)
16
- concurrent-ruby (1.1.5)
18
+ concurrent-ruby (1.1.7)
17
19
  diff-lcs (1.3)
18
20
  ffi (1.11.1)
19
21
  formatador (0.2.5)
@@ -31,59 +33,63 @@ GEM
31
33
  guard (~> 2.1)
32
34
  guard-compat (~> 1.1)
33
35
  rspec (>= 2.99.0, < 4.0)
34
- i18n (1.6.0)
36
+ i18n (1.8.5)
35
37
  concurrent-ruby (~> 1.0)
36
38
  listen (3.1.5)
37
39
  rb-fsevent (~> 0.9, >= 0.9.4)
38
40
  rb-inotify (~> 0.9, >= 0.9.7)
39
41
  ruby_dep (~> 1.2)
40
42
  lumberjack (1.0.13)
41
- method_source (0.9.2)
42
- minitest (5.11.3)
43
+ method_source (1.0.0)
44
+ minitest (5.14.2)
43
45
  nenv (0.3.0)
44
46
  notiffany (0.1.1)
45
47
  nenv (~> 0.1)
46
48
  shellany (~> 0.0)
47
- pry (0.12.2)
48
- coderay (~> 1.1.0)
49
- method_source (~> 0.9.0)
50
- rake (12.3.3)
49
+ pry (0.13.0)
50
+ coderay (~> 1.1)
51
+ method_source (~> 1.0)
52
+ pry-byebug (3.9.0)
53
+ byebug (~> 11.0)
54
+ pry (~> 0.13.0)
55
+ rake (13.0.1)
51
56
  rb-fsevent (0.10.3)
52
57
  rb-inotify (0.10.0)
53
58
  ffi (~> 1.0)
54
- rspec (3.8.0)
55
- rspec-core (~> 3.8.0)
56
- rspec-expectations (~> 3.8.0)
57
- rspec-mocks (~> 3.8.0)
58
- rspec-core (3.8.1)
59
- rspec-support (~> 3.8.0)
60
- rspec-expectations (3.8.4)
59
+ rspec (3.9.0)
60
+ rspec-core (~> 3.9.0)
61
+ rspec-expectations (~> 3.9.0)
62
+ rspec-mocks (~> 3.9.0)
63
+ rspec-core (3.9.0)
64
+ rspec-support (~> 3.9.0)
65
+ rspec-expectations (3.9.0)
61
66
  diff-lcs (>= 1.2.0, < 2.0)
62
- rspec-support (~> 3.8.0)
63
- rspec-mocks (3.8.1)
67
+ rspec-support (~> 3.9.0)
68
+ rspec-mocks (3.9.0)
64
69
  diff-lcs (>= 1.2.0, < 2.0)
65
- rspec-support (~> 3.8.0)
66
- rspec-support (3.8.2)
70
+ rspec-support (~> 3.9.0)
71
+ rspec-support (3.9.0)
67
72
  rspec_junit_formatter (0.4.1)
68
73
  rspec-core (>= 2, < 4, != 2.12.0)
69
74
  ruby_dep (1.5.0)
70
75
  shellany (0.0.1)
71
76
  thor (0.20.3)
72
77
  thread_safe (0.3.6)
73
- tzinfo (1.2.5)
78
+ tzinfo (1.2.7)
74
79
  thread_safe (~> 0.1)
80
+ zeitwerk (2.4.0)
75
81
 
76
82
  PLATFORMS
77
83
  ruby
78
84
 
79
85
  DEPENDENCIES
80
- bundler (~> 1.17)
86
+ bundler (~> 2.1)
81
87
  guard-rspec
82
88
  nxt_pipeline!
83
- pry
84
- rake (~> 12.3)
89
+ pry-byebug
90
+ rake (~> 13.0)
85
91
  rspec (~> 3.0)
86
92
  rspec_junit_formatter
87
93
 
88
94
  BUNDLED WITH
89
- 1.17.2
95
+ 2.1.4
data/README.md CHANGED
@@ -32,26 +32,31 @@ by the step yielded to the constructor.
32
32
  ```ruby
33
33
  pipeline = NxtPipeline::Pipeline.new do |p|
34
34
  # Add a named constructor that will be used to execute your steps later
35
- # All options that you pass in your step will be available through accessors in your constructor
36
- p.constructor(:service, default: true) do |step, arg|
37
- step.service_class.new(options: arg).call
35
+ # All options that you pass in your step will be available through accessors in your constructor
36
+ # You can call :to_s on a step to set it by default. You can later overwrite at execution for each step if needed.
37
+ p.constructor(:service, default: true) do |step, arg:|
38
+ step.to_s = step.service_class.to_s
39
+ result = step.service_class.new(options: arg).call
40
+ result && { arg: result }
38
41
  end
39
42
 
40
- p.constructor(:job) do |step, arg|
41
- step.job_class.perform_later(*arg) && arg
43
+ p.constructor(:job) do |step, arg:|
44
+ step.job_class.perform_later(*arg) && { arg: arg }
42
45
  end
43
46
  end
44
47
 
45
48
  # Once a pipeline was created you can still configure it
46
- pipeline.constructor(:call) do |step, arg|
47
- step.caller.new(arg).call
49
+ pipeline.constructor(:call) do |step, arg:|
50
+ result = step.caller.new(arg).call
51
+ result && { arg: result }
48
52
  end
49
53
 
50
54
  # same with block syntax
51
55
  # You can use this to split up execution from configuration
52
56
  pipeline.configure do |p|
53
- p.constructor(:call) do |step, arg|
54
- step.caller.new(arg).call
57
+ p.constructor(:call) do |step, arg:|
58
+ result = step.caller.new(arg).call
59
+ result && { arg: result }
55
60
  end
56
61
  end
57
62
  ```
@@ -67,11 +72,11 @@ pipeline.step service_class: MyOtherServiceClass, to_s: 'Second step'
67
72
  pipeline.step :job, job_class: MyJobClass # to_s is optional
68
73
  pipeline.step :job, job_class: MyOtherJobClass
69
74
 
70
- pipeline.step :step_name_for_better_log do |_, arg|
75
+ pipeline.step :step_name_for_better_log do |_, arg:|
71
76
  # ...
72
77
  end
73
78
 
74
- pipeline.step to_s: 'This is the same as above' do |step, arg|
79
+ pipeline.step to_s: 'This is the same as above' do |step, arg:|
75
80
  # ... step.to_s => 'This is the same as above'
76
81
  end
77
82
  ```
@@ -85,11 +90,11 @@ will be set to :inline.
85
90
  You can then execute the steps with:
86
91
 
87
92
  ```ruby
88
- pipeline.execute('initial argument')
93
+ pipeline.execute(arg: 'initial argument')
89
94
 
90
95
  # Or run the steps directly using block syntax
91
96
 
92
- pipeline.execute('initial argument') do |p|
97
+ pipeline.execute(arg: 'initial argument') do |p|
93
98
  p.step :service, service_class: MyServiceClass, to_s: 'First step'
94
99
  p.step :service, service_class: MyOtherServiceClass, to_s: 'Second step'
95
100
  p.step :job, job_class: MyJobClass # to_s is optional
@@ -101,9 +106,9 @@ end
101
106
  You can also directly execute a pipeline with:
102
107
 
103
108
  ```ruby
104
- NxtPipeline::Pipeline.execute('initial argument') do |p|
105
- p.step do |_, arg|
106
- arg.upcase
109
+ NxtPipeline::Pipeline.execute(arg: 'initial argument') do |p|
110
+ p.step do |_, arg:|
111
+ { arg: arg.upcase }
107
112
  end
108
113
  end
109
114
  ```
@@ -132,8 +137,8 @@ You can also define guard clauses that take a proc to prevent the execution of a
132
137
  When the guard takes an argument the step argument is yielded.
133
138
 
134
139
  ```ruby
135
- pipeline.execute('initial argument') do |p|
136
- p.step :service, service_class: MyServiceClass, if: -> (arg) { arg == 'initial argument' }
140
+ pipeline.execute(arg: 'initial argument') do |p|
141
+ p.step :service, service_class: MyServiceClass, if: -> (arg:) { arg == 'initial argument' }
137
142
  p.step :service, service_class: MyOtherServiceClass, unless: -> { false }
138
143
  end
139
144
 
@@ -145,24 +150,24 @@ Apart from defining constructors and steps you can also define error callbacks.
145
150
 
146
151
  ```ruby
147
152
  NxtPipeline::Pipeline.new do |p|
148
- p.step do |_, arg|
149
- arg.upcase
153
+ p.step do |_, arg:|
154
+ { arg: arg.upcase }
150
155
  end
151
156
 
152
- p.on_error MyCustomError do |step, arg, error|
157
+ p.on_error MyCustomError do |step, opts, error|
153
158
  # First matching error callback will be executed!
154
159
  end
155
160
 
156
- p.on_errors ArgumentError, KeyError do |step, arg, error|
161
+ p.on_errors ArgumentError, KeyError do |step, opts, error|
157
162
  # First matching error callback will be executed!
158
163
  end
159
164
 
160
- p.on_errors YetAnotherError, halt_on_error: false do |step, arg, error|
165
+ p.on_errors YetAnotherError, halt_on_error: false do |step, opts, error|
161
166
  # After executing the callback the pipeline will not halt but continue to
162
167
  # execute the next steps.
163
168
  end
164
169
 
165
- p.on_errors do |step, arg, error|
170
+ p.on_errors do |step, opts, error|
166
171
  # This will match all errors inheriting from StandardError
167
172
  end
168
173
  end
@@ -174,12 +179,12 @@ You can also define callbacks that run before and after the `#execute` action. B
174
179
 
175
180
  ```ruby
176
181
  NxtPipeline::Pipeline.new do |p|
177
- p.before_execute do |pipeline, arg|
182
+ p.before_execute do |pipeline, arg:|
178
183
  # Will be called from within #execute before entering the first step
179
184
  # After any configure block though!
180
185
  end
181
186
 
182
- p.after_execute do |pipeline, arg|
187
+ p.after_execute do |pipeline, arg:|
183
188
  # Will be called from within #execute after executing last step
184
189
  end
185
190
  end
@@ -187,6 +192,16 @@ end
187
192
 
188
193
  Note that the `after_execute` callback will not be called, when an error is raised in one of the steps. See the previous section (_Error callbacks_) for how to define callbacks that run in case of errors.
189
194
 
195
+ ### Step resolvers
196
+
197
+ NxtPipeline is using so called step_resolvers to find the constructor for a given step by the arguments passed in.
198
+ You can also use this if you are not fine with resolving the constructor from the step argument. Check out the
199
+ `nxt_pipeline/spec/step_resolver_spec.rb` for examples how you can implement your own step_resolvers.
200
+
201
+
202
+ ## Topics
203
+ - Step orchestration (chainable steps)
204
+ - Constructors should take arg as first and step as second arg
190
205
 
191
206
  ## Development
192
207
 
@@ -1,6 +1,7 @@
1
1
  require 'active_support/all'
2
2
  require 'nxt_pipeline/version'
3
3
  require 'nxt_pipeline/logger'
4
+ require 'nxt_pipeline/constructor'
4
5
  require 'nxt_pipeline/pipeline'
5
6
  require 'nxt_pipeline/step'
6
7
  require 'nxt_pipeline/error_callback'
@@ -0,0 +1,20 @@
1
+ module NxtPipeline
2
+ class Constructor
3
+ def initialize(name, **opts, &block)
4
+ @name = name
5
+ @block = block
6
+ @opts = opts
7
+ end
8
+
9
+ attr_reader :opts, :block
10
+
11
+ delegate :arity, to: :block
12
+
13
+ def call(*args, **opts, &block)
14
+ # ActiveSupport's #delegate does not properly handle keyword arg passing
15
+ # in the latest released version. Thefore we bypass delegation by reimplementing
16
+ # the method ourselves. This is already fixed in Rails master though.
17
+ self.block.call(*args, **opts, &block)
18
+ end
19
+ end
20
+ end
@@ -1,7 +1,7 @@
1
1
  module NxtPipeline
2
2
  class ErrorCallback
3
- def initialize(errors, halt_on_error, callback)
4
- @errors = errors
3
+ def initialize(errors, halt_on_error, &callback)
4
+ @errors = errors.any? ? errors : [StandardError]
5
5
  @halt_on_error = halt_on_error
6
6
  @callback = callback
7
7
  end
@@ -1,17 +1,18 @@
1
1
  module NxtPipeline
2
2
  class Pipeline
3
- def self.execute(opts, &block)
4
- new(&block).execute(opts)
3
+ def self.execute(**opts, &block)
4
+ new(&block).execute(**opts)
5
5
  end
6
6
 
7
- def initialize(&block)
7
+ def initialize(step_resolvers = default_step_resolvers, &block)
8
8
  @steps = []
9
9
  @error_callbacks = []
10
10
  @logger = Logger.new
11
11
  @current_step = nil
12
12
  @current_arg = nil
13
13
  @default_constructor_name = nil
14
- @registry = {}
14
+ @constructors = {}
15
+ @step_resolvers = step_resolvers
15
16
 
16
17
  configure(&block) if block_given?
17
18
  end
@@ -20,17 +21,20 @@ module NxtPipeline
20
21
 
21
22
  attr_accessor :logger, :steps
22
23
 
23
- # register steps with name and block
24
24
  def constructor(name, **opts, &constructor)
25
25
  name = name.to_sym
26
- raise StandardError, "Already registered step :#{name}" if registry[name]
26
+ raise StandardError, "Already registered step :#{name}" if constructors[name]
27
27
 
28
- registry[name] = constructor
28
+ constructors[name] = Constructor.new(name, **opts, &constructor)
29
29
 
30
30
  return unless opts.fetch(:default, false)
31
31
  set_default_constructor(name)
32
32
  end
33
33
 
34
+ def step_resolver(&block)
35
+ step_resolvers << block
36
+ end
37
+
34
38
  def set_default_constructor(name)
35
39
  raise_duplicate_default_constructor if default_constructor_name.present?
36
40
  self.default_constructor_name = name
@@ -40,43 +44,54 @@ module NxtPipeline
40
44
  raise ArgumentError, 'Default step already defined'
41
45
  end
42
46
 
43
- def step(type = nil, **opts, &block)
44
- type = type&.to_sym
45
-
47
+ def step(argument = nil, **opts, &block)
46
48
  constructor = if block_given?
47
49
  # make type the :to_s of inline steps
48
50
  # fall back to :inline if no type is given
49
- type ||= :inline
50
- opts.reverse_merge!(to_s: type)
51
- block
51
+ argument ||= :inline
52
+ opts.reverse_merge!(to_s: argument)
53
+ Constructor.new(:inline, **opts, &block)
52
54
  else
53
- if type
54
- raise_reserved_type_inline_error if type == :inline
55
- registry.fetch(type) { raise KeyError, "No step :#{type} registered" }
55
+ constructor = step_resolvers.lazy.map do |resolver|
56
+ resolver.call(argument)
57
+ end.find(&:itself)
58
+
59
+ if constructor
60
+ constructor && constructors.fetch(constructor) { raise KeyError, "No step :#{argument} registered" }
61
+ elsif default_constructor
62
+ argument ||= default_constructor_name
63
+ default_constructor
56
64
  else
57
- # When no type was given we try to fallback to the type of the default constructor
58
- type = default_constructor_name
59
- # If none was given - raise
60
- default_constructor || (raise StandardError, 'No default step registered')
65
+ raise StandardError, "Could not resolve step from: #{argument}"
61
66
  end
62
67
  end
63
68
 
64
- steps << Step.new(type, constructor, steps.count, **opts)
69
+ steps << Step.new(argument, constructor, steps.count, **opts)
65
70
  end
66
71
 
67
- def execute(arg, &block)
72
+ def execute(**changeset, &block)
68
73
  reset
69
74
 
70
75
  configure(&block) if block_given?
71
- before_execute_callback.call(self, arg) if before_execute_callback.respond_to?(:call)
76
+ before_execute_callback.call(self, changeset) if before_execute_callback.respond_to?(:call)
72
77
 
73
- result = steps.inject(arg) do |argument, step|
74
- execute_step(step, argument)
78
+ result = steps.inject(changeset) do |changeset, step|
79
+ execute_step(step, **changeset)
75
80
  rescue StandardError => error
81
+ logger_for_error = logger
82
+
83
+ error.define_singleton_method :details do
84
+ OpenStruct.new(
85
+ changeset: changeset,
86
+ logger: logger_for_error,
87
+ step: step
88
+ )
89
+ end
90
+
76
91
  callback = find_error_callback(error)
77
92
  raise unless callback && callback.continue_after_error?
78
93
  handle_step_error(error)
79
- argument
94
+ changeset
80
95
  end
81
96
 
82
97
  after_execute_callback.call(self, result) if after_execute_callback.respond_to?(:call)
@@ -95,7 +110,7 @@ module NxtPipeline
95
110
  end
96
111
 
97
112
  def on_errors(*errors, halt_on_error: true, &callback)
98
- error_callbacks << ErrorCallback.new(errors, halt_on_error, callback)
113
+ error_callbacks << ErrorCallback.new(errors, halt_on_error, &callback)
99
114
  end
100
115
 
101
116
  alias :on_error :on_errors
@@ -110,7 +125,7 @@ module NxtPipeline
110
125
 
111
126
  private
112
127
 
113
- attr_reader :error_callbacks, :registry
128
+ attr_reader :error_callbacks, :constructors, :step_resolvers
114
129
  attr_accessor :current_step,
115
130
  :current_arg,
116
131
  :default_constructor_name,
@@ -120,15 +135,15 @@ module NxtPipeline
120
135
  def default_constructor
121
136
  return unless default_constructor_name
122
137
 
123
- @default_constructor ||= registry[default_constructor_name.to_sym]
138
+ @default_constructor ||= constructors[default_constructor_name.to_sym]
124
139
  end
125
140
 
126
- def execute_step(step, arg)
141
+ def execute_step(step, **changeset)
127
142
  self.current_step = step
128
- self.current_arg = arg
129
- result = step.execute(arg)
143
+ self.current_arg = changeset
144
+ result = step.execute(**changeset)
130
145
  log_step(step)
131
- result || arg
146
+ result || changeset
132
147
  end
133
148
 
134
149
  def find_error_callback(error)
@@ -149,5 +164,9 @@ module NxtPipeline
149
164
  def raise_reserved_type_inline_error
150
165
  raise ArgumentError, 'Type :inline is reserved for inline steps!'
151
166
  end
167
+
168
+ def default_step_resolvers
169
+ [->(step_argument) { step_argument.is_a?(Symbol) && step_argument }]
170
+ end
152
171
  end
153
172
  end
@@ -1,26 +1,42 @@
1
1
  module NxtPipeline
2
2
  class Step
3
- def initialize(type, constructor, index, **opts)
3
+ def initialize(argument, constructor, index, **opts)
4
4
  define_attr_readers(opts)
5
5
 
6
- @type = type
6
+ @argument = argument
7
7
  @index = index
8
- @result = nil
9
8
  @opts = opts
10
- @status = nil
11
9
  @constructor = constructor
10
+ @to_s = "#{opts.merge(argument: argument)}"
11
+ @options_mapper = opts[:map_options]
12
+
13
+ @status = nil
14
+ @result = nil
12
15
  @error = nil
16
+ @mapped_options = nil
13
17
  end
14
18
 
15
- attr_reader :type, :result, :status, :error, :opts, :index
19
+ attr_reader :argument, :result, :status, :error, :opts, :index, :mapped_options
20
+ attr_accessor :to_s
21
+
22
+ alias_method :name=, :to_s=
23
+ alias_method :name, :to_s
24
+
25
+ def execute(**changeset)
26
+ mapper = options_mapper || default_options_mapper
27
+ mapper_args = [changeset, self].take(mapper.arity)
28
+ self.mapped_options = mapper.call(*mapper_args)
29
+
30
+ guard_args = [changeset, self]
16
31
 
17
- def execute(arg)
18
- guard_args = [arg, self]
19
32
  if_guard_args = guard_args.take(if_guard.arity)
20
33
  unless_guard_guard_args = guard_args.take(unless_guard.arity)
21
34
 
22
- if unless_guard.call(*unless_guard_guard_args) && if_guard.call(*if_guard_args)
23
- self.result = constructor.call(self, arg)
35
+ if !instrumentalize_callable(unless_guard, unless_guard_guard_args) && instrumentalize_callable(if_guard, if_guard_args)
36
+ constructor_args = [self, changeset]
37
+ constructor_args = constructor_args.take(constructor.arity)
38
+
39
+ self.result = instrumentalize_callable(constructor, constructor_args)
24
40
  end
25
41
 
26
42
  set_status
@@ -31,29 +47,33 @@ module NxtPipeline
31
47
  raise
32
48
  end
33
49
 
34
- def to_s
35
- "#{opts.merge(type: type)}"
36
- end
37
-
38
- def type?(potential_type)
39
- type.to_sym == potential_type.to_sym
40
- end
50
+ # def type?(potential_type)
51
+ # constructor.resolve_type(potential_type)
52
+ # end
41
53
 
42
54
  private
43
55
 
44
- attr_writer :result, :status, :error
45
- attr_reader :constructor
56
+ attr_writer :result, :status, :error, :mapped_options
57
+ attr_reader :constructor, :options_mapper
58
+
59
+ def instrumentalize_callable(callable, args)
60
+ if args.last.is_a?(Hash)
61
+ callable.call(*args.take(args.length - 1), **args.last)
62
+ else
63
+ callable.call(*args)
64
+ end
65
+ end
46
66
 
47
67
  def if_guard
48
- opts.fetch(:if) { no_guard }
68
+ opts.fetch(:if) { guard(true) }
49
69
  end
50
70
 
51
71
  def unless_guard
52
- opts.fetch(:unless) { no_guard }
72
+ opts.fetch(:unless) { guard(false) }
53
73
  end
54
74
 
55
- def no_guard
56
- -> { true }
75
+ def guard(result)
76
+ -> { result }
57
77
  end
58
78
 
59
79
  def define_attr_readers(opts)
@@ -67,5 +87,10 @@ module NxtPipeline
67
87
  def set_status
68
88
  self.status = result.present? ? :success : :skipped
69
89
  end
90
+
91
+ def default_options_mapper
92
+ # returns an empty hash
93
+ ->(changeset) { {} }
94
+ end
70
95
  end
71
96
  end
@@ -1,3 +1,4 @@
1
1
  module NxtPipeline
2
- VERSION = "0.2.8".freeze
2
+ VERSION = "0.4.2".freeze
3
3
  end
4
+
@@ -35,9 +35,9 @@ Gem::Specification.new do |spec|
35
35
  spec.require_paths = ["lib"]
36
36
 
37
37
  spec.add_dependency "activesupport"
38
- spec.add_development_dependency "bundler", "~> 1.17"
38
+ spec.add_development_dependency "bundler", "~> 2.1"
39
39
  spec.add_development_dependency "guard-rspec"
40
- spec.add_development_dependency "rake", "~> 12.3"
40
+ spec.add_development_dependency "rake", "~> 13.0"
41
41
  spec.add_development_dependency "rspec", "~> 3.0"
42
- spec.add_development_dependency "pry"
42
+ spec.add_development_dependency "pry-byebug"
43
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nxt_pipeline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nils Sommer
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-08-09 00:00:00.000000000 Z
13
+ date: 2020-10-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -32,14 +32,14 @@ dependencies:
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '1.17'
35
+ version: '2.1'
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '1.17'
42
+ version: '2.1'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: guard-rspec
45
45
  requirement: !ruby/object:Gem::Requirement
@@ -60,14 +60,14 @@ dependencies:
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: '12.3'
63
+ version: '13.0'
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
- version: '12.3'
70
+ version: '13.0'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rspec
73
73
  requirement: !ruby/object:Gem::Requirement
@@ -83,7 +83,7 @@ dependencies:
83
83
  - !ruby/object:Gem::Version
84
84
  version: '3.0'
85
85
  - !ruby/object:Gem::Dependency
86
- name: pry
86
+ name: pry-byebug
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
@@ -105,6 +105,7 @@ extra_rdoc_files: []
105
105
  files:
106
106
  - ".circleci/config.yml"
107
107
  - ".gitignore"
108
+ - ".pryrc"
108
109
  - ".rspec"
109
110
  - ".ruby-version"
110
111
  - ".travis.yml"
@@ -120,6 +121,7 @@ files:
120
121
  - bin/rspec
121
122
  - bin/setup
122
123
  - lib/nxt_pipeline.rb
124
+ - lib/nxt_pipeline/constructor.rb
123
125
  - lib/nxt_pipeline/error_callback.rb
124
126
  - lib/nxt_pipeline/logger.rb
125
127
  - lib/nxt_pipeline/pipeline.rb
@@ -148,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
150
  - !ruby/object:Gem::Version
149
151
  version: '0'
150
152
  requirements: []
151
- rubygems_version: 3.0.3
153
+ rubygems_version: 3.1.2
152
154
  signing_key:
153
155
  specification_version: 4
154
156
  summary: DSL to build Pipeline with mountable Segments to process things.