brick 1.0.188 → 1.0.190

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: 66a294952ebee9c385431265543c55106d7d9938c215d98163a15f1e94863ef9
4
- data.tar.gz: 207b5914e0bc18bdd24c074b3b6de94e262cce57f21ca40d8e7aeecbeb7ca1ec
3
+ metadata.gz: 3e7a12940f4ac57eea3c53bb3b437472f90bbaa857bd6611d3e871463add46f2
4
+ data.tar.gz: 8afb6e47cebd99a9b4172aa82d9447b71dd66e6df750249063b66b9b9ba939a9
5
5
  SHA512:
6
- metadata.gz: f381dd36a4c52d533545b8a5bcc61f43e64998f3e90f3158e5f1be7a04614f8113557e928ab5a129543f4529dbf9676b044ac99c3dde1d83a979b34892aa8137
7
- data.tar.gz: 54231970263712710cdc694b4909f1758b345084c5ed36c603fead9aebb41c1253c230f760fdc0c1a611a1ca40d0985bcd2cba3b823e90f829fe3b18357ff227
6
+ metadata.gz: d5379ddb6c61675b5606730a771a3f95638829b8359b42fd78c0509836635a93d36b787b09f21a0b9321623c917a149508b643a68ff4474baf7b40739ad5eeed
7
+ data.tar.gz: 40b6c6dc4fd31b10632fafb572608ec1c6473b6efa1dab346f1c82fc4f9daa1faba6d3675b336a780291595e25ace20358a95205a9284e7c42ddf450efe1d0a4
@@ -98,6 +98,7 @@ module ActiveRecord
98
98
  end
99
99
 
100
100
  def _br_quoted_name(name)
101
+ name = name.join('.') if name.is_a?(Array)
101
102
  if name == '*'
102
103
  name
103
104
  elsif is_mysql
@@ -729,12 +730,12 @@ module ActiveRecord
729
730
  cc_part_idx -= 1
730
731
  end
731
732
  end
732
- selects << "#{tbl_name}.#{cc_part.last} AS #{col_alias}"
733
+ selects << "#{_br_quoted_name(tbl_name)}.#{_br_quoted_name(cc_part.last)} AS #{_br_quoted_name(col_alias)}"
733
734
  cc_part << col_alias
734
735
  end
735
736
  # Add a key column unless we've already got it
736
737
  if key_alias && !used_col_aliases.key?(key_alias)
737
- selects << "#{key_tbl_name}.#{dest_pk} AS #{key_alias}"
738
+ selects << "#{_br_quoted_name(key_tbl_name)}.#{_br_quoted_name(dest_pk)} AS #{_br_quoted_name(key_alias)}"
738
739
  used_col_aliases[key_alias] = nil
739
740
  end
740
741
  cc[2] = key_alias ? [key_klass, key_alias] : nil
@@ -1018,7 +1019,7 @@ JOIN (SELECT #{hm_selects.map { |s| _br_quoted_name("#{'br_t0.' if from_clause}#
1018
1019
  selects, where_values_hash, nil, translations: translations, join_array: join_array,
1019
1020
  cust_col_override: { '_br' => (descrip_cols = [pieces, my_dsl]) }
1020
1021
  )
1021
- order_values = "#{klass.table_name}.#{klass.primary_key}"
1022
+ order_values = "#{_br_quoted_name(klass.table_name)}.#{_br_quoted_name(klass.primary_key)}"
1022
1023
  [self.select(selects), descrip_cols]
1023
1024
  end
1024
1025
 
@@ -2158,7 +2159,7 @@ class Object
2158
2159
 
2159
2160
  # %%% Allow params to define which columns to use for order_by
2160
2161
  # Overriding the default by providing a querystring param?
2161
- order_by = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
2162
+ order_by = params['_brick_order']&.split(',')&.map(&:to_s) || Object.send(:default_ordering, table_name, pk)
2162
2163
 
2163
2164
  ar_relation = ActiveRecord.version < Gem::Version.new('4') ? real_model.preload : real_model.all
2164
2165
  params['_brick_is_api'] = true if (is_api = request.format == :js || current_api_root)
@@ -2895,24 +2896,32 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2895
2896
  # end
2896
2897
  # end
2897
2898
  # schema = ::Brick.default_schema # Reset back for this next round of fun
2899
+ kcus = nil
2898
2900
  case ActiveRecord::Base.connection.adapter_name
2899
2901
  when 'PostgreSQL', 'Mysql2', 'Trilogy', 'SQLServer'
2900
- sql = "SELECT kcu1.CONSTRAINT_SCHEMA, kcu1.TABLE_NAME, kcu1.COLUMN_NAME,
2901
- kcu2.CONSTRAINT_SCHEMA AS primary_schema, kcu2.TABLE_NAME AS primary_table, kcu1.CONSTRAINT_NAME AS CONSTRAINT_SCHEMA_FK
2902
+ # All KCUs -- use this to virtually JOIN against fk_references in Ruby code
2903
+ sql = "SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, ORDINAL_POSITION,
2904
+ TABLE_NAME, COLUMN_NAME
2905
+ FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE#{"
2906
+ WHERE CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2907
+ kcus = ActiveRecord::Base.execute_sql(sql).each_with_object({}) do |v, s|
2908
+ key = "#{v['constraint_name']}.#{v['constraint_schema']}.#{v['constraint_catalog']}.#{v['ordinal_position']}"
2909
+ key << ".#{v['table_name']}.#{v['column_name']}" unless is_postgres || is_mssql
2910
+ s[key] = [v['constraint_schema'], v['table_name']]
2911
+ end
2912
+
2913
+ sql = "SELECT kcu.CONSTRAINT_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME,
2914
+ #{# These will get filled in with real values (effectively doing the JOIN in Ruby)
2915
+ is_postgres || is_mssql ? 'NULL as primary_schema, NULL as primary_table' :
2916
+ 'kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME'},
2917
+ kcu.CONSTRAINT_NAME AS CONSTRAINT_SCHEMA_FK,
2918
+ rc.UNIQUE_CONSTRAINT_NAME, rc.UNIQUE_CONSTRAINT_SCHEMA, rc.UNIQUE_CONSTRAINT_CATALOG, kcu.ORDINAL_POSITION
2902
2919
  FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
2903
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu1
2904
- ON kcu1.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG
2905
- AND kcu1.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
2906
- AND kcu1.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
2907
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu2
2908
- ON kcu2.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG
2909
- AND kcu2.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA
2910
- AND kcu2.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME#{"
2911
- AND kcu2.TABLE_NAME = kcu1.REFERENCED_TABLE_NAME
2912
- AND kcu2.COLUMN_NAME = kcu1.REFERENCED_COLUMN_NAME" unless is_postgres || is_mssql }
2913
- AND kcu2.ORDINAL_POSITION = kcu1.ORDINAL_POSITION#{"
2914
- WHERE kcu1.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2915
- # AND kcu2.TABLE_NAME = ?;", Apartment::Tenant.current, table_name
2920
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu
2921
+ ON kcu.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG
2922
+ AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
2923
+ AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME#{"
2924
+ WHERE kcu.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2916
2925
  fk_references = ActiveRecord::Base.execute_sql(sql)
2917
2926
  when 'SQLite'
2918
2927
  sql = "SELECT NULL AS constraint_schema, m.name, fkl.\"from\", NULL AS primary_schema, fkl.\"table\", m.name || '_' || fkl.\"from\" AS constraint_name
@@ -2943,6 +2952,11 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2943
2952
  ::Brick.default_schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
2944
2953
  fk_references&.each do |fk|
2945
2954
  fk = fk.values unless fk.is_a?(Array)
2955
+ # Virtually JOIN against fk_references in order to change out the primary schema and primary table
2956
+ if (kcu = kcus&.fetch("#{fk[6]}.#{fk[7]}.#{fk[8]}.#{fk[9]}", nil))
2957
+ fk[3] = kcu[0]
2958
+ fk[4] = kcu[1]
2959
+ end
2946
2960
  # Multitenancy makes things a little more general overall, except for non-tenanted tables
2947
2961
  if ::Brick.is_apartment_excluded_table(::Brick.namify(fk[1]))
2948
2962
  fk[0] = ::Brick.apartment_default_tenant
@@ -2967,6 +2981,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2967
2981
  end
2968
2982
  ::Brick._add_bt_and_hm(fk, relations)
2969
2983
  end
2984
+ kcus = nil # Allow this large item to be garbage collected
2970
2985
  end
2971
2986
 
2972
2987
  table_name_lookup = (::Brick.table_name_lookup ||= {})
@@ -738,8 +738,11 @@ window.addEventListener(\"popstate\", linkSchemas);
738
738
  hms_columns << hm_entry
739
739
  end
740
740
  when 'show', 'new', 'update'
741
+ predicates = nil
741
742
  hm_stuff << if hm_fk_name
742
- if hm_assoc.klass.column_names.include?(hm_fk_name.to_s) ||
743
+ if (hm_fk_name.is_a?(Array) && # Composite key?
744
+ hm_fk_name.all? { |hm_fk_part| hm_assoc.klass.column_names.include?(hm_fk_part) }) ||
745
+ hm_assoc.klass.column_names.include?(hm_fk_name.to_s) ||
743
746
  (hm_fk_name.is_a?(String) && hm_fk_name.include?('.')) # HMT? (Could do a better check for this)
744
747
  predicates = path_keys(hm_assoc, hm_fk_name, pk).map do |k, v|
745
748
  if v == '[sti_type]'
@@ -1638,7 +1641,7 @@ end
1638
1641
  end
1639
1642
  s << "<table id=\"#{hm_name}\" class=\"shadow\">
1640
1643
  <tr><th>#{hm[1]}#{' poly' if hm[0].options[:as]} #{hm[3]}
1641
- <% if respond_to?(:new_#{partial_new_path_name = hm.first.klass._brick_index(:singular)}_path) %>
1644
+ <% if predicates && respond_to?(:new_#{partial_new_path_name = hm.first.klass._brick_index(:singular)}_path) %>
1642
1645
  <span class = \"add-hm-related\"><%=
1643
1646
  pk_val = (obj_pk = model.primary_key).is_a?(String) ? obj.send(obj_pk) : obj_pk.map { |pk_part| obj.send(pk_part) }
1644
1647
  pk_val_arr = [pk_val] unless pk_val.is_a?(Array)
@@ -467,7 +467,7 @@ function onImagesLoaded(event) {
467
467
  if bt.length < 4
468
468
  bt << (option_detail = [["(No #{bt_name} chosen)", '^^^brick_NULL^^^']])
469
469
  # %%% Accommodate composite keys for obj.pk at the end here
470
- collection, descrip_cols = bt_class&.order(Arel.sql("#{bt_class.table_name}.#{obj_pk = bt_class.primary_key}"))&.brick_list
470
+ collection, descrip_cols = bt_class&.order(Arel.sql("#{bt_class._br_quoted_name(bt_class.table_name)}.#{bt_class._br_quoted_name(obj_pk = bt_class.primary_key)}"))&.brick_list
471
471
  collection&.brick_(:each) do |obj|
472
472
  option_detail << [
473
473
  obj.brick_descrip(
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 188
8
+ TINY = 190
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
@@ -10,6 +10,7 @@ module Brick
10
10
  # Auto-generates migration files
11
11
  class MigrationsGenerator < ::Rails::Generators::Base
12
12
  include ::Brick::MigrationBuilder
13
+ include FancyGets
13
14
 
14
15
  desc 'Auto-generates migration files for an existing database.'
15
16
 
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.188
4
+ version: 1.0.190
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-11-11 00:00:00.000000000 Z
11
+ date: 2023-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -280,7 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
280
  - !ruby/object:Gem::Version
281
281
  version: 1.3.6
282
282
  requirements: []
283
- rubygems_version: 3.1.6
283
+ rubygems_version: 3.2.33
284
284
  signing_key:
285
285
  specification_version: 4
286
286
  summary: Create a Rails app from data alone