brick 1.0.85 → 1.0.86
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/compatibility.rb +20 -5
- data/lib/brick/extensions.rb +29 -12
- data/lib/brick/frameworks/rails/engine.rb +22 -9
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +20 -5
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67cdd41b9c4a3a235e4d88a151149a7c2c9345a4280efe31c3fbd983b65fbdd4
|
4
|
+
data.tar.gz: 12f80d33a0360cfa67fb703ed59b65b9216cafa07a18d9283baf9df584067896
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e95aefd208502dfa2ae724d178a29d15ccad4d00522ecbb865019823ba331c0d9f6e4026aea1b634f57f1d7945d8f522e35361d42d9de972698de91c0b9bd129
|
7
|
+
data.tar.gz: 99d0df87ae591bf836f6040aa237863fb1535774cb6fae515bb1c25edd284b4f37d5a1c01584138df81cfbb66a535ef8bec9aaf2550c96a42c02dee7e48aada1
|
data/lib/brick/compatibility.rb
CHANGED
@@ -10,12 +10,27 @@ unless ActiveRecord.respond_to?(:version)
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
module ActionView
|
13
|
+
# ActiveSupport, ActionPack, and ActionView before 4.0 didn't have #version
|
14
|
+
unless ActiveSupport.respond_to?(:version)
|
15
|
+
module ActiveSupport
|
17
16
|
def self.version
|
18
|
-
|
17
|
+
::Gem::Version.new(ActiveSupport::VERSION::STRING)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
if Object.const_defined?('ActionPack')
|
22
|
+
unless ActionPack.respond_to?(:version)
|
23
|
+
module ActionPack
|
24
|
+
def self.version
|
25
|
+
::Gem::Version.new(ActionPack::VERSION::STRING)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if Object.const_defined?('ActionView') && !ActionView.respond_to?(:version)
|
30
|
+
module ActionView
|
31
|
+
def self.version
|
32
|
+
ActionPack.version
|
33
|
+
end
|
19
34
|
end
|
20
35
|
end
|
21
36
|
end
|
data/lib/brick/extensions.rb
CHANGED
@@ -239,7 +239,7 @@ module ActiveRecord
|
|
239
239
|
pk_alias = [pk_alias] unless pk_alias.is_a?(Array)
|
240
240
|
id = []
|
241
241
|
pk_alias.each do |pk_alias_part|
|
242
|
-
if (pk_part = obj.send(pk_alias_part))
|
242
|
+
if (pk_part = obj.respond_to?(pk_alias_part) ? obj.send(pk_alias_part) : nil)
|
243
243
|
id << pk_part
|
244
244
|
end
|
245
245
|
end
|
@@ -608,7 +608,11 @@ module ActiveRecord
|
|
608
608
|
# %%% Need to support {user: :profile}
|
609
609
|
next unless assoc_name.is_a?(Symbol)
|
610
610
|
|
611
|
-
table_alias =
|
611
|
+
table_alias = if (chain = chains[klass = reflect_on_association(assoc_name)&.klass])
|
612
|
+
shift_or_first(chain)
|
613
|
+
else
|
614
|
+
klass.table_name # ActiveRecord < 4.2 can't (yet) use the cool chains thing
|
615
|
+
end
|
612
616
|
_assoc_names[assoc_name] = [table_alias, klass]
|
613
617
|
end
|
614
618
|
end
|
@@ -706,7 +710,7 @@ module ActiveRecord
|
|
706
710
|
join_clause = "LEFT OUTER
|
707
711
|
JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', ')}, COUNT(#{'DISTINCT ' if hm.options[:through]}#{count_column
|
708
712
|
}) AS c_t_ FROM #{from_clause || hm_table_name} GROUP BY #{group_bys.join(', ')}) #{tbl_alias}"
|
709
|
-
|
713
|
+
self.joins_values |= ["#{join_clause} ON #{on_clause.join(' AND ')}"] # Same as: joins!(...)
|
710
714
|
end
|
711
715
|
while (n = nix.pop)
|
712
716
|
klass._br_hm_counts.delete(n)
|
@@ -723,7 +727,11 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
|
|
723
727
|
s["#{tbl_name}.#{v_parts.last}"] = v.last
|
724
728
|
end
|
725
729
|
end
|
726
|
-
where!
|
730
|
+
if respond_to?(:where!)
|
731
|
+
where!(wheres2)
|
732
|
+
else # AR < 4.0
|
733
|
+
self.where_values << build_where(wheres2)
|
734
|
+
end
|
727
735
|
end
|
728
736
|
# Must parse the order_by and see if there are any symbols which refer to BT associations
|
729
737
|
# or custom columns as they must be expanded to find the corresponding b_r_model__column
|
@@ -747,9 +755,10 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
|
|
747
755
|
selects << v if is_distinct
|
748
756
|
end
|
749
757
|
end
|
750
|
-
order!(*final_order_by)
|
758
|
+
self.order_values |= final_order_by # Same as: order!(*final_order_by)
|
751
759
|
end
|
752
|
-
|
760
|
+
# Don't want to get too carried away just yet
|
761
|
+
self.limit_value = 1000 # Same as: limit!(1000)
|
753
762
|
wheres unless wheres.empty? # Return the specific parameters that we did use
|
754
763
|
end
|
755
764
|
|
@@ -935,8 +944,13 @@ if ActiveSupport::Dependencies.respond_to?(:autoload_module!) # %%% Only works w
|
|
935
944
|
autoloaded_constants << qualified_name unless autoloaded_constants.include?(qualified_name)
|
936
945
|
klass
|
937
946
|
elsif (base_class = ::Brick.config.sti_namespace_prefixes&.fetch("::#{const_name}", nil)&.constantize)
|
938
|
-
|
939
|
-
|
947
|
+
begin
|
948
|
+
# Attempt to find an existing implementation for this subclass
|
949
|
+
base_class.module_parent.const_get(const_name)
|
950
|
+
rescue
|
951
|
+
# Build subclass and place it in the same module as its parent
|
952
|
+
base_class.module_parent.const_set(const_name.to_sym, klass = Class.new(base_class))
|
953
|
+
end
|
940
954
|
else
|
941
955
|
_brick_autoload_module!(*args)
|
942
956
|
end
|
@@ -1509,9 +1523,10 @@ class Object
|
|
1509
1523
|
ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
|
1510
1524
|
order_by, _ = model._brick_calculate_ordering(ordering, true) # Don't do the txt part
|
1511
1525
|
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1526
|
+
ar_relation = ActiveRecord.version < Gem::Version.new('4') ? model.preload : model.all
|
1527
|
+
@_brick_params = ar_relation.brick_select(params, (selects = []), order_by,
|
1528
|
+
translations = {},
|
1529
|
+
join_array = ::Brick::JoinArray.new)
|
1515
1530
|
# %%% Add custom HM count columns
|
1516
1531
|
# %%% What happens when the PK is composite?
|
1517
1532
|
counts = model._br_hm_counts.each_with_object([]) do |v, s|
|
@@ -1523,7 +1538,8 @@ class Object
|
|
1523
1538
|
"b_r_#{v.first}.c_t_ AS \"b_r_#{v.first}_ct\""
|
1524
1539
|
end
|
1525
1540
|
end
|
1526
|
-
|
1541
|
+
ar_select = ar_relation.respond_to?(:_select!) ? ar_relation.dup._select!(*selects, *counts) : ar_relation.select(selects + counts)
|
1542
|
+
instance_variable_set("@#{table_name.pluralize}".to_sym, ar_select)
|
1527
1543
|
if namespace && (idx = lookup_context.prefixes.index(table_name))
|
1528
1544
|
lookup_context.prefixes[idx] = "#{namespace.name.underscore}/#{lookup_context.prefixes[idx]}"
|
1529
1545
|
end
|
@@ -2028,6 +2044,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
|
|
2028
2044
|
end
|
2029
2045
|
::Brick.is_oracle = true if ActiveRecord::Base.connection.adapter_name == 'OracleEnhanced'
|
2030
2046
|
# ::Brick.default_schema ||= schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
2047
|
+
::Brick.default_schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
2031
2048
|
fk_references&.each do |fk|
|
2032
2049
|
fk = fk.values unless fk.is_a?(Array)
|
2033
2050
|
# Multitenancy makes things a little more general overall, except for non-tenanted tables
|
@@ -103,12 +103,18 @@ module Brick
|
|
103
103
|
unless (model_name = @_brick_model&.name) ||
|
104
104
|
(is_status = ::Brick.config.add_status && args[0..1] == ['status', ['brick_gem']]) ||
|
105
105
|
(is_orphans = ::Brick.config.add_orphans && args[0..1] == ['orphans', ['brick_gem']])
|
106
|
-
if
|
106
|
+
if ActionView.version < ::Gem::Version.new('5.0') # %%% Not sure if this should be perhaps 4.2 instead
|
107
|
+
begin
|
108
|
+
if (possible_template = _brick_find_template(*args, **options))
|
109
|
+
return possible_template
|
110
|
+
end
|
111
|
+
rescue
|
112
|
+
end
|
113
|
+
elsif (possible_template = _brick_find_template(*args, **options))
|
107
114
|
return possible_template
|
108
|
-
else
|
109
|
-
# Used to also have: ActionView.version < ::Gem::Version.new('5.0') &&
|
110
|
-
model_name = (args[1].is_a?(Array) ? set_brick_model(args) : nil)&.name
|
111
115
|
end
|
116
|
+
# Used to also have: ActionView.version < ::Gem::Version.new('5.0') &&
|
117
|
+
model_name = (args[1].is_a?(Array) ? set_brick_model(args) : nil)&.name
|
112
118
|
end
|
113
119
|
|
114
120
|
if @_brick_model
|
@@ -154,7 +160,7 @@ module Brick
|
|
154
160
|
'nil'
|
155
161
|
else
|
156
162
|
# Postgres column names are limited to 63 characters
|
157
|
-
"#{obj_name}.#{"b_r_#{assoc_name}_ct"[0..62]} || 0"
|
163
|
+
"#{obj_name}.#{"b_r_#{assoc_name}_ct"[0..62]}&.to_i || 0"
|
158
164
|
end
|
159
165
|
", #{set_ct}, #{path_keys(hm_assoc, hm_fk_name, obj_name, pk)}"
|
160
166
|
end
|
@@ -919,12 +925,19 @@ erDiagram
|
|
919
925
|
%><%= link_to(\"#\{bt_class} ##\{poly_id}\", send(\"#\{base_class_underscored}_path\".to_sym, poly_id)) if poly_id %><%
|
920
926
|
else
|
921
927
|
# binding.pry if @_brick_bt_descrip[bt.first][bt[1].first.first].nil?
|
922
|
-
|
928
|
+
bt_class = bt[1].first.first
|
929
|
+
descrips = @_brick_bt_descrip[bt.first][bt_class]
|
930
|
+
bt_id_col = if descrips.length == 1
|
931
|
+
[#{obj_name}.class.reflect_on_association(bt.first)&.foreign_key]
|
932
|
+
else
|
933
|
+
descrips.last
|
934
|
+
end
|
935
|
+
bt_txt = bt_class.brick_descrip(
|
923
936
|
# 0..62 because Postgres column names are limited to 63 characters
|
924
|
-
#{obj_name},
|
937
|
+
#{obj_name}, descrips[0..-2].map { |id| #{obj_name}.send(id.last[0..62]) }, bt_id_col
|
925
938
|
)
|
926
939
|
bt_txt ||= \"<span class=\\\"orphan\\\"><< Orphaned ID: #\{val} >></span>\".html_safe if val
|
927
|
-
bt_id = bt_id_col
|
940
|
+
bt_id = bt_id_col&.map { |id_col| #{obj_name}.respond_to?(id_sym = id_col.to_sym) ? #{obj_name}.send(id_sym) : id_col } %>
|
928
941
|
<%= bt_id&.first ? link_to(bt_txt, send(\"#\{bt_class.base_class._brick_index(:singular)}_path\".to_sym, bt_id)) : bt_txt %>
|
929
942
|
<% end
|
930
943
|
elsif (hms_col = hms_cols[col_name])
|
@@ -1183,7 +1196,7 @@ end
|
|
1183
1196
|
s << "<table id=\"#{hm_name}\" class=\"shadow\">
|
1184
1197
|
<tr><th>#{hm[3]}</th></tr>
|
1185
1198
|
<% collection = @#{obj_name}.#{hm_name}
|
1186
|
-
collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) :
|
1199
|
+
collection = collection.is_a?(ActiveRecord::Associations::CollectionProxy) ? collection.order(#{pk.inspect}) : collection.to_a.compact
|
1187
1200
|
if collection.empty? %>
|
1188
1201
|
<tr><td>(none)</td></tr>
|
1189
1202
|
<% else %>
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -137,7 +137,7 @@ module Brick
|
|
137
137
|
|
138
138
|
def set_db_schema(params = nil)
|
139
139
|
schema = (params ? params['_brick_schema'] : ::Brick.default_schema)
|
140
|
-
if schema && ::Brick.db_schemas&.key?(schema)
|
140
|
+
chosen = if schema && ::Brick.db_schemas&.key?(schema)
|
141
141
|
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?;", schema)
|
142
142
|
schema
|
143
143
|
elsif ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
@@ -146,6 +146,7 @@ module Brick
|
|
146
146
|
# ::Brick.apartment_multitenant && tbl_parts.first == Apartment.default_schema
|
147
147
|
(orig_schema - ['pg_catalog']).first
|
148
148
|
end
|
149
|
+
chosen == ::Brick.default_schema ? nil : chosen
|
149
150
|
end
|
150
151
|
|
151
152
|
# All tables and views (what Postgres calls "relations" including column and foreign key info)
|
@@ -218,7 +219,7 @@ module Brick
|
|
218
219
|
skip_hms[through] = nil if hms[through] && model.is_brick?
|
219
220
|
# End up with a hash of HMT names pointing to join-table associations
|
220
221
|
model._br_associatives[hmt.first] = hms[through] # || hms["#{(opt = hmt.last.options)[:through].to_s.singularize}_#{opt[:source].to_s.pluralize}".to_sym]
|
221
|
-
elsif hmt.last.inverse_of.nil?
|
222
|
+
elsif hmt.last.inverse_of.nil? && ActiveRecord.version >= ::Gem::Version.new('4.2')
|
222
223
|
puts "SKIPPING #{hmt.last.name.inspect}"
|
223
224
|
# %%% If we don't do this then below associative.name will find that associative is nil
|
224
225
|
skip_hms[hmt.last.name] = nil
|
@@ -540,7 +541,11 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
540
541
|
::Brick.is_eager_loading = true
|
541
542
|
if ::ActiveSupport.version < ::Gem::Version.new('6') ||
|
542
543
|
::Rails.configuration.instance_variable_get(:@autoloader) == :classic
|
543
|
-
::
|
544
|
+
if ::ActiveSupport.version < ::Gem::Version.new('4')
|
545
|
+
::Rails.application.eager_load!
|
546
|
+
else
|
547
|
+
::Rails.configuration.eager_load_namespaces.select { |ns| ns < ::Rails::Application }.each(&:eager_load!)
|
548
|
+
end
|
544
549
|
else
|
545
550
|
Zeitwerk::Loader.eager_load_all
|
546
551
|
end
|
@@ -562,7 +567,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
562
567
|
|
563
568
|
module RouteSet
|
564
569
|
def finalize!
|
565
|
-
|
570
|
+
# %%% Was: ::Rails.application.routes.named_routes.route_defined?(:brick_status_path)
|
571
|
+
unless ::Rails.application.routes.named_routes.names.include?(:brick_status)
|
566
572
|
path_prefix = ::Brick.config.path_prefix
|
567
573
|
existing_controllers = routes.each_with_object({}) do |r, s|
|
568
574
|
c = r.defaults[:controller]
|
@@ -837,13 +843,21 @@ ActiveSupport.on_load(:active_record) do
|
|
837
843
|
end
|
838
844
|
end
|
839
845
|
|
840
|
-
# This only gets added for ActiveRecord < 3.2
|
841
846
|
module Reflection
|
847
|
+
# This only gets added for ActiveRecord < 3.2
|
842
848
|
unless AssociationReflection.instance_methods.include?(:foreign_key)
|
843
849
|
class AssociationReflection < MacroReflection
|
844
850
|
alias foreign_key association_foreign_key
|
845
851
|
end
|
846
852
|
end
|
853
|
+
# And this for ActiveRecord < 4.0
|
854
|
+
unless AssociationReflection.instance_methods.include?(:polymorphic?)
|
855
|
+
class AssociationReflection < MacroReflection
|
856
|
+
def polymorphic?
|
857
|
+
options[:polymorphic]
|
858
|
+
end
|
859
|
+
end
|
860
|
+
end
|
847
861
|
end
|
848
862
|
|
849
863
|
# ActiveRecord 3.1 and 3.2 didn't try to bring in &block for the .extending() convenience thing
|
@@ -1022,6 +1036,7 @@ ActiveSupport.on_load(:active_record) do
|
|
1022
1036
|
delegate :left_outer_joins, to: :all
|
1023
1037
|
end
|
1024
1038
|
class Relation
|
1039
|
+
alias :model :klass unless respond_to?(:model) # To support AR < 4.2
|
1025
1040
|
unless MULTI_VALUE_METHODS.include?(:left_outer_joins)
|
1026
1041
|
_multi_value_methods = MULTI_VALUE_METHODS + [:left_outer_joins]
|
1027
1042
|
send(:remove_const, :MULTI_VALUE_METHODS)
|
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.86
|
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-10-
|
11
|
+
date: 2022-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '3.
|
19
|
+
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '3.
|
26
|
+
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: fancy_gets
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|