foobara 0.0.38 → 0.0.39
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +629 -149
- data/projects/builtin_types/src/builtin_types.rb +31 -9
- data/projects/detached_entity/src/extensions/type_declarations/handlers/extend_detached_entity_type_declaration/to_type_transformer.rb +1 -0
- data/projects/entity/src/extensions/builtin_types/entity/casters/primary_key.rb +39 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/to_type_transformer.rb +0 -31
- data/projects/model/src/extensions/builtin_types/model/{transformers → supported_transformers}/mutable.rb +5 -1
- data/projects/model/src/extensions/builtin_types/model/validators/attributes_declaration.rb +4 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/to_type_transformer.rb +1 -1
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/to_type_transformer.rb +0 -4
- data/projects/types/src/type.rb +48 -1
- metadata +6 -7
@@ -20,29 +20,50 @@ module Foobara
|
|
20
20
|
|
21
21
|
builtin_type_module = const_get(module_symbol, false)
|
22
22
|
|
23
|
+
processor_classes_requiring_type = []
|
24
|
+
|
23
25
|
casters_module = Util.constant_value(builtin_type_module, :Casters)
|
24
26
|
caster_classes = if casters_module
|
25
27
|
Util.constant_values(casters_module, extends: Value::Processor)
|
26
28
|
end
|
27
|
-
casters =
|
28
|
-
|
29
|
+
casters = []
|
30
|
+
caster_classes&.each do |caster_class|
|
31
|
+
if caster_class.respond_to?(:requires_type?) && caster_class.requires_type?
|
32
|
+
processor_classes_requiring_type << caster_class
|
33
|
+
else
|
34
|
+
casters << caster_class.new_with_agnostic_args(parent_declaration_data: declaration_data)
|
35
|
+
end
|
29
36
|
end
|
30
37
|
|
31
38
|
transformers_module = Util.constant_value(builtin_type_module, :Transformers)
|
32
39
|
transformer_classes = if transformers_module
|
33
40
|
Util.constant_values(transformers_module, extends: Value::Processor)
|
34
41
|
end
|
35
|
-
transformers =
|
36
|
-
|
37
|
-
|
42
|
+
transformers = []
|
43
|
+
transformer_classes&.each do |transformer_class|
|
44
|
+
if transformer_class.respond_to?(:requires_type?) && transformer_class.requires_type?
|
45
|
+
# :nocov:
|
46
|
+
processor_classes_requiring_type << transformer_class
|
47
|
+
# :nocov:
|
48
|
+
else
|
49
|
+
transformers << transformer_class.new_with_agnostic_args(parent_declaration_data: declaration_data)
|
50
|
+
end
|
51
|
+
end
|
38
52
|
|
39
53
|
validators_module = Util.constant_value(builtin_type_module, :Validators)
|
40
54
|
validator_classes = if validators_module
|
41
55
|
Util.constant_values(validators_module, extends: Value::Processor)
|
42
56
|
end
|
43
|
-
validators =
|
44
|
-
|
45
|
-
|
57
|
+
validators = []
|
58
|
+
validator_classes&.each do |validator_class|
|
59
|
+
if validator_class.respond_to?(:requires_type?) && validator_class.requires_type?
|
60
|
+
# :nocov:
|
61
|
+
processor_classes_requiring_type << validator_class
|
62
|
+
# :nocov:
|
63
|
+
else
|
64
|
+
validators << validator_class.new_with_agnostic_args(parent_declaration_data: declaration_data)
|
65
|
+
end
|
66
|
+
end
|
46
67
|
|
47
68
|
type = Foobara::Types::Type.new(
|
48
69
|
declaration_data,
|
@@ -54,7 +75,8 @@ module Foobara
|
|
54
75
|
# TODO: this is for controlling casting or not casting but could give the wrong information from a
|
55
76
|
# reflection point of view...
|
56
77
|
target_classes:,
|
57
|
-
description
|
78
|
+
description:,
|
79
|
+
processor_classes_requiring_type:
|
58
80
|
)
|
59
81
|
|
60
82
|
add_builtin_type(type)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Foobara
|
2
|
+
module BuiltinTypes
|
3
|
+
module Entity
|
4
|
+
module Casters
|
5
|
+
class PrimaryKey < Value::Caster
|
6
|
+
class << self
|
7
|
+
def requires_declaration_data?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def requires_type?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def entity_class
|
17
|
+
declaration_data.target_class
|
18
|
+
end
|
19
|
+
|
20
|
+
def primary_key_type
|
21
|
+
entity_class.primary_key_type
|
22
|
+
end
|
23
|
+
|
24
|
+
def applicable?(value)
|
25
|
+
primary_key_type.applicable?(value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def transform(primary_key)
|
29
|
+
entity_class.thunk(primary_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
def applies_message
|
33
|
+
primary_key_type.value_caster.applies_message
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -3,35 +3,6 @@ module Foobara
|
|
3
3
|
module Handlers
|
4
4
|
class ExtendEntityTypeDeclaration < ExtendDetachedEntityTypeDeclaration
|
5
5
|
class ToTypeTransformer < ExtendDetachedEntityTypeDeclaration::ToTypeTransformer
|
6
|
-
# TODO: move this to a more appropriate place
|
7
|
-
class EntityPrimaryKeyCaster < Value::Caster
|
8
|
-
class << self
|
9
|
-
def requires_declaration_data?
|
10
|
-
true
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def entity_class
|
15
|
-
declaration_data
|
16
|
-
end
|
17
|
-
|
18
|
-
def primary_key_type
|
19
|
-
entity_class.primary_key_type
|
20
|
-
end
|
21
|
-
|
22
|
-
def applicable?(value)
|
23
|
-
primary_key_type.applicable?(value)
|
24
|
-
end
|
25
|
-
|
26
|
-
def transform(primary_key)
|
27
|
-
entity_class.thunk(primary_key)
|
28
|
-
end
|
29
|
-
|
30
|
-
def applies_message
|
31
|
-
primary_key_type.value_caster.applies_message
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
6
|
def process_value(strict_declaration_type)
|
36
7
|
super.tap do |outcome|
|
37
8
|
if outcome.success?
|
@@ -43,8 +14,6 @@ module Foobara
|
|
43
14
|
caster.is_a?(Foobara::BuiltinTypes::Entity::Casters::Hash)
|
44
15
|
end
|
45
16
|
end
|
46
|
-
|
47
|
-
type.casters << EntityPrimaryKeyCaster.new(entity_class)
|
48
17
|
end
|
49
18
|
end
|
50
19
|
end
|
@@ -2,9 +2,13 @@ module Foobara
|
|
2
2
|
module BuiltinTypes
|
3
3
|
module Model
|
4
4
|
# TODO: Create Mutations/SupportedMutations concept
|
5
|
-
class
|
5
|
+
class SupportedTransformers
|
6
6
|
class Mutable < TypeDeclarations::Transformer
|
7
7
|
class << self
|
8
|
+
def requires_declaration_data?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
8
12
|
def requires_parent_declaration_data?
|
9
13
|
true
|
10
14
|
end
|
@@ -16,7 +16,7 @@ module Foobara
|
|
16
16
|
# TODO: create declaration validator for name and the others
|
17
17
|
# TODO: seems like a smell that we don't have processors for these?
|
18
18
|
def non_processor_keys
|
19
|
-
[:name, :model_class, :model_base_class, :model_module, :attributes_declaration,
|
19
|
+
[:name, :model_class, :model_base_class, :model_module, :attributes_declaration, *super]
|
20
20
|
end
|
21
21
|
|
22
22
|
def process_value(...)
|
data/projects/types/src/type.rb
CHANGED
@@ -25,7 +25,8 @@ module Foobara
|
|
25
25
|
:raw_declaration_data,
|
26
26
|
:name,
|
27
27
|
:target_classes,
|
28
|
-
:description
|
28
|
+
:description,
|
29
|
+
:processor_classes_requiring_type
|
29
30
|
attr_reader :type_symbol
|
30
31
|
|
31
32
|
def initialize(
|
@@ -41,6 +42,7 @@ module Foobara
|
|
41
42
|
element_type: nil,
|
42
43
|
element_types: nil,
|
43
44
|
structure_count: nil,
|
45
|
+
processor_classes_requiring_type: nil,
|
44
46
|
**opts
|
45
47
|
)
|
46
48
|
self.base_type = base_type
|
@@ -56,12 +58,57 @@ module Foobara
|
|
56
58
|
self.element_type = element_type
|
57
59
|
self.name = name
|
58
60
|
self.target_classes = Util.array(target_classes)
|
61
|
+
self.processor_classes_requiring_type = processor_classes_requiring_type
|
59
62
|
|
60
63
|
super(*, **opts.merge(processors:, prioritize: false))
|
61
64
|
|
65
|
+
apply_all_processors_needing_type!
|
66
|
+
|
62
67
|
validate_processors!
|
63
68
|
end
|
64
69
|
|
70
|
+
def apply_all_processors_needing_type!
|
71
|
+
each_processor_class_requiring_type do |processor_class|
|
72
|
+
# TODO: is this a smell?
|
73
|
+
processor = processor_class.new(self)
|
74
|
+
|
75
|
+
category = case processor
|
76
|
+
when Value::Caster
|
77
|
+
casters
|
78
|
+
when Value::Validator
|
79
|
+
# :nocov:
|
80
|
+
validators
|
81
|
+
# :nocov:
|
82
|
+
when Value::Transformer
|
83
|
+
# :nocov:
|
84
|
+
transformers
|
85
|
+
# :nocov:
|
86
|
+
when Types::ElementProcessor
|
87
|
+
# :nocov:
|
88
|
+
element_processors
|
89
|
+
# :nocov:
|
90
|
+
else
|
91
|
+
# TODO: add validator that these are all fine so we don't have to bother here...
|
92
|
+
# :nocov:
|
93
|
+
raise "Not sure where to put #{processor}"
|
94
|
+
# :nocov:
|
95
|
+
end
|
96
|
+
|
97
|
+
symbol = processor.symbol
|
98
|
+
category.delete_if { |p| p.symbol == symbol }
|
99
|
+
|
100
|
+
category << processor
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def each_processor_class_requiring_type(&block)
|
105
|
+
base_type&.each_processor_class_requiring_type(&block)
|
106
|
+
|
107
|
+
processor_classes_requiring_type&.each do |processor_class|
|
108
|
+
block.call(processor_class)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
65
112
|
def validate_processors!
|
66
113
|
all = [casters, transformers, validators, element_processors]
|
67
114
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.39
|
5
5
|
platform: ruby
|
6
|
+
original_platform: ''
|
6
7
|
authors:
|
7
8
|
- Miles Georgi
|
8
|
-
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foobara-util
|
@@ -218,6 +218,7 @@ files:
|
|
218
218
|
- projects/entity/src/entity.rb
|
219
219
|
- projects/entity/src/extensions/builtin_types/entity.rb
|
220
220
|
- projects/entity/src/extensions/builtin_types/entity/casters/hash.rb
|
221
|
+
- projects/entity/src/extensions/builtin_types/entity/casters/primary_key.rb
|
221
222
|
- projects/entity/src/extensions/builtin_types/entity/validators/attributes_declaration.rb
|
222
223
|
- projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration.rb
|
223
224
|
- projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/attributes_handler_desugarizer.rb
|
@@ -260,7 +261,7 @@ files:
|
|
260
261
|
- projects/model/src/concerns/reflection.rb
|
261
262
|
- projects/model/src/concerns/types.rb
|
262
263
|
- projects/model/src/extensions/builtin_types/model/casters/hash.rb
|
263
|
-
- projects/model/src/extensions/builtin_types/model/
|
264
|
+
- projects/model/src/extensions/builtin_types/model/supported_transformers/mutable.rb
|
264
265
|
- projects/model/src/extensions/builtin_types/model/validators/attributes_declaration.rb
|
265
266
|
- projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration.rb
|
266
267
|
- projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/attributes_handler_desugarizer.rb
|
@@ -382,7 +383,6 @@ metadata:
|
|
382
383
|
source_code_uri: https://foobara.com
|
383
384
|
changelog_uri: https://foobara.com/blob/main/CHANGELOG.md
|
384
385
|
rubygems_mfa_required: 'true'
|
385
|
-
post_install_message:
|
386
386
|
rdoc_options: []
|
387
387
|
require_paths:
|
388
388
|
- "./projects/builtin_types/lib"
|
@@ -422,8 +422,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
422
422
|
- !ruby/object:Gem::Version
|
423
423
|
version: '0'
|
424
424
|
requirements: []
|
425
|
-
rubygems_version: 3.
|
426
|
-
signing_key:
|
425
|
+
rubygems_version: 3.6.0
|
427
426
|
specification_version: 4
|
428
427
|
summary: A command-centric and discoverable software framework with a focus on domain
|
429
428
|
concepts and abstracting away integration code
|