foobara 0.0.135 → 0.0.136
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/projects/callback/src/registry/chained_conditioned.rb +1 -3
- data/projects/callback/src/registry/joined_conditioned.rb +28 -0
- data/projects/command/src/command_pattern_implementation/concerns/callbacks.rb +63 -46
- data/projects/command/src/command_pattern_implementation/concerns/state_machine.rb +10 -1
- data/projects/command_connectors/src/transformed_command.rb +0 -2
- data/projects/command_connectors/src/transformers/load_aggregates_pre_commit_transformer.rb +4 -21
- data/projects/command_connectors/src/transformers/load_aggregates_transformer.rb +30 -0
- data/projects/command_connectors/src/transformers/load_atoms_pre_commit_transformer.rb +4 -22
- data/projects/command_connectors/src/transformers/load_atoms_transformer.rb +31 -0
- data/projects/common/src/error.rb +4 -0
- data/projects/common/src/error_key.rb +1 -1
- data/projects/domain/src/domain_module_extension.rb +0 -1
- data/projects/domain/src/organization.rb +0 -1
- data/projects/entity/lib/foobara/entity.rb +1 -1
- data/projects/entity/src/association_depth.rb +7 -0
- data/projects/foobara/src/foobara.rb +9 -0
- data/projects/manifest/src/foobara/manifest/possible_error.rb +0 -2
- data/projects/model/src/model.rb +0 -3
- data/projects/namespace/src/namespace.rb +0 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f944c52f318016bd2742fb96208d11a2647d4802ee0a1ac4fbb5b353c5d6ad4
|
4
|
+
data.tar.gz: 5c7560766afe430188cd41053ce9f470eae20605dba8dde824432b760e6aa336
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bf5da1d2282282a3d17eb44a0f8ca815c525800f71de56a05ed1c1b66babf5662293a0549df8a2ba6ee88da6cca7fe334f7a852d82b010afcf05f6d21ba1541
|
7
|
+
data.tar.gz: 1444d194eaa3389270cdd23422ec294a59f523e1a71291a92551951987b54c7e316ce724465f7d0fa1151e5c7c2bad84879435eac2908c402f1c3ee888224c5f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [0.0.136] - 2025-07-06
|
2
|
+
|
3
|
+
- Do not allow calling Foobara.reset_alls in production
|
4
|
+
- Fix an error backtrace bug
|
5
|
+
- Separate Atom/Aggregate request versus object behavior in precommit transformers
|
6
|
+
- Fix busted command-class-level state machine callbacks
|
7
|
+
|
1
8
|
# [0.0.135] - 2025-07-01
|
2
9
|
|
3
10
|
- Eliminate Monorepo project
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "joined_conditioned"
|
2
2
|
|
3
3
|
module Foobara
|
4
4
|
module Callback
|
@@ -6,8 +6,6 @@ module Foobara
|
|
6
6
|
class ChainedConditioned < Conditioned
|
7
7
|
attr_accessor :other_conditions_registry
|
8
8
|
|
9
|
-
class InvalidConditions < StandardError; end
|
10
|
-
|
11
9
|
foobara_delegate :possible_conditions, :possible_condition_keys, to: :other_conditions_registry
|
12
10
|
|
13
11
|
def initialize(other_conditions_registry)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative "conditioned"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module Callback
|
5
|
+
module Registry
|
6
|
+
class JoinedConditioned < Conditioned
|
7
|
+
attr_accessor :first, :second
|
8
|
+
|
9
|
+
foobara_delegate :possible_conditions, :possible_condition_keys, to: :first
|
10
|
+
|
11
|
+
def initialize(first, second)
|
12
|
+
self.first = first
|
13
|
+
self.second = second
|
14
|
+
|
15
|
+
super(possible_conditions)
|
16
|
+
end
|
17
|
+
|
18
|
+
def unioned_callback_set_for(...)
|
19
|
+
super.union(
|
20
|
+
first.unioned_callback_set_for(...).union(
|
21
|
+
second.unioned_callback_set_for(...)
|
22
|
+
)
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "../../state_machine"
|
2
|
+
|
1
3
|
module Foobara
|
2
4
|
module CommandPatternImplementation
|
3
5
|
module Concerns
|
@@ -17,75 +19,90 @@ module Foobara
|
|
17
19
|
subclass_defined_callbacks.register_callback(:after, &)
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
+
def state_machine_callback_registry
|
23
|
+
return @state_machine_callback_registry if defined?(@state_machine_callback_registry)
|
24
|
+
|
25
|
+
@state_machine_callback_registry = if superclass.respond_to?(:state_machine_callback_registry)
|
26
|
+
Callback::Registry::ChainedConditioned.new(
|
27
|
+
superclass.state_machine_callback_registry
|
28
|
+
)
|
29
|
+
else
|
30
|
+
Callback::Registry::Conditioned.new(
|
31
|
+
from: Foobara::Command::StateMachine.states,
|
32
|
+
transition: Foobara::Command::StateMachine.transitions,
|
33
|
+
to: Foobara::Command::StateMachine.states
|
34
|
+
)
|
35
|
+
end
|
22
36
|
end
|
23
37
|
|
24
|
-
|
38
|
+
def remove_all_callbacks
|
39
|
+
Foobara::Command::StateMachine.remove_all_callbacks
|
40
|
+
if defined?(@state_machine_callback_registry)
|
41
|
+
remove_instance_variable(:@state_machine_callback_registry)
|
42
|
+
end
|
43
|
+
end
|
25
44
|
end
|
26
45
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
target.define_method "#{type}_any_transition" do |&block|
|
33
|
-
callback_state_machine_target.register_transition_callback(type) do |state_machine:, **args|
|
34
|
-
block.call(command: state_machine.owner, **args)
|
35
|
-
end
|
46
|
+
[self, ClassMethods].each do |target|
|
47
|
+
[:before, :after].each do |type|
|
48
|
+
target.define_method "#{type}_any_transition" do |&block|
|
49
|
+
state_machine_callback_registry.register_callback(type) do |state_machine:, **args|
|
50
|
+
block.call(command: state_machine.owner, **args)
|
36
51
|
end
|
37
52
|
end
|
53
|
+
end
|
38
54
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
55
|
+
target.define_method "around_any_transition" do |&block|
|
56
|
+
state_machine_callback_registry.register_callback(
|
57
|
+
:around
|
58
|
+
) do |state_machine:, **args, &do_transition_block|
|
59
|
+
block.call(command: state_machine.owner, **args, &do_transition_block)
|
45
60
|
end
|
61
|
+
end
|
46
62
|
|
47
|
-
|
48
|
-
|
49
|
-
|
63
|
+
target.define_method :error_any_transition do |&block|
|
64
|
+
state_machine_callback_registry.register_callback(:error) do |error|
|
65
|
+
callback_data = error.callback_data
|
50
66
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
67
|
+
state_machine = callback_data[:state_machine]
|
68
|
+
command = state_machine.owner
|
69
|
+
from = callback_data[:from]
|
70
|
+
transition = callback_data[:transition]
|
71
|
+
to = callback_data[:to]
|
56
72
|
|
57
|
-
|
58
|
-
end
|
73
|
+
block.call(error:, command:, state_machine:, from:, to:, transition:)
|
59
74
|
end
|
60
75
|
end
|
76
|
+
end
|
61
77
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
78
|
+
Foobara::Command::StateMachine.transitions.each do |transition|
|
79
|
+
[self, ClassMethods].each do |target|
|
80
|
+
[:before, :after].each do |type|
|
81
|
+
target.define_method "#{type}_#{transition}" do |&block|
|
82
|
+
state_machine_callback_registry.register_callback(
|
83
|
+
type, transition:
|
84
|
+
) do |state_machine:, **args|
|
85
|
+
block.call(command: state_machine.owner, **args)
|
71
86
|
end
|
72
87
|
end
|
88
|
+
end
|
73
89
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
90
|
+
target.define_method "around_#{transition}" do |&block|
|
91
|
+
state_machine_callback_registry.register_callback(
|
92
|
+
:around, transition:
|
93
|
+
) do |state_machine:, **args, &do_transition_block|
|
94
|
+
block.call(command: state_machine.owner, **args, &do_transition_block)
|
80
95
|
end
|
81
96
|
end
|
82
97
|
end
|
83
98
|
end
|
84
99
|
|
85
|
-
|
100
|
+
def state_machine_callback_registry
|
101
|
+
state_machine.callback_registry
|
102
|
+
end
|
86
103
|
|
87
|
-
|
88
|
-
|
104
|
+
on_include do
|
105
|
+
self.subclass_defined_callbacks ||= Foobara::Callback::Registry::SingleAction.new
|
89
106
|
end
|
90
107
|
end
|
91
108
|
end
|
@@ -3,8 +3,17 @@ module Foobara
|
|
3
3
|
module Concerns
|
4
4
|
module StateMachine
|
5
5
|
def state_machine
|
6
|
+
return @state_machine if defined?(@state_machine)
|
7
|
+
|
6
8
|
# It makes me nervous to pass self around. Seems like a design smell.
|
7
|
-
@state_machine
|
9
|
+
@state_machine = Foobara::Command::StateMachine.new(owner: self)
|
10
|
+
|
11
|
+
@state_machine.callback_registry = Callback::Registry::JoinedConditioned.new(
|
12
|
+
@state_machine.callback_registry,
|
13
|
+
self.class.state_machine_callback_registry
|
14
|
+
)
|
15
|
+
|
16
|
+
@state_machine
|
8
17
|
end
|
9
18
|
end
|
10
19
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Foobara
|
2
2
|
# TODO: feels so strange that this doesn't inherit from command
|
3
|
-
# TODO: move this to command connectors project
|
4
3
|
class TransformedCommand
|
5
4
|
class << self
|
6
5
|
# TODO: handle errors_transformers!
|
@@ -752,7 +751,6 @@ module Foobara
|
|
752
751
|
self.outcome = outcome if outcome
|
753
752
|
rescue => e
|
754
753
|
if capture_unknown_error
|
755
|
-
# TODO: move to superclass?
|
756
754
|
self.outcome = Outcome.error(CommandConnector::UnknownError.for(e))
|
757
755
|
else
|
758
756
|
# :nocov:
|
@@ -1,35 +1,18 @@
|
|
1
|
+
require_relative "load_aggregates_transformer"
|
2
|
+
|
1
3
|
module Foobara
|
2
4
|
module CommandConnectors
|
3
5
|
module Transformers
|
4
|
-
class LoadAggregatesPreCommitTransformer <
|
6
|
+
class LoadAggregatesPreCommitTransformer < LoadAggregatesTransformer
|
5
7
|
def applicable?(request)
|
6
8
|
request.command.outcome.success?
|
7
9
|
end
|
8
10
|
|
9
11
|
def transform(request)
|
10
|
-
|
12
|
+
super(request.command.outcome.result)
|
11
13
|
|
12
14
|
request
|
13
15
|
end
|
14
|
-
|
15
|
-
def load_aggregates(object)
|
16
|
-
case object
|
17
|
-
when Entity
|
18
|
-
object.class.load_aggregate(object)
|
19
|
-
when Array
|
20
|
-
object.each do |element|
|
21
|
-
load_aggregates(element)
|
22
|
-
end
|
23
|
-
when Hash
|
24
|
-
object.each_key do |key|
|
25
|
-
load_aggregates(key)
|
26
|
-
end
|
27
|
-
|
28
|
-
object.each_value do |value|
|
29
|
-
load_aggregates(value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
16
|
end
|
34
17
|
end
|
35
18
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Foobara
|
2
|
+
module CommandConnectors
|
3
|
+
module Transformers
|
4
|
+
class LoadAggregatesTransformer < Value::Transformer
|
5
|
+
def transform(object)
|
6
|
+
load_aggregates(object)
|
7
|
+
end
|
8
|
+
|
9
|
+
def load_aggregates(object)
|
10
|
+
case object
|
11
|
+
when Entity
|
12
|
+
object.class.load_aggregate(object)
|
13
|
+
when Array
|
14
|
+
object.each do |element|
|
15
|
+
load_aggregates(element)
|
16
|
+
end
|
17
|
+
when Hash
|
18
|
+
object.each_key do |key|
|
19
|
+
load_aggregates(key)
|
20
|
+
end
|
21
|
+
|
22
|
+
object.each_value do |value|
|
23
|
+
load_aggregates(value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,36 +1,18 @@
|
|
1
|
+
require_relative "load_atoms_transformer"
|
2
|
+
|
1
3
|
module Foobara
|
2
4
|
module CommandConnectors
|
3
5
|
module Transformers
|
4
|
-
class LoadAtomsPreCommitTransformer <
|
6
|
+
class LoadAtomsPreCommitTransformer < LoadAtomsTransformer
|
5
7
|
def applicable?(request)
|
6
8
|
request.command.outcome.success?
|
7
9
|
end
|
8
10
|
|
9
11
|
def transform(request)
|
10
|
-
|
12
|
+
super(request.command.outcome.result)
|
11
13
|
|
12
14
|
request
|
13
15
|
end
|
14
|
-
|
15
|
-
def load_atoms(object)
|
16
|
-
case object
|
17
|
-
when Entity
|
18
|
-
if object.persisted? && !object.loaded?
|
19
|
-
object.class.load(object)
|
20
|
-
end
|
21
|
-
when Model
|
22
|
-
load_atoms(object.attributes)
|
23
|
-
when Array
|
24
|
-
object.each do |element|
|
25
|
-
load_atoms(element)
|
26
|
-
end
|
27
|
-
when Hash
|
28
|
-
object.each_pair do |key, value|
|
29
|
-
load_atoms(key)
|
30
|
-
load_atoms(value)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
16
|
end
|
35
17
|
end
|
36
18
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Foobara
|
2
|
+
module CommandConnectors
|
3
|
+
module Transformers
|
4
|
+
class LoadAtomsTransformer < Value::Transformer
|
5
|
+
def transform(object)
|
6
|
+
load_atoms(object)
|
7
|
+
end
|
8
|
+
|
9
|
+
def load_atoms(object)
|
10
|
+
case object
|
11
|
+
when Entity
|
12
|
+
if object.persisted? && !object.loaded?
|
13
|
+
object.class.load(object)
|
14
|
+
end
|
15
|
+
when Model
|
16
|
+
load_atoms(object.attributes)
|
17
|
+
when Array
|
18
|
+
object.each do |element|
|
19
|
+
load_atoms(element)
|
20
|
+
end
|
21
|
+
when Hash
|
22
|
+
object.each_pair do |key, value|
|
23
|
+
load_atoms(key)
|
24
|
+
load_atoms(value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -231,6 +231,10 @@ module Foobara
|
|
231
231
|
has_build_error = false
|
232
232
|
|
233
233
|
1.upto(10) do |i|
|
234
|
+
backtrace_line = backtrace_when_initialized[i]
|
235
|
+
|
236
|
+
break unless backtrace_line
|
237
|
+
|
234
238
|
if backtrace_when_initialized[i].end_with?("#build_error'")
|
235
239
|
index = i + 1
|
236
240
|
has_build_error = true
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Foobara
|
2
|
-
# TODO: I think we should have a configuration that indicates if created records can have primary keys
|
2
|
+
# TODO: I think we should have a configuration that indicates if created records can have primary keys passed to them
|
3
3
|
# or not. That is, do primary keys get issued by the database upon insertion? Or are they generated externally
|
4
4
|
# and passed in? Would be nice to have programmatic clarification via explicit configuration.
|
5
5
|
class Entity < DetachedEntity
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require_relative "project"
|
2
2
|
|
3
3
|
module Foobara
|
4
|
+
class MethodCantBeCalledInProductionError < StandardError; end
|
5
|
+
|
4
6
|
class << self
|
5
7
|
def require_project_file(project, path)
|
6
8
|
require_relative("../../#{project}/src/#{path}")
|
@@ -47,7 +49,14 @@ module Foobara
|
|
47
49
|
end
|
48
50
|
|
49
51
|
def reset_alls
|
52
|
+
raise_if_production!("reset_alls")
|
50
53
|
all_projects.each_value(&:reset_all)
|
51
54
|
end
|
55
|
+
|
56
|
+
def raise_if_production!(*)
|
57
|
+
if ENV["FOOBARA_ENV"].nil? || ENV["FOOBARA_ENV"] == "production"
|
58
|
+
raise MethodCantBeCalledInProductionError
|
59
|
+
end
|
60
|
+
end
|
52
61
|
end
|
53
62
|
end
|
data/projects/model/src/model.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
require "inheritable_thread_vars"
|
2
2
|
|
3
3
|
module Foobara
|
4
|
-
# TODO: either make this an abstract base class of ValueModel and Entity or rename it to ValueModel
|
5
|
-
# and have Entity inherit from it...
|
6
|
-
# TODO: also, why is this at the root level instead of in a project??
|
7
4
|
class Model
|
8
5
|
class NoSuchAttributeError < StandardError; end
|
9
6
|
class AttributeIsImmutableError < StandardError; end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foobara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.136
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- projects/callback/src/registry/chained_conditioned.rb
|
156
156
|
- projects/callback/src/registry/chained_multiple_action.rb
|
157
157
|
- projects/callback/src/registry/conditioned.rb
|
158
|
+
- projects/callback/src/registry/joined_conditioned.rb
|
158
159
|
- projects/callback/src/registry/multiple_action.rb
|
159
160
|
- projects/callback/src/registry/single_action.rb
|
160
161
|
- projects/callback/src/runner.rb
|
@@ -231,7 +232,9 @@ files:
|
|
231
232
|
- projects/command_connectors/src/transformers/auth_errors_transformer.rb
|
232
233
|
- projects/command_connectors/src/transformers/entity_to_primary_key_inputs_transformer.rb
|
233
234
|
- projects/command_connectors/src/transformers/load_aggregates_pre_commit_transformer.rb
|
235
|
+
- projects/command_connectors/src/transformers/load_aggregates_transformer.rb
|
234
236
|
- projects/command_connectors/src/transformers/load_atoms_pre_commit_transformer.rb
|
237
|
+
- projects/command_connectors/src/transformers/load_atoms_transformer.rb
|
235
238
|
- projects/command_connectors/src/transformers/load_delegated_attributes_entities_pre_commit_transformer.rb
|
236
239
|
- projects/common/lib/foobara/common.rb
|
237
240
|
- projects/common/src/data_path.rb
|
@@ -288,6 +291,7 @@ files:
|
|
288
291
|
- projects/domain_mapper/src/domain_mapper.rb
|
289
292
|
- projects/domain_mapper/src/domain_mapper_lookups.rb
|
290
293
|
- projects/entity/lib/foobara/entity.rb
|
294
|
+
- projects/entity/src/association_depth.rb
|
291
295
|
- projects/entity/src/concerns/attributes.rb
|
292
296
|
- projects/entity/src/concerns/callbacks.rb
|
293
297
|
- projects/entity/src/concerns/initialization.rb
|