foobara 0.0.48 → 0.0.50
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 +4 -0
 - data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/desugarizers/move_defaults_from_element_types_to_root.rb +5 -1
 - data/projects/builtin_types/src/attributes/supported_validators/required/type_declaration_extension/extend_attributes_type_declaration/desugarizers/move_required_from_element_types_to_root.rb +5 -1
 - data/projects/command/src/concerns/inputs_type.rb +10 -0
 - data/projects/detached_entity/src/concerns/associations.rb +4 -2
 - 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/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/model_attribute_helpers/src/attribute_helpers.rb +143 -0
 - data/projects/type_declarations/src/attributes.rb +45 -2
 - data/projects/type_declarations/src/dsl/attributes.rb +3 -14
 - metadata +6 -3
 - data/projects/entity/src/concerns/attribute_helpers.rb +0 -133
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 046fdc3bab52559499e744edbde0ef847e26c4e6107423779351a26acc654619
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 56174a565dafcdf3cd03a66e791be3d5a6074bd426c203371b6d7f41fa3a7e12
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ca08c711d53d11eb7ee073d040163df8bfe23c69b4b8e4c4f9647c6d216578755388b009b6d67e2cf988cc4e043413bfbe8f4f78ecb7690f713191cf00474255
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: a3b1e726a7295d1a0e4d22ef8f7a8130b39d57a1576f07f3f36bb20347ffce4bde07d6205c9c2853b392f47542ef7c696de57ab02c7c11d463484e3f5eebc779
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
| 
         @@ -25,7 +25,11 @@ module Foobara 
     | 
|
| 
       25 
25 
     | 
    
         
             
                                  end
         
     | 
| 
       26 
26 
     | 
    
         
             
                                end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                                 
     | 
| 
      
 28 
     | 
    
         
            +
                                if defaults.empty?
         
     | 
| 
      
 29 
     | 
    
         
            +
                                  rawish_type_declaration.delete(:defaults)
         
     | 
| 
      
 30 
     | 
    
         
            +
                                else
         
     | 
| 
      
 31 
     | 
    
         
            +
                                  rawish_type_declaration[:defaults] = defaults
         
     | 
| 
      
 32 
     | 
    
         
            +
                                end
         
     | 
| 
       29 
33 
     | 
    
         | 
| 
       30 
34 
     | 
    
         
             
                                rawish_type_declaration
         
     | 
| 
       31 
35 
     | 
    
         
             
                              end
         
     | 
| 
         @@ -40,7 +40,11 @@ module Foobara 
     | 
|
| 
       40 
40 
     | 
    
         
             
                                  end
         
     | 
| 
       41 
41 
     | 
    
         
             
                                end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                                 
     | 
| 
      
 43 
     | 
    
         
            +
                                if required_attributes.empty?
         
     | 
| 
      
 44 
     | 
    
         
            +
                                  rawish_type_declaration.delete(:required)
         
     | 
| 
      
 45 
     | 
    
         
            +
                                else
         
     | 
| 
      
 46 
     | 
    
         
            +
                                  rawish_type_declaration[:required] = required_attributes
         
     | 
| 
      
 47 
     | 
    
         
            +
                                end
         
     | 
| 
       44 
48 
     | 
    
         | 
| 
       45 
49 
     | 
    
         
             
                                rawish_type_declaration
         
     | 
| 
       46 
50 
     | 
    
         
             
                              end
         
     | 
| 
         @@ -25,6 +25,16 @@ module Foobara 
     | 
|
| 
       25 
25 
     | 
    
         
             
                        @inputs_type
         
     | 
| 
       26 
26 
     | 
    
         
             
                      end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
                      def add_inputs(...)
         
     | 
| 
      
 29 
     | 
    
         
            +
                        new_type = type_for_declaration(...)
         
     | 
| 
      
 30 
     | 
    
         
            +
                        new_declaration = TypeDeclarations::Attributes.merge(
         
     | 
| 
      
 31 
     | 
    
         
            +
                          inputs_type.declaration_data,
         
     | 
| 
      
 32 
     | 
    
         
            +
                          new_type.declaration_data
         
     | 
| 
      
 33 
     | 
    
         
            +
                        )
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                        inputs new_declaration
         
     | 
| 
      
 36 
     | 
    
         
            +
                      end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       28 
38 
     | 
    
         
             
                      def inputs_type
         
     | 
| 
       29 
39 
     | 
    
         
             
                        return @inputs_type if defined?(@inputs_type)
         
     | 
| 
       30 
40 
     | 
    
         | 
| 
         @@ -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 = {}
         
     | 
| 
         @@ -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
         
     | 
| 
         @@ -0,0 +1,143 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # delete this file
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Foobara
         
     | 
| 
      
 4 
     | 
    
         
            +
              module ModelAttributeHelpers
         
     | 
| 
      
 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
         
     | 
| 
      
 20 
     | 
    
         
            +
                  module AttributeHelpers
         
     | 
| 
      
 21 
     | 
    
         
            +
                    include Foobara::Concern
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    module ClassMethods
         
     | 
| 
      
 24 
     | 
    
         
            +
                      def foobara_has_primary_key?
         
     | 
| 
      
 25 
     | 
    
         
            +
                        respond_to?(:foobara_primary_key_attribute)
         
     | 
| 
      
 26 
     | 
    
         
            +
                      end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                      def foobara_attributes_for_update(require_primary_key: false)
         
     | 
| 
      
 29 
     | 
    
         
            +
                        foobara_attributes_for_aggregate_update(require_primary_key:)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                      # TODO: we should have metadata on the entity about whether it required a primary key
         
     | 
| 
      
 33 
     | 
    
         
            +
                      # upon creation or not instead of an option here.
         
     | 
| 
      
 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 
     | 
    
         
            +
                        declaration = foobara_attributes_type.declaration_data
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                        Foobara::TypeDeclarations::Attributes.reject(declaration, foobara_primary_key_attribute)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                      def foobara_attributes_for_aggregate_update(require_primary_key: false, initial: true)
         
     | 
| 
      
 44 
     | 
    
         
            +
                        declaration = foobara_attributes_type.declaration_data
         
     | 
| 
      
 45 
     | 
    
         
            +
                        declaration = Util.deep_dup(declaration)
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                        declaration.delete(:defaults)
         
     | 
| 
      
 48 
     | 
    
         
            +
                        declaration.delete(:required)
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                        if initial && foobara_has_primary_key?
         
     | 
| 
      
 51 
     | 
    
         
            +
                          if require_primary_key
         
     | 
| 
      
 52 
     | 
    
         
            +
                            declaration[:required] = [foobara_primary_key_attribute]
         
     | 
| 
      
 53 
     | 
    
         
            +
                          else
         
     | 
| 
      
 54 
     | 
    
         
            +
                            TypeDeclarations::Attributes.reject(declaration, foobara_primary_key_attribute)
         
     | 
| 
      
 55 
     | 
    
         
            +
                          end
         
     | 
| 
      
 56 
     | 
    
         
            +
                        end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                        foobara_associations.each_pair do |data_path, type|
         
     | 
| 
      
 59 
     | 
    
         
            +
                          if type.extends?(BuiltinTypes[:entity])
         
     | 
| 
      
 60 
     | 
    
         
            +
                            target_class = type.target_class
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                            entry = foobara_type_declaration_value_at(declaration, DataPath.new(data_path).path)
         
     | 
| 
      
 63 
     | 
    
         
            +
                            entry.clear
         
     | 
| 
      
 64 
     | 
    
         
            +
                            entry.merge!(target_class.foobara_attributes_for_aggregate_update(initial: false))
         
     | 
| 
      
 65 
     | 
    
         
            +
                          end
         
     | 
| 
      
 66 
     | 
    
         
            +
                        end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                        declaration
         
     | 
| 
      
 69 
     | 
    
         
            +
                      end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                      def foobara_attributes_for_atom_update(require_primary_key: false)
         
     | 
| 
      
 72 
     | 
    
         
            +
                        declaration = foobara_attributes_type.declaration_data
         
     | 
| 
      
 73 
     | 
    
         
            +
                        declaration = Util.deep_dup(declaration)
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                        declaration.delete(:defaults)
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                        if foobara_has_primary_key?
         
     | 
| 
      
 78 
     | 
    
         
            +
                          if require_primary_key
         
     | 
| 
      
 79 
     | 
    
         
            +
                            declaration[:required] = [foobara_primary_key_attribute]
         
     | 
| 
      
 80 
     | 
    
         
            +
                          else
         
     | 
| 
      
 81 
     | 
    
         
            +
                            declaration = TypeDeclarations::Attributes.reject(declaration, foobara_primary_key_attribute)
         
     | 
| 
      
 82 
     | 
    
         
            +
                          end
         
     | 
| 
      
 83 
     | 
    
         
            +
                        end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                        # expect all associations to be expressed as primary key values
         
     | 
| 
      
 86 
     | 
    
         
            +
                        # TODO: should we have a special type for encapsulating primary keys types??
         
     | 
| 
      
 87 
     | 
    
         
            +
                        foobara_associations.each_pair do |data_path, type|
         
     | 
| 
      
 88 
     | 
    
         
            +
                          if type.extends?(BuiltinTypes[:entity])
         
     | 
| 
      
 89 
     | 
    
         
            +
                            target_class = type.target_class
         
     | 
| 
      
 90 
     | 
    
         
            +
                            # TODO: do we really need declaration_data? Why cant we use the type directly?
         
     | 
| 
      
 91 
     | 
    
         
            +
                            # TODO: make this work with the type directly for performance reasons.
         
     | 
| 
      
 92 
     | 
    
         
            +
                            primary_key_type_declaration = target_class.foobara_primary_key_type.declaration_data
         
     | 
| 
      
 93 
     | 
    
         
            +
                            entry = foobara_type_declaration_value_at(declaration, DataPath.new(data_path).path)
         
     | 
| 
      
 94 
     | 
    
         
            +
                            entry.clear
         
     | 
| 
      
 95 
     | 
    
         
            +
                            entry.merge!(primary_key_type_declaration)
         
     | 
| 
      
 96 
     | 
    
         
            +
                          end
         
     | 
| 
      
 97 
     | 
    
         
            +
                        end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                        declaration
         
     | 
| 
      
 100 
     | 
    
         
            +
                      end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                      def foobara_attributes_for_find_by
         
     | 
| 
      
 103 
     | 
    
         
            +
                        element_type_declarations = {}
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                        foobara_attributes_type.element_types.each_pair do |attribute_name, attribute_type|
         
     | 
| 
      
 106 
     | 
    
         
            +
                          element_type_declarations[attribute_name] = attribute_type.reference_or_declaration_data
         
     | 
| 
      
 107 
     | 
    
         
            +
                        end
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                        handler = Domain.global.foobara_type_builder.handler_for_class(
         
     | 
| 
      
 110 
     | 
    
         
            +
                          TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
         
     | 
| 
      
 111 
     | 
    
         
            +
                        )
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                        handler.desugarize(
         
     | 
| 
      
 114 
     | 
    
         
            +
                          type: "::attributes",
         
     | 
| 
      
 115 
     | 
    
         
            +
                          element_type_declarations:
         
     | 
| 
      
 116 
     | 
    
         
            +
                        )
         
     | 
| 
      
 117 
     | 
    
         
            +
                      end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                      private
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                      def foobara_type_declaration_value_at(declaration, path_parts)
         
     | 
| 
      
 122 
     | 
    
         
            +
                        return declaration if path_parts.empty?
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                        path_part, *path_parts = path_parts
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                        declaration = case path_part
         
     | 
| 
      
 127 
     | 
    
         
            +
                                      when :"#"
         
     | 
| 
      
 128 
     | 
    
         
            +
                                        declaration[:element_type_declaration]
         
     | 
| 
      
 129 
     | 
    
         
            +
                                      when Symbol, Integer
         
     | 
| 
      
 130 
     | 
    
         
            +
                                        declaration[:element_type_declarations][path_part]
         
     | 
| 
      
 131 
     | 
    
         
            +
                                      else
         
     | 
| 
      
 132 
     | 
    
         
            +
                                        # :nocov:
         
     | 
| 
      
 133 
     | 
    
         
            +
                                        raise "Bad path part #{path_part}"
         
     | 
| 
      
 134 
     | 
    
         
            +
                                        # :nocov:
         
     | 
| 
      
 135 
     | 
    
         
            +
                                      end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                        foobara_type_declaration_value_at(declaration, path_parts)
         
     | 
| 
      
 138 
     | 
    
         
            +
                      end
         
     | 
| 
      
 139 
     | 
    
         
            +
                    end
         
     | 
| 
      
 140 
     | 
    
         
            +
                  end
         
     | 
| 
      
 141 
     | 
    
         
            +
                end
         
     | 
| 
      
 142 
     | 
    
         
            +
              end
         
     | 
| 
      
 143 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -21,12 +21,55 @@ module Foobara 
     | 
|
| 
       21 
21 
     | 
    
         
             
                        end
         
     | 
| 
       22 
22 
     | 
    
         
             
                      end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                       
     | 
| 
      
 24 
     | 
    
         
            +
                      handler = Domain.global.foobara_type_builder.handler_for_class(
         
     | 
| 
      
 25 
     | 
    
         
            +
                        TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
         
     | 
| 
      
 26 
     | 
    
         
            +
                      )
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                      handler.desugarize(
         
     | 
| 
       25 
29 
     | 
    
         
             
                        type: "::attributes",
         
     | 
| 
       26 
30 
     | 
    
         
             
                        element_type_declarations:,
         
     | 
| 
       27 
31 
     | 
    
         
             
                        required:,
         
     | 
| 
       28 
32 
     | 
    
         
             
                        defaults:
         
     | 
| 
       29 
     | 
    
         
            -
                       
     | 
| 
      
 33 
     | 
    
         
            +
                      )
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    def reject(declaration, *keys)
         
     | 
| 
      
 37 
     | 
    
         
            +
                      declaration = Util.deep_dup(declaration)
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      element_type_declarations = declaration[:element_type_declarations]
         
     | 
| 
      
 40 
     | 
    
         
            +
                      required = declaration[:required]
         
     | 
| 
      
 41 
     | 
    
         
            +
                      defaults = declaration[:defaults]
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                      changed = false
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                      keys.flatten.each do |key|
         
     | 
| 
      
 46 
     | 
    
         
            +
                        key = key.to_sym
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                        if element_type_declarations.key?(key)
         
     | 
| 
      
 49 
     | 
    
         
            +
                          changed = true
         
     | 
| 
      
 50 
     | 
    
         
            +
                          element_type_declarations.delete(key)
         
     | 
| 
      
 51 
     | 
    
         
            +
                        end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                        if required&.include?(key)
         
     | 
| 
      
 54 
     | 
    
         
            +
                          changed = true
         
     | 
| 
      
 55 
     | 
    
         
            +
                          required.delete(key)
         
     | 
| 
      
 56 
     | 
    
         
            +
                        end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                        if defaults&.key?(key)
         
     | 
| 
      
 59 
     | 
    
         
            +
                          changed = true
         
     | 
| 
      
 60 
     | 
    
         
            +
                          defaults.delete(key)
         
     | 
| 
      
 61 
     | 
    
         
            +
                        end
         
     | 
| 
      
 62 
     | 
    
         
            +
                      end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                      if changed
         
     | 
| 
      
 65 
     | 
    
         
            +
                        handler = Domain.global.foobara_type_builder.handler_for_class(
         
     | 
| 
      
 66 
     | 
    
         
            +
                          TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
         
     | 
| 
      
 67 
     | 
    
         
            +
                        )
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                        handler.desugarize(declaration)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      else
         
     | 
| 
      
 71 
     | 
    
         
            +
                        declaration
         
     | 
| 
      
 72 
     | 
    
         
            +
                      end
         
     | 
| 
       30 
73 
     | 
    
         
             
                    end
         
     | 
| 
       31 
74 
     | 
    
         
             
                  end
         
     | 
| 
       32 
75 
     | 
    
         
             
                end
         
     | 
| 
         @@ -47,7 +47,6 @@ module Foobara 
     | 
|
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                    def _to_declaration(&)
         
     | 
| 
       49 
49 
     | 
    
         
             
                      instance_eval(&)
         
     | 
| 
       50 
     | 
    
         
            -
                      _prune_type_declaration
         
     | 
| 
       51 
50 
     | 
    
         
             
                      _type_declaration
         
     | 
| 
       52 
51 
     | 
    
         
             
                    end
         
     | 
| 
       53 
52 
     | 
    
         | 
| 
         @@ -163,30 +162,20 @@ module Foobara 
     | 
|
| 
       163 
162 
     | 
    
         
             
                    end
         
     | 
| 
       164 
163 
     | 
    
         | 
| 
       165 
164 
     | 
    
         
             
                    def _add_to_required(attribute_name)
         
     | 
| 
      
 165 
     | 
    
         
            +
                      _type_declaration[:required] ||= []
         
     | 
| 
       166 
166 
     | 
    
         
             
                      _type_declaration[:required] << attribute_name.to_sym
         
     | 
| 
       167 
167 
     | 
    
         
             
                    end
         
     | 
| 
       168 
168 
     | 
    
         | 
| 
       169 
169 
     | 
    
         
             
                    def _add_to_defaults(attribute_name, value)
         
     | 
| 
      
 170 
     | 
    
         
            +
                      _type_declaration[:defaults] ||= {}
         
     | 
| 
       170 
171 
     | 
    
         
             
                      _type_declaration[:defaults][attribute_name.to_sym] = value
         
     | 
| 
       171 
172 
     | 
    
         
             
                    end
         
     | 
| 
       172 
173 
     | 
    
         | 
| 
       173 
     | 
    
         
            -
                    def _prune_type_declaration
         
     | 
| 
       174 
     | 
    
         
            -
                      if _type_declaration[:required].empty?
         
     | 
| 
       175 
     | 
    
         
            -
                        _type_declaration.delete(:required)
         
     | 
| 
       176 
     | 
    
         
            -
                      end
         
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
                      if _type_declaration[:defaults].empty?
         
     | 
| 
       179 
     | 
    
         
            -
                        _type_declaration.delete(:defaults)
         
     | 
| 
       180 
     | 
    
         
            -
                      end
         
     | 
| 
       181 
     | 
    
         
            -
                    end
         
     | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
       183 
174 
     | 
    
         
             
                    def _type_declaration
         
     | 
| 
       184 
175 
     | 
    
         
             
                      @_type_declaration ||= begin
         
     | 
| 
       185 
176 
     | 
    
         
             
                        sugar = {
         
     | 
| 
       186 
177 
     | 
    
         
             
                          type: "::attributes",
         
     | 
| 
       187 
     | 
    
         
            -
                          element_type_declarations: {} 
     | 
| 
       188 
     | 
    
         
            -
                          required: [],
         
     | 
| 
       189 
     | 
    
         
            -
                          defaults: {}
         
     | 
| 
      
 178 
     | 
    
         
            +
                          element_type_declarations: {}
         
     | 
| 
       190 
179 
     | 
    
         
             
                        }
         
     | 
| 
       191 
180 
     | 
    
         | 
| 
       192 
181 
     | 
    
         
             
                        handler = Domain.current.foobara_type_builder.handler_for_class(Handlers::ExtendAttributesTypeDeclaration)
         
     | 
    
        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.50
         
     | 
| 
       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-22 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"
         
     | 
| 
         @@ -1,133 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Foobara
         
     | 
| 
       2 
     | 
    
         
            -
              class Entity < DetachedEntity
         
     | 
| 
       3 
     | 
    
         
            -
                module Concerns
         
     | 
| 
       4 
     | 
    
         
            -
                  module AttributeHelpers
         
     | 
| 
       5 
     | 
    
         
            -
                    include Foobara::Concern
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                    module ClassMethods
         
     | 
| 
       8 
     | 
    
         
            -
                      def attributes_for_update
         
     | 
| 
       9 
     | 
    
         
            -
                        attributes_for_aggregate_update
         
     | 
| 
       10 
     | 
    
         
            -
                      end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                      # TODO: we should have metadata on the entity about whether it required a primary key
         
     | 
| 
       13 
     | 
    
         
            -
                      # upon creation or not instead of an option here.
         
     | 
| 
       14 
     | 
    
         
            -
                      def attributes_for_create(includes_primary_key: false)
         
     | 
| 
       15 
     | 
    
         
            -
                        return attributes_type if includes_primary_key
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                        declaration = attributes_type.declaration_data
         
     | 
| 
       18 
     | 
    
         
            -
                        # TODO: just slice out the element type declarations
         
     | 
| 
       19 
     | 
    
         
            -
                        declaration = Util.deep_dup(declaration)
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                        if declaration.key?(:required) && declaration[:required].include?(primary_key_attribute)
         
     | 
| 
       22 
     | 
    
         
            -
                          declaration[:required].delete(primary_key_attribute)
         
     | 
| 
       23 
     | 
    
         
            -
                        end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                        if declaration.key?(:defaults) && declaration[:defaults].include?(primary_key_attribute)
         
     | 
| 
       26 
     | 
    
         
            -
                          declaration[:defaults].delete(primary_key_attribute)
         
     | 
| 
       27 
     | 
    
         
            -
                        end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                        handler = Domain.global.foobara_type_builder.handler_for_class(
         
     | 
| 
       36 
     | 
    
         
            -
                          TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
         
     | 
| 
       37 
     | 
    
         
            -
                        )
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                        handler.desugarize(declaration)
         
     | 
| 
       40 
     | 
    
         
            -
                      end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                      def attributes_for_aggregate_update(initial = true)
         
     | 
| 
       43 
     | 
    
         
            -
                        declaration = attributes_type.declaration_data
         
     | 
| 
       44 
     | 
    
         
            -
                        # TODO: just slice out the element type declarations
         
     | 
| 
       45 
     | 
    
         
            -
                        declaration = Util.deep_dup(declaration)
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                        declaration.delete(:defaults)
         
     | 
| 
       48 
     | 
    
         
            -
                        declaration.delete(:required)
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                        if initial
         
     | 
| 
       51 
     | 
    
         
            -
                          declaration[:required] = [primary_key_attribute]
         
     | 
| 
       52 
     | 
    
         
            -
                        end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                        associations.each_pair do |data_path, type|
         
     | 
| 
       55 
     | 
    
         
            -
                          if type.extends?(BuiltinTypes[:entity])
         
     | 
| 
       56 
     | 
    
         
            -
                            target_class = type.target_class
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                            entry = type_declaration_value_at(declaration, DataPath.new(data_path).path)
         
     | 
| 
       59 
     | 
    
         
            -
                            entry.clear
         
     | 
| 
       60 
     | 
    
         
            -
                            entry.merge!(target_class.attributes_for_aggregate_update(false))
         
     | 
| 
       61 
     | 
    
         
            -
                          end
         
     | 
| 
       62 
     | 
    
         
            -
                        end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                        declaration
         
     | 
| 
       65 
     | 
    
         
            -
                      end
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                      def attributes_for_atom_update
         
     | 
| 
       68 
     | 
    
         
            -
                        declaration = attributes_type.declaration_data
         
     | 
| 
       69 
     | 
    
         
            -
                        # TODO: just slice out the element type declarations
         
     | 
| 
       70 
     | 
    
         
            -
                        declaration = Util.deep_dup(declaration)
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                        declaration.delete(:defaults)
         
     | 
| 
       73 
     | 
    
         
            -
                        declaration[:required] = [primary_key_attribute]
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
                        # expect all associations to be expressed as primary key values
         
     | 
| 
       76 
     | 
    
         
            -
                        # TODO: should we have a special type for encapsulating primary keys types??
         
     | 
| 
       77 
     | 
    
         
            -
                        associations.each_pair do |data_path, type|
         
     | 
| 
       78 
     | 
    
         
            -
                          if type.extends?(BuiltinTypes[:entity])
         
     | 
| 
       79 
     | 
    
         
            -
                            target_class = type.target_class
         
     | 
| 
       80 
     | 
    
         
            -
                            # TODO: do we really need declaration_data? Why cant we use the type directly?
         
     | 
| 
       81 
     | 
    
         
            -
                            # TODO: make this work with the type directly for performance reasons.
         
     | 
| 
       82 
     | 
    
         
            -
                            primary_key_type_declaration = target_class.primary_key_type.declaration_data
         
     | 
| 
       83 
     | 
    
         
            -
                            entry = type_declaration_value_at(declaration, DataPath.new(data_path).path)
         
     | 
| 
       84 
     | 
    
         
            -
                            entry.clear
         
     | 
| 
       85 
     | 
    
         
            -
                            entry.merge!(primary_key_type_declaration)
         
     | 
| 
       86 
     | 
    
         
            -
                          end
         
     | 
| 
       87 
     | 
    
         
            -
                        end
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                        declaration
         
     | 
| 
       90 
     | 
    
         
            -
                      end
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
                      def attributes_for_find_by
         
     | 
| 
       93 
     | 
    
         
            -
                        element_type_declarations = {}
         
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
                        attributes_type.element_types.each_pair do |attribute_name, attribute_type|
         
     | 
| 
       96 
     | 
    
         
            -
                          element_type_declarations[attribute_name] = attribute_type.reference_or_declaration_data
         
     | 
| 
       97 
     | 
    
         
            -
                        end
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                        handler = Domain.global.foobara_type_builder.handler_for_class(
         
     | 
| 
       100 
     | 
    
         
            -
                          TypeDeclarations::Handlers::ExtendAttributesTypeDeclaration
         
     | 
| 
       101 
     | 
    
         
            -
                        )
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
                        handler.desugarize(
         
     | 
| 
       104 
     | 
    
         
            -
                          type: "::attributes",
         
     | 
| 
       105 
     | 
    
         
            -
                          element_type_declarations:
         
     | 
| 
       106 
     | 
    
         
            -
                        )
         
     | 
| 
       107 
     | 
    
         
            -
                      end
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
                      private
         
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
                      def type_declaration_value_at(declaration, path_parts)
         
     | 
| 
       112 
     | 
    
         
            -
                        return declaration if path_parts.empty?
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
                        path_part, *path_parts = path_parts
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                        declaration = case path_part
         
     | 
| 
       117 
     | 
    
         
            -
                                      when :"#"
         
     | 
| 
       118 
     | 
    
         
            -
                                        declaration[:element_type_declaration]
         
     | 
| 
       119 
     | 
    
         
            -
                                      when Symbol, Integer
         
     | 
| 
       120 
     | 
    
         
            -
                                        declaration[:element_type_declarations][path_part]
         
     | 
| 
       121 
     | 
    
         
            -
                                      else
         
     | 
| 
       122 
     | 
    
         
            -
                                        # :nocov:
         
     | 
| 
       123 
     | 
    
         
            -
                                        raise "Bad path part #{path_part}"
         
     | 
| 
       124 
     | 
    
         
            -
                                        # :nocov:
         
     | 
| 
       125 
     | 
    
         
            -
                                      end
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                        type_declaration_value_at(declaration, path_parts)
         
     | 
| 
       128 
     | 
    
         
            -
                      end
         
     | 
| 
       129 
     | 
    
         
            -
                    end
         
     | 
| 
       130 
     | 
    
         
            -
                  end
         
     | 
| 
       131 
     | 
    
         
            -
                end
         
     | 
| 
       132 
     | 
    
         
            -
              end
         
     | 
| 
       133 
     | 
    
         
            -
            end
         
     |