bcdd-result 0.13.0 → 1.1.0

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.
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
@@ -1,14 +1,14 @@
1
1
  class BCDD::Result
2
- module Transitions
2
+ module EventLogs
3
3
  module Listener
4
4
  module ClassMethods
5
5
  def around_and_then?: () -> bool
6
- def around_transitions?: () -> bool
6
+ def around_event_logs?: () -> bool
7
7
  end
8
8
 
9
9
  extend ClassMethods
10
10
 
11
- def around_transitions: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
11
+ def around_event_logs: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
12
12
 
13
13
  def on_start: (scope: Hash[Symbol, untyped]) -> untyped
14
14
 
@@ -16,9 +16,9 @@ class BCDD::Result
16
16
 
17
17
  def on_record: (record: Hash[Symbol, untyped] ) -> untyped
18
18
 
19
- def on_finish: (transitions: Hash[Symbol, untyped] ) -> untyped
19
+ def on_finish: (event_logs: Hash[Symbol, untyped] ) -> untyped
20
20
 
21
- def before_interruption: (exception: ::Exception, transitions: Hash[Symbol, untyped]) -> untyped
21
+ def before_interruption: (exception: ::Exception, event_logs: Hash[Symbol, untyped]) -> untyped
22
22
  end
23
23
 
24
24
  class Listeners
@@ -40,11 +40,11 @@ class BCDD::Result
40
40
 
41
41
  private attr_reader listeners: Array[Listener]
42
42
  private attr_reader around_and_then_listener: untyped
43
- private attr_reader around_transitions_listener: untyped
43
+ private attr_reader around_event_logs_listener: untyped
44
44
 
45
45
  def initialize: (Array[Listener], untyped, untyped) -> void
46
46
 
47
- def around_transitions: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
47
+ def around_event_logs: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
48
48
 
49
49
  def on_start: (scope: Hash[Symbol, untyped]) -> untyped
50
50
 
@@ -52,9 +52,9 @@ class BCDD::Result
52
52
 
53
53
  def on_record: (record: Hash[Symbol, untyped] ) -> untyped
54
54
 
55
- def on_finish: (transitions: Hash[Symbol, untyped] ) -> untyped
55
+ def on_finish: (event_logs: Hash[Symbol, untyped] ) -> untyped
56
56
 
57
- def before_interruption: (exception: ::Exception, transitions: Hash[Symbol, untyped]) -> untyped
57
+ def before_interruption: (exception: ::Exception, event_logs: Hash[Symbol, untyped]) -> untyped
58
58
  end
59
59
 
60
60
  module Listener::Null
@@ -64,8 +64,6 @@ class BCDD::Result
64
64
  end
65
65
 
66
66
  class Config
67
- include ::Singleton
68
-
69
67
  attr_reader listener: untyped
70
68
  attr_reader trace_id: ::Proc
71
69
 
@@ -115,24 +113,26 @@ class BCDD::Result
115
113
  def move_down!: (?Integer level) -> Tree
116
114
  def move_to_root!: () -> Tree
117
115
 
118
- NestedIds: ^(Node) -> Array[untyped]
119
-
120
- def nested_ids: () -> Array[untyped]
121
-
116
+ Ids: ^(Node) -> Array[untyped]
122
117
  IdsMatrix: ::Proc
118
+ IdsLevelParent: ::Proc
123
119
 
120
+ def ids: () -> Array[untyped]
121
+ def ids_list: () -> Array[Integer]
124
122
  def ids_matrix: () -> untyped
123
+ def ids_level_parent: () -> untyped
125
124
  end
126
125
 
127
126
  module Tracking
128
127
  EMPTY_ARRAY: Array[untyped]
129
128
  EMPTY_HASH: Hash[untyped, untyped]
130
- EMPTY_TREE: Transitions::Tree
129
+ EMPTY_TREE: EventLogs::Tree
130
+ EMPTY_IDS: Hash[untyped, untyped]
131
131
  VERSION: Integer
132
132
  EMPTY: Hash[Symbol, untyped]
133
133
 
134
134
  class Enabled
135
- private attr_accessor tree: Transitions::Tree
135
+ private attr_accessor tree: EventLogs::Tree
136
136
  private attr_accessor records: Array[Hash[Symbol, untyped]]
137
137
  private attr_accessor listener: untyped
138
138
  private attr_accessor root_started_at: Integer
@@ -146,7 +146,7 @@ class BCDD::Result
146
146
 
147
147
  private
148
148
 
149
- def start: (String, String) -> [Transitions::Tree::Node, Hash[Symbol, untyped]]
149
+ def start: (String, String) -> [EventLogs::Tree::Node, Hash[Symbol, untyped]]
150
150
  def finish: (untyped) -> untyped
151
151
 
152
152
  TreeNodeValueNormalizer: ^(Integer, Array[untyped]) -> untyped
@@ -158,7 +158,7 @@ class BCDD::Result
158
158
 
159
159
  def now_in_milliseconds: () -> Integer
160
160
 
161
- def map_transitions: () -> Hash[Symbol, untyped]
161
+ def map_event_logs: () -> Hash[Symbol, untyped]
162
162
 
163
163
  def build_listener: () -> Listener
164
164
  end
data/sig/bcdd/result.rbs CHANGED
@@ -1,16 +1,16 @@
1
1
  class BCDD::Result
2
2
  private attr_accessor unknown: bool
3
- private attr_writer transitions: Hash[Symbol, untyped]
3
+ private attr_writer event_logs: Hash[Symbol, untyped]
4
4
  private attr_reader type_checker: BCDD::Result::Contract::TypeChecker
5
5
 
6
6
  attr_reader data: BCDD::Result::Data
7
7
  attr_reader source: untyped
8
8
  attr_reader terminal: bool
9
- attr_reader transitions: Hash[Symbol, untyped]
9
+ attr_reader event_logs: Hash[Symbol, untyped]
10
10
 
11
11
  def self.config: -> BCDD::Result::Config
12
12
  def self.configuration: (freeze: bool) { (BCDD::Result::Config) -> void } -> (bool | BCDD::Result::Config)
13
- def self.transitions: (name: untyped, desc: untyped) { () -> untyped } -> BCDD::Result
13
+ def self.event_logs: (name: untyped, desc: untyped) { () -> untyped } -> BCDD::Result
14
14
 
15
15
  def initialize: (
16
16
  type: Symbol,
@@ -23,6 +23,7 @@ class BCDD::Result
23
23
  def type: -> Symbol
24
24
  def value: -> untyped
25
25
 
26
+ def type?: (Symbol | String) -> bool
26
27
  def terminal?: -> bool
27
28
  def success?: (?Symbol type) -> bool
28
29
  def failure?: (?Symbol type) -> bool
@@ -47,6 +48,11 @@ class BCDD::Result
47
48
  def deconstruct: -> [Symbol, [Symbol, untyped]]
48
49
  def deconstruct_keys: (Array[Symbol]) -> Hash[Symbol, Hash[Symbol, untyped]]
49
50
 
51
+ TYPE_AND_VALUE: Array[Symbol]
52
+
53
+ def method_missing: (Symbol, *untyped) { (untyped) -> untyped } -> untyped
54
+
55
+ alias is? type?
50
56
  alias eql? ==
51
57
  alias on_type on
52
58
 
@@ -64,40 +70,16 @@ end
64
70
 
65
71
  class BCDD::Result
66
72
  class Success < BCDD::Result
67
- module Methods
68
- def success?: (?Symbol type) -> bool
69
- def failure?: (?Symbol type) -> bool
70
- def value_or: { () -> untyped } -> untyped
71
- def value: -> untyped
72
-
73
- private
74
-
75
- def kind: -> Symbol
76
- def type_checker: -> BCDD::Result::Contract::TypeChecker
77
- end
78
-
79
- include Methods
73
+ include BCDD::Success
80
74
  end
81
75
 
82
- def self.Failure: (Symbol type, ?untyped value) -> BCDD::Result::Failure
76
+ def self.Success: (Symbol type, ?untyped value) -> BCDD::Result::Success
83
77
  end
84
78
 
85
79
  class BCDD::Result
86
80
  class Failure < BCDD::Result
87
- module Methods
88
- def success?: (?Symbol type) -> bool
89
- def failure?: (?Symbol type) -> bool
90
- def value_or: { (untyped) -> untyped } -> untyped
91
- def value: -> untyped
92
-
93
- private
94
-
95
- def kind: -> Symbol
96
- def type_checker: -> BCDD::Result::Contract::TypeChecker
97
- end
98
-
99
- include Methods
81
+ include BCDD::Failure
100
82
  end
101
83
 
102
- def self.Success: (Symbol type, ?untyped value) -> BCDD::Result::Success
84
+ def self.Failure: (Symbol type, ?untyped value) -> BCDD::Result::Failure
103
85
  end
@@ -0,0 +1,13 @@
1
+ module BCDD
2
+ module Success
3
+ def success?: (?Symbol type) -> bool
4
+ def failure?: (?Symbol type) -> bool
5
+ def value_or: { () -> 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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcdd-result
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-01 00:00:00.000000000 Z
11
+ date: 2024-03-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Unleash a pragmatic and observable use of Result Pattern and Railway-Oriented
14
14
  Programming in Ruby.
@@ -38,10 +38,23 @@ files:
38
38
  - examples/multiple_listeners/config/boot.rb
39
39
  - examples/multiple_listeners/config/initializers/bcdd.rb
40
40
  - examples/multiple_listeners/db/setup.rb
41
+ - examples/multiple_listeners/lib/bcdd/result/event_logs_record.rb
41
42
  - examples/multiple_listeners/lib/bcdd/result/rollback_on_failure.rb
42
- - examples/multiple_listeners/lib/bcdd/result/transitions_record.rb
43
+ - examples/multiple_listeners/lib/event_logs_listener/stdout.rb
43
44
  - examples/multiple_listeners/lib/runtime_breaker.rb
44
- - examples/multiple_listeners/lib/transitions_listener/stdout.rb
45
+ - examples/service_objects/Rakefile
46
+ - examples/service_objects/app/models/account.rb
47
+ - examples/service_objects/app/models/account/member.rb
48
+ - examples/service_objects/app/models/user.rb
49
+ - examples/service_objects/app/models/user/token.rb
50
+ - examples/service_objects/app/services/account/owner_creation.rb
51
+ - examples/service_objects/app/services/application_service.rb
52
+ - examples/service_objects/app/services/user/creation.rb
53
+ - examples/service_objects/app/services/user/token/creation.rb
54
+ - examples/service_objects/config.rb
55
+ - examples/service_objects/config/boot.rb
56
+ - examples/service_objects/config/initializers/bcdd.rb
57
+ - examples/service_objects/db/setup.rb
45
58
  - examples/single_listener/Rakefile
46
59
  - examples/single_listener/app/models/account.rb
47
60
  - examples/single_listener/app/models/account/member.rb
@@ -56,9 +69,18 @@ files:
56
69
  - examples/single_listener/db/setup.rb
57
70
  - examples/single_listener/lib/bcdd/result/rollback_on_failure.rb
58
71
  - examples/single_listener/lib/runtime_breaker.rb
59
- - examples/single_listener/lib/single_transitions_listener.rb
72
+ - examples/single_listener/lib/single_event_logs_listener.rb
60
73
  - lib/bcdd-result.rb
74
+ - lib/bcdd/context.rb
75
+ - lib/bcdd/context/callable_and_then.rb
76
+ - lib/bcdd/context/expectations.rb
77
+ - lib/bcdd/context/expectations/mixin.rb
78
+ - lib/bcdd/context/failure.rb
79
+ - lib/bcdd/context/mixin.rb
80
+ - lib/bcdd/context/success.rb
81
+ - lib/bcdd/failure.rb
61
82
  - lib/bcdd/result.rb
83
+ - lib/bcdd/result/_self.rb
62
84
  - lib/bcdd/result/callable_and_then.rb
63
85
  - lib/bcdd/result/callable_and_then/caller.rb
64
86
  - lib/bcdd/result/callable_and_then/config.rb
@@ -70,13 +92,6 @@ files:
70
92
  - lib/bcdd/result/config/switchers/constant_aliases.rb
71
93
  - lib/bcdd/result/config/switchers/features.rb
72
94
  - lib/bcdd/result/config/switchers/pattern_matching.rb
73
- - lib/bcdd/result/context.rb
74
- - lib/bcdd/result/context/callable_and_then.rb
75
- - lib/bcdd/result/context/expectations.rb
76
- - lib/bcdd/result/context/expectations/mixin.rb
77
- - lib/bcdd/result/context/failure.rb
78
- - lib/bcdd/result/context/mixin.rb
79
- - lib/bcdd/result/context/success.rb
80
95
  - lib/bcdd/result/contract.rb
81
96
  - lib/bcdd/result/contract/disabled.rb
82
97
  - lib/bcdd/result/contract/error.rb
@@ -87,25 +102,26 @@ files:
87
102
  - lib/bcdd/result/contract/type_checker.rb
88
103
  - lib/bcdd/result/data.rb
89
104
  - lib/bcdd/result/error.rb
105
+ - lib/bcdd/result/event_logs.rb
106
+ - lib/bcdd/result/event_logs/config.rb
107
+ - lib/bcdd/result/event_logs/listener.rb
108
+ - lib/bcdd/result/event_logs/listeners.rb
109
+ - lib/bcdd/result/event_logs/tracking.rb
110
+ - lib/bcdd/result/event_logs/tracking/disabled.rb
111
+ - lib/bcdd/result/event_logs/tracking/enabled.rb
112
+ - lib/bcdd/result/event_logs/tree.rb
90
113
  - lib/bcdd/result/expectations.rb
91
114
  - lib/bcdd/result/expectations/mixin.rb
92
115
  - lib/bcdd/result/failure.rb
93
- - lib/bcdd/result/failure/methods.rb
94
116
  - lib/bcdd/result/handler.rb
95
117
  - lib/bcdd/result/handler/allowed_types.rb
96
118
  - lib/bcdd/result/ignored_types.rb
97
119
  - lib/bcdd/result/mixin.rb
98
120
  - lib/bcdd/result/success.rb
99
- - lib/bcdd/result/success/methods.rb
100
- - lib/bcdd/result/transitions.rb
101
- - lib/bcdd/result/transitions/config.rb
102
- - lib/bcdd/result/transitions/listener.rb
103
- - lib/bcdd/result/transitions/listeners.rb
104
- - lib/bcdd/result/transitions/tracking.rb
105
- - lib/bcdd/result/transitions/tracking/disabled.rb
106
- - lib/bcdd/result/transitions/tracking/enabled.rb
107
- - lib/bcdd/result/transitions/tree.rb
108
121
  - lib/bcdd/result/version.rb
122
+ - lib/bcdd/success.rb
123
+ - sig/bcdd/context.rbs
124
+ - sig/bcdd/failure.rbs
109
125
  - sig/bcdd/result.rbs
110
126
  - sig/bcdd/result/callable_and_then.rbs
111
127
  - sig/bcdd/result/config.rbs
@@ -113,12 +129,13 @@ files:
113
129
  - sig/bcdd/result/contract.rbs
114
130
  - sig/bcdd/result/data.rbs
115
131
  - sig/bcdd/result/error.rbs
132
+ - sig/bcdd/result/event_logs.rbs
116
133
  - sig/bcdd/result/expectations.rbs
117
134
  - sig/bcdd/result/handler.rbs
118
135
  - sig/bcdd/result/ignored_types.rbs
119
136
  - sig/bcdd/result/mixin.rbs
120
- - sig/bcdd/result/transitions.rbs
121
137
  - sig/bcdd/result/version.rbs
138
+ - sig/bcdd/success.rbs
122
139
  homepage: https://github.com/b-cdd/result
123
140
  licenses:
124
141
  - MIT
@@ -143,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
160
  - !ruby/object:Gem::Version
144
161
  version: '0'
145
162
  requirements: []
146
- rubygems_version: 3.5.3
163
+ rubygems_version: 3.1.6
147
164
  signing_key:
148
165
  specification_version: 4
149
166
  summary: Unleash a pragmatic and observable use of Result Pattern and Railway-Oriented
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result::TransitionsRecord < ActiveRecord::Base
4
- self.table_name = 'bcdd_result_transitions'
5
-
6
- class Listener
7
- include ::BCDD::Result::Transitions::Listener
8
-
9
- def on_finish(transitions:)
10
- metadata = transitions[:metadata]
11
- root_name = transitions.dig(:records, 0, :root, :name) || 'Unknown'
12
-
13
- BCDD::Result::TransitionsRecord.create(
14
- root_name: root_name,
15
- trace_id: metadata[:trace_id],
16
- version: transitions[:version],
17
- duration: metadata[:duration],
18
- ids_tree: metadata[:ids_tree],
19
- ids_matrix: metadata[:ids_matrix],
20
- records: transitions[:records]
21
- )
22
- rescue ::StandardError => e
23
- err = "#{e.message} (#{e.class}); Backtrace: #{e.backtrace.join(', ')}"
24
-
25
- ::Kernel.warn "Error on BCDD::Result::TransitionsRecord::Listener#on_finish: #{err}"
26
- end
27
- end
28
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class TransitionsListener::Stdout
4
- include BCDD::Result::Transitions::Listener
5
-
6
- def initialize
7
- @buffer = []
8
- end
9
-
10
- def on_start(scope:)
11
- scope => { id:, name:, desc: }
12
-
13
- @buffer << [id, "##{id} #{name} - #{desc}".chomp('- ')]
14
- end
15
-
16
- def on_record(record:)
17
- record => { current: { id: }, result: { kind:, type: } }
18
-
19
- method_name = record.dig(:and_then, :method_name)
20
-
21
- @buffer << [id, " * #{kind}(#{type}) from method: #{method_name}".chomp('from method: ')]
22
- end
23
-
24
- MapNestedMessages = ->(transitions, buffer, hide_given_and_continue) do
25
- ids_matrix = transitions.dig(:metadata, :ids_matrix)
26
-
27
- messages = buffer.filter_map { |(id, msg)| "#{' ' * ids_matrix[id].last}#{msg}" if ids_matrix[id] }
28
-
29
- messages.reject! { _1.match?(/\(_(given|continue)_\)/) } if hide_given_and_continue
30
-
31
- messages
32
- end
33
-
34
- def on_finish(transitions:)
35
- messages = MapNestedMessages[transitions, @buffer, ENV['HIDE_GIVEN_AND_CONTINUE']]
36
-
37
- puts messages.join("\n")
38
- end
39
-
40
- def before_interruption(exception:, transitions:)
41
- messages = MapNestedMessages[transitions, @buffer, ENV['HIDE_GIVEN_AND_CONTINUE']]
42
-
43
- puts messages.join("\n")
44
-
45
- bc = ::ActiveSupport::BacktraceCleaner.new
46
- bc.add_filter { |line| line.gsub(__dir__.sub('/lib', ''), '').sub(/\A\//, '')}
47
- bc.add_silencer { |line| /lib\/bcdd\/result/.match?(line) }
48
- bc.add_silencer { |line| line.include?(RUBY_VERSION) }
49
-
50
- backtrace = bc.clean(exception.backtrace)
51
-
52
- puts "\nException: #{exception.message} (#{exception.class}); Backtrace: #{backtrace.join(", ")}"
53
- end
54
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result::Context::Failure < BCDD::Result::Context
4
- include BCDD::Result::Failure::Methods
5
-
6
- def and_expose(_type, _keys, **_options)
7
- self
8
- end
9
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result
4
- class Context < self
5
- require_relative 'context/failure'
6
- require_relative 'context/success'
7
- require_relative 'context/mixin'
8
- require_relative 'context/expectations'
9
- require_relative 'context/callable_and_then'
10
-
11
- EXPECTED_OUTCOME = 'BCDD::Result::Context::Success or BCDD::Result::Context::Failure'
12
-
13
- def self.Success(type, **value)
14
- Success.new(type: type, value: value)
15
- end
16
-
17
- def self.Failure(type, **value)
18
- Failure.new(type: type, value: value)
19
- end
20
-
21
- def initialize(type:, value:, source: nil, expectations: nil, terminal: nil)
22
- value.is_a?(::Hash) or raise ::ArgumentError, 'value must be a Hash'
23
-
24
- @acc = {}
25
-
26
- super
27
- end
28
-
29
- def and_then(method_name = nil, **injected_value, &block)
30
- super(method_name, injected_value, &block)
31
- end
32
-
33
- def and_then!(source, **injected_value)
34
- _call = injected_value.delete(:_call)
35
-
36
- acc.merge!(injected_value)
37
-
38
- super(source, injected_value, _call: _call)
39
- end
40
-
41
- protected
42
-
43
- attr_reader :acc
44
-
45
- private
46
-
47
- SourceMethodArity = ->(method) do
48
- return 0 if method.arity.zero?
49
-
50
- parameters = method.parameters.map(&:first)
51
-
52
- return 1 if !parameters.empty? && parameters.all?(/\Akey/)
53
-
54
- -1
55
- end
56
-
57
- def call_and_then_source_method!(method, injected_value)
58
- acc.merge!(value.merge(injected_value))
59
-
60
- case SourceMethodArity[method]
61
- when 0 then source.send(method.name)
62
- when 1 then source.send(method.name, **acc)
63
- else raise Error::InvalidSourceMethodArity.build(source: source, method: method, max_arity: 1)
64
- end
65
- end
66
-
67
- def call_and_then_block!(block)
68
- acc.merge!(value)
69
-
70
- block.call(acc)
71
- end
72
-
73
- def call_and_then_callable!(source, value:, injected_value:, method_name:)
74
- acc.merge!(value.merge(injected_value))
75
-
76
- CallableAndThen::Caller.call(source, value: acc, injected_value: injected_value, method_name: method_name)
77
- end
78
-
79
- def ensure_result_object(result, origin:)
80
- raise_unexpected_outcome_error(result, origin) unless result.is_a?(Context)
81
-
82
- return result.tap { _1.acc.merge!(acc) } if result.source.equal?(source)
83
-
84
- raise Error::InvalidResultSource.build(given_result: result, expected_source: source)
85
- end
86
-
87
- def raise_unexpected_outcome_error(result, origin)
88
- raise Error::UnexpectedOutcome.build(outcome: result, origin: origin, expected: EXPECTED_OUTCOME)
89
- end
90
-
91
- private_constant :SourceMethodArity
92
- end
93
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BCDD::Result::Failure::Methods
4
- def success?(_type = nil)
5
- false
6
- end
7
-
8
- def failure?(type = nil)
9
- type.nil? || type_checker.allow_failure?([type])
10
- end
11
-
12
- def value_or
13
- yield(value)
14
- end
15
-
16
- private
17
-
18
- def kind
19
- :failure
20
- end
21
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BCDD::Result::Success::Methods
4
- def success?(type = nil)
5
- type.nil? || type_checker.allow_success?([type])
6
- end
7
-
8
- def failure?(_type = nil)
9
- false
10
- end
11
-
12
- def value_or
13
- value
14
- end
15
-
16
- private
17
-
18
- def kind
19
- :success
20
- end
21
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result
4
- module Transitions
5
- require_relative 'transitions/listener'
6
- require_relative 'transitions/listeners'
7
- require_relative 'transitions/config'
8
- require_relative 'transitions/tree'
9
- require_relative 'transitions/tracking'
10
-
11
- THREAD_VAR_NAME = :bcdd_result_transitions_tracking
12
-
13
- EnsureResult = ->(result) do
14
- return result if result.is_a?(::BCDD::Result)
15
-
16
- raise Error::UnexpectedOutcome.build(outcome: result, origin: :transitions)
17
- end
18
-
19
- def self.tracking
20
- Thread.current[THREAD_VAR_NAME] ||= Tracking.instance
21
- end
22
- end
23
-
24
- def self.transitions(name: nil, desc: nil, &block)
25
- Transitions.tracking.exec(name, desc, &block)
26
- end
27
- end