brick 1.0.85 → 1.0.87

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b174d2fbdbef5d71921aa28da8fe7f943eb095fc3dd3c95efb7ac752681917e
4
- data.tar.gz: daf09d491031d7f30171b85e25f68ceb36e73df5b183b86ab8269474651fb4b6
3
+ metadata.gz: b178117c13e6d4feb053c27334b558285765a68a8bdc00c0a1d7a0a708ab3e70
4
+ data.tar.gz: b4b90b2cef91df1797d3a6534d6658914000b01542fe244d7560d31922c2125e
5
5
  SHA512:
6
- metadata.gz: 697528d1c7445130ab1cae24b76ad154f72e1a770c26f50ab6bf6f40fe98045c775311c32460e4bfca0869567873166733f0b488eb3e67d9f1a11eb271407032
7
- data.tar.gz: ba9004f32e27f8104eb3547bec82682011a2f328e6081774e6afd4485ff14ec10cc5992bcf539fbc328131a5bd5dbde5804b18bcf73f26108ab9a1f9f48b49b7
6
+ metadata.gz: a7866357360543e3af339aced9e7ff8c1dff803f3f92eebb12926b5cefb4da18415003b729ad5aca3b7771a145035963bd1e49d8a46096bb943a161e4b33ca79
7
+ data.tar.gz: b2978cf99f81c2ad59b04f656c189763d230542e9eb9d9eb7d3a922c609e79354926357320967f7de53a1a6cc4ec55b61811395138e632cb0f1a96993a31e926
@@ -10,12 +10,27 @@ unless ActiveRecord.respond_to?(:version)
10
10
  end
11
11
  end
12
12
 
13
- require 'action_view'
14
- # Older ActionView didn't have #version
15
- unless ActionView.respond_to?(:version)
16
- module ActionView
13
+ # ActiveSupport, ActionPack, and ActionView before 4.0 didn't have #version
14
+ unless ActiveSupport.respond_to?(:version)
15
+ module ActiveSupport
17
16
  def self.version
18
- ActionPack.version
17
+ ::Gem::Version.new(ActiveSupport::VERSION::STRING)
18
+ end
19
+ end
20
+ end
21
+ if Object.const_defined?('ActionPack')
22
+ unless ActionPack.respond_to?(:version)
23
+ module ActionPack
24
+ def self.version
25
+ ::Gem::Version.new(ActionPack::VERSION::STRING)
26
+ end
27
+ end
28
+ end
29
+ if Object.const_defined?('ActionView') && !ActionView.respond_to?(:version)
30
+ module ActionView
31
+ def self.version
32
+ ActionPack.version
33
+ end
19
34
  end
20
35
  end
21
36
  end
@@ -211,7 +211,14 @@ module ActiveRecord
211
211
  this_obj = obj
212
212
  bracket_name.split('.').each do |part|
213
213
  obj_name += ".#{part}"
214
- this_obj = caches.fetch(obj_name) { caches[obj_name] = this_obj&.send(part.to_sym) }
214
+ this_obj = begin
215
+ caches.fetch(obj_name) { caches[obj_name] = this_obj&.send(part.to_sym) }
216
+ rescue
217
+ clsnm = part.camelize
218
+ if (possible = this_obj.class.reflect_on_all_associations.select { |a| a.class_name == clsnm || a.klass.base_class.name == clsnm }.first)
219
+ caches[obj_name] = this_obj&.send(possible.name)
220
+ end
221
+ end
215
222
  break if this_obj.nil?
216
223
  end
217
224
  if this_obj.is_a?(ActiveRecord::Base) && (obj_descrip = this_obj.class.brick_descrip(this_obj))
@@ -239,7 +246,7 @@ module ActiveRecord
239
246
  pk_alias = [pk_alias] unless pk_alias.is_a?(Array)
240
247
  id = []
241
248
  pk_alias.each do |pk_alias_part|
242
- if (pk_part = obj.send(pk_alias_part))
249
+ if (pk_part = obj.respond_to?(pk_alias_part) ? obj.send(pk_alias_part) : nil)
243
250
  id << pk_part
244
251
  end
245
252
  end
@@ -608,7 +615,11 @@ module ActiveRecord
608
615
  # %%% Need to support {user: :profile}
609
616
  next unless assoc_name.is_a?(Symbol)
610
617
 
611
- table_alias = shift_or_first(chains[klass = reflect_on_association(assoc_name)&.klass])
618
+ table_alias = if (chain = chains[klass = reflect_on_association(assoc_name)&.klass])
619
+ shift_or_first(chain)
620
+ else
621
+ klass.table_name # ActiveRecord < 4.2 can't (yet) use the cool chains thing
622
+ end
612
623
  _assoc_names[assoc_name] = [table_alias, klass]
613
624
  end
614
625
  end
@@ -706,7 +717,7 @@ module ActiveRecord
706
717
  join_clause = "LEFT OUTER
707
718
  JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', ')}, COUNT(#{'DISTINCT ' if hm.options[:through]}#{count_column
708
719
  }) AS c_t_ FROM #{from_clause || hm_table_name} GROUP BY #{group_bys.join(', ')}) #{tbl_alias}"
709
- joins!("#{join_clause} ON #{on_clause.join(' AND ')}")
720
+ self.joins_values |= ["#{join_clause} ON #{on_clause.join(' AND ')}"] # Same as: joins!(...)
710
721
  end
711
722
  while (n = nix.pop)
712
723
  klass._br_hm_counts.delete(n)
@@ -723,7 +734,11 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
723
734
  s["#{tbl_name}.#{v_parts.last}"] = v.last
724
735
  end
725
736
  end
726
- where!(wheres2)
737
+ if respond_to?(:where!)
738
+ where!(wheres2)
739
+ else # AR < 4.0
740
+ self.where_values << build_where(wheres2)
741
+ end
727
742
  end
728
743
  # Must parse the order_by and see if there are any symbols which refer to BT associations
729
744
  # or custom columns as they must be expanded to find the corresponding b_r_model__column
@@ -747,9 +762,10 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
747
762
  selects << v if is_distinct
748
763
  end
749
764
  end
750
- order!(*final_order_by)
765
+ self.order_values |= final_order_by # Same as: order!(*final_order_by)
751
766
  end
752
- limit!(1000) # Don't want to get too carried away just yet
767
+ # Don't want to get too carried away just yet
768
+ self.limit_value = 1000 # Same as: limit!(1000)
753
769
  wheres unless wheres.empty? # Return the specific parameters that we did use
754
770
  end
755
771
 
@@ -935,8 +951,13 @@ if ActiveSupport::Dependencies.respond_to?(:autoload_module!) # %%% Only works w
935
951
  autoloaded_constants << qualified_name unless autoloaded_constants.include?(qualified_name)
936
952
  klass
937
953
  elsif (base_class = ::Brick.config.sti_namespace_prefixes&.fetch("::#{const_name}", nil)&.constantize)
938
- # Build subclass and place it into Object
939
- Object.const_set(const_name.to_sym, klass = Class.new(base_class))
954
+ begin
955
+ # Attempt to find an existing implementation for this subclass
956
+ base_class.module_parent.const_get(const_name)
957
+ rescue
958
+ # Build subclass and place it in the same module as its parent
959
+ base_class.module_parent.const_set(const_name.to_sym, klass = Class.new(base_class))
960
+ end
940
961
  else
941
962
  _brick_autoload_module!(*args)
942
963
  end
@@ -1509,9 +1530,10 @@ class Object
1509
1530
  ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
1510
1531
  order_by, _ = model._brick_calculate_ordering(ordering, true) # Don't do the txt part
1511
1532
 
1512
- @_brick_params = (ar_relation = model.all).brick_select(params, (selects = []), order_by,
1513
- translations = {},
1514
- join_array = ::Brick::JoinArray.new)
1533
+ ar_relation = ActiveRecord.version < Gem::Version.new('4') ? model.preload : model.all
1534
+ @_brick_params = ar_relation.brick_select(params, (selects = []), order_by,
1535
+ translations = {},
1536
+ join_array = ::Brick::JoinArray.new)
1515
1537
  # %%% Add custom HM count columns
1516
1538
  # %%% What happens when the PK is composite?
1517
1539
  counts = model._br_hm_counts.each_with_object([]) do |v, s|
@@ -1523,7 +1545,8 @@ class Object
1523
1545
  "b_r_#{v.first}.c_t_ AS \"b_r_#{v.first}_ct\""
1524
1546
  end
1525
1547
  end
1526
- instance_variable_set("@#{table_name.pluralize}".to_sym, ar_relation.dup._select!(*selects, *counts))
1548
+ ar_select = ar_relation.respond_to?(:_select!) ? ar_relation.dup._select!(*selects, *counts) : ar_relation.select(selects + counts)
1549
+ instance_variable_set("@#{table_name.pluralize}".to_sym, ar_select)
1527
1550
  if namespace && (idx = lookup_context.prefixes.index(table_name))
1528
1551
  lookup_context.prefixes[idx] = "#{namespace.name.underscore}/#{lookup_context.prefixes[idx]}"
1529
1552
  end
@@ -1781,6 +1804,8 @@ end.class_exec do
1781
1804
  # This is done separately so that during testing it can be called right after a migration
1782
1805
  # in order to make sure everything is good.
1783
1806
  def _brick_reflect_tables
1807
+ return unless ::Brick.config.mode == :on
1808
+
1784
1809
  # return if ActiveRecord::Base.connection.current_database == 'postgres'
1785
1810
 
1786
1811
  initializer_loaded = false
@@ -1854,8 +1879,9 @@ end.class_exec do
1854
1879
  ::Brick.db_schemas ||= {}
1855
1880
 
1856
1881
  if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
1857
- if (possible_schema = ::Brick.config.schema_behavior&.[](:multitenant)&.[](:schema_to_analyse))
1858
- if ::Brick.db_schemas.key?(possible_schema)
1882
+ if (possible_schemas = ::Brick.config.schema_behavior&.[](:multitenant)&.[](:schema_to_analyse))
1883
+ possible_schemas = [possible_schemas] unless possible_schemas.is_a?(Array)
1884
+ if (possible_schema = possible_schemas.find { |ps| ::Brick.db_schemas.key?(ps) })
1859
1885
  ::Brick.default_schema = schema = possible_schema
1860
1886
  orig_schema = ActiveRecord::Base.execute_sql('SELECT current_schemas(true)').first['current_schemas'][1..-2].split(',')
1861
1887
  ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?", schema)
@@ -1865,7 +1891,7 @@ end.class_exec do
1865
1891
  orig_schema = ActiveRecord::Base.execute_sql('SELECT current_schemas(true)').first['current_schemas'][1..-2].split(',')
1866
1892
  ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?", schema)
1867
1893
  else
1868
- puts "*** In the brick.rb initializer the line \"::Brick.schema_behavior = ...\" refers to a schema called \"#{possible_schema}\". This schema does not exist. ***"
1894
+ puts "*** In the brick.rb initializer the line \"::Brick.schema_behavior = ...\" refers to schema(s) called #{possible_schemas.map { |s| "\"#{s}\"" }.join(', ')}. No mentioned schema exists. ***"
1869
1895
  end
1870
1896
  end
1871
1897
  end
@@ -2028,6 +2054,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2028
2054
  end
2029
2055
  ::Brick.is_oracle = true if ActiveRecord::Base.connection.adapter_name == 'OracleEnhanced'
2030
2056
  # ::Brick.default_schema ||= schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
2057
+ ::Brick.default_schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
2031
2058
  fk_references&.each do |fk|
2032
2059
  fk = fk.values unless fk.is_a?(Array)
2033
2060
  # Multitenancy makes things a little more general overall, except for non-tenanted tables
@@ -103,12 +103,18 @@ module Brick
103
103
  unless (model_name = @_brick_model&.name) ||
104
104
  (is_status = ::Brick.config.add_status && args[0..1] == ['status', ['brick_gem']]) ||
105
105
  (is_orphans = ::Brick.config.add_orphans && args[0..1] == ['orphans', ['brick_gem']])
106
- if (possible_template = _brick_find_template(*args, **options))
106
+ if ActionView.version < ::Gem::Version.new('5.0') # %%% Not sure if this should be perhaps 4.2 instead
107
+ begin
108
+ if (possible_template = _brick_find_template(*args, **options))
109
+ return possible_template
110
+ end
111
+ rescue
112
+ end
113
+ elsif (possible_template = _brick_find_template(*args, **options))
107
114
  return possible_template
108
- else
109
- # Used to also have: ActionView.version < ::Gem::Version.new('5.0') &&
110
- model_name = (args[1].is_a?(Array) ? set_brick_model(args) : nil)&.name
111
115
  end
116
+ # Used to also have: ActionView.version < ::Gem::Version.new('5.0') &&
117
+ model_name = (args[1].is_a?(Array) ? set_brick_model(args) : nil)&.name
112
118
  end
113
119
 
114
120
  if @_brick_model
@@ -154,7 +160,7 @@ module Brick
154
160
  'nil'
155
161
  else
156
162
  # Postgres column names are limited to 63 characters
157
- "#{obj_name}.#{"b_r_#{assoc_name}_ct"[0..62]} || 0"
163
+ "#{obj_name}.#{"b_r_#{assoc_name}_ct"[0..62]}&.to_i || 0"
158
164
  end
159
165
  ", #{set_ct}, #{path_keys(hm_assoc, hm_fk_name, obj_name, pk)}"
160
166
  end
@@ -919,12 +925,19 @@ erDiagram
919
925
  %><%= link_to(\"#\{bt_class} ##\{poly_id}\", send(\"#\{base_class_underscored}_path\".to_sym, poly_id)) if poly_id %><%
920
926
  else
921
927
  # binding.pry if @_brick_bt_descrip[bt.first][bt[1].first.first].nil?
922
- bt_txt = (bt_class = bt[1].first.first).brick_descrip(
928
+ bt_class = bt[1].first.first
929
+ descrips = @_brick_bt_descrip[bt.first][bt_class]
930
+ bt_id_col = if descrips.length == 1
931
+ [#{obj_name}.class.reflect_on_association(bt.first)&.foreign_key]
932
+ else
933
+ descrips.last
934
+ end
935
+ bt_txt = bt_class.brick_descrip(
923
936
  # 0..62 because Postgres column names are limited to 63 characters
924
- #{obj_name}, (descrips = @_brick_bt_descrip[bt.first][bt_class])[0..-2].map { |id| #{obj_name}.send(id.last[0..62]) }, (bt_id_col = descrips.last)
937
+ #{obj_name}, descrips[0..-2].map { |id| #{obj_name}.send(id.last[0..62]) }, bt_id_col
925
938
  )
926
939
  bt_txt ||= \"<span class=\\\"orphan\\\">&lt;&lt; Orphaned ID: #\{val} >></span>\".html_safe if val
927
- bt_id = bt_id_col.map { |id_col| #{obj_name}.send(id_col.to_sym) } %>
940
+ bt_id = bt_id_col&.map { |id_col| #{obj_name}.respond_to?(id_sym = id_col.to_sym) ? #{obj_name}.send(id_sym) : id_col } %>
928
941
  <%= bt_id&.first ? link_to(bt_txt, send(\"#\{bt_class.base_class._brick_index(:singular)}_path\".to_sym, bt_id)) : bt_txt %>
929
942
  <% end
930
943
  elsif (hms_col = hms_cols[col_name])
@@ -1183,7 +1196,7 @@ end
1183
1196
  s << "<table id=\"#{hm_name}\" class=\"shadow\">
1184
1197
  <tr><th>#{hm[3]}</th></tr>
1185
1198
  <% collection = @#{obj_name}.#{hm_name}
1186
- collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) : [collection].compact
1199
+ collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) : collection.to_a.compact
1187
1200
  if collection.empty? %>
1188
1201
  <tr><td>(none)</td></tr>
1189
1202
  <% else %>
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 85
8
+ TINY = 87
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
data/lib/brick.rb CHANGED
@@ -137,7 +137,7 @@ module Brick
137
137
 
138
138
  def set_db_schema(params = nil)
139
139
  schema = (params ? params['_brick_schema'] : ::Brick.default_schema)
140
- if schema && ::Brick.db_schemas&.key?(schema)
140
+ chosen = if schema && ::Brick.db_schemas&.key?(schema)
141
141
  ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?;", schema)
142
142
  schema
143
143
  elsif ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
@@ -146,6 +146,7 @@ module Brick
146
146
  # ::Brick.apartment_multitenant && tbl_parts.first == Apartment.default_schema
147
147
  (orig_schema - ['pg_catalog']).first
148
148
  end
149
+ chosen == ::Brick.default_schema ? nil : chosen
149
150
  end
150
151
 
151
152
  # All tables and views (what Postgres calls "relations" including column and foreign key info)
@@ -218,7 +219,7 @@ module Brick
218
219
  skip_hms[through] = nil if hms[through] && model.is_brick?
219
220
  # End up with a hash of HMT names pointing to join-table associations
220
221
  model._br_associatives[hmt.first] = hms[through] # || hms["#{(opt = hmt.last.options)[:through].to_s.singularize}_#{opt[:source].to_s.pluralize}".to_sym]
221
- elsif hmt.last.inverse_of.nil?
222
+ elsif hmt.last.inverse_of.nil? && ActiveRecord.version >= ::Gem::Version.new('4.2')
222
223
  puts "SKIPPING #{hmt.last.name.inspect}"
223
224
  # %%% If we don't do this then below associative.name will find that associative is nil
224
225
  skip_hms[hmt.last.name] = nil
@@ -540,7 +541,11 @@ In config/initializers/brick.rb appropriate entries would look something like:
540
541
  ::Brick.is_eager_loading = true
541
542
  if ::ActiveSupport.version < ::Gem::Version.new('6') ||
542
543
  ::Rails.configuration.instance_variable_get(:@autoloader) == :classic
543
- ::Rails.configuration.eager_load_namespaces.select { |ns| ns < ::Rails::Application }.each(&:eager_load!)
544
+ if ::ActiveSupport.version < ::Gem::Version.new('4')
545
+ ::Rails.application.eager_load!
546
+ else
547
+ ::Rails.configuration.eager_load_namespaces.select { |ns| ns < ::Rails::Application }.each(&:eager_load!)
548
+ end
544
549
  else
545
550
  Zeitwerk::Loader.eager_load_all
546
551
  end
@@ -562,7 +567,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
562
567
 
563
568
  module RouteSet
564
569
  def finalize!
565
- unless ::Rails.application.routes.named_routes.route_defined?(:brick_status_path)
570
+ # %%% Was: ::Rails.application.routes.named_routes.route_defined?(:brick_status_path)
571
+ unless ::Rails.application.routes.named_routes.names.include?(:brick_status)
566
572
  path_prefix = ::Brick.config.path_prefix
567
573
  existing_controllers = routes.each_with_object({}) do |r, s|
568
574
  c = r.defaults[:controller]
@@ -837,13 +843,21 @@ ActiveSupport.on_load(:active_record) do
837
843
  end
838
844
  end
839
845
 
840
- # This only gets added for ActiveRecord < 3.2
841
846
  module Reflection
847
+ # This only gets added for ActiveRecord < 3.2
842
848
  unless AssociationReflection.instance_methods.include?(:foreign_key)
843
849
  class AssociationReflection < MacroReflection
844
850
  alias foreign_key association_foreign_key
845
851
  end
846
852
  end
853
+ # And this for ActiveRecord < 4.0
854
+ unless AssociationReflection.instance_methods.include?(:polymorphic?)
855
+ class AssociationReflection < MacroReflection
856
+ def polymorphic?
857
+ options[:polymorphic]
858
+ end
859
+ end
860
+ end
847
861
  end
848
862
 
849
863
  # ActiveRecord 3.1 and 3.2 didn't try to bring in &block for the .extending() convenience thing
@@ -1022,6 +1036,7 @@ ActiveSupport.on_load(:active_record) do
1022
1036
  delegate :left_outer_joins, to: :all
1023
1037
  end
1024
1038
  class Relation
1039
+ alias :model :klass unless respond_to?(:model) # To support AR < 4.2
1025
1040
  unless MULTI_VALUE_METHODS.include?(:left_outer_joins)
1026
1041
  _multi_value_methods = MULTI_VALUE_METHODS + [:left_outer_joins]
1027
1042
  send(:remove_const, :MULTI_VALUE_METHODS)
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.85
4
+ version: 1.0.87
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-26 00:00:00.000000000 Z
11
+ date: 2022-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.1'
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '3.1'
26
+ version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fancy_gets
29
29
  requirement: !ruby/object:Gem::Requirement