foobara 0.0.47 → 0.0.49
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/projects/command/src/concerns/errors.rb +2 -2
- data/projects/command/src/concerns/inputs.rb +3 -2
- data/projects/detached_entity/src/concerns/associations.rb +12 -3
- data/projects/detached_entity/src/concerns/primary_key.rb +6 -4
- data/projects/detached_entity/src/concerns/types.rb +4 -2
- data/projects/entity/src/entity.rb +0 -1
- data/projects/foobara/lib/foobara/all.rb +1 -0
- data/projects/manifest/src/foobara/manifest/type.rb +1 -1
- data/projects/model/src/concerns/types.rb +3 -1
- data/projects/model_attribute_helpers/lib/foobara/model_attribute_helpers.rb +16 -0
- data/projects/model_attribute_helpers/src/attribute_helper_aliases.rb +30 -0
- data/projects/{entity/src/concerns → model_attribute_helpers/src}/attribute_helpers.rb +51 -30
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c906fa3ff55b19d33976a861a7d249aaf8b869507ba845cd8743459653fc117f
|
4
|
+
data.tar.gz: 86da929e2ed3d0b478067f27e7605060941a593eb8c5c95298304d3cf048fc45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04424105e5a0d9788839c40c3689ae34d8f1c39192128cf6e30a8c85e326fb3f5aa0b02a11cec7ac374ae62862cd941bb774db423d01e6e912b4a1a21977b3c2
|
7
|
+
data.tar.gz: 4030da0e998f344b19a453a624481189dbf432654c8af7a63a5197eeeb281d7a64df683c4babfcb59abad342a5b436036d61eda8bb760a0d011aa30cac1b780b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [0.0.49] - 2025-01-21
|
2
|
+
|
3
|
+
- Fill out more foobara_ model attribute helper methods to further support the ActiveRecordType gem
|
4
|
+
|
5
|
+
## [0.0.48] - 2025-01-17
|
6
|
+
|
7
|
+
- Add support for foobara_attributes_type to allow ActiveRecordType gem to work
|
8
|
+
|
1
9
|
## [0.0.47] - 2025-01-03
|
2
10
|
|
3
11
|
- Bumped Ruby from 3.2.2 to 3.4.1
|
@@ -91,7 +91,7 @@ module Foobara
|
|
91
91
|
|
92
92
|
error_class = self.class.lookup_input_error_class(symbol, path)
|
93
93
|
error_class.new(**error_args, path:)
|
94
|
-
elsif
|
94
|
+
elsif [2, 3].include?(args.size)
|
95
95
|
input, symbol, message = args
|
96
96
|
context = opts
|
97
97
|
|
@@ -143,7 +143,7 @@ module Foobara
|
|
143
143
|
|
144
144
|
error_class = self.class.lookup_runtime_error_class(symbol)
|
145
145
|
error_class.new(**error_args)
|
146
|
-
elsif args.is_a?(::Array) &&
|
146
|
+
elsif args.is_a?(::Array) && [1, 2].include?(args.size)
|
147
147
|
symbol, message = args
|
148
148
|
context = opts
|
149
149
|
|
@@ -2,6 +2,8 @@ module Foobara
|
|
2
2
|
class Command
|
3
3
|
module Concerns
|
4
4
|
module Inputs
|
5
|
+
class UnexpectedInputValidationError < StandardError; end
|
6
|
+
|
5
7
|
include Concern
|
6
8
|
|
7
9
|
attr_reader :inputs
|
@@ -41,9 +43,8 @@ module Foobara
|
|
41
43
|
if error.is_a?(Value::DataError)
|
42
44
|
add_input_error(error)
|
43
45
|
else
|
44
|
-
# TODO: raise a real error
|
45
46
|
# :nocov:
|
46
|
-
raise "
|
47
|
+
raise UnexpectedInputValidationError, "Unexpected input validation error: #{error}"
|
47
48
|
# :nocov:
|
48
49
|
end
|
49
50
|
end
|
@@ -5,10 +5,12 @@ module Foobara
|
|
5
5
|
include Concern
|
6
6
|
|
7
7
|
module ClassMethods
|
8
|
-
def
|
9
|
-
@
|
8
|
+
def foobara_associations
|
9
|
+
@foobara_associations ||= construct_associations
|
10
10
|
end
|
11
11
|
|
12
|
+
alias associations foobara_associations
|
13
|
+
|
12
14
|
def deep_associations
|
13
15
|
@deep_associations ||= begin
|
14
16
|
deep = {}
|
@@ -109,6 +111,8 @@ module Foobara
|
|
109
111
|
end
|
110
112
|
end
|
111
113
|
|
114
|
+
# TODO: this big switch is a problem. Hard to create new types in other projects without being able
|
115
|
+
# to modify this switch. Figure out what to do.
|
112
116
|
def construct_associations(
|
113
117
|
type = attributes_type,
|
114
118
|
path = DataPath.new,
|
@@ -135,7 +139,12 @@ module Foobara
|
|
135
139
|
construct_associations(element_type, path.append(attribute_name), result)
|
136
140
|
end
|
137
141
|
elsif type.extends?(BuiltinTypes[:model])
|
138
|
-
|
142
|
+
target_class = type.target_class
|
143
|
+
|
144
|
+
method = target_class.respond_to?(:foobara_attributes_type) ? :foobara_attributes_type : :attributes_type
|
145
|
+
attributes_type = target_class.send(method)
|
146
|
+
|
147
|
+
construct_associations(attributes_type, path, result)
|
139
148
|
elsif type.extends?(BuiltinTypes[:associative_array])
|
140
149
|
# not going to bother testing this for now
|
141
150
|
# :nocov:
|
@@ -20,18 +20,20 @@ module Foobara
|
|
20
20
|
# :nocov:
|
21
21
|
end
|
22
22
|
|
23
|
-
@
|
23
|
+
@foobara_primary_key_attribute = attribute_name.to_sym
|
24
24
|
|
25
25
|
set_model_type
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
return @
|
28
|
+
def foobara_primary_key_attribute
|
29
|
+
return @foobara_primary_key_attribute if @foobara_primary_key_attribute
|
30
30
|
|
31
31
|
unless superclass == DetachedEntity
|
32
|
-
@
|
32
|
+
@foobara_primary_key_attribute = superclass.primary_key_attribute
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
alias primary_key_attribute foobara_primary_key_attribute
|
35
37
|
end
|
36
38
|
|
37
39
|
def primary_key
|
@@ -23,10 +23,12 @@ module Foobara
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
@
|
26
|
+
def foobara_primary_key_type
|
27
|
+
@foobara_primary_key_type ||= attributes_type.element_types[primary_key_attribute]
|
28
28
|
end
|
29
29
|
|
30
|
+
alias primary_key_type foobara_primary_key_type
|
31
|
+
|
30
32
|
def full_entity_name
|
31
33
|
full_model_name
|
32
34
|
end
|
@@ -102,7 +102,7 @@ module Foobara
|
|
102
102
|
)
|
103
103
|
end
|
104
104
|
|
105
|
-
def
|
105
|
+
def foobara_attributes_type
|
106
106
|
return @attributes_type if @attributes_type
|
107
107
|
|
108
108
|
@attributes_type = if model_type
|
@@ -112,6 +112,8 @@ module Foobara
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
alias attributes_type foobara_attributes_type
|
116
|
+
|
115
117
|
def model_type=(model_type)
|
116
118
|
@model_type = model_type
|
117
119
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "date"
|
2
|
+
require "time"
|
3
|
+
require "bigdecimal"
|
4
|
+
|
5
|
+
module Foobara
|
6
|
+
module ModelAttributeHelpers
|
7
|
+
class << self
|
8
|
+
def install!
|
9
|
+
Model.include Concerns::AttributeHelpers
|
10
|
+
Model.include Concerns::AttributeHelperAliases
|
11
|
+
Entity.include Concerns::AttributeHelpers
|
12
|
+
Entity.include Concerns::AttributeHelperAliases
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# This is currently the working file, fix this up/move it
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module ModelAttributeHelpers
|
5
|
+
module Concerns
|
6
|
+
module AttributeHelperAliases
|
7
|
+
include Foobara::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
%i[
|
11
|
+
attributes_for_update
|
12
|
+
type_from_foobara_model_class
|
13
|
+
attributes_type_from_foobara_model_class
|
14
|
+
primary_key_attribute_from_foobara_model_class
|
15
|
+
foobara_model_class_has_primary_key
|
16
|
+
attributes_for_create
|
17
|
+
attributes_for_aggregate_update
|
18
|
+
attributes_for_atom_update
|
19
|
+
attributes_for_find_by
|
20
|
+
type_declaration_value_at
|
21
|
+
].each do |method_name|
|
22
|
+
define_method method_name do |*args, **opts, &block|
|
23
|
+
send("foobara_#{method_name}", *args, **opts, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,37 +1,56 @@
|
|
1
|
+
# delete this file
|
2
|
+
|
1
3
|
module Foobara
|
2
|
-
|
4
|
+
module ModelAttributeHelpers
|
3
5
|
module Concerns
|
6
|
+
# TODO: This concern is retroactively designed to be mixed into any entity-like class that can hold an
|
7
|
+
# entity-like foobara type.
|
8
|
+
# Because we want a subclass of ActiveRecord::Base to be such a target in the case of the
|
9
|
+
# foobara-active-record-type class, but because we can't make ActiveRecord::Base a subclass of Entity or
|
10
|
+
# DetachedEntity, and also because it makes sense to extend such behavior to foobara model classes,
|
11
|
+
# we will implement this as a Concern/mixin with a published expected interface and prefixed methods.
|
12
|
+
# This also means it should live in its own project, not here in the entity project.
|
13
|
+
# required methods:
|
14
|
+
#
|
15
|
+
# foobara_type
|
16
|
+
# foobara_attributes_type
|
17
|
+
# foobara_primary_key_attribute (nil if not an entity type)
|
18
|
+
# foobara_primary_key_type (nil if not an entity type)
|
19
|
+
# foobara_associations
|
4
20
|
module AttributeHelpers
|
5
21
|
include Foobara::Concern
|
6
22
|
|
7
23
|
module ClassMethods
|
8
|
-
def
|
9
|
-
|
24
|
+
def foobara_has_primary_key?
|
25
|
+
respond_to?(:foobara_primary_key_attribute)
|
26
|
+
end
|
27
|
+
|
28
|
+
def foobara_attributes_for_update
|
29
|
+
foobara_attributes_for_aggregate_update
|
10
30
|
end
|
11
31
|
|
12
32
|
# TODO: we should have metadata on the entity about whether it required a primary key
|
13
33
|
# upon creation or not instead of an option here.
|
14
|
-
def
|
15
|
-
return
|
34
|
+
def foobara_attributes_for_create(includes_primary_key: false)
|
35
|
+
return foobara_attributes_type if includes_primary_key
|
36
|
+
return foobara_attributes_type unless foobara_has_primary_key?
|
37
|
+
|
38
|
+
primary_key_attribute = foobara_primary_key_attribute
|
16
39
|
|
17
40
|
declaration = attributes_type.declaration_data
|
18
41
|
# TODO: just slice out the element type declarations
|
19
42
|
declaration = Util.deep_dup(declaration)
|
20
43
|
|
21
|
-
|
44
|
+
declaration[:element_type_declarations].delete(primary_key_attribute)
|
45
|
+
|
46
|
+
if declaration.key?(:required)
|
22
47
|
declaration[:required].delete(primary_key_attribute)
|
23
48
|
end
|
24
49
|
|
25
|
-
if declaration.key?(:defaults)
|
50
|
+
if declaration.key?(:defaults)
|
26
51
|
declaration[:defaults].delete(primary_key_attribute)
|
27
52
|
end
|
28
53
|
|
29
|
-
if declaration.key?(:element_type_declarations)
|
30
|
-
if declaration[:element_type_declarations].key?(primary_key_attribute)
|
31
|
-
declaration[:element_type_declarations].delete(primary_key_attribute)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
54
|
handler = Domain.global.foobara_type_builder.handler_for_class(
|
36
55
|
TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
|
37
56
|
)
|
@@ -39,48 +58,50 @@ module Foobara
|
|
39
58
|
handler.desugarize(declaration)
|
40
59
|
end
|
41
60
|
|
42
|
-
def
|
43
|
-
declaration =
|
61
|
+
def foobara_attributes_for_aggregate_update(initial = true)
|
62
|
+
declaration = foobara_attributes_type.declaration_data
|
44
63
|
# TODO: just slice out the element type declarations
|
45
64
|
declaration = Util.deep_dup(declaration)
|
46
65
|
|
47
66
|
declaration.delete(:defaults)
|
48
67
|
declaration.delete(:required)
|
49
68
|
|
50
|
-
if initial
|
51
|
-
declaration[:required] = [
|
69
|
+
if initial && foobara_has_primary_key?
|
70
|
+
declaration[:required] = [foobara_primary_key_attribute]
|
52
71
|
end
|
53
72
|
|
54
|
-
|
73
|
+
foobara_associations.each_pair do |data_path, type|
|
55
74
|
if type.extends?(BuiltinTypes[:entity])
|
56
75
|
target_class = type.target_class
|
57
76
|
|
58
|
-
entry =
|
77
|
+
entry = foobara_type_declaration_value_at(declaration, DataPath.new(data_path).path)
|
59
78
|
entry.clear
|
60
|
-
entry.merge!(target_class.
|
79
|
+
entry.merge!(target_class.foobara_attributes_for_aggregate_update(false))
|
61
80
|
end
|
62
81
|
end
|
63
82
|
|
64
83
|
declaration
|
65
84
|
end
|
66
85
|
|
67
|
-
def
|
68
|
-
declaration =
|
86
|
+
def foobara_attributes_for_atom_update
|
87
|
+
declaration = foobara_attributes_type.declaration_data
|
69
88
|
# TODO: just slice out the element type declarations
|
70
89
|
declaration = Util.deep_dup(declaration)
|
71
90
|
|
72
91
|
declaration.delete(:defaults)
|
73
|
-
|
92
|
+
if foobara_has_primary_key?
|
93
|
+
declaration[:required] = [foobara_primary_key_attribute]
|
94
|
+
end
|
74
95
|
|
75
96
|
# expect all associations to be expressed as primary key values
|
76
97
|
# TODO: should we have a special type for encapsulating primary keys types??
|
77
|
-
|
98
|
+
foobara_associations.each_pair do |data_path, type|
|
78
99
|
if type.extends?(BuiltinTypes[:entity])
|
79
100
|
target_class = type.target_class
|
80
101
|
# TODO: do we really need declaration_data? Why cant we use the type directly?
|
81
102
|
# TODO: make this work with the type directly for performance reasons.
|
82
|
-
primary_key_type_declaration = target_class.
|
83
|
-
entry =
|
103
|
+
primary_key_type_declaration = target_class.foobara_primary_key_type.declaration_data
|
104
|
+
entry = foobara_type_declaration_value_at(declaration, DataPath.new(data_path).path)
|
84
105
|
entry.clear
|
85
106
|
entry.merge!(primary_key_type_declaration)
|
86
107
|
end
|
@@ -89,10 +110,10 @@ module Foobara
|
|
89
110
|
declaration
|
90
111
|
end
|
91
112
|
|
92
|
-
def
|
113
|
+
def foobara_attributes_for_find_by
|
93
114
|
element_type_declarations = {}
|
94
115
|
|
95
|
-
|
116
|
+
foobara_attributes_type.element_types.each_pair do |attribute_name, attribute_type|
|
96
117
|
element_type_declarations[attribute_name] = attribute_type.reference_or_declaration_data
|
97
118
|
end
|
98
119
|
|
@@ -108,7 +129,7 @@ module Foobara
|
|
108
129
|
|
109
130
|
private
|
110
131
|
|
111
|
-
def
|
132
|
+
def foobara_type_declaration_value_at(declaration, path_parts)
|
112
133
|
return declaration if path_parts.empty?
|
113
134
|
|
114
135
|
path_part, *path_parts = path_parts
|
@@ -124,7 +145,7 @@ module Foobara
|
|
124
145
|
# :nocov:
|
125
146
|
end
|
126
147
|
|
127
|
-
|
148
|
+
foobara_type_declaration_value_at(declaration, path_parts)
|
128
149
|
end
|
129
150
|
end
|
130
151
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
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.49
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-01-
|
10
|
+
date: 2025-01-21 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: bigdecimal
|
@@ -219,7 +219,6 @@ files:
|
|
219
219
|
- projects/domain_mapper/src/domain_mapper.rb
|
220
220
|
- projects/domain_mapper/src/domain_mapper_lookups.rb
|
221
221
|
- projects/entity/lib/foobara/entity.rb
|
222
|
-
- projects/entity/src/concerns/attribute_helpers.rb
|
223
222
|
- projects/entity/src/concerns/attributes.rb
|
224
223
|
- projects/entity/src/concerns/callbacks.rb
|
225
224
|
- projects/entity/src/concerns/initialization.rb
|
@@ -289,6 +288,9 @@ files:
|
|
289
288
|
- projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/to_type_transformer.rb
|
290
289
|
- projects/model/src/extensions/type_declarations/handlers/registered_type_declaration/model_class_desugarizer.rb
|
291
290
|
- projects/model/src/model.rb
|
291
|
+
- projects/model_attribute_helpers/lib/foobara/model_attribute_helpers.rb
|
292
|
+
- projects/model_attribute_helpers/src/attribute_helper_aliases.rb
|
293
|
+
- projects/model_attribute_helpers/src/attribute_helpers.rb
|
292
294
|
- projects/monorepo/lib/foobara/monorepo.rb
|
293
295
|
- projects/monorepo/lib/foobara/monorepo/project.rb
|
294
296
|
- projects/namespace/lib/foobara/namespace.rb
|
@@ -415,6 +417,7 @@ require_paths:
|
|
415
417
|
- "./projects/in_memory_crud_driver_minimal/lib"
|
416
418
|
- "./projects/manifest/lib"
|
417
419
|
- "./projects/model/lib"
|
420
|
+
- "./projects/model_attribute_helpers/lib"
|
418
421
|
- "./projects/monorepo/lib"
|
419
422
|
- "./projects/namespace/lib"
|
420
423
|
- "./projects/persistence/lib"
|