brick 1.0.39 → 1.0.40
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 +4 -4
- data/lib/brick/extensions.rb +5 -1
- data/lib/brick/frameworks/rails/engine.rb +6 -1
- data/lib/brick/tasks/orphans.rake +57 -0
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +5 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf29d4af64b65c01ae68df45762b816403a1ebc0035e1221552f249ff3ba2ce9
|
4
|
+
data.tar.gz: 076cdb672d7c2137cc74421467d72491e9ea89751fab32015f427158fc367b45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce17038567ddd9d6d9d9dce6eb71fd50612d167b56351898ef9b3f9441d1a7ef3ee4ec3a57f3f24e613829e6c8a2f59517fc0d4e9266f11166b92821310b0c06
|
7
|
+
data.tar.gz: 6a7bb38b009853594a8bf1ab28489bbc92d6300fcd0f8497c7950e81c6a62a4c6da2bd65840f93bd7afea40153727cb93914529120ecf9b0dceca39b21fef880
|
data/lib/brick/extensions.rb
CHANGED
@@ -70,7 +70,11 @@ module ActiveRecord
|
|
70
70
|
def self._brick_primary_key(relation = nil)
|
71
71
|
return instance_variable_get(:@_brick_primary_key) if instance_variable_defined?(:@_brick_primary_key)
|
72
72
|
|
73
|
-
pk =
|
73
|
+
pk = begin
|
74
|
+
primary_key.is_a?(String) ? [primary_key] : primary_key || []
|
75
|
+
rescue
|
76
|
+
[]
|
77
|
+
end
|
74
78
|
# Just return [] if we're missing any part of the primary key. (PK is usually just "id")
|
75
79
|
if relation && pk.present?
|
76
80
|
@_brick_primary_key ||= pk.any? { |pk_part| !relation[:cols].key?(pk_part) } ? [] : pk
|
@@ -529,6 +529,7 @@ if (headerTop) {
|
|
529
529
|
# 0..62 because Postgres column names are limited to 63 characters
|
530
530
|
#{obj_name}, (descrips = @_brick_bt_descrip[bt.first][bt_class])[0..-2].map { |z| #{obj_name}.send(z.last[0..62]) }, (bt_id_col = descrips.last)
|
531
531
|
)
|
532
|
+
bt_txt ||= \"<< Orphaned ID: #\{val} >>\" if val
|
532
533
|
bt_id = #{obj_name}.send(*bt_id_col) if bt_id_col&.present? %>
|
533
534
|
<%= bt_id ? link_to(bt_txt, send(\"#\{bt_class.base_class.name.underscore.tr('/', '_')\}_path\".to_sym, bt_id)) : bt_txt %>
|
534
535
|
<%#= Previously was: bt_obj = bt[1].first.first.find_by(bt[2] => val); link_to(bt_obj.brick_descrip, send(\"#\{bt[1].first.first.name.underscore\}_path\".to_sym, bt_obj.send(bt[1].first.first.primary_key.to_sym))) if bt_obj %>
|
@@ -610,7 +611,11 @@ end
|
|
610
611
|
html_options = { prompt: \"Select #\{bt_name\}\" }
|
611
612
|
html_options[:class] = 'dimmed' unless val %>
|
612
613
|
<%= f.select k.to_sym, bt[3], { value: val || '^^^brick_NULL^^^' }, html_options %>
|
613
|
-
<%= bt_obj = bt_class&.find_by(bt_pair[1] => val)
|
614
|
+
<%= if (bt_obj = bt_class&.find_by(bt_pair[1] => val))
|
615
|
+
link_to('⇛', send(\"#\{bt_class.base_class.name.underscore.tr('/', '_')\}_path\".to_sym, bt_obj.send(bt_class.primary_key.to_sym)), { class: 'show-arrow' })
|
616
|
+
elsif val
|
617
|
+
\"Orphaned ID: #\{val}\"
|
618
|
+
end %>
|
614
619
|
<% else case #{model_name}.column_for_attribute(k).type
|
615
620
|
when :string, :text %>
|
616
621
|
<% if is_bcrypt?(val) # || .readonly? %>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if Object.const_defined?('::Rake::TaskManager')
|
4
|
+
namespace :brick do
|
5
|
+
desc 'Find any seemingly-orphaned records'
|
6
|
+
task orphans: :environment do
|
7
|
+
def class_pk(dotted_name, multitenant)
|
8
|
+
Object.const_get((multitenant ? [dotted_name.split('.').last] : dotted_name.split('.')).map { |nm| "::#{nm.singularize.camelize}" }.join).primary_key
|
9
|
+
end
|
10
|
+
|
11
|
+
schema_list = ((multi = ::Brick.config.schema_behavior[:multitenant]) && ::Brick.db_schemas.keys.sort) || []
|
12
|
+
if schema_list.length > 1
|
13
|
+
require 'fancy_gets'
|
14
|
+
include FancyGets
|
15
|
+
schema = gets_list(
|
16
|
+
list: schema_list,
|
17
|
+
chosen: multi[:schema_to_analyse]
|
18
|
+
)
|
19
|
+
elsif schema_list.length.positive?
|
20
|
+
schema = schema_list.first
|
21
|
+
end
|
22
|
+
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?", schema) if schema
|
23
|
+
orphans = +''
|
24
|
+
::Brick.relations.each do |k, v|
|
25
|
+
next if v.key?(:isView) || ::Brick.config.exclude_tables.include?(k) ||
|
26
|
+
!(pri_pk = v[:pkey].values.first&.first) ||
|
27
|
+
!(pri_pk = class_pk(k, multi))
|
28
|
+
v[:fks].each do |k1, v1|
|
29
|
+
next if v1[:is_bt] ||
|
30
|
+
!(for_rel = ::Brick.relations.fetch(v1[:inverse_table], nil)) ||
|
31
|
+
v1[:inverse]&.key?(:polymorphic) ||
|
32
|
+
!(for_pk = for_rel.fetch(:pkey, nil)&.values&.first&.first) ||
|
33
|
+
!(for_pk = class_pk(v1[:inverse_table], multi))
|
34
|
+
begin
|
35
|
+
ActiveRecord::Base.execute_sql(
|
36
|
+
"SELECT DISTINCT frn.#{v1[:fk]} AS pri_id, frn.#{for_pk} AS fk_id
|
37
|
+
FROM #{v1[:inverse_table]} AS frn
|
38
|
+
LEFT OUTER JOIN #{k} AS pri ON pri.#{pri_pk} = frn.#{v1[:fk]}
|
39
|
+
WHERE frn.#{v1[:fk]} IS NOT NULL AND pri.#{pri_pk} IS NULL
|
40
|
+
ORDER BY 1, 2"
|
41
|
+
).each do |o|
|
42
|
+
orphans << "#{v1[:inverse_table]} #{o['fk_id']} refers to non-existant #{k} #{o['pri_id']}\n"
|
43
|
+
end
|
44
|
+
rescue StandardError => err
|
45
|
+
puts "Strange -- #{err.inspect}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
puts "For #{schema}:\n#{'=' * (schema.length + 5)}" if schema
|
50
|
+
if orphans.blank?
|
51
|
+
puts "No orphans!"
|
52
|
+
else
|
53
|
+
print orphans
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -481,6 +481,11 @@ require 'active_record'
|
|
481
481
|
require 'active_record/relation'
|
482
482
|
require 'active_record/relation/query_methods' if is_add_left_outer_join
|
483
483
|
|
484
|
+
# Rake tasks
|
485
|
+
class Railtie < Rails::Railtie
|
486
|
+
Dir.glob("#{File.expand_path(__dir__)}/brick/tasks/**/*.rake").each { |task| load task }
|
487
|
+
end
|
488
|
+
|
484
489
|
# Major compatibility fixes for ActiveRecord < 4.2
|
485
490
|
# ================================================
|
486
491
|
ActiveSupport.on_load(:active_record) do
|
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.40
|
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
|
+
date: 2022-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '7.2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: fancy_gets
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: appraisal
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -225,6 +239,7 @@ files:
|
|
225
239
|
- lib/brick/join_array.rb
|
226
240
|
- lib/brick/serializers/json.rb
|
227
241
|
- lib/brick/serializers/yaml.rb
|
242
|
+
- lib/brick/tasks/orphans.rake
|
228
243
|
- lib/brick/util.rb
|
229
244
|
- lib/brick/version_number.rb
|
230
245
|
- lib/generators/brick/USAGE
|