business_flow 0.13.0 → 0.14.0

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: cdef83b6efdb2ec395d4163aa60019a462290771
4
- data.tar.gz: 5e8cafcb5a42577f5ccd6935d4bc2caa27aad273
3
+ metadata.gz: ef0272ca5eb7e69dd6f802b1e684930a2a344021
4
+ data.tar.gz: 5b02b5d3c8981929d9f7e2675890933562501388
5
5
  SHA512:
6
- metadata.gz: fcafa83b78deab671faf9ac470dc234a332ce159a05ba3ed652d719521038b786d63cf178a5270bcdaa1def9bda1b9cc7cd130d3a8100ceddededbe0232debe9
7
- data.tar.gz: 6083b83d0699c52fda62eee141238dff4d7ce910cfc3386a52bdc518e7986e45bedefac50e19ac3081059474c3bbace3c2d051151169cad637ed49ebb5a05c61
6
+ metadata.gz: 8238af8e966875e8ffeca8ffa376f73d761158c64ca01b1af8edda23c3f2e6b814f12395d295c99269152de7b478205019ef1bebb4a725113dc4e8324595d7d0
7
+ data.tar.gz: f8afa54780606ad60029b47eee2c88a832822088ce98922374635ad1e97422341bf8a2d4aa43f8d48bdf05b515f2a06a612c720d83db759b041be2870e7fea38
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- business_flow (0.13.0)
4
+ business_flow (0.14.0)
5
5
  activemodel (>= 3.0)
6
6
  activesupport (>= 3.0)
7
7
 
@@ -15,6 +15,13 @@ module BusinessFlow
15
15
  @needs.add_fields(fields)
16
16
  end
17
17
 
18
+ # Allows a field to be retieved form the initialization paramters,
19
+ # but does not require it to be non-nil
20
+ def optional(*fields)
21
+ @optionals ||= FieldList.new([], ParameterField, self)
22
+ @optionals.add_fields(fields)
23
+ end
24
+
18
25
  # Allows a field to be retrieved from the initialiaztion parameters
19
26
  def wants(field, default = proc { nil }, opts = {})
20
27
  internal_name = "wants_#{field}".to_sym
@@ -53,7 +60,7 @@ module BusinessFlow
53
60
  # :reek:UtilityFunction This is a function on us so that other modules
54
61
  # can change execution behavior.
55
62
  def execute(flow)
56
- catch(:halt_step) { flow.call }
63
+ catch(:halt_step) { flow.call } unless flow.errors?
57
64
  result_from(flow)
58
65
  end
59
66
 
@@ -304,6 +311,8 @@ module BusinessFlow
304
311
 
305
312
  # Helper class around memoized fields
306
313
  class MemoizedField
314
+ attr_reader :field
315
+
307
316
  def initialize(field, retriever, setter_factory)
308
317
  @field = field
309
318
  @retriever = retriever
@@ -319,7 +328,7 @@ module BusinessFlow
319
328
 
320
329
  private
321
330
 
322
- attr_reader :field, :retriever, :setter_factory
331
+ attr_reader :retriever, :setter_factory
323
332
 
324
333
  def memoized(ivar_name, setter, retriever)
325
334
  <<-MEMOIZED
@@ -375,6 +384,7 @@ module BusinessFlow
375
384
 
376
385
  def add_to(klass)
377
386
  @field.add_to(klass)
387
+ klass.send(:public, @field.field)
378
388
  end
379
389
 
380
390
  private
@@ -390,9 +400,12 @@ module BusinessFlow
390
400
  @parameters = parameters
391
401
  end
392
402
 
403
+ # :reek:NilCheck
393
404
  def fetch(key)
394
405
  value = inner_fetch(key)
395
- return yield if !value && block_given?
406
+ # We only want to fall back to a default if we were
407
+ # given nil. Other falsy vlues should be directly used.
408
+ return yield if value.nil? && block_given?
396
409
  value
397
410
  end
398
411
 
@@ -35,7 +35,8 @@ module BusinessFlow
35
35
  # Represents the result of a step, and allows setting response values on
36
36
  # an object, and merging error data into the same object.
37
37
  class Result
38
- def initialize(result, output_map, output_callable)
38
+ def initialize(parameter_source, result, output_map, output_callable)
39
+ @parameter_source = parameter_source
39
40
  @result = result
40
41
  @output_map = output_map
41
42
  @output_callable = output_callable
@@ -44,6 +45,7 @@ module BusinessFlow
44
45
  def merge_into(object)
45
46
  merge_errors_into(object)
46
47
  merge_outputs_into(object)
48
+ output
47
49
  end
48
50
 
49
51
  def executed?
@@ -56,8 +58,14 @@ module BusinessFlow
56
58
  @result.respond_to?(:errors?) ? @result.errors? : false
57
59
  end
58
60
 
61
+ # :reek:ManualDispatch Checking respond_to? is signficantly faster than
62
+ # eating the NoMethodError when grabbing our error object.
63
+ def valid?
64
+ @result.respond_to?(:valid?) ? @result.valid? : true
65
+ end
66
+
59
67
  def output
60
- @output_callable.call(@result)
68
+ @parameter_source.instance_exec(@result, &@output_callable)
61
69
  end
62
70
 
63
71
  def self.process_output(object, output, output_setter)
@@ -71,8 +79,14 @@ module BusinessFlow
71
79
 
72
80
  private
73
81
 
82
+ # :reek:ManualDispatch Checking respond_to? is signficantly faster than
83
+ # eating the NoMethodError when grabbing our error object.
84
+ def mergeable_errors?
85
+ @result.respond_to?(:errors) && errors? && !valid?
86
+ end
87
+
74
88
  def merge_errors_into(object)
75
- return unless errors?
89
+ return unless mergeable_errors?
76
90
  @result.errors.each do |attribute, message|
77
91
  attribute = "#{@result.class.name.underscore}.#{attribute}"
78
92
  (object.errors[attribute] << message).uniq!
@@ -103,8 +117,8 @@ module BusinessFlow
103
117
 
104
118
  # Manage creating results for our step
105
119
  ResultFactory = Struct.new(:outputs, :output_callable) do
106
- def result(step_result)
107
- Result.new(step_result, outputs, output_callable)
120
+ def result(step_result, parameter_source)
121
+ Result.new(parameter_source, step_result, outputs, output_callable)
108
122
  end
109
123
  end
110
124
 
@@ -163,7 +177,8 @@ module BusinessFlow
163
177
  def call(parameter_source)
164
178
  parameters = @input_object.parameters_from_source(parameter_source)
165
179
  if @condition.call(parameter_source, parameters)
166
- @result_factory.result(@callable.call(parameter_source, parameters))
180
+ @result_factory.result(@callable.call(parameter_source, parameters),
181
+ parameter_source)
167
182
  else
168
183
  ConditionFailedResult.new
169
184
  end
@@ -1,3 +1,3 @@
1
1
  module BusinessFlow
2
- VERSION = '0.13.0'.freeze
2
+ VERSION = '0.14.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: business_flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Scarborough
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-22 00:00:00.000000000 Z
11
+ date: 2019-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel