brick 1.0.173 → 1.0.175
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/brick/config.rb +2 -1
- data/lib/brick/extensions.rb +38 -12
- data/lib/brick/frameworks/rails/engine.rb +11 -11
- data/lib/brick/frameworks/rails/form_tags.rb +2 -2
- data/lib/brick/frameworks/rails.rb +2 -2
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +21 -3
- data/lib/generators/brick/install_generator.rb +2 -0
- data/lib/generators/brick/migration_builder.rb +3 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 566c62de5deb537568049267ecd415bfb4f22b0343f689a5c4c819a173cc92ba
|
4
|
+
data.tar.gz: aaf90092d67a2669f64ad0ce5484196fefedb3ce666c6977d0b9b66f5fcc8739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98748d0a02f3d004963652c02d17465406fe586b9ea1bf581f55e9f3fa119d72c3edf323f1934c165059ca0088eb47c7cbe82bf9cba8799bfec83e862dcd13c9
|
7
|
+
data.tar.gz: 916e16bf303120062467e8555ca2845c9ca3e4ed752c0b95094cc556632453ae8dcb66819cb920f101d9da1abf37c57af5ace6282e39a39747f5d117460b8e2d
|
data/lib/brick/config.rb
CHANGED
@@ -21,10 +21,11 @@ module Brick
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def mode
|
24
|
+
rails_env = Object.const_defined?('Rails') && ::Rails.env
|
24
25
|
@mutex.synchronize do
|
25
26
|
case @brick_mode
|
26
27
|
when nil, :development
|
27
|
-
(
|
28
|
+
(rails_env == 'development' || ENV.key?('BRICK')) ? :on : nil
|
28
29
|
when :diag_env
|
29
30
|
ENV.key?('BRICK') ? :on : nil
|
30
31
|
else
|
data/lib/brick/extensions.rb
CHANGED
@@ -1288,6 +1288,7 @@ end
|
|
1288
1288
|
end
|
1289
1289
|
# puts "#{self.name} - #{args.first}"
|
1290
1290
|
# Unless it's a Brick prefix looking for a TNP that should create a module ...
|
1291
|
+
relations = ::Brick.relations
|
1291
1292
|
unless (is_tnp_module = (is_brick_prefix && !is_controller && ::Brick.config.table_name_prefixes.values.include?(requested)))
|
1292
1293
|
# ... first look around for an existing module or class.
|
1293
1294
|
desired_classname = (self == Object || !name) ? requested : "#{name}::#{requested}"
|
@@ -1309,12 +1310,16 @@ end
|
|
1309
1310
|
(possible.instance_of?(Class) && possible == self)) && # Are we simply searching for ourselves?
|
1310
1311
|
# Skip when what we found as `possible` is not related to the base class of an STI model
|
1311
1312
|
(!sti_base || possible.is_a?(sti_base))
|
1313
|
+
# if possible.is_a?(ActiveRecord::Base) && !possible.abstract_class? && (pk = possible.primary_key) &&
|
1314
|
+
# !(relation = relations.fetch(possible.table_name, nil))&.fetch(:pks, nil)
|
1315
|
+
# binding.pry
|
1316
|
+
# x = 5
|
1317
|
+
# end
|
1312
1318
|
return possible
|
1313
1319
|
end
|
1314
1320
|
end
|
1315
1321
|
end
|
1316
1322
|
class_name = ::Brick.namify(requested)
|
1317
|
-
relations = ::Brick.relations
|
1318
1323
|
# CONTROLLER
|
1319
1324
|
result = if ::Brick.enable_controllers? &&
|
1320
1325
|
is_controller && (plural_class_name = class_name[0..-11]).length.positive?
|
@@ -1908,6 +1913,8 @@ class Object
|
|
1908
1913
|
end
|
1909
1914
|
self.define_method :crosstab do
|
1910
1915
|
@relations = ::Brick.relations.each_with_object({}) do |r, s|
|
1916
|
+
next if r.first.is_a?(Symbol)
|
1917
|
+
|
1911
1918
|
cols = r.last[:cols].each_with_object([]) do |c, s2|
|
1912
1919
|
s2 << [c.first] + c.last
|
1913
1920
|
end
|
@@ -2030,8 +2037,10 @@ class Object
|
|
2030
2037
|
}
|
2031
2038
|
unless ::Brick.config.enable_api == false
|
2032
2039
|
json['paths'] = relations.each_with_object({}) do |relation, s|
|
2033
|
-
next if
|
2034
|
-
|
2040
|
+
next if relation.first.is_a?(Symbol) || (
|
2041
|
+
(api_vers = relation.last.fetch(:api, nil)) &&
|
2042
|
+
!(api_ver_paths = api_vers[current_api_ver] || api_vers[nil])
|
2043
|
+
)
|
2035
2044
|
|
2036
2045
|
schema_tag = {}
|
2037
2046
|
if (schema_name = relation.last&.fetch(:schema, nil))
|
@@ -2595,14 +2604,14 @@ end.class_exec do
|
|
2595
2604
|
# return if ActiveRecord::Base.connection.current_database == 'postgres'
|
2596
2605
|
|
2597
2606
|
orig_schema = nil
|
2598
|
-
if (relations = ::Brick.relations).
|
2607
|
+
if (relations = ::Brick.relations).keys == [:db_name]
|
2599
2608
|
::Brick.remove_instance_variable(:@_additional_references_loaded) if ::Brick.instance_variable_defined?(:@_additional_references_loaded)
|
2600
2609
|
# Very first thing, load inflections since we'll be using .pluralize and .singularize on table and model names
|
2601
|
-
if File.exist?(inflections = ::Rails.root
|
2610
|
+
if File.exist?(inflections = ::Rails.root&.join('config/initializers/inflections.rb') || '')
|
2602
2611
|
load inflections
|
2603
2612
|
end
|
2604
2613
|
# Now the Brick initializer since there may be important schema things configured
|
2605
|
-
if !::Brick.initializer_loaded && File.exist?(brick_initializer = ::Rails.root
|
2614
|
+
if !::Brick.initializer_loaded && File.exist?(brick_initializer = ::Rails.root&.join('config/initializers/brick.rb') || '')
|
2606
2615
|
::Brick.initializer_loaded = load brick_initializer
|
2607
2616
|
|
2608
2617
|
# After loading the initializer, add compatibility for ActiveStorage and ActionText if those haven't already been
|
@@ -2749,7 +2758,14 @@ end.class_exec do
|
|
2749
2758
|
relation[:ukeys][r['key'] || "#{relation_name}.#{col_name}"] ||= []
|
2750
2759
|
# key = (relation[:ukeys] = Hash.new { |h, k| h[k] = [] }) if key.is_a?(Array)
|
2751
2760
|
# key[r['key']]
|
2761
|
+
else
|
2762
|
+
if r['data_type'] == 'uuid'
|
2763
|
+
# && r['column_name'] == ::Brick.ar_base.primary_key
|
2764
|
+
# binding.pry
|
2765
|
+
relation[:pkey][r['key'] || relation_name] ||= []
|
2766
|
+
end
|
2752
2767
|
end
|
2768
|
+
# binding.pry if key && r['data_type'] == 'uuid'
|
2753
2769
|
key << col_name if key
|
2754
2770
|
cols = relation[:cols] # relation.fetch(:cols) { relation[:cols] = [] }
|
2755
2771
|
cols[col_name] = [r['data_type'], r['max_length'], measures&.include?(col_name), r['is_nullable'] == 'NO']
|
@@ -2916,6 +2932,8 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
|
|
2916
2932
|
end
|
2917
2933
|
|
2918
2934
|
relations.each do |k, v|
|
2935
|
+
next if k.is_a?(Symbol)
|
2936
|
+
|
2919
2937
|
rel_name = k.split('.').map { |rel_part| ::Brick.namify(rel_part, :underscore) }
|
2920
2938
|
schema_names = rel_name[0..-2]
|
2921
2939
|
schema_names.shift if ::Brick.apartment_multitenant && schema_names.first == ::Brick.apartment_default_tenant
|
@@ -3152,6 +3170,10 @@ module Brick
|
|
3152
3170
|
assoc_bt[:inverse] = assoc_hm
|
3153
3171
|
end
|
3154
3172
|
|
3173
|
+
def ar_base
|
3174
|
+
@ar_base ||= Object.const_defined?(:ApplicationRecord) ? ApplicationRecord : Class.new(ActiveRecord::Base)
|
3175
|
+
end
|
3176
|
+
|
3155
3177
|
# Identify built out routes, migrations, models,
|
3156
3178
|
# (and also soon controllers and views!)
|
3157
3179
|
# for each resource
|
@@ -3178,6 +3200,8 @@ module Brick
|
|
3178
3200
|
abstract_activerecord_bases = ::Brick.eager_load_classes(true)
|
3179
3201
|
rails_root = ::Rails.root.to_s
|
3180
3202
|
models = ::Brick.relations.each_with_object({}) do |rel, s|
|
3203
|
+
next if rel.first.is_a?(Symbol)
|
3204
|
+
|
3181
3205
|
begin
|
3182
3206
|
if (model = rel.last[:class_name]&.constantize) &&
|
3183
3207
|
(inh = ActiveRecord::Base._brick_inheriteds[model]&.join(':'))
|
@@ -3187,19 +3211,20 @@ module Brick
|
|
3187
3211
|
rescue
|
3188
3212
|
end
|
3189
3213
|
end
|
3190
|
-
::Brick.relations.
|
3191
|
-
|
3214
|
+
::Brick.relations.each_with_object([]) do |v, s|
|
3215
|
+
next if v.first.is_a?(Symbol) # ||
|
3216
|
+
# Brick.config.exclude_tables.include?(v.first)
|
3192
3217
|
|
3193
|
-
tbl_parts =
|
3218
|
+
tbl_parts = v.first.split('.')
|
3194
3219
|
tbl_parts.shift if ::Brick.apartment_multitenant && tbl_parts.length > 1 && tbl_parts.first == ::Brick.apartment_default_tenant
|
3195
3220
|
res = tbl_parts.join('.')
|
3196
3221
|
table_name = (model = models[res])&.last&.table_name
|
3197
3222
|
table_name ||= begin
|
3198
|
-
v[:class_name].constantize.table_name
|
3223
|
+
v.last[:class_name].constantize.table_name
|
3199
3224
|
rescue
|
3200
3225
|
end
|
3201
3226
|
model = model.first if model.is_a?(Array)
|
3202
|
-
[
|
3227
|
+
s << [v.first, table_name || v.first, migrations&.fetch(res, nil), model]
|
3203
3228
|
end
|
3204
3229
|
end
|
3205
3230
|
|
@@ -3230,7 +3255,8 @@ module Brick
|
|
3230
3255
|
is_default_schema = multi_schema&.==(::Brick.apartment_default_tenant)
|
3231
3256
|
relations.each_with_object([]) do |v, s|
|
3232
3257
|
frn_tbl = v.first
|
3233
|
-
next if
|
3258
|
+
next if frn_tbl.is_a?(Symbol) || # Skip internal metadata entries
|
3259
|
+
(relation = v.last).key?(:isView) || config.exclude_tables.include?(frn_tbl) ||
|
3234
3260
|
!(for_pk = (relation[:pkey].values.first&.first))
|
3235
3261
|
|
3236
3262
|
is_default_frn_schema = !is_default_schema && multi_schema &&
|
@@ -204,7 +204,7 @@ function linkSchemas() {
|
|
204
204
|
<polygon style=\"fill:#894747;\" points=\"58,31.559 19,52 19,35 58,15.831\"/>
|
205
205
|
</g>
|
206
206
|
</svg>
|
207
|
-
"
|
207
|
+
"
|
208
208
|
|
209
209
|
# paths['app/models'] << 'lib/brick/frameworks/active_record/models'
|
210
210
|
config.brick = ActiveSupport::OrderedOptions.new
|
@@ -344,7 +344,7 @@ function linkSchemas() {
|
|
344
344
|
s[r.name[0..-9]] = nil if r.name.end_with?('Resource')
|
345
345
|
end
|
346
346
|
::Brick.relations.each do |k, v|
|
347
|
-
unless existing.key?(class_name = v[:class_name]) || Brick.config.exclude_tables.include?(k) ||
|
347
|
+
unless k.is_a?(Symbol) || existing.key?(class_name = v[:class_name]) || Brick.config.exclude_tables.include?(k) ||
|
348
348
|
class_name.blank? || class_name.include?('::')
|
349
349
|
Object.const_get("#{class_name}Resource")
|
350
350
|
end
|
@@ -399,7 +399,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
399
399
|
end
|
400
400
|
def to_s
|
401
401
|
@_name.to_s.html_safe + @vc.instance_variable_get(:@__vc_helpers)&.link_to_brick(nil,
|
402
|
-
BRICK_SVG,
|
402
|
+
BRICK_SVG.html_safe,
|
403
403
|
{ title: "#{@_name} in Brick" }
|
404
404
|
)
|
405
405
|
end
|
@@ -464,7 +464,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
464
464
|
alias _brick_routes routes
|
465
465
|
def routes(*args)
|
466
466
|
::Brick.relations.each do |k, v|
|
467
|
-
next if k == 'active_admin_comments'
|
467
|
+
next if k.is_a?(Symbol) || k == 'active_admin_comments'
|
468
468
|
|
469
469
|
begin
|
470
470
|
if (class_name = Object.const_get(v.fetch(:class_name, nil)))
|
@@ -486,7 +486,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
486
486
|
rescue
|
487
487
|
end
|
488
488
|
h2((@title + link_to_brick(nil,
|
489
|
-
BRICK_SVG, # This would do well to be sized a bit smaller
|
489
|
+
BRICK_SVG.html_safe, # This would do well to be sized a bit smaller
|
490
490
|
{ title: "#{@_name} in Brick" }
|
491
491
|
)).html_safe)
|
492
492
|
else
|
@@ -518,7 +518,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
518
518
|
def fetch_models
|
519
519
|
# Auto-create Brick models
|
520
520
|
::Brick.relations.each do |k, v|
|
521
|
-
next if k == 'active_admin_comments'
|
521
|
+
next if k.is_a?(Symbol) || k == 'active_admin_comments'
|
522
522
|
|
523
523
|
begin
|
524
524
|
v[:class_name].constantize
|
@@ -554,7 +554,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
554
554
|
(::Brick.config.json_columns['motor_audits'] ||= []) << 'audited_changes' if mar_tables.include?('motor_audits')
|
555
555
|
(::Brick.config.json_columns['motor_configs'] ||= []) << 'value' if mar_tables.include?('motor_configs')
|
556
556
|
::Brick.relations.each do |k, v|
|
557
|
-
next if mar_tables.include?(k) || k == 'motor_audits'
|
557
|
+
next if k.is_a?(Symbol) || mar_tables.include?(k) || k == 'motor_audits'
|
558
558
|
|
559
559
|
v[:class_name].constantize
|
560
560
|
end
|
@@ -607,7 +607,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
607
607
|
alias :_brick_lookup_context :lookup_context
|
608
608
|
def lookup_context(*args)
|
609
609
|
ret = _brick_lookup_context(*args)
|
610
|
-
@_lookup_context.instance_variable_set(:@_brick_req_params, params)
|
610
|
+
@_lookup_context.instance_variable_set(:@_brick_req_params, params) if request
|
611
611
|
ret
|
612
612
|
end
|
613
613
|
end
|
@@ -773,7 +773,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
773
773
|
# environment or whatever, then get either the controllers or routes list instead
|
774
774
|
prefix = "#{::Brick.config.path_prefix}/" if ::Brick.config.path_prefix
|
775
775
|
table_options = ::Brick.relations.each_with_object({}) do |rel, s|
|
776
|
-
next if ::Brick.config.exclude_tables.include?(rel.first)
|
776
|
+
next if rel.first.is_a?(Symbol) || ::Brick.config.exclude_tables.include?(rel.first)
|
777
777
|
|
778
778
|
tbl_parts = rel.first.split('.')
|
779
779
|
if (aps = rel.last.fetch(:auto_prefixed_schema, nil))
|
@@ -1531,7 +1531,7 @@ end %>#{"
|
|
1531
1531
|
<table id=\"resourceName\"><td><h1><%= page_title %></h1></td>
|
1532
1532
|
<% if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) %>
|
1533
1533
|
<td><%= link_to_brick(
|
1534
|
-
::Brick::Rails::AVO_SVG,
|
1534
|
+
::Brick::Rails::AVO_SVG.html_safe,
|
1535
1535
|
{ show_proc: Proc.new do |obj, relation|
|
1536
1536
|
path_helper = \"resources_#\{relation.fetch(:auto_prefixed_schema, nil)}#\{obj.class.base_class.model_name.singular_route_key}_path\".to_sym
|
1537
1537
|
::Avo.railtie_routes_url_helpers.send(path_helper, obj) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
|
@@ -1543,7 +1543,7 @@ end %>#{"
|
|
1543
1543
|
if Object.const_defined?('ActiveAdmin')
|
1544
1544
|
ActiveAdmin.application.namespaces.names.each do |ns| %>
|
1545
1545
|
<td><%= link_to_brick(
|
1546
|
-
::Brick::Rails::AA_PNG,
|
1546
|
+
::Brick::Rails::AA_PNG.html_safe,
|
1547
1547
|
{ show_proc: Proc.new do |aa_model, relation|
|
1548
1548
|
path_helper = \"#\{ns}_#\{relation.fetch(:auto_prefixed_schema, nil)}#\{rk = aa_model.model_name.singular_route_key}_path\".to_sym
|
1549
1549
|
send(path_helper, obj) if respond_to?(path_helper)
|
@@ -48,7 +48,7 @@ module Brick::Rails::FormTags
|
|
48
48
|
if show_avo_button != false && Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) && klass.name.exclude?('::')
|
49
49
|
out << "
|
50
50
|
<td>#{link_to_brick(
|
51
|
-
::Brick::Rails::AVO_SVG,
|
51
|
+
::Brick::Rails::AVO_SVG.html_safe,
|
52
52
|
{ index_proc: Proc.new do |_avo_model, relation|
|
53
53
|
path_helper = "resources_#{relation.fetch(:auto_prefixed_schema, nil)}#{klass.model_name.route_key}_path".to_sym
|
54
54
|
::Avo.railtie_routes_url_helpers.send(path_helper) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
|
@@ -62,7 +62,7 @@ module Brick::Rails::FormTags
|
|
62
62
|
ActiveAdmin.application.namespaces.names.each do |ns|
|
63
63
|
out << "
|
64
64
|
<td>#{link_to_brick(
|
65
|
-
::Brick::Rails::AA_PNG,
|
65
|
+
::Brick::Rails::AA_PNG.html_safe,
|
66
66
|
{ index_proc: Proc.new do |aa_model, relation|
|
67
67
|
path_helper = "#{ns}_#{relation.fetch(:auto_prefixed_schema, nil)}#{rk = aa_model.model_name.route_key}_path".to_sym
|
68
68
|
send(path_helper) if respond_to?(path_helper)
|
@@ -11,8 +11,8 @@ module ::Brick::Rails
|
|
11
11
|
<path d=\"M82.812 76.8753C82.6905 76.694 82.3715 76.2207 82.2449 76.0444C82.2044 75.9739 82.2044 75.8782 82.1588 75.8127C82.1132 75.7473 82.1335 75.7724 82.1183 75.7573C79.0714 71.3971 75.1056 67.7497 70.4969 65.0692C65.8882 62.3886 60.7474 60.7393 55.4325 60.2361C54.3236 60.1354 53.1943 60.08 52.055 60.08C45.2173 60.1051 38.5214 62.022 32.7166 65.6161C26.9118 69.2102 22.2271 74.3397 19.1864 80.4308L19.151 80.5013C18.7358 81.3323 18.3458 82.1784 17.9914 83.0194L16.9786 85.2655C16.9077 85.3662 16.8419 85.472 16.771 85.5828C16.6647 85.7389 16.5584 85.9 16.4621 86.0612C15.3778 87.6439 13.8123 88.8397 11.995 89.4732C10.1776 90.1068 8.20406 90.1448 6.36344 89.5817C4.52281 89.0186 2.9119 87.884 1.76676 86.3442C0.621625 84.8044 0.00246102 82.9403 0 81.0251C0.00604053 80.0402 0.177178 79.0632 0.506372 78.1344L1.22036 76.5681C1.25084 76.5034 1.28639 76.4411 1.32669 76.3818C1.40265 76.2559 1.47861 76.135 1.56469 76.0192C1.58531 75.9789 1.60901 75.9401 1.63558 75.9034C7.06401 67.6054 14.947 61.1866 24.1977 57.5317C33.4485 53.8768 43.6114 53.166 53.2855 55.4971L48.9155 45.9286L41.9276 30.6188L33.8256 12.8263L33.6433 12.4285C32.7439 10.3058 32.6986 7.92067 33.5167 5.76573L34.0231 4.69304C34.8148 3.24136 35.9941 2.03525 37.431 1.20762C38.868 0.379997 40.5068 -0.0370045 42.1668 0.0025773C43.8268 0.0421591 45.4436 0.536787 46.839 1.43195C48.2345 2.32711 49.3543 3.58804 50.0751 5.07578L50.2523 5.47363L51.8474 8.96365L74.0974 57.708L82.812 76.8753Z\" fill=\"currentColor\" fill-opacity=\"0.22\"></path>
|
12
12
|
<path opacity=\"0.25\" d=\"M41.9129 30.649L35.3301 45.0422C35.2023 45.3204 35.0074 45.563 34.7627 45.7484C34.518 45.9337 34.2311 46.0562 33.9274 46.1048C27.3926 47.1897 21.1567 49.6166 15.617 53.2308C15.279 53.4505 14.8783 53.555 14.4753 53.5286C14.0723 53.5022 13.6889 53.3463 13.3827 53.0844C13.0765 52.8225 12.8642 52.4688 12.7777 52.0765C12.6911 51.6842 12.7351 51.2745 12.9029 50.9092L32.0285 8.99382L33.4869 5.7959C32.6687 7.95084 32.7141 10.336 33.6135 12.4586L33.7958 12.8565L41.9129 30.649Z\" fill=\"currentColor\" fill-opacity=\"0.22\"></path>
|
13
13
|
</svg>
|
14
|
-
"
|
14
|
+
"
|
15
15
|
|
16
16
|
AA_PNG = "<img src=\"data:image/png;base64,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\">
|
17
|
-
"
|
17
|
+
"
|
18
18
|
end
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -89,7 +89,7 @@ end
|
|
89
89
|
# is first established), and then automatically creates models, controllers, views,
|
90
90
|
# and routes based on those available relations.
|
91
91
|
require 'brick/config'
|
92
|
-
if Gem::Specification.all_names.any? { |g| g.start_with?('rails-') }
|
92
|
+
if Gem::Specification.all_names.any? { |g| g.start_with?('rails-') && g[6..-1] =~ /^([0-9]|\.)+$/ }
|
93
93
|
require 'rails'
|
94
94
|
require 'brick/frameworks/rails'
|
95
95
|
end
|
@@ -149,7 +149,19 @@ module Brick
|
|
149
149
|
ch.connection_pool_list.blank?
|
150
150
|
|
151
151
|
# Key our list of relations for this connection off of the connection pool's object_id
|
152
|
-
|
152
|
+
cp_objid = ActiveRecord::Base.connection_pool.object_id
|
153
|
+
@relations ||= {}
|
154
|
+
|
155
|
+
# Have we already seen this database? (Perhaps we're connecting to a replica?)
|
156
|
+
@relations[cp_objid] ||= if (db_name = ActiveRecord::Base.connection&.instance_variable_get(:@config)&.fetch(:database, nil)) &&
|
157
|
+
!@relations.key?(cp_objid) &&
|
158
|
+
(existing = @relations.find { |_k, v| v.fetch(:db_name, nil) == db_name })
|
159
|
+
existing.last
|
160
|
+
else
|
161
|
+
Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = {} } }.tap do |h|
|
162
|
+
h[:db_name] = db_name if db_name
|
163
|
+
end
|
164
|
+
end
|
153
165
|
end
|
154
166
|
|
155
167
|
def apartment_multitenant
|
@@ -624,7 +636,9 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
624
636
|
end
|
625
637
|
|
626
638
|
# Find associative tables that can be set up for has_many :through
|
627
|
-
::Brick.relations.each do |
|
639
|
+
::Brick.relations.each do |key, tbl|
|
640
|
+
next if key.is_a?(Symbol)
|
641
|
+
|
628
642
|
tbl_cols = tbl[:cols].keys
|
629
643
|
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 }
|
630
644
|
# Aside from the primary key and the metadata columns created_at, updated_at, and deleted_at, if this table only has
|
@@ -719,6 +733,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
719
733
|
|
720
734
|
if res_names.empty?
|
721
735
|
::Brick.relations.each_with_object({}) do |v, s|
|
736
|
+
next if v.first.is_a?(Symbol)
|
737
|
+
|
722
738
|
v_parts = v.first.split('.')
|
723
739
|
v_parts.shift if v_parts.first == 'public'
|
724
740
|
res_names[v_parts.join('.')] = v.first
|
@@ -880,6 +896,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
880
896
|
end
|
881
897
|
versioned_views = {} # Track which views have already been done for each api_root
|
882
898
|
::Brick.relations.each do |k, v|
|
899
|
+
next if k.is_a?(Symbol)
|
900
|
+
|
883
901
|
if (schema_name = v.fetch(:schema, nil))
|
884
902
|
schema_prefix = "#{schema_name}."
|
885
903
|
end
|
@@ -35,6 +35,8 @@ module Brick
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
possible_additional_references = relations.each_with_object(Hash.new { |h, k| h[k] = [] }) do |relation, s|
|
38
|
+
next if relation.first.is_a?(Symbol)
|
39
|
+
|
38
40
|
this_tnp = tnps&.keys&.find { |tnp| relation.first.start_with?(tnp) }
|
39
41
|
model_filename = "app/models/#{ActiveSupport::Inflector.singularize(relation.first)}.rb"
|
40
42
|
relation.last[:cols].each do |col, type|
|
@@ -105,7 +105,6 @@ module Brick
|
|
105
105
|
built_schemas = {} # Track all built schemas so we can place an appropriate drop_schema command only in the first
|
106
106
|
# migration in which that schema is referenced, thereby allowing rollbacks to function properly.
|
107
107
|
versions_to_create = [] # Resulting versions to be used when updating the schema_migrations table
|
108
|
-
ar_base = Object.const_defined?(:ApplicationRecord) ? ApplicationRecord : Class.new(ActiveRecord::Base)
|
109
108
|
# Start by making migrations for fringe tables (those with no foreign keys).
|
110
109
|
# Continue layer by layer, creating migrations for tables that reference ones already done, until
|
111
110
|
# no more migrations can be created. (At that point hopefully all tables are accounted for.)
|
@@ -126,7 +125,7 @@ module Brick
|
|
126
125
|
fringe.each do |tbl|
|
127
126
|
next unless (relation = relations.fetch(tbl, nil))&.fetch(:cols, nil)&.present?
|
128
127
|
|
129
|
-
pkey_cols = (rpk = relation[:pkey].values.flatten) & (arpk = [ar_base.primary_key].flatten.sort)
|
128
|
+
pkey_cols = (rpk = relation[:pkey].values.flatten) & (arpk = [::Brick.ar_base.primary_key].flatten.sort)
|
130
129
|
# In case things aren't as standard
|
131
130
|
if pkey_cols.empty?
|
132
131
|
pkey_cols = if rpk.empty? && relation[:cols][arpk.first]&.first == key_type
|
@@ -239,9 +238,9 @@ module Brick
|
|
239
238
|
begin
|
240
239
|
primary_key = relations[fk[:inverse_table]][:class_name]&.constantize&.primary_key
|
241
240
|
rescue NameError => e
|
242
|
-
primary_key = ar_base.primary_key
|
241
|
+
primary_key = ::Brick.ar_base.primary_key
|
243
242
|
end
|
244
|
-
mig << " t.references :#{fk[:assoc_name]}#{suffix}, foreign_key: { to_table: #{to_table}#{", primary_key: :#{primary_key}" if primary_key != ar_base.primary_key} }\n"
|
243
|
+
mig << " t.references :#{fk[:assoc_name]}#{suffix}, foreign_key: { to_table: #{to_table}#{", primary_key: :#{primary_key}" if primary_key != ::Brick.ar_base.primary_key} }\n"
|
245
244
|
end
|
246
245
|
else
|
247
246
|
next if !id_option&.end_with?('id: false') && pkey_cols&.include?(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.
|
4
|
+
version: 1.0.175
|
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-09-
|
11
|
+
date: 2023-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|