brick 1.0.93 → 1.0.94

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: 8488acac0623c04f11e916c67303fd06d471154231c92613318cc7458fcfe23f
4
- data.tar.gz: af566c853bb25e7497a6afbba539ad0d14ec23ad000c053e6dbdf757deefbaa0
3
+ metadata.gz: 4b4de74edca4a5dd2c7d57d23dda2aa4cbc966402db4f2d0490dfeb741224dd5
4
+ data.tar.gz: fe905ed82bf8ae8f249e5ce3fe1646cb6366caf3343086ea8ba597e51525f521
5
5
  SHA512:
6
- metadata.gz: d0d8428b6f80bf3a79abb16265fb8625404f92caf30034da94186a5c5982a78543f29e0a49cc0dc515eb8b6d6da24ccdd53e8d089c90dce46ce214ce5bee4339
7
- data.tar.gz: 562bd7522f0f45843a89464645e1cc153e455e1e5b4e3dec5f1b38a8bfaefd8bd359a2538aa274b90b50353285d2175f315b7e304e54e60516a5ce2ed3b2fc7e
6
+ metadata.gz: 45d2dda76345ab043c4e62d92b5e12a466ffec892e1ce63b540bd6427fcecfa777739732754d554f78b5803599fca1390fa2d38cb8f0acd9b0ffd8e5c6dd34aa
7
+ data.tar.gz: 65b73535a5874fe5b3c46fec455fe62857259c7d56b68241a729f2c928a47e0fdcc71988a3b7ead506de717fae71932007855efaf18dd8866b920da2c6d5c779
@@ -245,12 +245,15 @@ module ActiveRecord
245
245
  end
246
246
 
247
247
  def self.bt_link(assoc_name)
248
- assoc_name = CGI.escapeHTML(assoc_name.to_s)
248
+ assoc_html_name = unless (assoc_name = assoc_name.to_s).camelize == name
249
+ CGI.escapeHTML(assoc_name)
250
+ end
249
251
  model_path = ::Rails.application.routes.url_helpers.send("#{_brick_index}_path".to_sym)
252
+ model_path << "?#{self.inheritance_column}=#{self.name}" if self != base_class
250
253
  av_class = Class.new.extend(ActionView::Helpers::UrlHelper)
251
254
  av_class.extend(ActionView::Helpers::TagHelper) if ActionView.version < ::Gem::Version.new('7')
252
- link = av_class.link_to(name, model_path)
253
- table_name == assoc_name ? link : "#{assoc_name}-#{link}".html_safe
255
+ link = av_class.link_to(assoc_html_name ? name : assoc_name, model_path)
256
+ assoc_html_name ? "#{assoc_name}-#{link}".html_safe : link
254
257
  end
255
258
 
256
259
  def self._brick_index(mode = nil)
@@ -542,7 +545,7 @@ module ActiveRecord
542
545
  field_tbl_name = "\"#{field_tbl_name}\"" if ::Brick.is_oracle && rel_dupe.brick_links.values.include?(field_tbl_name)
543
546
 
544
547
  # Postgres can not use DISTINCT with any columns that are XML, so for any of those just convert to text
545
- is_xml = is_distinct && Brick.relations[field_tbl_name]&.[](:cols)&.[](sel_col.last)&.first&.start_with?('xml')
548
+ is_xml = is_distinct && Brick.relations[k1.table_name]&.[](:cols)&.[](sel_col.last)&.first&.start_with?('xml')
546
549
  # If it's not unique then also include the belongs_to association name before the column name
547
550
  if used_col_aliases.key?(col_alias = "br_fk_#{v.first}__#{sel_col.last}")
548
551
  col_alias = "br_fk_#{v.first}__#{v1[idx][-2..-1].map(&:to_s).join('__')}"
@@ -2310,7 +2313,7 @@ module Brick
2310
2313
  rails_root = ::Rails.root.to_s
2311
2314
  migrations = if Dir.exist?(mig_path = ActiveRecord::Migrator.migrations_paths.first || "#{rails_root}/db/migrate")
2312
2315
  Dir["#{mig_path}/**/*.rb"].each_with_object(Hash.new { |h, k| h[k] = [] }) do |v, s|
2313
- File.read(v).split("\n").each do |line|
2316
+ File.read(v).split("\n").each_with_index do |line, line_idx|
2314
2317
  # For all non-commented lines, look for any that have "create_table", "alter_table", or "drop_table"
2315
2318
  if !line.lstrip.start_with?('#') &&
2316
2319
  (idx = (line.index('create_table ') || line.index('create_table('))&.+(13)) ||
@@ -2318,8 +2321,9 @@ module Brick
2318
2321
  (idx = (line.index('drop_table ') || line.index('drop_table('))&.+(11))
2319
2322
  tbl = line[idx..-1].match(/([:'"\w\.]+)/)&.captures&.first
2320
2323
  if tbl
2321
- s[tbl.tr(':\'"', '').pluralize] << v
2322
- break
2324
+ v = v[(rails_root.length)..-1] if v.start_with?(rails_root)
2325
+ v = v[1..-1] if v.start_with?('/')
2326
+ s[tbl.tr(':\'"', '').pluralize] << [v, line_idx + 1]
2323
2327
  end
2324
2328
  end
2325
2329
  end
@@ -141,10 +141,10 @@ module Brick
141
141
  next unless @_brick_model.instance_methods.include?(through) &&
142
142
  (associative = @_brick_model._br_associatives.fetch(hm.first, nil))
143
143
 
144
- tbl_nm = if (source = hm_assoc.source_reflection).macro == :belongs_to
145
- hm_assoc.through_reflection&.name # for standard HMT, which is HM -> BT
146
- else
144
+ tbl_nm = if (source = hm_assoc.source_reflection).macro == :has_many
147
145
  source.inverse_of&.name # For HM -> HM style HMT
146
+ else # belongs_to or has_one
147
+ hm_assoc.through_reflection&.name # for standard HMT, which is HM -> BT
148
148
  end
149
149
  # If there is no inverse available for the source belongs_to association, make one based on the class name
150
150
  unless tbl_nm
@@ -203,7 +203,6 @@ module Brick
203
203
  # environment or whatever, then get either the controllers or routes list instead
204
204
  prefix = "#{::Brick.config.path_prefix}/" if ::Brick.config.path_prefix
205
205
  table_options = (::Brick.relations.keys - ::Brick.config.exclude_tables).each_with_object({}) do |tbl, s|
206
- binding.pry if tbl.is_a?(Symbol)
207
206
  if (tbl_parts = tbl.split('.')).first == apartment_default_schema
208
207
  tbl = tbl_parts.last
209
208
  end
@@ -911,7 +910,9 @@ erDiagram
911
910
  end
912
911
  unless @_brick_sequence # If no sequence is defined, start with all inclusions
913
912
  cust_cols = #{model_name}._br_cust_cols
914
- @_brick_sequence = col_keys + cust_cols.keys + #{(hms_keys).inspect}.reject { |assoc_name| @_brick_incl&.exclude?(assoc_name) }
913
+ # HOT columns, kept as symbols
914
+ hots = #{model_name}._br_bt_descrip.keys.select { |k| bts.key?(k) }
915
+ @_brick_sequence = col_keys + cust_cols.keys + hots + #{(hms_keys).inspect}.reject { |assoc_name| @_brick_incl&.exclude?(assoc_name) }
915
916
  end
916
917
  @_brick_sequence.reject! { |nm| @_brick_excl.include?(nm) } if @_brick_excl # Reject exclusions
917
918
  @_brick_sequence.each_with_object(+'') do |col_name, s|
@@ -928,8 +929,12 @@ erDiagram
928
929
  elsif col # HM column
929
930
  s << \"<th#\{' x-order=\"' + col_name + '\"' if true}>#\{col[2]} \"
930
931
  s << (col.first ? \"#\{col[3]}\" : \"#\{link_to(col[3], send(\"#\{col[1]._brick_index}_path\"))}\")
931
- elsif (cc = cust_cols.key?(col_name)) # Custom column
932
+ elsif cust_cols.key?(col_name) # Custom column
932
933
  s << \"<th x-order=\\\"#\{col_name}\\\">#\{col_name}\"
934
+ elsif col_name.is_a?(Symbol) && (hot = bts[col_name]) # has_one :through
935
+ s << \"<th x-order=\\\"#\{hot.first.to_s}\\\">HOT \" +
936
+ hot[1].map { |hot_pair| hot_pair.first.bt_link(col_name) }.join(' ')
937
+ hot[1].first
933
938
  else # Bad column name!
934
939
  s << \"<th title=\\\"<< Unknown column >>\\\">#\{col_name}\"
935
940
  end
@@ -947,14 +952,16 @@ erDiagram
947
952
  <td><%= link_to '⇛', #{path_obj_name}_path(slashify(#{obj_pk})), { class: 'big-arrow' } %></td>" if obj_pk}
948
953
  <% @_brick_sequence.each do |col_name|
949
954
  val = #{obj_name}.attributes[col_name] %>
950
- <td<%= ' class=\"dimmed\"'.html_safe unless cols.key?(col_name) || (cust_col = cust_cols[col_name])%>><%
955
+ <td<%= ' class=\"dimmed\"'.html_safe unless cols.key?(col_name) || (cust_col = cust_cols[col_name]) ||
956
+ (col_name.is_a?(Symbol) && bts.key?(col_name)) # HOT
957
+ %>><%
951
958
  if (bt = bts[col_name])
952
959
  if bt[2] # Polymorphic?
953
960
  bt_class = #{obj_name}.send(\"#\{bt.first}_type\")
954
961
  base_class_underscored = (::Brick.existing_stis[bt_class] || bt_class).constantize.base_class._brick_index(:singular)
955
962
  poly_id = #{obj_name}.send(\"#\{bt.first}_id\")
956
963
  %><%= link_to(\"#\{bt_class} ##\{poly_id}\", send(\"#\{base_class_underscored}_path\".to_sym, poly_id)) if poly_id %><%
957
- else
964
+ else # BT or HOT
958
965
  bt_class = bt[1].first.first
959
966
  descrips = @_brick_bt_descrip[bt.first][bt_class]
960
967
  bt_id_col = if descrips.nil?
@@ -1041,7 +1048,7 @@ erDiagram
1041
1048
  %>
1042
1049
  <tr>
1043
1050
  <td><%= begin
1044
- kls = Object.const_get(::Brick.relations[r[0]].fetch(:class_name, nil))
1051
+ kls = Object.const_get(::Brick.relations.fetch(r[0], nil)&.fetch(:class_name, nil))
1045
1052
  rescue
1046
1053
  end
1047
1054
  kls ? link_to(r[0], send(\"#\{kls._brick_index}_path\".to_sym)) : r[0] %></td>
@@ -1051,8 +1058,9 @@ erDiagram
1051
1058
  ' class=\"dimmed\"'
1052
1059
  end&.html_safe %>><%= # Table
1053
1060
  r[1] %></td>
1054
- <td<%= ' class=\"dimmed\"'.html_safe unless r[2] %>><%= # Migration
1055
- r[2]&.join('<br>')&.html_safe %></td>
1061
+ <td<%= lines = r[2]&.map { |line| \"#\{line.first}:#\{line.last}\" }
1062
+ ' class=\"dimmed\"'.html_safe unless r[2] %>><%= # Migration
1063
+ lines&.join('<br>')&.html_safe %></td>
1056
1064
  <td<%= ' class=\"dimmed\"'.html_safe unless r[3] %>><%= # Model
1057
1065
  r[3] %></td>
1058
1066
  <td<%= ' class=\"dimmed\"'.html_safe unless r[4] %>><%= # Route
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 93
8
+ TINY = 94
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
@@ -211,12 +211,13 @@ module Brick
211
211
  else
212
212
  s.first[a.foreign_key.to_s] = [a.name, a.klass]
213
213
  end
214
- else # This gets has_many as well as has_one and has_many :through
215
- if through
214
+ else # This gets all forms of has_many and has_one
215
+ if through # has_many :through or has_one :through
216
216
  is_invalid_source = nil
217
217
  begin
218
- if a.through_reflection&.belongs_to?
219
- puts "WARNING: HMT relationship :#{a.name} in model #{model.name} tries to go through belongs_to association :#{through}. This is not possible."
218
+ if a.through_reflection.macro != :has_many # This HM goes through either a belongs_to or a has_one, so essentially a HOT?
219
+ # Treat it like a belongs_to - just keyed on the association name instead of a foreign_key
220
+ s.first[a.name] = [a.name, a.klass]
220
221
  next
221
222
  elsif !a.source_reflection # Had considered: a.active_record.reflect_on_association(a.source_reflection_name).nil?
222
223
  is_invalid_source = true
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.93
4
+ version: 1.0.94
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-11-21 00:00:00.000000000 Z
11
+ date: 2022-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord