brick 1.0.188 → 1.0.190

Sign up to get free protection for your applications and to get access to all the features.
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