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
@@ -1,100 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BCDD::Result::Transitions
4
- class Tracking::Enabled
5
- attr_accessor :tree, :records, :root_started_at
6
-
7
- private :tree, :tree=, :records, :records=, :root_started_at, :root_started_at=
8
-
9
- def exec(name, desc)
10
- start(name, desc)
11
-
12
- transition_node = tree.current
13
-
14
- result = EnsureResult[yield]
15
-
16
- tree.move_to_root! if transition_node.root?
17
-
18
- finish(result)
19
-
20
- result
21
- end
22
-
23
- def reset!
24
- self.tree = Tracking::EMPTY_TREE
25
- end
26
-
27
- def record(result)
28
- return if tree.frozen?
29
-
30
- track(result, time: ::Time.now.getutc)
31
- end
32
-
33
- def record_and_then(type_arg, arg, source)
34
- type = type_arg.instance_of?(::Method) ? :method : type_arg
35
-
36
- unless tree.frozen?
37
- current_and_then = { type: type, arg: arg, source: source }
38
- current_and_then[:method_name] = type_arg.name if type == :method
39
-
40
- tree.current.value[1] = current_and_then
41
- end
42
-
43
- yield
44
- end
45
-
46
- def reset_and_then!
47
- return if tree.frozen?
48
-
49
- tree.current.value[1] = Tracking::EMPTY_HASH
50
- end
51
-
52
- private
53
-
54
- def start(name, desc)
55
- name_and_desc = [name, desc]
56
-
57
- tree.frozen? ? root_start(name_and_desc) : tree.insert!(name_and_desc)
58
- end
59
-
60
- def finish(result)
61
- node = tree.current
62
-
63
- tree.move_up!
64
-
65
- return unless node.root?
66
-
67
- duration = (now_in_milliseconds - root_started_at)
68
-
69
- metadata = { duration: duration, tree_map: tree.nested_ids }
70
-
71
- result.send(:transitions=, version: Tracking::VERSION, records: records, metadata: metadata)
72
-
73
- reset!
74
- end
75
-
76
- TreeNodeValueNormalizer = ->(id, (nam, des)) { [{ id: id, name: nam, desc: des }, Tracking::EMPTY_HASH] }
77
-
78
- def root_start(name_and_desc)
79
- self.root_started_at = now_in_milliseconds
80
-
81
- self.records = []
82
-
83
- self.tree = Tree.new(name_and_desc, normalizer: TreeNodeValueNormalizer)
84
- end
85
-
86
- def track(result, time:)
87
- result = result.data.to_h
88
-
89
- root, = tree.root_value
90
- parent, = tree.parent_value
91
- current, and_then = tree.current_value
92
-
93
- records << { root: root, parent: parent, current: current, result: result, and_then: and_then, time: time }
94
- end
95
-
96
- def now_in_milliseconds
97
- ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :millisecond)
98
- end
99
- end
100
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result
4
- module Transitions
5
- module Tracking
6
- require_relative 'tracking/enabled'
7
- require_relative 'tracking/disabled'
8
-
9
- EMPTY_ARRAY = [].freeze
10
- EMPTY_HASH = {}.freeze
11
- EMPTY_TREE = Tree.new(nil).freeze
12
- VERSION = 1
13
- EMPTY = { version: VERSION, records: EMPTY_ARRAY, metadata: { duration: 0, tree_map: EMPTY_ARRAY } }.freeze
14
-
15
- def self.instance
16
- Config.instance.feature.enabled?(:transitions) ? Tracking::Enabled.new : Tracking::Disabled
17
- end
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class BCDD::Result
4
- module Transitions
5
- require_relative 'transitions/tree'
6
- require_relative 'transitions/tracking'
7
-
8
- THREAD_VAR_NAME = :bcdd_result_transitions_tracking
9
-
10
- EnsureResult = ->(result) do
11
- return result if result.is_a?(::BCDD::Result)
12
-
13
- raise Error::UnexpectedOutcome.build(outcome: result, origin: :transitions)
14
- end
15
-
16
- def self.tracking
17
- Thread.current[THREAD_VAR_NAME] ||= Tracking.instance
18
- end
19
- end
20
-
21
- def self.transitions(name: nil, desc: nil, &block)
22
- Transitions.tracking.exec(name, desc, &block)
23
- rescue ::Exception => e
24
- Transitions.tracking.reset!
25
-
26
- raise e
27
- end
28
- end
@@ -1,100 +0,0 @@
1
- class BCDD::Result
2
- module Transitions
3
- class Tree
4
- class Node
5
- attr_reader id: Integer
6
- attr_reader value: untyped
7
- attr_reader parent: (Node | nil)
8
- attr_reader normalizer: ^(Integer, Array[untyped]) -> untyped
9
- attr_reader children: Array[Node]
10
-
11
- def initialize: (
12
- untyped value,
13
- parent: (Node | nil),
14
- id: Integer,
15
- normalizer: ^(Integer, Array[untyped]) -> untyped
16
- ) -> void
17
-
18
- def insert: (untyped, id: Integer) -> Node
19
-
20
- def root?: () -> bool
21
- def leaf?: () -> bool
22
- def node?: () -> bool
23
- def inspect: () -> String
24
- end
25
-
26
- attr_reader size: Integer
27
- attr_reader root: Node
28
- attr_reader current: Node
29
-
30
- def initialize: (untyped, ?normalizer: ^(Integer, Array[untyped]) -> untyped) -> void
31
- def root_value: () -> untyped
32
- def parent_value: () -> untyped
33
- def current_value: () -> untyped
34
- def insert: (untyped) -> Node
35
- def insert!: (untyped) -> Tree
36
- def move_to!: (Node) -> Tree
37
- def move_up!: (?Integer level) -> Tree
38
- def move_down!: (?Integer level) -> Tree
39
- def move_to_root!: () -> Tree
40
-
41
- NestedIds: ^(Node) -> Array[untyped]
42
-
43
- def nested_ids: () -> Array[untyped]
44
- end
45
-
46
- module Tracking
47
- EMPTY_ARRAY: Array[untyped]
48
- EMPTY_HASH: Hash[untyped, untyped]
49
- EMPTY_TREE: Transitions::Tree
50
- VERSION: Integer
51
- EMPTY: Hash[Symbol, untyped]
52
-
53
- class Enabled
54
- private attr_accessor tree: Transitions::Tree
55
- private attr_accessor records: Array[Hash[Symbol, untyped]]
56
- private attr_accessor root_started_at: Integer
57
-
58
- def exec: (String, String) { () -> untyped } -> BCDD::Result
59
- def reset!: () -> void
60
- def record: (BCDD::Result) -> void
61
- def record_and_then: ((untyped), untyped, untyped) { () -> BCDD::Result } -> BCDD::Result
62
- def reset_and_then!: () -> void
63
-
64
- private
65
-
66
- def start: (String, String) -> void
67
- def finish: (BCDD::Result) -> void
68
-
69
- TreeNodeValueNormalizer: ^(Integer, Array[untyped]) -> untyped
70
-
71
- def root_start: (Array[untyped]) -> void
72
-
73
- def track: (BCDD::Result, time: Time) -> void
74
-
75
- def now_in_milliseconds: () -> Integer
76
- end
77
-
78
- module Disabled
79
- def self.exec: (String, String) { () -> untyped } -> BCDD::Result
80
- def self.reset!: () -> void
81
- def self.record: (BCDD::Result) -> void
82
- def self.record_and_then: ((untyped), untyped, untyped) { () -> BCDD::Result } -> BCDD::Result
83
- def self.reset_and_then!: () -> void
84
-
85
- private
86
-
87
- def self.start: (String, String) -> void
88
- def self.finish: (BCDD::Result) -> void
89
- end
90
-
91
- def self.instance: () -> (Enabled | singleton(Disabled))
92
- end
93
-
94
- THREAD_VAR_NAME: Symbol
95
-
96
- EnsureResult: ^(untyped) -> BCDD::Result
97
-
98
- def self.tracking: () -> (Tracking::Enabled | singleton(Tracking::Disabled))
99
- end
100
- end