brick 1.0.203 → 1.0.204

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: 7653a7b2f496e0ade8937b6352b66d06a63dc47487a2472ebf5e5f5b94faf711
4
- data.tar.gz: b4723c7d202d7cdaf125bd0ca6bc52852b89c813444bf8e4662724a591d7a7bc
3
+ metadata.gz: 9bf1dd73cdb0040884c92622e0a7dab4c36232440b5f70e74c2f9f362843373d
4
+ data.tar.gz: 19fd7bbfd6088ed1606b6c2a5ad2fa67cb9dd3b6217313bdfaa368b4fc1ca5f0
5
5
  SHA512:
6
- metadata.gz: c29614452bbbd5b1c52e6fcee20fd2308479e508a03d15d98ddd3ca73c3ad746dff9e9bfffb8979768f456d68ce5bbfaa286d96c2ef62c65e306bd3d0fa15495
7
- data.tar.gz: f8a2ac34c8a34a3a7308a49b6e17a57bf71c13718a58838f61e8e5d45699f3d9dee766a3786d4fd11be52601f02e9168803f49a8b4ce35ef7d404bef95523584
6
+ metadata.gz: eb16cd17c3ad18718164242957e71353ccb5708650136a44517a13255b65d40dc47d6b579defd92d76b9b6a77c696a386880db70f6c2d1495a0f198f64866dbc
7
+ data.tar.gz: 97e22cd5f88a8008313362558ccb5ab7829772568573f0622e2eba61640d5a59ae44135d4870878f90bd750d496ed8aeef0e22badffe4168b142580911650b11
@@ -126,10 +126,11 @@ module ActiveRecord
126
126
  return @_brick_primary_key if instance_variable_defined?(:@_brick_primary_key)
127
127
 
128
128
  pk = begin
129
- primary_key.is_a?(String) ? [primary_key] : primary_key.dup || []
130
- rescue
131
- []
132
- end
129
+ primary_key
130
+ rescue
131
+ superclass.respond_to?(:primary_key) && superclass.primary_key
132
+ end
133
+ pk = pk.is_a?(String) ? [pk] : pk.dup || []
133
134
  pk.map! { |pk_part| pk_part =~ /^[A-Z0-9_]+$/ ? pk_part.downcase : pk_part } unless connection.adapter_name == 'MySQL2'
134
135
  # Just return [] if we're missing any part of the primary key. (PK is usually just "id")
135
136
  if relation && pk.present?
@@ -1551,7 +1552,7 @@ class Object
1551
1552
 
1552
1553
  private
1553
1554
 
1554
- def build_model(relations, base_module, base_name, class_name, inheritable_name = nil)
1555
+ def build_model(relations, base_module, base_name, class_name, inheritable_name = nil, is_generator = nil)
1555
1556
  tnp = ::Brick.config.table_name_prefixes&.find { |p| p.last == base_module.name }
1556
1557
  # return [base_module, ''] if !base_module.is_a?(Class) && base_name == tnp&.last
1557
1558
 
@@ -1585,12 +1586,12 @@ class Object
1585
1586
  # Maybe, just maybe there's a database table that will satisfy this need
1586
1587
  matching = ::Brick.table_name_lookup&.fetch(class_name, nil)
1587
1588
  if (matching ||= [table_name, singular_table_name, plural_class_name, model_name, table_name.titleize].find { |m| relations.key?(schema_name ? "#{schema_name}.#{m}" : m) })
1588
- build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
1589
+ build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching, is_generator)
1589
1590
  end
1590
1591
  end
1591
1592
  end
1592
1593
 
1593
- def build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
1594
+ def build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching, is_generator = nil)
1594
1595
  if ::Brick.apartment_multitenant &&
1595
1596
  schema_name == ::Brick.apartment_default_tenant
1596
1597
  relation = relations["#{schema_name}.#{matching}"]
@@ -1638,11 +1639,11 @@ class Object
1638
1639
  hmts = nil
1639
1640
  if (schema_module || Object).const_defined?((chosen_name = (inheritable_name || model_name)).to_sym)
1640
1641
  possible = (schema_module || Object).const_get(chosen_name)
1641
- return possible unless possible == schema_module
1642
+ return possible unless possible == schema_module || is_generator
1642
1643
  end
1643
1644
  code = +"class #{full_name} < #{base_model.name}\n"
1644
1645
  built_model = Class.new(base_model) do |new_model_class|
1645
- (schema_module || Object).const_set(chosen_name, new_model_class)
1646
+ (schema_module || Object).const_set(chosen_name, new_model_class) unless is_generator
1646
1647
  @_brick_relation = relation
1647
1648
  if inheritable_name
1648
1649
  new_model_class.define_singleton_method :inherited do |subclass|
@@ -1662,7 +1663,7 @@ class Object
1662
1663
  code << " has_secure_password\n"
1663
1664
  end
1664
1665
  # Accommodate singular or camel-cased table names such as "order_detail" or "OrderDetails"
1665
- code << " self.table_name = '#{self.table_name = matching}'\n" if inheritable_name || self.table_name != matching
1666
+ code << " self.table_name = '#{self.table_name = matching}'\n" if (inheritable_name || model_name).underscore.pluralize != matching
1666
1667
  if (inh_col = ::Brick.config.sti_type_column.find { |_k, v| v.include?(matching) }&.first)
1667
1668
  new_model_class.inheritance_column = inh_col
1668
1669
  code << " self.inheritance_column = '#{inh_col}'\n"
@@ -2618,9 +2619,9 @@ class Object
2618
2619
 
2619
2620
  def _brick_get_hm_assoc_name(relation, hm_assoc, source = nil)
2620
2621
  assoc_name, needs_class = if (relation[:hm_counts][hm_assoc[:inverse_table]]&.> 1) &&
2621
- hm_assoc[:alternate_name] != (source || name.underscore)
2622
+ hm_assoc[:alternate_name] != (source || name&.underscore)
2622
2623
  plural = "#{hm_assoc[:assoc_name]}_#{ActiveSupport::Inflector.pluralize(hm_assoc[:alternate_name])}"
2623
- new_alt_name = (hm_assoc[:alternate_name] == name.underscore) ? "#{hm_assoc[:assoc_name].singularize}_#{plural}" : plural
2624
+ new_alt_name = (hm_assoc[:alternate_name] == name&.underscore) ? "#{hm_assoc[:assoc_name].singularize}_#{plural}" : plural
2624
2625
  # %%% In rare cases might even need to add a number at the end for uniqueness
2625
2626
  # uniq = 1
2626
2627
  # while same_name = relation[:fks].find { |x| x.last[:assoc_name] == hm_assoc[:assoc_name] && x.last != hm_assoc }
@@ -3008,9 +3009,14 @@ module Brick
3008
3009
 
3009
3010
  def _brick_index(tbl_name, mode = nil, separator = nil, relation = nil, not_path = nil)
3010
3011
  separator ||= '_'
3011
- res_name = (tbl_name_parts = tbl_name.split('.'))[0..-2].first
3012
- res_name << '.' if res_name
3013
- (res_name ||= +'') << (relation ||= ::Brick.relations.fetch(tbl_name, nil))&.fetch(:resource, nil) || tbl_name_parts.last
3012
+ relation ||= ::Brick.relations.fetch(tbl_name, nil)
3013
+ if mode == :migration
3014
+ res_name = tbl_name
3015
+ else
3016
+ res_name = (tbl_name_parts = tbl_name.split('.'))[0..-2].first
3017
+ res_name << '.' if res_name
3018
+ (res_name ||= +'') << relation&.fetch(:resource, nil) || tbl_name_parts.last
3019
+ end
3014
3020
 
3015
3021
  res_parts = ((mode == :singular) ? res_name.singularize : res_name).split('.')
3016
3022
  res_parts.shift if ::Brick.apartment_multitenant && res_parts.length > 1 && res_parts.first == ::Brick.apartment_default_tenant
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 203
8
+ TINY = 204
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
@@ -34,7 +34,6 @@ module Brick
34
34
 
35
35
  tbl_parts = rel.first.split('.')
36
36
  tbl_parts.shift if [::Brick.default_schema, 'public'].include?(tbl_parts.first)
37
- tbl_parts[-1] = tbl_parts[-1].pluralize
38
37
  begin
39
38
  s << ControllerOption.new(tbl_parts.join('/').camelize, rel.last[:class_name].constantize)
40
39
  rescue
@@ -64,7 +63,7 @@ module Brick
64
63
  else
65
64
  Object
66
65
  end
67
- controller_parts[controller_parts.length - 1] = (controller_name = "#{controller_parts.last.pluralize}Controller")
66
+ controller_parts[controller_parts.length - 1] = (controller_name = "#{controller_parts.last}Controller")
68
67
  _built_controller, code = Object.send(:build_controller, namespace, controller_name, controller_name, controller_option.model, relations)
69
68
  path = ['controllers']
70
69
  path.concat(controller_parts.map(&:underscore))
@@ -110,7 +110,7 @@ module Brick
110
110
  end
111
111
  end
112
112
  # Start the timestamps back the same number of minutes from now as expected number of migrations to create
113
- current_mig_time = Time.now - (schemas.length + chosen.length).minutes
113
+ current_mig_time = [Time.now - (schemas.length + chosen.length).minutes]
114
114
  done = []
115
115
  fks = {}
116
116
  stuck = {}
@@ -139,12 +139,14 @@ module Brick
139
139
  # puts snag_fks.inspect
140
140
  stuck[tbl] = snags
141
141
  end
142
- end).present?
142
+ end
143
+ ).present?
143
144
  fringe.each do |tbl|
144
145
  mig = gen_migration_columns(relations, tbl, (tbl_parts = tbl.split('.')), (add_fks = []), built_schemas, mig_path, current_mig_time,
145
- key_type, is_4x_rails, ar_version, do_fks_last)
146
+ key_type, is_4x_rails, ar_version, do_fks_last, versions_to_create)
146
147
  after_fks.concat(add_fks) if do_fks_last
147
- versions_to_create << migration_file_write(mig_path, "create_#{::Brick._brick_index(tbl, nil, 'x')}", current_mig_time += 1.minute, ar_version, mig)
148
+ current_mig_time[0] += 1.minute
149
+ versions_to_create << migration_file_write(mig_path, "create_#{::Brick._brick_index(tbl, nil, 'x')}", current_mig_time, ar_version, mig)
148
150
  end
149
151
  done.concat(fringe)
150
152
  chosen -= done
@@ -154,9 +156,10 @@ module Brick
154
156
  # Write out any more tables that haven't been done yet
155
157
  chosen.each do |tbl|
156
158
  mig = gen_migration_columns(relations, tbl, (tbl_parts = tbl.split('.')), (add_fks = []), built_schemas, mig_path, current_mig_time,
157
- key_type, is_4x_rails, ar_version, do_fks_last)
159
+ key_type, is_4x_rails, ar_version, do_fks_last, versions_to_create)
158
160
  after_fks.concat(add_fks)
159
- migration_file_write(mig_path, "create_#{::Brick._brick_index(tbl, nil, 'x')}", current_mig_time += 1.minute, ar_version, mig)
161
+ current_mig_time[0] += 1.minute
162
+ versions_to_create << migration_file_write(mig_path, "create_#{::Brick._brick_index(tbl, :migration, 'x')}", current_mig_time, ar_version, mig)
160
163
  end
161
164
  done.concat(chosen)
162
165
  chosen.clear
@@ -188,7 +191,8 @@ module Brick
188
191
  end\n"
189
192
  end
190
193
  mig << +" end\n"
191
- migration_file_write(mig_path, 'create_brick_fks.rbx', current_mig_time += 1.minute, ar_version, mig)
194
+ current_mig_time[0] += 1.minute
195
+ versions_to_create << migration_file_write(mig_path, 'create_brick_fks.rbx', current_mig_time, ar_version, mig)
192
196
  puts "Have written out a final migration called 'create_brick_fks.rbx' which creates #{after_fks.length} foreign keys.
193
197
  This file extension (.rbx) will cause it not to run yet when you do a 'rails db:migrate'.
194
198
  The idea here is to do all data loading first, and then rename that migration file back
@@ -255,7 +259,7 @@ module Brick
255
259
  private
256
260
 
257
261
  def gen_migration_columns(relations, tbl, tbl_parts, add_fks, built_schemas, mig_path, current_mig_time,
258
- key_type, is_4x_rails, ar_version, do_fks_last)
262
+ key_type, is_4x_rails, ar_version, do_fks_last, versions_to_create)
259
263
  return unless (relation = relations.fetch(tbl, nil))&.fetch(:cols, nil)&.present?
260
264
 
261
265
  mig = +''
@@ -278,7 +282,8 @@ module Brick
278
282
  end
279
283
  unless schema.blank? || built_schemas.key?(schema)
280
284
  mig = +" def change\n create_schema(:#{schema}) unless schema_exists?(:#{schema})\n end\n"
281
- migration_file_write(mig_path, "create_db_schema_#{schema.underscore}", current_mig_time += 1.minute, ar_version, mig)
285
+ current_mig_time[0] += 1.minute
286
+ versions_to_create << migration_file_write(mig_path, "create_db_schema_#{schema.underscore}", current_mig_time, ar_version, mig)
282
287
  built_schemas[schema] = nil
283
288
  end
284
289
 
@@ -389,11 +394,11 @@ module Brick
389
394
  end
390
395
  end
391
396
  if possible_ts.length == 2 && # Both created_at and updated_at
392
- # Rails 5 and later timestamps default to NOT NULL
393
- (possible_ts.first.last == is_4x_rails && possible_ts.last.last == is_4x_rails)
397
+ # Rails 5 and later timestamps default to NOT NULL
398
+ (possible_ts.first.last == is_4x_rails && possible_ts.last.last == is_4x_rails)
394
399
  mig << "\n t.timestamps\n"
395
400
  else # Just one or the other, or a nullability mismatch
396
- possible_ts.each { |ts| emit_column('timestamp', ts.first, nil) }
401
+ possible_ts.each { |ts| mig << emit_column('timestamp', ts.first, nil) }
397
402
  end
398
403
  mig << " end\n"
399
404
  if pk_is_also_fk
@@ -424,7 +429,7 @@ module Brick
424
429
  end
425
430
 
426
431
  def migration_file_write(mig_path, name, current_mig_time, ar_version, mig)
427
- File.open("#{mig_path}/#{version = current_mig_time.strftime('%Y%m%d%H%M00')}_#{name}#{'.rb' unless name.index('.')}", "w") do |f|
432
+ File.open("#{mig_path}/#{version = current_mig_time.first.strftime('%Y%m%d%H%M00')}_#{name}#{'.rb' unless name.index('.')}", "w") do |f|
428
433
  f.write "class #{name.split('.').first.camelize} < ActiveRecord::Migration#{ar_version}\n"
429
434
  f.write mig
430
435
  f.write "end\n"
@@ -62,7 +62,7 @@ module Brick
62
62
  else
63
63
  Object
64
64
  end
65
- _built_model, code = Object.send(:build_model, relations, base_module, base_module.name, model_parts.last)
65
+ _built_model, code = Object.send(:build_model, relations, base_module, base_module.name, model_parts.last, nil, true)
66
66
  path = ['models']
67
67
  path.concat(model_parts.map(&:underscore))
68
68
  dir = +"#{::Rails.root}/app"
@@ -27,7 +27,7 @@ module Brick
27
27
  # Generate a list of viable models that can be chosen
28
28
  # First start with any existing models that have been defined ...
29
29
  existing_models = ActiveRecord::Base.descendants.each_with_object({}) do |m, s|
30
- s[m.table_name] = SeedModel.new(m.table_name, m, false) if !m.abstract_class? && m.table_exists?
30
+ s[m.table_name] = SeedModel.new(m.table_name, m, false) if !m.abstract_class? && !m.is_view? && m.table_exists?
31
31
  end
32
32
  models = (existing_models.values +
33
33
  # ... then add models which can be auto-built by Brick
@@ -123,12 +123,15 @@ module Brick
123
123
  pk_val = obj.send(pkey_cols.first)
124
124
  fk_vals = []
125
125
  data = []
126
- relation[:cols].each do |col, col_type|
126
+ relation[:cols].each do |col, _col_type|
127
127
  next if !(fk = fkeys.find { |assoc| col == assoc[:fk] }) &&
128
128
  pkey_cols.include?(col)
129
129
 
130
- if (val = obj.send(col)) && (val.is_a?(Time) || val.is_a?(Date))
131
- val = val.to_s
130
+ begin
131
+ if (val = obj.send(col)) && (val.is_a?(Time) || val.is_a?(Date))
132
+ val = val.to_s
133
+ end
134
+ rescue StandardError => e # ActiveRecord::Encryption::Errors::Configuration
132
135
  end
133
136
  if fk
134
137
  inv_tbl = fk[:inverse_table].gsub('.', '__')
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.203
4
+ version: 1.0.204
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-07 00:00:00.000000000 Z
11
+ date: 2024-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord