brick 1.0.123 → 1.0.124
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/lib/brick/extensions.rb +19 -8
 - data/lib/brick/frameworks/rails/form_tags.rb +13 -5
 - data/lib/brick/version_number.rb +1 -1
 - data/lib/brick.rb +8 -3
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 44fce70a53b4467d019ca42a9826f44a4849d472dcbfc2fe324f961708b70a18
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2674709f203786560b41c1bf1e2062336cf88282d168848303e9920b398662e3
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 337760a0382fd37a64026a07d80e708f9f475f73e8ca420d05341b731c977ab9153556803f10314a4851730e28a22ce4847705e2d8ad81121a8f33736f505f12
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 04a1e5ec1cc503173da16be708d611f9fb1dd6f3965e6e848dfd1e310f3e1c94b396c8e693982d8f3c3589b5d8ffbfee70fd52593918e12ecd8309c8e110b4c5
         
     | 
    
        data/lib/brick/extensions.rb
    CHANGED
    
    | 
         @@ -638,6 +638,7 @@ module ActiveRecord 
     | 
|
| 
       638 
638 
     | 
    
         
             
                  # Add derived table JOIN for the has_many counts
         
     | 
| 
       639 
639 
     | 
    
         
             
                  nix = []
         
     | 
| 
       640 
640 
     | 
    
         
             
                  klass._br_hm_counts.each do |k, hm|
         
     | 
| 
      
 641 
     | 
    
         
            +
                    num_bt_things = 0
         
     | 
| 
       641 
642 
     | 
    
         
             
                    count_column = if hm.options[:through]
         
     | 
| 
       642 
643 
     | 
    
         
             
                                     # Build the chain of JOINs going to the final destination HMT table
         
     | 
| 
       643 
644 
     | 
    
         
             
                                     # (Usually just one JOIN, but could be many.)
         
     | 
| 
         @@ -668,6 +669,8 @@ module ActiveRecord 
     | 
|
| 
       668 
669 
     | 
    
         
             
                                       from_clause << if (src_ref = a.source_reflection).macro == :belongs_to
         
     | 
| 
       669 
670 
     | 
    
         
             
                                                        nm = hmt_assoc.source_reflection.inverse_of&.name
         
     | 
| 
       670 
671 
     | 
    
         
             
                                                        link_back << nm
         
     | 
| 
      
 672 
     | 
    
         
            +
                                                        num_bt_things += 1
         
     | 
| 
      
 673 
     | 
    
         
            +
                                                        # puts "BT #{a.table_name}"
         
     | 
| 
       671 
674 
     | 
    
         
             
                                                        "ON br_t#{idx}.id = br_t#{idx - 1}.#{a.foreign_key}"
         
     | 
| 
       672 
675 
     | 
    
         
             
                                                      elsif src_ref.options[:as]
         
     | 
| 
       673 
676 
     | 
    
         
             
                                                        "ON br_t#{idx}.#{src_ref.type} = '#{src_ref.active_record.name}'" + # "polymorphable_type"
         
     | 
| 
         @@ -686,6 +689,7 @@ module ActiveRecord 
     | 
|
| 
       686 
689 
     | 
    
         
             
                                                            "br_t#{idx - 1}.#{a.foreign_key} = br_t#{idx}.id"
         
     | 
| 
       687 
690 
     | 
    
         
             
                                                        end
         
     | 
| 
       688 
691 
     | 
    
         
             
                                                      else # Standard has_many or has_one
         
     | 
| 
      
 692 
     | 
    
         
            +
                                                        # puts "HM #{a.table_name}"
         
     | 
| 
       689 
693 
     | 
    
         
             
                                                        # binding.pry unless (
         
     | 
| 
       690 
694 
     | 
    
         
             
                                                        nm = hmt_assoc.source_reflection.inverse_of&.name
         
     | 
| 
       691 
695 
     | 
    
         
             
                                                        # )
         
     | 
| 
         @@ -708,7 +712,13 @@ module ActiveRecord 
     | 
|
| 
       708 
712 
     | 
    
         
             
                                       # binding.pry if link_back.length > 2
         
     | 
| 
       709 
713 
     | 
    
         
             
                                       "br_t#{idx}.#{hm.foreign_key}"
         
     | 
| 
       710 
714 
     | 
    
         
             
                                     else # A HMT that goes HM -> HM, something like Categories -> Products -> LineItems
         
     | 
| 
       711 
     | 
    
         
            -
                                       #  
     | 
| 
      
 715 
     | 
    
         
            +
                                       # %%% Currently flaky, so will revisit this soon, probably while implementing the whole link_back architecture
         
     | 
| 
      
 716 
     | 
    
         
            +
                                       if num_bt_things > 1
         
     | 
| 
      
 717 
     | 
    
         
            +
                                         # binding.pry
         
     | 
| 
      
 718 
     | 
    
         
            +
                                         nix << k
         
     | 
| 
      
 719 
     | 
    
         
            +
                                         next
         
     | 
| 
      
 720 
     | 
    
         
            +
                                       end
         
     | 
| 
      
 721 
     | 
    
         
            +
             
     | 
| 
       712 
722 
     | 
    
         
             
                                       "br_t#{idx}.#{src_ref.active_record.primary_key}"
         
     | 
| 
       713 
723 
     | 
    
         
             
                                     end
         
     | 
| 
       714 
724 
     | 
    
         
             
                                   else
         
     | 
| 
         @@ -2498,9 +2508,9 @@ module Brick 
     | 
|
| 
       2498 
2508 
     | 
    
         
             
              # rubocop:enable Style/CommentedKeyword
         
     | 
| 
       2499 
2509 
     | 
    
         | 
| 
       2500 
2510 
     | 
    
         
             
              class << self
         
     | 
| 
       2501 
     | 
    
         
            -
                def _add_bt_and_hm(fk, relations,  
     | 
| 
      
 2511 
     | 
    
         
            +
                def _add_bt_and_hm(fk, relations, polymorphic_class = nil, is_optional = false)
         
     | 
| 
       2502 
2512 
     | 
    
         
             
                  bt_assoc_name = ::Brick.namify(fk[2], :downcase)
         
     | 
| 
       2503 
     | 
    
         
            -
                  unless  
     | 
| 
      
 2513 
     | 
    
         
            +
                  unless polymorphic_class
         
     | 
| 
       2504 
2514 
     | 
    
         
             
                    bt_assoc_name = if bt_assoc_name.underscore.end_with?('_id')
         
     | 
| 
       2505 
2515 
     | 
    
         
             
                                      bt_assoc_name[-3] == '_' ? bt_assoc_name[0..-4] : bt_assoc_name[0..-3]
         
     | 
| 
       2506 
2516 
     | 
    
         
             
                                    elsif bt_assoc_name.downcase.end_with?('id') && bt_assoc_name.exclude?('_')
         
     | 
| 
         @@ -2555,7 +2565,7 @@ module Brick 
     | 
|
| 
       2555 
2565 
     | 
    
         
             
                      puts "Brick: Additional reference #{fk.inspect} refers to non-existent #{'table'.pluralize(missing.length)} #{missing.join(' and ')}. (Available tables include #{tables.join(', ')}.)"
         
     | 
| 
       2556 
2566 
     | 
    
         
             
                      return
         
     | 
| 
       2557 
2567 
     | 
    
         
             
                    end
         
     | 
| 
       2558 
     | 
    
         
            -
                    unless (cols = relations[fk[1]][:cols]).key?(fk[2]) || ( 
     | 
| 
      
 2568 
     | 
    
         
            +
                    unless (cols = relations[fk[1]][:cols]).key?(fk[2]) || (polymorphic_class && cols.key?("#{fk[2]}_id") && cols.key?("#{fk[2]}_type"))
         
     | 
| 
       2559 
2569 
     | 
    
         
             
                      columns = cols.map { |k, v| "#{k} (#{v.first.split(' ').first})" }
         
     | 
| 
       2560 
2570 
     | 
    
         
             
                      puts "Brick: Additional reference #{fk.inspect} refers to non-existent column #{fk[2]}. (Columns present in #{fk[1]} are #{columns.join(', ')}.)"
         
     | 
| 
       2561 
2571 
     | 
    
         
             
                      return
         
     | 
| 
         @@ -2572,9 +2582,10 @@ module Brick 
     | 
|
| 
       2572 
2582 
     | 
    
         
             
                  return unless bts # Rails 5.0 and older can have bts end up being nil
         
     | 
| 
       2573 
2583 
     | 
    
         | 
| 
       2574 
2584 
     | 
    
         
             
                  if (assoc_bt = bts[cnstr_name])
         
     | 
| 
       2575 
     | 
    
         
            -
                    if  
     | 
| 
      
 2585 
     | 
    
         
            +
                    if polymorphic_class
         
     | 
| 
       2576 
2586 
     | 
    
         
             
                      # Assuming same fk (don't yet support composite keys for polymorphics)
         
     | 
| 
       2577 
2587 
     | 
    
         
             
                      assoc_bt[:inverse_table] << fk[4]
         
     | 
| 
      
 2588 
     | 
    
         
            +
                      assoc_bt[:polymorphic] << polymorphic_class
         
     | 
| 
       2578 
2589 
     | 
    
         
             
                    else # Expect we could have a composite key going
         
     | 
| 
       2579 
2590 
     | 
    
         
             
                      if assoc_bt[:fk].is_a?(String)
         
     | 
| 
       2580 
2591 
     | 
    
         
             
                        assoc_bt[:fk] = [assoc_bt[:fk], fk[2]] unless fk[2] == assoc_bt[:fk]
         
     | 
| 
         @@ -2584,10 +2595,10 @@ module Brick 
     | 
|
| 
       2584 
2595 
     | 
    
         
             
                      assoc_bt[:assoc_name] = "#{assoc_bt[:assoc_name]}_#{fk[2]}"
         
     | 
| 
       2585 
2596 
     | 
    
         
             
                    end
         
     | 
| 
       2586 
2597 
     | 
    
         
             
                  else
         
     | 
| 
       2587 
     | 
    
         
            -
                    inverse_table = [primary_table] if  
     | 
| 
      
 2598 
     | 
    
         
            +
                    inverse_table = [primary_table] if polymorphic_class
         
     | 
| 
       2588 
2599 
     | 
    
         
             
                    assoc_bt = bts[cnstr_name] = { is_bt: true, fk: fk[2], assoc_name: bt_assoc_name, inverse_table: inverse_table || primary_table }
         
     | 
| 
       2589 
2600 
     | 
    
         
             
                    assoc_bt[:optional] = true if is_optional
         
     | 
| 
       2590 
     | 
    
         
            -
                    assoc_bt[:polymorphic] =  
     | 
| 
      
 2601 
     | 
    
         
            +
                    assoc_bt[:polymorphic] = [polymorphic_class] if polymorphic_class
         
     | 
| 
       2591 
2602 
     | 
    
         
             
                  end
         
     | 
| 
       2592 
2603 
     | 
    
         
             
                  if is_class
         
     | 
| 
       2593 
2604 
     | 
    
         
             
                    # For use in finding the proper :source for a HMT association that references an STI subclass
         
     | 
| 
         @@ -2613,7 +2624,7 @@ module Brick 
     | 
|
| 
       2613 
2624 
     | 
    
         
             
                              end
         
     | 
| 
       2614 
2625 
     | 
    
         
             
                    assoc_hm = hms[hm_cnstr_name] = { is_bt: false, fk: fk[2], assoc_name: fk_namified.pluralize, alternate_name: bt_assoc_name,
         
     | 
| 
       2615 
2626 
     | 
    
         
             
                                                      inverse_table: inv_tbl, inverse: assoc_bt }
         
     | 
| 
       2616 
     | 
    
         
            -
                    assoc_hm[:polymorphic] = true if  
     | 
| 
      
 2627 
     | 
    
         
            +
                    assoc_hm[:polymorphic] = true if polymorphic_class
         
     | 
| 
       2617 
2628 
     | 
    
         
             
                    hm_counts = relation.fetch(:hm_counts) { relation[:hm_counts] = {} }
         
     | 
| 
       2618 
2629 
     | 
    
         
             
                    this_hm_count = hm_counts[fk[1]] = hm_counts.fetch(fk[1]) { 0 } + 1
         
     | 
| 
       2619 
2630 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -170,11 +170,8 @@ module Brick::Rails::FormTags 
     | 
|
| 
       170 
170 
     | 
    
         
             
                                   if klass
         
     | 
| 
       171 
171 
     | 
    
         
             
                                     type_col = klass.inheritance_column # Usually 'type'
         
     | 
| 
       172 
172 
     | 
    
         
             
                                     filter_parts << "#{type_col}=#{sti_type}" if sti_type && klass.column_names.include?(type_col)
         
     | 
| 
       173 
     | 
    
         
            -
                                     path_params = request.path_parameters 
     | 
| 
       174 
     | 
    
         
            -
                                     path_params.delete(:controller)
         
     | 
| 
       175 
     | 
    
         
            -
                                     path_params.delete(:action)
         
     | 
| 
      
 173 
     | 
    
         
            +
                                     path_params = request.path_parameters
         
     | 
| 
       176 
174 
     | 
    
         
             
                                     pk = (klass.primary_key || ActiveRecord::Base.primary_key).to_sym
         
     | 
| 
       177 
     | 
    
         
            -
                                     # Used to also have this but it's a bit too permissive to identify a primary key:  (path_params.length == 1 && path_params.values.first) ||
         
     | 
| 
       178 
175 
     | 
    
         
             
                                     if ((id = (path_params[pk] || path_params[:id] || path_params["#{klass.name.underscore}_id".to_sym])) && (obj = klass.find_by(pk => id))) ||
         
     | 
| 
       179 
176 
     | 
    
         
             
                                        (['show', 'edit', 'update', 'destroy'].include?(action_name) && (obj = klass.first))
         
     | 
| 
       180 
177 
     | 
    
         
             
                                       obj
         
     | 
| 
         @@ -183,7 +180,18 @@ module Brick::Rails::FormTags 
     | 
|
| 
       183 
180 
     | 
    
         
             
                                       # %%% If there is a polymorphic association that might relate to stuff in the path_params,
         
     | 
| 
       184 
181 
     | 
    
         
             
                                       # try to identify an appropriate ___able_id and ___able_type filter
         
     | 
| 
       185 
182 
     | 
    
         
             
                                       ((klass.column_names - [pk.to_s]) & path_params.keys.map(&:to_s)).each do |path_param|
         
     | 
| 
       186 
     | 
    
         
            -
                                          
     | 
| 
      
 183 
     | 
    
         
            +
                                         next if [:controller, :action].include?(path_param)
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
                                         foreign_id = path_params[path_param.to_sym]
         
     | 
| 
      
 186 
     | 
    
         
            +
                                         # Need to convert a friendly_id slug to a real ID?
         
     | 
| 
      
 187 
     | 
    
         
            +
                                         if Object.const_defined?('FriendlyId') &&
         
     | 
| 
      
 188 
     | 
    
         
            +
                                            (assoc = klass.reflect_on_all_associations.find { |a| a.belongs_to? && a.foreign_key == path_param }) &&
         
     | 
| 
      
 189 
     | 
    
         
            +
                                            (assoc_klass = assoc.klass).instance_variable_get(:@friendly_id_config) &&
         
     | 
| 
      
 190 
     | 
    
         
            +
                                            (new_id = assoc_klass.where(assoc_klass.friendly_id_config.query_field => foreign_id)
         
     | 
| 
      
 191 
     | 
    
         
            +
                                                                 .pluck(assoc_klass.primary_key).first)
         
     | 
| 
      
 192 
     | 
    
         
            +
                                           foreign_id = new_id
         
     | 
| 
      
 193 
     | 
    
         
            +
                                         end
         
     | 
| 
      
 194 
     | 
    
         
            +
                                         filter_parts << "#{path_param}=#{foreign_id}"
         
     | 
| 
       187 
195 
     | 
    
         
             
                                       end
         
     | 
| 
       188 
196 
     | 
    
         
             
                                       klass
         
     | 
| 
       189 
197 
     | 
    
         
             
                                     end
         
     | 
    
        data/lib/brick/version_number.rb
    CHANGED
    
    
    
        data/lib/brick.rb
    CHANGED
    
    | 
         @@ -208,7 +208,7 @@ module Brick 
     | 
|
| 
       208 
208 
     | 
    
         
             
                      if a.polymorphic?
         
     | 
| 
       209 
209 
     | 
    
         
             
                        rel_poly_bt = relations[model.table_name][:fks].find { |_k, fk| fk[:assoc_name] == a.name.to_s }
         
     | 
| 
       210 
210 
     | 
    
         
             
                        if (primary_tables = rel_poly_bt&.last&.fetch(:inverse_table, [])).is_a?(Array)
         
     | 
| 
       211 
     | 
    
         
            -
                          models =  
     | 
| 
      
 211 
     | 
    
         
            +
                          models = rel_poly_bt[1][:polymorphic]&.map { |table| table.singularize.camelize.constantize }
         
     | 
| 
       212 
212 
     | 
    
         
             
                          s.first[a.foreign_key.to_s] = [a.name, models, true]
         
     | 
| 
       213 
213 
     | 
    
         
             
                        else
         
     | 
| 
       214 
214 
     | 
    
         
             
                          # This will come up when using Devise invitable when invited_by_class_name is not
         
     | 
| 
         @@ -523,8 +523,13 @@ module Brick 
     | 
|
| 
       523 
523 
     | 
    
         
             
                        table_name, poly = k.split('.')
         
     | 
| 
       524 
524 
     | 
    
         
             
                        v ||= ActiveRecord::Base.execute_sql("SELECT DISTINCT #{poly}_type AS typ FROM #{table_name}").each_with_object([]) { |result, s| s << result['typ'] if result['typ'] }
         
     | 
| 
       525 
525 
     | 
    
         
             
                        v.each do |type|
         
     | 
| 
       526 
     | 
    
         
            -
                           
     | 
| 
       527 
     | 
    
         
            -
             
     | 
| 
      
 526 
     | 
    
         
            +
                          # Allow polymorphic BT to relate to an STI subclass
         
     | 
| 
      
 527 
     | 
    
         
            +
                          base_type = ::Brick.config.sti_namespace_prefixes["::#{type}"] ||
         
     | 
| 
      
 528 
     | 
    
         
            +
                                      ::Brick.config.sti_namespace_prefixes.find { |k, _v| type.start_with?(k[2..-1]) }&.last&.[](2..-1)
         
     | 
| 
      
 529 
     | 
    
         
            +
                          if relations.key?(primary_table = (base_type || type).underscore.pluralize)
         
     | 
| 
      
 530 
     | 
    
         
            +
                            ::Brick._add_bt_and_hm([nil, table_name, poly, nil, primary_table, "(brick) #{table_name}_#{poly}"], relations,
         
     | 
| 
      
 531 
     | 
    
         
            +
                                                   type, # Polymorphic class
         
     | 
| 
      
 532 
     | 
    
         
            +
                                                   is_optional)
         
     | 
| 
       528 
533 
     | 
    
         
             
                          else
         
     | 
| 
       529 
534 
     | 
    
         
             
                            missing_stis[primary_table] = type unless ::Brick.existing_stis.key?(type)
         
     | 
| 
       530 
535 
     | 
    
         
             
                          end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: brick
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.124
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Lorin Thwaits
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2023-03- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-03-26 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: activerecord
         
     |