bcdd-result 0.12.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -2
  3. data/CHANGELOG.md +99 -16
  4. data/README.md +618 -247
  5. data/Rakefile +1 -1
  6. data/Steepfile +4 -4
  7. data/examples/multiple_listeners/Rakefile +55 -0
  8. data/examples/multiple_listeners/app/models/account/member.rb +10 -0
  9. data/examples/multiple_listeners/app/models/account/owner_creation.rb +62 -0
  10. data/examples/multiple_listeners/app/models/account.rb +11 -0
  11. data/examples/multiple_listeners/app/models/user/creation.rb +67 -0
  12. data/examples/multiple_listeners/app/models/user/token/creation.rb +51 -0
  13. data/examples/multiple_listeners/app/models/user/token.rb +7 -0
  14. data/examples/multiple_listeners/app/models/user.rb +15 -0
  15. data/examples/multiple_listeners/config/boot.rb +16 -0
  16. data/examples/multiple_listeners/config/initializers/bcdd.rb +9 -0
  17. data/examples/multiple_listeners/config.rb +27 -0
  18. data/examples/multiple_listeners/db/setup.rb +60 -0
  19. data/examples/multiple_listeners/lib/bcdd/result/event_logs_record.rb +27 -0
  20. data/examples/multiple_listeners/lib/bcdd/result/rollback_on_failure.rb +15 -0
  21. data/examples/multiple_listeners/lib/event_logs_listener/stdout.rb +60 -0
  22. data/examples/multiple_listeners/lib/runtime_breaker.rb +11 -0
  23. data/examples/service_objects/Rakefile +36 -0
  24. data/examples/service_objects/app/models/account/member.rb +10 -0
  25. data/examples/service_objects/app/models/account.rb +11 -0
  26. data/examples/service_objects/app/models/user/token.rb +7 -0
  27. data/examples/service_objects/app/models/user.rb +15 -0
  28. data/examples/service_objects/app/services/account/owner_creation.rb +47 -0
  29. data/examples/service_objects/app/services/application_service.rb +79 -0
  30. data/examples/service_objects/app/services/user/creation.rb +56 -0
  31. data/examples/service_objects/app/services/user/token/creation.rb +37 -0
  32. data/examples/service_objects/config/boot.rb +17 -0
  33. data/examples/service_objects/config/initializers/bcdd.rb +9 -0
  34. data/examples/service_objects/config.rb +20 -0
  35. data/examples/service_objects/db/setup.rb +49 -0
  36. data/examples/single_listener/Rakefile +92 -0
  37. data/examples/single_listener/app/models/account/member.rb +10 -0
  38. data/examples/single_listener/app/models/account/owner_creation.rb +62 -0
  39. data/examples/single_listener/app/models/account.rb +11 -0
  40. data/examples/single_listener/app/models/user/creation.rb +67 -0
  41. data/examples/single_listener/app/models/user/token/creation.rb +51 -0
  42. data/examples/single_listener/app/models/user/token.rb +7 -0
  43. data/examples/single_listener/app/models/user.rb +15 -0
  44. data/examples/single_listener/config/boot.rb +16 -0
  45. data/examples/single_listener/config/initializers/bcdd.rb +9 -0
  46. data/examples/single_listener/config.rb +23 -0
  47. data/examples/single_listener/db/setup.rb +49 -0
  48. data/examples/single_listener/lib/bcdd/result/rollback_on_failure.rb +15 -0
  49. data/examples/single_listener/lib/runtime_breaker.rb +11 -0
  50. data/examples/single_listener/lib/single_event_logs_listener.rb +117 -0
  51. data/lib/bcdd/{result/context → context}/callable_and_then.rb +5 -4
  52. data/lib/bcdd/{result/context → context}/expectations/mixin.rb +3 -3
  53. data/lib/bcdd/{result/context → context}/expectations.rb +2 -2
  54. data/lib/bcdd/context/failure.rb +9 -0
  55. data/lib/bcdd/{result/context → context}/mixin.rb +4 -4
  56. data/lib/bcdd/context/success.rb +37 -0
  57. data/lib/bcdd/context.rb +91 -0
  58. data/lib/bcdd/failure.rb +23 -0
  59. data/lib/bcdd/result/_self.rb +198 -0
  60. data/lib/bcdd/result/callable_and_then/caller.rb +1 -1
  61. data/lib/bcdd/result/config/switchers/addons.rb +2 -2
  62. data/lib/bcdd/result/config/switchers/constant_aliases.rb +1 -3
  63. data/lib/bcdd/result/config/switchers/features.rb +5 -5
  64. data/lib/bcdd/result/config/switchers/pattern_matching.rb +1 -1
  65. data/lib/bcdd/result/config.rb +9 -2
  66. data/lib/bcdd/result/contract/for_types.rb +1 -1
  67. data/lib/bcdd/result/contract/for_types_and_values.rb +2 -0
  68. data/lib/bcdd/result/contract/type_checker.rb +4 -0
  69. data/lib/bcdd/result/event_logs/config.rb +28 -0
  70. data/lib/bcdd/result/event_logs/listener.rb +51 -0
  71. data/lib/bcdd/result/event_logs/listeners.rb +87 -0
  72. data/lib/bcdd/result/event_logs/tracking/disabled.rb +15 -0
  73. data/lib/bcdd/result/event_logs/tracking/enabled.rb +161 -0
  74. data/lib/bcdd/result/event_logs/tracking.rb +26 -0
  75. data/lib/bcdd/result/{transitions → event_logs}/tree.rb +46 -4
  76. data/lib/bcdd/result/event_logs.rb +27 -0
  77. data/lib/bcdd/result/expectations/mixin.rb +2 -2
  78. data/lib/bcdd/result/failure.rb +1 -3
  79. data/lib/bcdd/result/ignored_types.rb +14 -0
  80. data/lib/bcdd/result/mixin.rb +2 -2
  81. data/lib/bcdd/result/success.rb +1 -3
  82. data/lib/bcdd/result/version.rb +1 -1
  83. data/lib/bcdd/result.rb +25 -191
  84. data/lib/bcdd/success.rb +23 -0
  85. data/sig/bcdd/context.rbs +175 -0
  86. data/sig/bcdd/failure.rbs +13 -0
  87. data/sig/bcdd/result/config.rbs +1 -2
  88. data/sig/bcdd/result/context.rbs +2 -165
  89. data/sig/bcdd/result/contract.rbs +1 -0
  90. data/sig/bcdd/result/event_logs.rbs +189 -0
  91. data/sig/bcdd/result/ignored_types.rbs +9 -0
  92. data/sig/bcdd/result.rbs +14 -32
  93. data/sig/bcdd/success.rbs +13 -0
  94. metadata +75 -22
  95. data/lib/bcdd/result/context/failure.rb +0 -9
  96. data/lib/bcdd/result/context/success.rb +0 -19
  97. data/lib/bcdd/result/context.rb +0 -93
  98. data/lib/bcdd/result/failure/methods.rb +0 -21
  99. data/lib/bcdd/result/success/methods.rb +0 -21
  100. data/lib/bcdd/result/transitions/tracking/disabled.rb +0 -27
  101. data/lib/bcdd/result/transitions/tracking/enabled.rb +0 -100
  102. data/lib/bcdd/result/transitions/tracking.rb +0 -20
  103. data/lib/bcdd/result/transitions.rb +0 -28
  104. data/sig/bcdd/result/transitions.rbs +0 -100
@@ -0,0 +1,189 @@
1
+ class BCDD::Result
2
+ module EventLogs
3
+ module Listener
4
+ module ClassMethods
5
+ def around_and_then?: () -> bool
6
+ def around_event_logs?: () -> bool
7
+ end
8
+
9
+ extend ClassMethods
10
+
11
+ def around_event_logs: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
12
+
13
+ def on_start: (scope: Hash[Symbol, untyped]) -> untyped
14
+
15
+ def around_and_then: (scope: Hash[Symbol, untyped], and_then: Hash[Symbol, untyped]) { () -> untyped } -> untyped
16
+
17
+ def on_record: (record: Hash[Symbol, untyped] ) -> untyped
18
+
19
+ def on_finish: (event_logs: Hash[Symbol, untyped] ) -> untyped
20
+
21
+ def before_interruption: (exception: ::Exception, event_logs: Hash[Symbol, untyped]) -> untyped
22
+ end
23
+
24
+ class Listeners
25
+ class Chain
26
+ include Listener
27
+
28
+ attr_reader listeners: Hash[Symbol, untyped]
29
+
30
+ def initialize: (Array[untyped]) -> void
31
+
32
+ def new: () -> Listeners
33
+
34
+ private
35
+
36
+ def listener?: (untyped, untyped) -> bool
37
+ end
38
+
39
+ def self.[]: (*untyped) -> Chain
40
+
41
+ private attr_reader listeners: Array[Listener]
42
+ private attr_reader around_and_then_listener: untyped
43
+ private attr_reader around_event_logs_listener: untyped
44
+
45
+ def initialize: (Array[Listener], untyped, untyped) -> void
46
+
47
+ def around_event_logs: (scope: Hash[Symbol, untyped]) { () -> untyped } -> untyped
48
+
49
+ def on_start: (scope: Hash[Symbol, untyped]) -> untyped
50
+
51
+ def around_and_then: (scope: Hash[Symbol, untyped], and_then: Hash[Symbol, untyped]) { () -> untyped } -> untyped
52
+
53
+ def on_record: (record: Hash[Symbol, untyped] ) -> untyped
54
+
55
+ def on_finish: (event_logs: Hash[Symbol, untyped] ) -> untyped
56
+
57
+ def before_interruption: (exception: ::Exception, event_logs: Hash[Symbol, untyped]) -> untyped
58
+ end
59
+
60
+ module Listener::Null
61
+ extend Listener
62
+
63
+ def self.new: () -> untyped
64
+ end
65
+
66
+ class Config
67
+ attr_reader listener: untyped
68
+ attr_reader trace_id: ::Proc
69
+
70
+ def self.instance: -> Config
71
+
72
+ def initialize: -> void
73
+
74
+ def listener=: (Listener) -> void
75
+ def trace_id=: (::Proc) -> void
76
+ end
77
+
78
+ class Tree
79
+ class Node
80
+ attr_reader id: Integer
81
+ attr_reader value: untyped
82
+ attr_reader parent: (Node | nil)
83
+ attr_reader normalizer: ^(Integer, Array[untyped]) -> untyped
84
+ attr_reader children: Array[Node]
85
+
86
+ def initialize: (
87
+ untyped value,
88
+ parent: (Node | nil),
89
+ id: Integer,
90
+ normalizer: ^(Integer, Array[untyped]) -> untyped
91
+ ) -> void
92
+
93
+ def insert: (untyped, id: Integer) -> Node
94
+
95
+ def root?: () -> bool
96
+ def leaf?: () -> bool
97
+ def node?: () -> bool
98
+ def inspect: () -> String
99
+ end
100
+
101
+ attr_reader size: Integer
102
+ attr_reader root: Node
103
+ attr_reader current: Node
104
+
105
+ def initialize: (untyped, ?normalizer: ^(Integer, Array[untyped]) -> untyped) -> void
106
+ def root_value: () -> untyped
107
+ def parent_value: () -> untyped
108
+ def current_value: () -> untyped
109
+ def insert: (untyped) -> Node
110
+ def insert!: (untyped) -> Tree
111
+ def move_to!: (Node) -> Tree
112
+ def move_up!: (?Integer level) -> Tree
113
+ def move_down!: (?Integer level) -> Tree
114
+ def move_to_root!: () -> Tree
115
+
116
+ Ids: ^(Node) -> Array[untyped]
117
+ IdsMatrix: ::Proc
118
+ IdsLevelParent: ::Proc
119
+
120
+ def ids: () -> Array[untyped]
121
+ def ids_list: () -> Array[Integer]
122
+ def ids_matrix: () -> untyped
123
+ def ids_level_parent: () -> untyped
124
+ end
125
+
126
+ module Tracking
127
+ EMPTY_ARRAY: Array[untyped]
128
+ EMPTY_HASH: Hash[untyped, untyped]
129
+ EMPTY_TREE: EventLogs::Tree
130
+ EMPTY_IDS: Hash[untyped, untyped]
131
+ VERSION: Integer
132
+ EMPTY: Hash[Symbol, untyped]
133
+
134
+ class Enabled
135
+ private attr_accessor tree: EventLogs::Tree
136
+ private attr_accessor records: Array[Hash[Symbol, untyped]]
137
+ private attr_accessor listener: untyped
138
+ private attr_accessor root_started_at: Integer
139
+
140
+ def exec: (untyped, untyped) { () -> untyped } -> untyped
141
+ def err!: (::Exception, untyped) -> void
142
+ def reset!: () -> void
143
+ def record: (BCDD::Result) -> void
144
+ def record_and_then: ((untyped), untyped) { () -> untyped } -> untyped
145
+ def reset_and_then!: () -> void
146
+
147
+ private
148
+
149
+ def start: (String, String) -> [EventLogs::Tree::Node, Hash[Symbol, untyped]]
150
+ def finish: (untyped) -> untyped
151
+
152
+ TreeNodeValueNormalizer: ^(Integer, Array[untyped]) -> untyped
153
+
154
+ def root_start: (Array[untyped]) -> void
155
+
156
+ def track: (BCDD::Result, time: Time) -> void
157
+ def track_record: (BCDD::Result, Time) -> Hash[Symbol, untyped]
158
+
159
+ def now_in_milliseconds: () -> Integer
160
+
161
+ def map_event_logs: () -> Hash[Symbol, untyped]
162
+
163
+ def build_listener: () -> Listener
164
+ end
165
+
166
+ module Disabled
167
+ def self.exec: (untyped, untyped) { () -> untyped } -> untyped
168
+ def self.err!: (::Exception) -> void
169
+ def self.reset!: () -> void
170
+ def self.record: (BCDD::Result) -> void
171
+ def self.record_and_then: ((untyped), untyped) { () -> BCDD::Result } -> BCDD::Result
172
+ def self.reset_and_then!: () -> void
173
+
174
+ private
175
+
176
+ def self.start: (String, String) -> void
177
+ def self.finish: (untyped) -> untyped
178
+ end
179
+
180
+ def self.instance: () -> (Enabled | singleton(Disabled))
181
+ end
182
+
183
+ THREAD_VAR_NAME: Symbol
184
+
185
+ EnsureResult: ^(untyped) -> BCDD::Result
186
+
187
+ def self.tracking: () -> (Tracking::Enabled | singleton(Tracking::Disabled))
188
+ end
189
+ end
@@ -0,0 +1,9 @@
1
+ class BCDD::Result
2
+ module IgnoredTypes
3
+ LIST: ::Set[::Symbol]
4
+ GIVEN: ::Symbol
5
+ CONTINUE: ::Symbol
6
+
7
+ def self.include?: (::Symbol) -> bool
8
+ end
9
+ 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
- def self.configuration: { (BCDD::Result::Config) -> void } -> BCDD::Result::Config
13
- def self.transitions: { () -> untyped } -> BCDD::Result
12
+ def self.configuration: (freeze: bool) { (BCDD::Result::Config) -> void } -> (bool | BCDD::Result::Config)
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,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcdd-result
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 1.0.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-01-08 00:00:00.000000000 Z
11
+ date: 2024-03-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Empower Ruby apps with pragmatic use of Result pattern (monad), Railway
14
- Oriented Programming, and B/CDD.
13
+ description: Unleash a pragmatic and observable use of Result Pattern and Railway-Oriented
14
+ Programming in Ruby.
15
15
  email:
16
16
  - rodrigo.serradura@gmail.com
17
17
  executables: []
@@ -26,8 +26,61 @@ files:
26
26
  - README.md
27
27
  - Rakefile
28
28
  - Steepfile
29
+ - examples/multiple_listeners/Rakefile
30
+ - examples/multiple_listeners/app/models/account.rb
31
+ - examples/multiple_listeners/app/models/account/member.rb
32
+ - examples/multiple_listeners/app/models/account/owner_creation.rb
33
+ - examples/multiple_listeners/app/models/user.rb
34
+ - examples/multiple_listeners/app/models/user/creation.rb
35
+ - examples/multiple_listeners/app/models/user/token.rb
36
+ - examples/multiple_listeners/app/models/user/token/creation.rb
37
+ - examples/multiple_listeners/config.rb
38
+ - examples/multiple_listeners/config/boot.rb
39
+ - examples/multiple_listeners/config/initializers/bcdd.rb
40
+ - examples/multiple_listeners/db/setup.rb
41
+ - examples/multiple_listeners/lib/bcdd/result/event_logs_record.rb
42
+ - examples/multiple_listeners/lib/bcdd/result/rollback_on_failure.rb
43
+ - examples/multiple_listeners/lib/event_logs_listener/stdout.rb
44
+ - examples/multiple_listeners/lib/runtime_breaker.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
58
+ - examples/single_listener/Rakefile
59
+ - examples/single_listener/app/models/account.rb
60
+ - examples/single_listener/app/models/account/member.rb
61
+ - examples/single_listener/app/models/account/owner_creation.rb
62
+ - examples/single_listener/app/models/user.rb
63
+ - examples/single_listener/app/models/user/creation.rb
64
+ - examples/single_listener/app/models/user/token.rb
65
+ - examples/single_listener/app/models/user/token/creation.rb
66
+ - examples/single_listener/config.rb
67
+ - examples/single_listener/config/boot.rb
68
+ - examples/single_listener/config/initializers/bcdd.rb
69
+ - examples/single_listener/db/setup.rb
70
+ - examples/single_listener/lib/bcdd/result/rollback_on_failure.rb
71
+ - examples/single_listener/lib/runtime_breaker.rb
72
+ - examples/single_listener/lib/single_event_logs_listener.rb
29
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
30
82
  - lib/bcdd/result.rb
83
+ - lib/bcdd/result/_self.rb
31
84
  - lib/bcdd/result/callable_and_then.rb
32
85
  - lib/bcdd/result/callable_and_then/caller.rb
33
86
  - lib/bcdd/result/callable_and_then/config.rb
@@ -39,13 +92,6 @@ files:
39
92
  - lib/bcdd/result/config/switchers/constant_aliases.rb
40
93
  - lib/bcdd/result/config/switchers/features.rb
41
94
  - lib/bcdd/result/config/switchers/pattern_matching.rb
42
- - lib/bcdd/result/context.rb
43
- - lib/bcdd/result/context/callable_and_then.rb
44
- - lib/bcdd/result/context/expectations.rb
45
- - lib/bcdd/result/context/expectations/mixin.rb
46
- - lib/bcdd/result/context/failure.rb
47
- - lib/bcdd/result/context/mixin.rb
48
- - lib/bcdd/result/context/success.rb
49
95
  - lib/bcdd/result/contract.rb
50
96
  - lib/bcdd/result/contract/disabled.rb
51
97
  - lib/bcdd/result/contract/error.rb
@@ -56,21 +102,26 @@ files:
56
102
  - lib/bcdd/result/contract/type_checker.rb
57
103
  - lib/bcdd/result/data.rb
58
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
59
113
  - lib/bcdd/result/expectations.rb
60
114
  - lib/bcdd/result/expectations/mixin.rb
61
115
  - lib/bcdd/result/failure.rb
62
- - lib/bcdd/result/failure/methods.rb
63
116
  - lib/bcdd/result/handler.rb
64
117
  - lib/bcdd/result/handler/allowed_types.rb
118
+ - lib/bcdd/result/ignored_types.rb
65
119
  - lib/bcdd/result/mixin.rb
66
120
  - lib/bcdd/result/success.rb
67
- - lib/bcdd/result/success/methods.rb
68
- - lib/bcdd/result/transitions.rb
69
- - lib/bcdd/result/transitions/tracking.rb
70
- - lib/bcdd/result/transitions/tracking/disabled.rb
71
- - lib/bcdd/result/transitions/tracking/enabled.rb
72
- - lib/bcdd/result/transitions/tree.rb
73
121
  - lib/bcdd/result/version.rb
122
+ - lib/bcdd/success.rb
123
+ - sig/bcdd/context.rbs
124
+ - sig/bcdd/failure.rbs
74
125
  - sig/bcdd/result.rbs
75
126
  - sig/bcdd/result/callable_and_then.rbs
76
127
  - sig/bcdd/result/config.rbs
@@ -78,11 +129,13 @@ files:
78
129
  - sig/bcdd/result/contract.rbs
79
130
  - sig/bcdd/result/data.rbs
80
131
  - sig/bcdd/result/error.rbs
132
+ - sig/bcdd/result/event_logs.rbs
81
133
  - sig/bcdd/result/expectations.rbs
82
134
  - sig/bcdd/result/handler.rbs
135
+ - sig/bcdd/result/ignored_types.rbs
83
136
  - sig/bcdd/result/mixin.rbs
84
- - sig/bcdd/result/transitions.rbs
85
137
  - sig/bcdd/result/version.rbs
138
+ - sig/bcdd/success.rbs
86
139
  homepage: https://github.com/b-cdd/result
87
140
  licenses:
88
141
  - MIT
@@ -107,9 +160,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
160
  - !ruby/object:Gem::Version
108
161
  version: '0'
109
162
  requirements: []
110
- rubygems_version: 3.5.3
163
+ rubygems_version: 3.5.6
111
164
  signing_key:
112
165
  specification_version: 4
113
- summary: Empower Ruby apps with pragmatic use of Result pattern (monad), Railway Oriented
114
- Programming, and B/CDD.
166
+ summary: Unleash a pragmatic and observable use of Result Pattern and Railway-Oriented
167
+ Programming in Ruby.
115
168
  test_files: []
@@ -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,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result
4
- class Context::Success < Context
5
- include ::BCDD::Result::Success::Methods
6
-
7
- def and_expose(type, keys, terminal: true)
8
- unless keys.is_a?(::Array) && !keys.empty? && keys.all?(::Symbol)
9
- raise ::ArgumentError, 'keys must be an Array of Symbols'
10
- end
11
-
12
- Transitions.tracking.reset_and_then!
13
-
14
- exposed_value = acc.merge(value).slice(*keys)
15
-
16
- self.class.new(type: type, value: exposed_value, source: source, terminal: terminal)
17
- end
18
- end
19
- 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
- module BCDD::Result::Transitions
4
- module Tracking::Disabled
5
- def self.exec(_name, _desc)
6
- EnsureResult[yield]
7
- end
8
-
9
- def self.reset!; end
10
-
11
- def self.record(result); end
12
-
13
- def self.record_and_then(_type, _data, _source)
14
- yield
15
- end
16
-
17
- def self.reset_and_then!; end
18
-
19
- class << self
20
- private
21
-
22
- def start(name, desc); end
23
-
24
- def finish(result); end
25
- end
26
- end
27
- end