bcdd-result 0.13.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -4
  3. data/CHANGELOG.md +61 -21
  4. data/README.md +397 -227
  5. data/Rakefile +1 -1
  6. data/Steepfile +1 -1
  7. data/examples/multiple_listeners/Rakefile +8 -8
  8. data/examples/multiple_listeners/app/models/account/owner_creation.rb +1 -1
  9. data/examples/multiple_listeners/app/models/user/creation.rb +1 -1
  10. data/examples/multiple_listeners/app/models/user/token/creation.rb +1 -1
  11. data/examples/multiple_listeners/config/initializers/bcdd.rb +0 -2
  12. data/examples/multiple_listeners/config.rb +3 -3
  13. data/examples/multiple_listeners/db/setup.rb +2 -3
  14. data/examples/multiple_listeners/lib/bcdd/result/event_logs_record.rb +27 -0
  15. data/examples/multiple_listeners/lib/event_logs_listener/stdout.rb +60 -0
  16. data/examples/multiple_listeners/lib/runtime_breaker.rb +1 -1
  17. data/examples/service_objects/Rakefile +36 -0
  18. data/examples/service_objects/app/models/account/member.rb +10 -0
  19. data/examples/service_objects/app/models/account.rb +11 -0
  20. data/examples/service_objects/app/models/user/token.rb +7 -0
  21. data/examples/service_objects/app/models/user.rb +15 -0
  22. data/examples/service_objects/app/services/account/owner_creation.rb +47 -0
  23. data/examples/service_objects/app/services/application_service.rb +79 -0
  24. data/examples/service_objects/app/services/user/creation.rb +56 -0
  25. data/examples/service_objects/app/services/user/token/creation.rb +37 -0
  26. data/examples/service_objects/config/boot.rb +17 -0
  27. data/examples/service_objects/config/initializers/bcdd.rb +9 -0
  28. data/examples/service_objects/config.rb +20 -0
  29. data/examples/service_objects/db/setup.rb +49 -0
  30. data/examples/single_listener/Rakefile +5 -5
  31. data/examples/single_listener/app/models/account/owner_creation.rb +1 -1
  32. data/examples/single_listener/app/models/user/creation.rb +1 -1
  33. data/examples/single_listener/app/models/user/token/creation.rb +1 -1
  34. data/examples/single_listener/config/initializers/bcdd.rb +0 -2
  35. data/examples/single_listener/config.rb +1 -1
  36. data/examples/single_listener/lib/{single_transitions_listener.rb → single_event_logs_listener.rb} +32 -23
  37. data/lib/bcdd/{result/context → context}/callable_and_then.rb +6 -5
  38. data/lib/bcdd/{result/context → context}/expectations/mixin.rb +1 -1
  39. data/lib/bcdd/{result/context → context}/expectations.rb +2 -2
  40. data/lib/bcdd/context/failure.rb +9 -0
  41. data/lib/bcdd/{result/context → context}/mixin.rb +2 -2
  42. data/lib/bcdd/{result/context → context}/success.rb +11 -11
  43. data/lib/bcdd/context.rb +115 -0
  44. data/lib/bcdd/failure.rb +23 -0
  45. data/lib/bcdd/result/_self.rb +198 -0
  46. data/lib/bcdd/result/callable_and_then/caller.rb +1 -1
  47. data/lib/bcdd/result/config/switchers/addons.rb +2 -2
  48. data/lib/bcdd/result/config/switchers/constant_aliases.rb +1 -3
  49. data/lib/bcdd/result/config/switchers/features.rb +5 -5
  50. data/lib/bcdd/result/config/switchers/pattern_matching.rb +1 -1
  51. data/lib/bcdd/result/config.rb +7 -5
  52. data/lib/bcdd/result/contract/type_checker.rb +4 -0
  53. data/lib/bcdd/result/{transitions → event_logs}/config.rb +5 -3
  54. data/lib/bcdd/result/{transitions → event_logs}/listener.rb +5 -5
  55. data/lib/bcdd/result/{transitions → event_logs}/listeners.rb +17 -17
  56. data/lib/bcdd/result/{transitions → event_logs}/tracking/disabled.rb +1 -1
  57. data/lib/bcdd/result/{transitions → event_logs}/tracking/enabled.rb +15 -13
  58. data/lib/bcdd/result/{transitions → event_logs}/tracking.rb +4 -3
  59. data/lib/bcdd/result/{transitions → event_logs}/tree.rb +27 -11
  60. data/lib/bcdd/result/event_logs.rb +27 -0
  61. data/lib/bcdd/result/failure.rb +1 -3
  62. data/lib/bcdd/result/success.rb +1 -3
  63. data/lib/bcdd/result/version.rb +1 -1
  64. data/lib/bcdd/result.rb +23 -191
  65. data/lib/bcdd/success.rb +23 -0
  66. data/sig/bcdd/context.rbs +175 -0
  67. data/sig/bcdd/failure.rbs +13 -0
  68. data/sig/bcdd/result/config.rbs +1 -3
  69. data/sig/bcdd/result/context.rbs +2 -174
  70. data/sig/bcdd/result/contract.rbs +1 -0
  71. data/sig/bcdd/result/{transitions.rbs → event_logs.rbs} +19 -19
  72. data/sig/bcdd/result.rbs +13 -31
  73. data/sig/bcdd/success.rbs +13 -0
  74. metadata +41 -24
  75. data/examples/multiple_listeners/lib/bcdd/result/transitions_record.rb +0 -28
  76. data/examples/multiple_listeners/lib/transitions_listener/stdout.rb +0 -54
  77. data/lib/bcdd/result/context/failure.rb +0 -9
  78. data/lib/bcdd/result/context.rb +0 -93
  79. data/lib/bcdd/result/failure/methods.rb +0 -21
  80. data/lib/bcdd/result/success/methods.rb +0 -21
  81. data/lib/bcdd/result/transitions.rb +0 -27
data/lib/bcdd/result.rb CHANGED
@@ -1,197 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'set'
4
- require 'singleton'
5
4
 
6
- require_relative 'result/version'
7
- require_relative 'result/error'
8
- require_relative 'result/ignored_types'
9
- require_relative 'result/transitions'
10
- require_relative 'result/callable_and_then'
11
- require_relative 'result/data'
12
- require_relative 'result/handler'
13
- require_relative 'result/failure'
14
- require_relative 'result/success'
15
- require_relative 'result/mixin'
16
- require_relative 'result/contract'
17
- require_relative 'result/expectations'
18
- require_relative 'result/context'
19
- require_relative 'result/config'
20
-
21
- class BCDD::Result
22
- attr_accessor :unknown, :transitions
23
-
24
- attr_reader :source, :data, :type_checker, :terminal
25
-
26
- protected :source
27
-
28
- private :unknown, :unknown=, :type_checker, :transitions=
29
-
30
- def self.config
31
- Config.instance
32
- end
33
-
34
- def self.configuration(freeze: true)
35
- yield(config)
36
-
37
- freeze and config.freeze
38
- end
39
-
40
- def initialize(type:, value:, source: nil, expectations: nil, terminal: nil)
41
- data = Data.new(kind, type, value)
42
-
43
- @type_checker = Contract.evaluate(data, expectations)
44
- @source = source
45
- @terminal = kind == :failure || (terminal && !IgnoredTypes.include?(type))
46
- @data = data
47
-
48
- self.unknown = true
49
- self.transitions = Transitions::Tracking::EMPTY
50
-
51
- Transitions.tracking.record(self)
52
- end
53
-
54
- def terminal?
55
- terminal
56
- end
57
-
58
- def type
59
- data.type
60
- end
61
-
62
- def value
63
- data.value
64
- end
65
-
66
- def success?(_type = nil)
67
- raise Error::NotImplemented
68
- end
69
-
70
- def failure?(_type = nil)
71
- raise Error::NotImplemented
72
- end
73
-
74
- def value_or(&_block)
75
- raise Error::NotImplemented
76
- end
77
-
78
- def on(*types, &block)
79
- raise Error::MissingTypeArgument if types.empty?
80
-
81
- tap { known(block) if type_checker.allow?(types) }
82
- end
83
-
84
- def on_success(*types, &block)
85
- tap { known(block) if type_checker.allow_success?(types) && success? }
86
- end
87
-
88
- def on_failure(*types, &block)
89
- tap { known(block) if type_checker.allow_failure?(types) && failure? }
90
- end
91
-
92
- def on_unknown
93
- tap { yield(value, type) if unknown }
94
- end
95
-
96
- def and_then(method_name = nil, injected_value = nil, &block)
97
- return self if terminal?
98
-
99
- method_name && block and raise ::ArgumentError, 'method_name and block are mutually exclusive'
100
-
101
- method_name ? call_and_then_source_method(method_name, injected_value) : call_and_then_block(block)
102
- end
103
-
104
- def and_then!(source, injected_value = nil, _call: nil)
105
- raise Error::CallableAndThenDisabled unless Config.instance.feature.enabled?(:and_then!)
106
-
107
- return self if terminal?
108
-
109
- call_and_then_callable!(source, value: value, injected_value: injected_value, method_name: _call)
110
- end
111
-
112
- def handle
113
- handler = Handler.new(self, type_checker: type_checker)
114
-
115
- yield handler
116
-
117
- handler.send(:outcome)
118
- end
119
-
120
- def ==(other)
121
- self.class == other.class && type == other.type && value == other.value
122
- end
123
-
124
- def hash
125
- [self.class, type, value].hash
126
- end
127
-
128
- def inspect
129
- format('#<%<class_name>s type=%<type>p value=%<value>p>', class_name: self.class.name, type: type, value: value)
130
- end
131
-
132
- def deconstruct
133
- [type, value]
134
- end
135
-
136
- def deconstruct_keys(_keys)
137
- { kind => { type => value } }
138
- end
139
-
140
- alias eql? ==
141
- alias on_type on
142
-
143
- private
144
-
145
- def kind
146
- :unknown
147
- end
148
-
149
- def known(block)
150
- self.unknown = false
151
-
152
- block.call(value, type)
153
- end
154
-
155
- def call_and_then_source_method(method_name, injected_value)
156
- method = source.method(method_name)
157
-
158
- Transitions.tracking.record_and_then(method, injected_value) do
159
- result = call_and_then_source_method!(method, injected_value)
160
-
161
- ensure_result_object(result, origin: :method)
162
- end
163
- end
164
-
165
- def call_and_then_source_method!(method, injected_value)
166
- case method.arity
167
- when 0 then source.send(method.name)
168
- when 1 then source.send(method.name, value)
169
- when 2 then source.send(method.name, value, injected_value)
170
- else raise Error::InvalidSourceMethodArity.build(source: source, method: method, max_arity: 2)
171
- end
172
- end
173
-
174
- def call_and_then_block(block)
175
- Transitions.tracking.record_and_then(:block, nil) do
176
- result = call_and_then_block!(block)
177
-
178
- ensure_result_object(result, origin: :block)
179
- end
180
- end
181
-
182
- def call_and_then_block!(block)
183
- block.call(value)
184
- end
185
-
186
- def call_and_then_callable!(source, value:, injected_value:, method_name:)
187
- CallableAndThen::Caller.call(source, value: value, injected_value: injected_value, method_name: method_name)
188
- end
189
-
190
- def ensure_result_object(result, origin:)
191
- raise Error::UnexpectedOutcome.build(outcome: result, origin: origin) unless result.is_a?(::BCDD::Result)
192
-
193
- return result if result.source.equal?(source)
194
-
195
- raise Error::InvalidResultSource.build(given_result: result, expected_source: source)
5
+ module BCDD
6
+ require_relative 'success'
7
+ require_relative 'failure'
8
+
9
+ class Result
10
+ require_relative 'result/version'
11
+ require_relative 'result/error'
12
+ require_relative 'result/ignored_types'
13
+ require_relative 'result/event_logs'
14
+ require_relative 'result/callable_and_then'
15
+ require_relative 'result/data'
16
+ require_relative 'result/handler'
17
+ require_relative 'result/failure'
18
+ require_relative 'result/success'
19
+ require_relative 'result/mixin'
20
+ require_relative 'result/contract'
21
+ require_relative 'result/expectations'
22
+ require_relative 'result/config'
23
+ require_relative 'result/_self'
24
+
25
+ require_relative 'context'
26
+
27
+ Context = ::BCDD::Context
196
28
  end
197
29
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDD
4
+ module Success
5
+ def success?(type = nil)
6
+ type.nil? || type_checker.allow_success?([type])
7
+ end
8
+
9
+ def failure?(_type = nil)
10
+ false
11
+ end
12
+
13
+ def value_or
14
+ value
15
+ end
16
+
17
+ private
18
+
19
+ def kind
20
+ :success
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,175 @@
1
+ class BCDD::Context < BCDD::Result
2
+ EXPECTED_OUTCOME: String
3
+
4
+ SourceMethodArity: ^(Method) -> Integer
5
+
6
+ attr_reader memo: Hash[Symbol, untyped]
7
+
8
+ def initialize: (
9
+ type: Symbol,
10
+ value: untyped,
11
+ ?source: untyped,
12
+ ?expectations: BCDD::Result::Contract::Evaluator,
13
+ ?terminal: bool
14
+ ) -> void
15
+
16
+ def and_then: (?Symbol, **untyped) ?{ (Hash[Symbol, untyped]) -> untyped } -> untyped
17
+
18
+ def and_then!: (untyped, **untyped) -> untyped
19
+
20
+ private
21
+
22
+ def call_and_then_source_method: (Symbol, Hash[Symbol, untyped]) -> BCDD::Context
23
+
24
+ def call_and_then_callable!: (untyped, value: untyped, injected_value: untyped, method_name: (Symbol | nil)) -> BCDD::Context
25
+
26
+ def ensure_result_object: (untyped, origin: Symbol) -> BCDD::Context
27
+
28
+ def raise_unexpected_outcome_error: (BCDD::Context | untyped, Symbol) -> void
29
+ end
30
+
31
+ class BCDD::Context
32
+ class Error < BCDD::Result::Error
33
+ class InvalidExposure < BCDD::Context::Error
34
+ end
35
+ end
36
+ end
37
+
38
+ class BCDD::Context
39
+ class Success < BCDD::Context
40
+ include BCDD::Success
41
+
42
+ FetchValues: Proc
43
+
44
+ def and_expose: (Symbol, Array[Symbol], terminal: bool) -> BCDD::Context::Success
45
+ end
46
+
47
+ def self.Success: (Symbol, **untyped) -> BCDD::Context::Success
48
+ end
49
+
50
+ module BCDD::Context::CallableAndThen
51
+ class Caller < BCDD::Result::CallableAndThen::Caller
52
+ module KeyArgs
53
+ def self.parameters?: (untyped) -> bool
54
+
55
+ def self.invalid_arity: (untyped, Symbol) -> BCDD::Result::CallableAndThen::Error::InvalidArity
56
+ end
57
+
58
+ def self.call: (
59
+ untyped source,
60
+ value: untyped,
61
+ injected_value: untyped,
62
+ method_name: (Symbol | nil),
63
+ ) -> BCDD::Context
64
+
65
+ private
66
+
67
+ def self.call_proc!: (
68
+ untyped source,
69
+ Hash[Symbol, untyped] value,
70
+ nil injected_value
71
+ ) -> BCDD::Context
72
+
73
+ def self.call_method!: (
74
+ untyped source,
75
+ Method method,
76
+ Hash[Symbol, untyped] value,
77
+ nil injected_value
78
+ ) -> BCDD::Context
79
+
80
+ def self.callable_method: (
81
+ untyped source,
82
+ (Symbol | nil) method_name
83
+ ) -> ::Method
84
+
85
+ def self.ensure_result_object: (
86
+ untyped source,
87
+ untyped value,
88
+ BCDD::Context result
89
+ ) -> BCDD::Context
90
+
91
+ def self.expected_result_object: () -> singleton(BCDD::Context)
92
+
93
+ def self.expected_outcome: () -> String
94
+ end
95
+ end
96
+
97
+ class BCDD::Context
98
+ class Failure < BCDD::Context
99
+ include BCDD::Failure
100
+
101
+ def and_expose: (Symbol, Array[Symbol], **untyped) -> BCDD::Context::Failure
102
+ end
103
+
104
+ def self.Failure: (Symbol, **untyped) -> BCDD::Context::Failure
105
+ end
106
+
107
+ class BCDD::Context
108
+ module Mixin
109
+ Factory: singleton(BCDD::Result::Mixin::Factory)
110
+
111
+ module Methods
112
+ def Success: (Symbol, **untyped) -> BCDD::Context::Success
113
+
114
+ def Failure: (Symbol, **untyped) -> BCDD::Context::Failure
115
+
116
+ private
117
+
118
+ def _ResultAs: (singleton(BCDD::Context), Symbol, untyped, ?terminal: bool) -> untyped
119
+ end
120
+
121
+ module Addons
122
+ module Continue
123
+ include BCDD::Context::Mixin::Methods
124
+
125
+ private
126
+
127
+ def Continue: (**untyped) -> BCDD::Context::Success
128
+ end
129
+
130
+ module Given
131
+ include BCDD::Context::Mixin::Methods
132
+
133
+ private
134
+
135
+ def Given: (*untyped) -> BCDD::Context::Success
136
+ end
137
+
138
+ OPTIONS: Hash[Symbol, Module]
139
+
140
+ def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
141
+ end
142
+ end
143
+
144
+ def self.mixin_module: -> singleton(BCDD::Context::Mixin)
145
+
146
+ def self.result_factory: -> singleton(BCDD::Context)
147
+ end
148
+
149
+ class BCDD::Context::Expectations < BCDD::Result::Expectations
150
+ def self.mixin_module: -> singleton(BCDD::Context::Expectations::Mixin)
151
+
152
+ def self.result_factory_without_expectations: -> singleton(BCDD::Result)
153
+
154
+ def Success: (Symbol, **untyped) -> BCDD::Context::Success
155
+ def Failure: (Symbol, **untyped) -> BCDD::Context::Failure
156
+ end
157
+
158
+ module BCDD::Context::Expectations::Mixin
159
+ Methods: singleton(BCDD::Result::Expectations::Mixin::Methods)
160
+ Factory: singleton(BCDD::Result::Expectations::Mixin::Factory)
161
+
162
+ module Addons
163
+ module Continue
164
+ private def Continue: (**untyped) -> BCDD::Context::Success
165
+ end
166
+
167
+ module Given
168
+ private def Given: (*untyped) -> BCDD::Context::Success
169
+ end
170
+
171
+ OPTIONS: Hash[Symbol, Module]
172
+
173
+ def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
174
+ end
175
+ end
@@ -0,0 +1,13 @@
1
+ module BCDD
2
+ module Failure
3
+ def success?: (?Symbol type) -> bool
4
+ def failure?: (?Symbol type) -> bool
5
+ def value_or: { (untyped) -> untyped } -> untyped
6
+ def value: -> untyped
7
+
8
+ private
9
+
10
+ def kind: -> Symbol
11
+ def type_checker: -> BCDD::Result::Contract::TypeChecker
12
+ end
13
+ end
@@ -1,6 +1,4 @@
1
1
  class BCDD::Result::Config
2
- include Singleton
3
-
4
2
  ADDON: Hash[Symbol, Hash[Symbol, untyped]]
5
3
  FEATURE: Hash[Symbol, Hash[Symbol, untyped]]
6
4
  PATTERN_MATCHING: Hash[Symbol, Hash[Symbol, untyped]]
@@ -15,7 +13,7 @@ class BCDD::Result::Config
15
13
  def initialize: -> void
16
14
 
17
15
  def and_then!: () -> BCDD::Result::CallableAndThen::Config
18
- def transitions: () -> BCDD::Result::Transitions::Config
16
+ def event_logs: () -> BCDD::Result::EventLogs::Config
19
17
 
20
18
  def freeze: -> BCDD::Result::Config
21
19
  def options: -> Hash[Symbol, BCDD::Result::Config::Switcher]
@@ -1,175 +1,3 @@
1
- class BCDD::Result::Context < BCDD::Result
2
- EXPECTED_OUTCOME: String
3
-
4
- SourceMethodArity: ^(Method) -> Integer
5
-
6
- attr_reader acc: Hash[Symbol, untyped]
7
-
8
- def initialize: (
9
- type: Symbol,
10
- value: untyped,
11
- ?source: untyped,
12
- ?expectations: BCDD::Result::Contract::Evaluator,
13
- ?terminal: bool
14
- ) -> void
15
-
16
- def and_then: (?Symbol, **untyped) ?{ (Hash[Symbol, untyped]) -> untyped } -> untyped
17
-
18
- def and_then!: (untyped, **untyped) -> untyped
19
-
20
- private
21
-
22
- def call_and_then_source_method: (Symbol, Hash[Symbol, untyped]) -> BCDD::Result::Context
23
-
24
- def call_and_then_callable!: (untyped, value: untyped, injected_value: untyped, method_name: (Symbol | nil)) -> BCDD::Result::Context
25
-
26
- def ensure_result_object: (untyped, origin: Symbol) -> BCDD::Result::Context
27
-
28
- def raise_unexpected_outcome_error: (BCDD::Result::Context | untyped, Symbol) -> void
29
- end
30
-
31
- class BCDD::Result::Context
32
- class Error < BCDD::Result::Error
33
- class InvalidExposure < BCDD::Result::Context::Error
34
- end
35
- end
36
- end
37
-
38
- class BCDD::Result::Context
39
- class Success < BCDD::Result::Context
40
- include BCDD::Result::Success::Methods
41
-
42
- FetchValues: Proc
43
-
44
- def and_expose: (Symbol, Array[Symbol], terminal: bool) -> BCDD::Result::Context::Success
45
- end
46
-
47
- def self.Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
48
- end
49
-
50
- module BCDD::Result::Context::CallableAndThen
51
- class Caller < BCDD::Result::CallableAndThen::Caller
52
- module KeyArgs
53
- def self.parameters?: (untyped) -> bool
54
-
55
- def self.invalid_arity: (untyped, Symbol) -> BCDD::Result::CallableAndThen::Error::InvalidArity
56
- end
57
-
58
- def self.call: (
59
- untyped source,
60
- value: untyped,
61
- injected_value: untyped,
62
- method_name: (Symbol | nil),
63
- ) -> BCDD::Result::Context
64
-
65
- private
66
-
67
- def self.call_proc!: (
68
- untyped source,
69
- Hash[Symbol, untyped] value,
70
- nil injected_value
71
- ) -> BCDD::Result::Context
72
-
73
- def self.call_method!: (
74
- untyped source,
75
- Method method,
76
- Hash[Symbol, untyped] value,
77
- nil injected_value
78
- ) -> BCDD::Result::Context
79
-
80
- def self.callable_method: (
81
- untyped source,
82
- (Symbol | nil) method_name
83
- ) -> ::Method
84
-
85
- def self.ensure_result_object: (
86
- untyped source,
87
- untyped value,
88
- BCDD::Result::Context result
89
- ) -> BCDD::Result::Context
90
-
91
- def self.expected_result_object: () -> singleton(BCDD::Result::Context)
92
-
93
- def self.expected_outcome: () -> String
94
- end
95
- end
96
-
97
- class BCDD::Result::Context
98
- class Failure < BCDD::Result::Context
99
- include BCDD::Result::Failure::Methods
100
-
101
- def and_expose: (Symbol, Array[Symbol], **untyped) -> BCDD::Result::Context::Failure
102
- end
103
-
104
- def self.Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
105
- end
106
-
107
- class BCDD::Result::Context
108
- module Mixin
109
- Factory: singleton(BCDD::Result::Mixin::Factory)
110
-
111
- module Methods
112
- def Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
113
-
114
- def Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
115
-
116
- private
117
-
118
- def _ResultAs: (singleton(BCDD::Result::Context), Symbol, untyped, ?terminal: bool) -> untyped
119
- end
120
-
121
- module Addons
122
- module Continue
123
- include BCDD::Result::Context::Mixin::Methods
124
-
125
- private
126
-
127
- def Continue: (**untyped) -> BCDD::Result::Context::Success
128
- end
129
-
130
- module Given
131
- include BCDD::Result::Context::Mixin::Methods
132
-
133
- private
134
-
135
- def Given: (*untyped) -> BCDD::Result::Context::Success
136
- end
137
-
138
- OPTIONS: Hash[Symbol, Module]
139
-
140
- def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
141
- end
142
- end
143
-
144
- def self.mixin_module: -> singleton(BCDD::Result::Context::Mixin)
145
-
146
- def self.result_factory: -> singleton(BCDD::Result::Context)
147
- end
148
-
149
- class BCDD::Result::Context::Expectations < BCDD::Result::Expectations
150
- def self.mixin_module: -> singleton(BCDD::Result::Context::Expectations::Mixin)
151
-
152
- def self.result_factory_without_expectations: -> singleton(BCDD::Result)
153
-
154
- def Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
155
- def Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
156
- end
157
-
158
- module BCDD::Result::Context::Expectations::Mixin
159
- Methods: singleton(BCDD::Result::Expectations::Mixin::Methods)
160
- Factory: singleton(BCDD::Result::Expectations::Mixin::Factory)
161
-
162
- module Addons
163
- module Continue
164
- private def Continue: (**untyped) -> BCDD::Result::Context::Success
165
- end
166
-
167
- module Given
168
- private def Given: (*untyped) -> BCDD::Result::Context::Success
169
- end
170
-
171
- OPTIONS: Hash[Symbol, Module]
172
-
173
- def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
174
- end
1
+ class BCDD::Result
2
+ Context: BCDD::Context
175
3
  end
@@ -26,6 +26,7 @@ module BCDD::Result::Contract
26
26
  expectations: BCDD::Result::Contract::Evaluator
27
27
  ) -> void
28
28
 
29
+ def allow!: (Symbol) -> Symbol
29
30
  def allow?: (Array[Symbol]) -> bool
30
31
  def allow_success?: (Array[Symbol]) -> bool
31
32
  def allow_failure?: (Array[Symbol]) -> bool