brick 1.0.18 → 1.0.19

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: add7e232024e140e2fb089ef158600e2a2a955efd787dc986769b43b4b1f6d24
4
- data.tar.gz: a45d187a7b739f90b1fede46dfc9f63a2057a3410d052e0ad57322f4741ebfee
3
+ metadata.gz: 57a1d4e3774c90984cfc435d9ed87e42b74c364b01fd7ced7df740f5005b935e
4
+ data.tar.gz: 8222088ef88ca48cd90144c8503638644195f2d593ff95d7b2e3530304ac6fb2
5
5
  SHA512:
6
- metadata.gz: '0897e041c617f0e1e695d0402784184ce2f7ec575d9b0e7a7b1b59b2efbcb40a4de28bcbe2eb124f576dddb8e7371f572c67ee3b19120cd281bf3358249b4508'
7
- data.tar.gz: fc7a4a93a7d2409f4aa82fb3dbf23710aaad45a1dca1193c8cbcefa86d5d9061a773214c8fe0dd02375660bfb6e5a9856df3a202f57a73990e79d23850918f9b
6
+ metadata.gz: 2b785c34e1a21563232ae54f6af25989fe02b73f92eb1327b27d6f21e80b7e353a5995305c4c1188dda885465a196f87fb5979a13c3e6a0219d4895dc59593dd
7
+ data.tar.gz: bd2018d48dad15f51d7a87e39d2710bde9a5becbe969e741004bf730f57faecbd84a81a2f75cfdd60c2ff48f239fe6c5c8d3f47b4b2f79e355b7f100f9bb7943
@@ -137,7 +137,6 @@ module ActiveRecord
137
137
  alias _brick_find_sti_class find_sti_class
138
138
  def find_sti_class(type_name)
139
139
  if ::Brick.sti_models.key?(type_name)
140
- # puts ['X', self.name, type_name].inspect
141
140
  _brick_find_sti_class(type_name)
142
141
  else
143
142
  # This auto-STI is more of a brute-force approach, building modules where needed
@@ -149,7 +148,7 @@ module ActiveRecord
149
148
  if ::Brick.config.sti_namespace_prefixes&.key?("::#{module_name}::") ||
150
149
  ::Brick.config.sti_namespace_prefixes&.key?("#{module_name}::")
151
150
  _brick_find_sti_class(type_name)
152
- elsif File.exists?(candidate_file = Rails.root.join('app/models' + module_prefixes.map(&:underscore).join('/') + '.rb'))
151
+ elsif File.exist?(candidate_file = Rails.root.join('app/models' + module_prefixes.map(&:underscore).join('/') + '.rb'))
153
152
  _brick_find_sti_class(type_name) # Find this STI class normally
154
153
  else
155
154
  # Build missing prefix modules if they don't yet exist
@@ -243,10 +242,10 @@ class Object
243
242
 
244
243
  # Adjust for STI if we know of a base model for the requested model name
245
244
  table_name = if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil))
246
- base_model.table_name
247
- else
248
- ActiveSupport::Inflector.pluralize(singular_table_name)
249
- end
245
+ base_model.table_name
246
+ else
247
+ ActiveSupport::Inflector.pluralize(singular_table_name)
248
+ end
250
249
 
251
250
  # Maybe, just maybe there's a database table that will satisfy this need
252
251
  if (matching = [table_name, singular_table_name, plural_class_name, model_name].find { |m| relations.key?(m) })
@@ -522,9 +521,9 @@ module ActiveRecord::ConnectionHandling
522
521
  end
523
522
 
524
523
  def _brick_reflect_tables
525
- if (relations = ::Brick.relations).empty?
526
- # Only for Postgres? (Doesn't work in sqlite3)
527
- # puts ActiveRecord::Base.connection.execute("SELECT current_setting('SEARCH_PATH')").to_a.inspect
524
+ if (relations = ::Brick.relations).empty?
525
+ # Only for Postgres? (Doesn't work in sqlite3)
526
+ # puts ActiveRecord::Base.connection.execute("SELECT current_setting('SEARCH_PATH')").to_a.inspect
528
527
 
529
528
  schema_sql = 'SELECT NULL AS table_schema;'
530
529
  case ActiveRecord::Base.connection.adapter_name
@@ -614,6 +613,25 @@ module ActiveRecord::ConnectionHandling
614
613
  end
615
614
  end
616
615
 
616
+ # # Add unique OIDs
617
+ # if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
618
+ # ActiveRecord::Base.execute_sql(
619
+ # "SELECT c.oid, n.nspname, c.relname
620
+ # FROM pg_catalog.pg_namespace AS n
621
+ # INNER JOIN pg_catalog.pg_class AS c ON n.oid = c.relnamespace
622
+ # WHERE c.relkind IN ('r', 'v')"
623
+ # ).each do |r|
624
+ # next if ['pg_catalog', 'information_schema', ''].include?(r['nspname']) ||
625
+ # ['ar_internal_metadata', 'schema_migrations'].include?(r['relname'])
626
+ # relation = relations.fetch(r['relname'], nil)
627
+ # if relation
628
+ # (relation[:oid] ||= {})[r['nspname']] = r['oid']
629
+ # else
630
+ # puts "Where is #{r['nspname']} #{r['relname']} ?"
631
+ # end
632
+ # end
633
+ # end
634
+
617
635
  case ActiveRecord::Base.connection.adapter_name
618
636
  when 'PostgreSQL', 'Mysql2'
619
637
  sql = ActiveRecord::Base.send(:sanitize_sql_array, [
@@ -706,7 +724,7 @@ module Brick
706
724
  missing << fk[0] unless relations.key?(fk[0])
707
725
  missing << primary_table unless is_class || relations.key?(primary_table)
708
726
  unless missing.empty?
709
- tables = relations.reject { |k, v| v.fetch(:isView, nil) }.keys.sort
727
+ tables = relations.reject { |_k, v| v.fetch(:isView, nil) }.keys.sort
710
728
  puts "Brick: Additional reference #{fk.inspect} refers to non-existent #{'table'.pluralize(missing.length)} #{missing.join(' and ')}. (Available tables include #{tables.join(', ')}.)"
711
729
  return
712
730
  end
@@ -715,7 +733,7 @@ module Brick
715
733
  puts "Brick: Additional reference #{fk.inspect} refers to non-existent column #{fk[1]}. (Columns present in #{fk[0]} are #{columns.join(', ')}.)"
716
734
  return
717
735
  end
718
- if (redundant = bts.find { |k, v| v[:inverse]&.fetch(:inverse_table, nil) == fk[0] && v[:fk] == fk[1] && v[:inverse_table] == primary_table })
736
+ if (redundant = bts.find { |_k, v| v[:inverse]&.fetch(:inverse_table, nil) == fk[0] && v[:fk] == fk[1] && v[:inverse_table] == primary_table })
719
737
  if is_class && !redundant.last.key?(:class)
720
738
  redundant.last[:primary_class] = primary_class # Round out this BT so it can find the proper :source for a HMT association that references an STI subclass
721
739
  else
@@ -737,19 +755,19 @@ module Brick
737
755
  # assoc_bt[:inverse_of] = primary_class.reflect_on_all_associations.find { |a| a.foreign_key == bt[1] }
738
756
  end
739
757
 
740
- unless is_class || ::Brick.config.exclude_hms&.any? { |exclusion| fk[0] == exclusion[0] && fk[1] == exclusion[1] && primary_table == exclusion[2] }
741
- cnstr_name = "hm_#{cnstr_name}"
742
- if (assoc_hm = hms.fetch(cnstr_name, nil))
743
- assoc_hm[:fk] = assoc_hm[:fk].is_a?(String) ? [assoc_hm[:fk], fk[1]] : assoc_hm[:fk].concat(fk[1])
744
- assoc_hm[:alternate_name] = "#{assoc_hm[:alternate_name]}_#{bt_assoc_name}" unless assoc_hm[:alternate_name] == bt_assoc_name
745
- assoc_hm[:inverse] = assoc_bt
746
- else
747
- assoc_hm = hms[cnstr_name] = { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0], inverse: assoc_bt }
748
- hm_counts = relation.fetch(:hm_counts) { relation[:hm_counts] = {} }
749
- hm_counts[fk[0]] = hm_counts.fetch(fk[0]) { 0 } + 1
750
- end
751
- assoc_bt[:inverse] = assoc_hm
758
+ return if is_class || ::Brick.config.exclude_hms&.any? { |exclusion| fk[0] == exclusion[0] && fk[1] == exclusion[1] && primary_table == exclusion[2] }
759
+
760
+ cnstr_name = "hm_#{cnstr_name}"
761
+ if (assoc_hm = hms.fetch(cnstr_name, nil))
762
+ assoc_hm[:fk] = assoc_hm[:fk].is_a?(String) ? [assoc_hm[:fk], fk[1]] : assoc_hm[:fk].concat(fk[1])
763
+ assoc_hm[:alternate_name] = "#{assoc_hm[:alternate_name]}_#{bt_assoc_name}" unless assoc_hm[:alternate_name] == bt_assoc_name
764
+ assoc_hm[:inverse] = assoc_bt
765
+ else
766
+ assoc_hm = hms[cnstr_name] = { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0], inverse: assoc_bt }
767
+ hm_counts = relation.fetch(:hm_counts) { relation[:hm_counts] = {} }
768
+ hm_counts[fk[0]] = hm_counts.fetch(fk[0]) { 0 } + 1
752
769
  end
770
+ assoc_bt[:inverse] = assoc_hm
753
771
  # hms[cnstr_name] << { is_bt: false, fk: fk[1], assoc_name: fk[0], alternate_name: bt_assoc_name, inverse_table: fk[0] }
754
772
  end
755
773
  end
@@ -51,14 +51,11 @@ module Brick
51
51
  # Need to return true if we can fill in the blanks for a missing one
52
52
  # args will be something like: ["index", ["categories"]]
53
53
  model = args[1].map(&:camelize).join('::').singularize.constantize
54
- if (
55
- is_template_exists = model && (
56
- ['index', 'show'].include?(args.first) || # Everything has index and show
57
- # Only CRU stuff has create / update / destroy
58
- (!model.is_view? && ['new', 'create', 'edit', 'update', 'destroy'].include?(args.first))
59
- )
60
- )
61
- instance_variable_set(:@_brick_model, model)
54
+ if is_template_exists = model && (
55
+ ['index', 'show'].include?(args.first) || # Everything has index and show
56
+ # Only CRU stuff has create / update / destroy
57
+ (!model.is_view? && ['new', 'create', 'edit', 'update', 'destroy'].include?(args.first))
58
+ ) && instance_variable_set(:@_brick_model, model)
62
59
  end
63
60
  end
64
61
  is_template_exists
@@ -88,9 +85,6 @@ module Brick
88
85
  end
89
86
  end
90
87
 
91
- schema_options = ::Brick.db_schemas.each_with_object(+'') { |v, s| s << "<option value=\"#{v}\">#{v}</option>" }.html_safe
92
- table_options = (::Brick.relations.keys - ::Brick.config.exclude_tables)
93
- .each_with_object(+'') { |v, s| s << "<option value=\"#{v}\">#{v}</option>" }.html_safe
94
88
  hms_columns = +'' # Used for 'index'
95
89
  hms_headers = hms.each_with_object([]) do |hm, s|
96
90
  next if exclude_hms.key?((hm_assoc = hm.last).name)
@@ -114,7 +108,13 @@ module Brick
114
108
  end
115
109
  s << [hm_assoc, "H#{hm_assoc.macro == :has_one ? 'O' : 'M'}#{'T' if hm_assoc.options[:through]} #{hm.first}"]
116
110
  end
117
-
111
+ end
112
+ if @_brick_model
113
+ schema_options = ::Brick.db_schemas.each_with_object(+'') { |v, s| s << "<option value=\"#{v}\">#{v}</option>" }.html_safe
114
+ # %%% If we are not auto-creating controllers (or routes) then omit by default, and if enabled anyway, such as in a development
115
+ # environment or whatever, then get either the controllers or routes list instead
116
+ table_options = (::Brick.relations.keys - ::Brick.config.exclude_tables)
117
+ .each_with_object(+'') { |v, s| s << "<option value=\"#{v.underscore.pluralize}\">#{v}</option>" }.html_safe
118
118
  css = "<style>
119
119
  table {
120
120
  border-collapse: collapse;
@@ -253,7 +253,7 @@ function changeout(href, param, value) {
253
253
  <h1>#{model_name.pluralize}</h1>
254
254
  <% if @_brick_params&.present? %><h3>where <%= @_brick_params.each_with_object([]) { |v, s| s << \"#\{v.first\} = #\{v.last.inspect\}\" }.join(', ') %></h3><% end %>
255
255
  <table id=\"#{table_name}\">
256
- <thead><tr>#{"<th></th>" if pk }
256
+ <thead><tr>#{"<th></th>" if pk}
257
257
  <% bts = { #{bts.each_with_object([]) { |v, s| s << "#{v.first.inspect} => [#{v.last.first.inspect}, #{v.last[1].name}, #{v.last[1].primary_key.inspect}]"}.join(', ')} }
258
258
  @#{table_name}.columns.map(&:name).each do |col| %>
259
259
  <% next if col == '#{pk}' || ::Brick.config.metadata_columns.include?(col) %>
@@ -271,7 +271,7 @@ function changeout(href, param, value) {
271
271
  <tbody>
272
272
  <% @#{table_name}.each do |#{obj_name}| %>
273
273
  <tr>#{"
274
- <td><%= link_to '⇛', #{obj_name}_path(#{obj_name}.#{pk}), { class: 'big-arrow' } %></td>" if pk }
274
+ <td><%= link_to '⇛', #{obj_name}_path(#{obj_name}.#{pk}), { class: 'big-arrow' } %></td>" if pk}
275
275
  <% #{obj_name}.attributes.each do |k, val| %>
276
276
  <% next if k == '#{pk}' || ::Brick.config.metadata_columns.include?(k) %>
277
277
  <td>
@@ -341,8 +341,13 @@ function changeout(href, param, value) {
341
341
  <% end %>
342
342
  <% when :boolean %>
343
343
  <%= f.check_box k.to_sym %>
344
- <% when :integer, :date, :datetime, :decimal %>
344
+ <% when :integer, :decimal, :float, :date, :datetime, :time, :timestamp
345
+ # What happens when keys are UUID?
346
+ # Postgres naturally uses the +uuid_generate_v4()+ function from the uuid-ossp extension
347
+ # If it's not yet enabled then: enable_extension 'uuid-ossp'
348
+ # ActiveUUID gem created a new :uuid type %>
345
349
  <%= val %>
350
+ <% when :binary, :primary_key %>
346
351
  <% end %>
347
352
  <% end %>
348
353
  </td>
@@ -391,17 +396,6 @@ function changeout(href, param, value) {
391
396
  # Just in case it hadn't been done previously when we tried to load the brick initialiser,
392
397
  # go make sure we've loaded additional references (virtual foreign keys).
393
398
  ::Brick.load_additional_references
394
-
395
- # Find associative tables that can be set up for has_many :through
396
- ::Brick.relations.each do |_key, tbl|
397
- tbl_cols = tbl[:cols].keys
398
- fks = tbl[:fks].each_with_object({}) { |fk, s| s[fk.last[:fk]] = [fk.last[:assoc_name], fk.last[:inverse_table]] if fk.last[:is_bt]; s }
399
- # Aside from the primary key and the metadata columns created_at, updated_at, and deleted_at, if this table only has
400
- # foreign keys then it can act as an associative table and thus be used with has_many :through.
401
- if fks.length > 1 && (tbl_cols - fks.keys - (::Brick.config.metadata_columns || []) - (tbl[:pkey].values.first || [])).length.zero?
402
- fks.each { |fk| tbl[:hmt_fks][fk.first] = fk.last }
403
- end
404
- end
405
399
  end
406
400
  end
407
401
  end
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 18
8
+ TINY = 19
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
@@ -254,6 +254,17 @@ module Brick
254
254
  ars.each { |fk| ::Brick._add_bt_and_hm(fk[0..2]) }
255
255
  @_additional_references_loaded = true
256
256
  end
257
+
258
+ # Find associative tables that can be set up for has_many :through
259
+ ::Brick.relations.each do |_key, tbl|
260
+ tbl_cols = tbl[:cols].keys
261
+ fks = tbl[:fks].each_with_object({}) { |fk, s| s[fk.last[:fk]] = [fk.last[:assoc_name], fk.last[:inverse_table]] if fk.last[:is_bt]; s }
262
+ # Aside from the primary key and the metadata columns created_at, updated_at, and deleted_at, if this table only has
263
+ # foreign keys then it can act as an associative table and thus be used with has_many :through.
264
+ if fks.length > 1 && (tbl_cols - fks.keys - (::Brick.config.metadata_columns || []) - (tbl[:pkey].values.first || [])).length.zero?
265
+ fks.each { |fk| tbl[:hmt_fks][fk.first] = fk.last }
266
+ end
267
+ end
257
268
  end
258
269
 
259
270
 
@@ -18,7 +18,7 @@ module Brick
18
18
  desc 'Generates an initializer file for configuring Brick'
19
19
 
20
20
  def create_initializer_file
21
- unless File.exists?(filename = 'config/initializers/brick.rb')
21
+ unless File.exist?(filename = 'config/initializers/brick.rb')
22
22
  # See if we can make suggestions for additional_references
23
23
  resembles_fks = []
24
24
  possible_additional_references = (relations = ::Brick.relations).each_with_object([]) do |v, s|
@@ -47,7 +47,7 @@ module Brick
47
47
  if (relations.fetch(f_table = col_down, nil) ||
48
48
  relations.fetch(f_table = ActiveSupport::Inflector.pluralize(col_down), nil)) &&
49
49
  # Looks pretty promising ... just make sure a model file isn't present
50
- !File.exists?("app/models/#{ActiveSupport::Inflector.singularize(v.first)}.rb")
50
+ !File.exist?("app/models/#{ActiveSupport::Inflector.singularize(v.first)}.rb")
51
51
  s << "['#{v.first}', '#{col}', '#{f_table}']"
52
52
  else
53
53
  resembles_fks << "#{v.first}.#{col}"
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.18
4
+ version: 1.0.19
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-03-27 00:00:00.000000000 Z
11
+ date: 2022-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord