brick 1.0.70 → 1.0.71

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: af28a866a39817e9daa3a54b8f091c790d9280571cec94f9a3a317606e239fd9
4
- data.tar.gz: a2cfe0b823c8b364c8f842852e631a48efe7f9dde8d506a27fbc85ebb74e58eb
3
+ metadata.gz: e50dce8dd2821ec196836393569138d4e18c53a9ef1e3e910ddffa6bc3788824
4
+ data.tar.gz: 982b26f7ed3a14f69589b6c422b37a5ec42b210c095cf85ef0eeab151ea80c59
5
5
  SHA512:
6
- metadata.gz: 0cc18926c7c449e7dfba8d919d41b2490cb4d4a14692073f98f96903da075a31ff029f7a5f5931a845c7caf8f00b51cdba9ab0711dfa626d9e445d9122350b2b
7
- data.tar.gz: 84373ca68edb9ebb88b8ccf2963bbf2e416c35c41840df1c1cd6922ef757cac204453aeb1e15881316681558a53ce17e32692e16320bb1b53c608bc41401920d
6
+ metadata.gz: 2c0e76b3e092d35f57045f3dd106ae9b8c90b266df0a7c0c973824ed20c1ac41560f124420d164e4e9d170b9a386345f424f19bce01bf041c9ebb553c842e553
7
+ data.tar.gz: 6d257bbec4c364456be5167b55c2eb377d94cdd0485e56dfb699daf14f3dce7a46c94c91534ecbe9c8f090b564e8752de0c3b88cf7560e01ca9d8388a3ec9930
@@ -99,13 +99,14 @@ module ActiveRecord
99
99
  dsl
100
100
  end
101
101
 
102
- def self.brick_parse_dsl(build_array = nil, prefix = [], translations = {}, is_polymorphic = false)
102
+ def self.brick_parse_dsl(build_array = nil, prefix = [], translations = {}, emit_dsl = false, is_polymorphic = false)
103
103
  build_array = ::Brick::JoinArray.new.tap { |ary| ary.replace([build_array]) } if build_array.is_a?(::Brick::JoinHash)
104
104
  build_array = ::Brick::JoinArray.new unless build_array.nil? || build_array.is_a?(Array)
105
105
  members = []
106
106
  bracket_name = nil
107
107
  prefix = [prefix] unless prefix.is_a?(Array)
108
108
  if (dsl = ::Brick.config.model_descrips[name] || brick_get_dsl)
109
+ dsl2 = +''
109
110
  klass = nil
110
111
  dsl.each_char do |ch|
111
112
  if bracket_name
@@ -125,7 +126,15 @@ module ActiveRecord
125
126
  end
126
127
  translations[parts[0..-2].join('.')] = klass
127
128
  end
128
- members << parts
129
+ if klass.column_names.exclude?(parts.last) &&
130
+ (klass = (orig_class = klass).reflect_on_association(possible_dsl = parts.pop.to_sym)&.klass)
131
+ members2, dsl2a = klass.brick_parse_dsl(build_array, prefix + [possible_dsl], translations, true)
132
+ members += members2
133
+ dsl2 << dsl2a
134
+ else
135
+ dsl2 << "[#{bracket_name}]"
136
+ members << parts
137
+ end
129
138
  bracket_name = nil
130
139
  else
131
140
  bracket_name << ch
@@ -133,13 +142,20 @@ module ActiveRecord
133
142
  elsif ch == '['
134
143
  bracket_name = +''
135
144
  klass = self
145
+ else
146
+ dsl2 << ch
136
147
  end
137
148
  end
149
+ # Rewrite the DSL just in case it's different because we had to expand it
150
+ unless emit_dsl
151
+ # puts "Compare:\n #{dsl}\n #{dsl2}"
152
+ ::Brick.config.model_descrips[name] = dsl2
153
+ end
138
154
  else # With no DSL available, still put this prefix into the JoinArray so we can get primary key (ID) info from this table
139
155
  x = prefix.each_with_object(build_array) { |v, s| s[v.to_sym] }
140
156
  x[prefix.last] = nil unless prefix.empty? # Using []= will "hydrate" any missing part(s) in our whole series
141
157
  end
142
- members
158
+ emit_dsl ? [members, dsl2] : members
143
159
  end
144
160
 
145
161
  # If available, parse simple DSL attached to a model in order to provide a friendlier name.
@@ -169,9 +185,12 @@ module ActiveRecord
169
185
  this_obj = caches.fetch(obj_name) { caches[obj_name] = this_obj&.send(part.to_sym) }
170
186
  break if this_obj.nil?
171
187
  end
188
+ if this_obj.is_a?(ActiveRecord::Base) && (obj_descrip = this_obj.class.brick_descrip(this_obj))
189
+ this_obj = obj_descrip
190
+ end
172
191
  this_obj&.to_s || ''
173
192
  end
174
- is_brackets_have_content = true unless (datum).blank?
193
+ is_brackets_have_content = true unless datum.blank?
175
194
  output << (datum || '')
176
195
  bracket_name = nil
177
196
  else
@@ -244,7 +263,8 @@ module ActiveRecord
244
263
 
245
264
  # join_array will receive this relation name when calling #brick_parse_dsl
246
265
  _br_bt_descrip[bt.first] = if bt[1].is_a?(Array)
247
- bt[1].each_with_object({}) { |bt_class, s| s[bt_class] = bt_class.brick_parse_dsl(join_array, bt.first, translations, true) }
266
+ # Last two params here: "false" is for don't emit DSL, and "true" is for yes, we are polymorphic
267
+ bt[1].each_with_object({}) { |bt_class, s| s[bt_class] = bt_class.brick_parse_dsl(join_array, bt.first, translations, false, true) }
248
268
  else
249
269
  { bt.last => bt[1].brick_parse_dsl(join_array, bt.first, translations) }
250
270
  end
@@ -409,15 +429,37 @@ module ActiveRecord
409
429
  if selects&.empty? # Default to all columns
410
430
  tbl_no_schema = table.name.split('.').last
411
431
  columns.each do |col|
412
- col_alias = " AS #{col.name}_" if (col_name = col.name) == 'class'
432
+ if (col_name = col.name) == 'class'
433
+ col_alias = " AS #{col.name}_"
434
+ else
435
+ alias_name = nil
436
+ idx = 0
437
+ col_name.each_char do |c|
438
+ unless (c >= 'a' && c <= 'z') ||
439
+ c == '_' ||
440
+ (c >= 'A' && c <= 'Z') ||
441
+ (c >= '0' && c <= '9')
442
+ (alias_name ||= col_name.dup)[idx] = 'x'
443
+ end
444
+ ++idx
445
+ end
446
+ col_alias = " AS #{alias_name}" if alias_name
447
+ end
413
448
  selects << if is_mysql
414
449
  "`#{tbl_no_schema}`.`#{col_name}`#{col_alias}"
415
450
  elsif is_postgres || is_mssql
416
451
  # Postgres can not use DISTINCT with any columns that are XML, so for any of those just convert to text
417
- cast_as_text = '::text' if is_distinct && Brick.relations[klass.table_name]&.[](:cols)&.[](col.name)&.first&.start_with?('xml')
452
+ cast_as_text = '::text' if is_distinct && Brick.relations[klass.table_name]&.[](:cols)&.[](col_name)&.first&.start_with?('xml')
418
453
  "\"#{tbl_no_schema}\".\"#{col_name}\"#{cast_as_text}#{col_alias}"
419
- else # Sqlite or Oracle
420
- "#{tbl_no_schema}.#{col_name}#{col_alias}"
454
+ elsif col.type # Could be Sqlite or Oracle
455
+ if col_alias
456
+ "#{tbl_no_schema}.#{col_name}#{col_alias}"
457
+ else
458
+ "#{tbl_no_schema}.#{col_name}"
459
+ end
460
+ else # Oracle with a custom data type
461
+ typ = col.sql_type
462
+ "'<#{typ.end_with?('_TYP') ? typ[0..-5] : typ}>' AS #{col.name}"
421
463
  end
422
464
  end
423
465
  end
@@ -1415,7 +1457,7 @@ module ActiveRecord::ConnectionHandling
1415
1457
  # ActiveRecord::Base.connection.current_database will be something like "XEPDB1"
1416
1458
  ::Brick.default_schema = schema = ActiveRecord::Base.connection.raw_connection.username
1417
1459
  ::Brick.db_schemas = {}
1418
- execute_oracle("SELECT username FROM sys.all_users WHERE ORACLE_MAINTAINED != 'Y'").each { |s| ::Brick.db_schemas[s.first] = nil }
1460
+ ActiveRecord::Base.execute_sql("SELECT username FROM sys.all_users WHERE ORACLE_MAINTAINED != 'Y'").each { |s| ::Brick.db_schemas[s.first] = nil }
1419
1461
  when 'SQLite'
1420
1462
  sql = "SELECT m.name AS relation_name, UPPER(m.type) AS table_type,
1421
1463
  p.name AS column_name, p.type AS data_type,
@@ -1478,8 +1520,9 @@ module ActiveRecord::ConnectionHandling
1478
1520
  schema_and_tables = case ActiveRecord::Base.connection.adapter_name
1479
1521
  when 'OracleEnhanced'
1480
1522
  sql =
1481
- "SELECT c.owner AS schema, c.table_name AS relation_name, 'BASE_TABLE' AS table_type,
1482
- LOWER(c.column_name) AS column_name, c.data_type,
1523
+ "SELECT c.owner AS schema, c.table_name AS relation_name,
1524
+ CASE WHEN v.owner IS NULL THEN 'BASE_TABLE' ELSE 'VIEW' END AS table_type,
1525
+ c.column_name, c.data_type,
1483
1526
  COALESCE(c.data_length, c.data_precision) AS max_length,
1484
1527
  CASE ac.constraint_type WHEN 'P' THEN 'PRIMARY KEY' END AS const,
1485
1528
  ac.constraint_name AS \"key\",
@@ -1487,9 +1530,11 @@ module ActiveRecord::ConnectionHandling
1487
1530
  FROM all_tab_cols c
1488
1531
  LEFT OUTER JOIN all_cons_columns acc ON acc.owner = c.owner AND acc.table_name = c.table_name AND acc.column_name = c.column_name
1489
1532
  LEFT OUTER JOIN all_constraints ac ON ac.owner = acc.owner AND ac.table_name = acc.table_name AND ac.constraint_name = acc.constraint_name AND constraint_type = 'P'
1533
+ LEFT OUTER JOIN all_views v ON c.owner = v.owner AND c.table_name = v.view_name
1490
1534
  WHERE c.owner IN (#{::Brick.db_schemas.keys.map { |s| "'#{s}'" }.join(', ')})
1535
+ AND c.table_name NOT IN (?, ?)
1491
1536
  ORDER BY 1, 2, c.internal_column_id, acc.position"
1492
- execute_oracle(sql, *ar_tables)
1537
+ ActiveRecord::Base.execute_sql(sql, *ar_tables)
1493
1538
  else
1494
1539
  ActiveRecord::Base.retrieve_schema_and_tables(sql)
1495
1540
  end
@@ -1579,7 +1624,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
1579
1624
  WHERE ac.constraint_type = 'R'
1580
1625
  AND ac.owner IN (#{schemas})
1581
1626
  AND ac.r_owner IN (#{schemas})"
1582
- fk_references = ActiveRecord::Base.execute_oracle(sql)
1627
+ fk_references = ActiveRecord::Base.execute_sql(sql)
1583
1628
  end
1584
1629
  ::Brick.is_oracle = true if ActiveRecord::Base.connection.adapter_name == 'OracleEnhanced'
1585
1630
  # ::Brick.default_schema ||= schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
@@ -1679,16 +1724,6 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
1679
1724
  ar_imtn = ActiveRecord.version >= ::Gem::Version.new('5.0') ? ActiveRecord::Base.internal_metadata_table_name : ''
1680
1725
  [ar_smtn, ar_imtn]
1681
1726
  end
1682
-
1683
- def execute_oracle(*sql_args)
1684
- cursor = ActiveRecord::Base.execute_sql(*sql_args)
1685
- result = []
1686
- while row = cursor.fetch()
1687
- result << row
1688
- end
1689
- cursor.close
1690
- result
1691
- end
1692
1727
  end
1693
1728
 
1694
1729
  # ==========================================
@@ -1090,9 +1090,9 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
1090
1090
  mermaid.initialize({
1091
1091
  startOnLoad: true,
1092
1092
  securityLevel: \"loose\",
1093
+ er: { useMaxWidth: false },
1093
1094
  mermaid: {callback: function(objId) {
1094
1095
  var svg = document.getElementById(objId);
1095
- svg.removeAttribute(\"width\");
1096
1096
  var cb;
1097
1097
  for(cb in cbs) {
1098
1098
  var gErd = svg.getElementById(cb);
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 70
8
+ TINY = 71
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
@@ -560,7 +560,7 @@ ActiveSupport.on_load(:active_record) do
560
560
  class << self
561
561
  def execute_sql(sql, *param_array)
562
562
  param_array = param_array.first if param_array.length == 1 && param_array.first.is_a?(Array)
563
- if ActiveRecord::Base.connection.adapter_name == 'SQLServer'
563
+ if ['OracleEnhanced', 'SQLServer'].include?(ActiveRecord::Base.connection.adapter_name)
564
564
  connection.exec_query(send(:sanitize_sql_array, [sql] + param_array)).rows
565
565
  else
566
566
  connection.execute(send(:sanitize_sql_array, [sql] + param_array))
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.70
4
+ version: 1.0.71
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-09-13 00:00:00.000000000 Z
11
+ date: 2022-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord