brick 1.0.84 → 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/config.rb +25 -4
- data/lib/brick/extensions.rb +48 -19
- data/lib/brick/frameworks/rails/controller.rb +10 -4
- data/lib/brick/frameworks/rails/engine.rb +43 -14
- data/lib/brick/util.rb +1 -0
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +52 -21
- data/lib/generators/brick/install_generator.rb +8 -2
- 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/config.rb
CHANGED
@@ -20,6 +20,23 @@ module Brick
|
|
20
20
|
@serializer = Brick::Serializers::YAML
|
21
21
|
end
|
22
22
|
|
23
|
+
def mode
|
24
|
+
@mutex.synchronize do
|
25
|
+
case @brick_mode
|
26
|
+
when nil, :development
|
27
|
+
(::Rails.env == 'development' || ENV.key?('BRICK')) ? :on : nil
|
28
|
+
when :diag_env
|
29
|
+
ENV.key?('BRICK') ? :on : nil
|
30
|
+
else
|
31
|
+
@brick_mode
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def mode=(setting)
|
37
|
+
@mutex.synchronize { @brick_mode = setting unless @brick_mode == :on }
|
38
|
+
end
|
39
|
+
|
23
40
|
# Any path prefixing to apply to all auto-generated Brick routes
|
24
41
|
def path_prefix
|
25
42
|
@mutex.synchronize { @path_prefix }
|
@@ -31,7 +48,8 @@ module Brick
|
|
31
48
|
|
32
49
|
# Indicates whether Brick models are on or off. Default: true.
|
33
50
|
def enable_models
|
34
|
-
|
51
|
+
brick_mode = mode
|
52
|
+
@mutex.synchronize { brick_mode == :on && (@enable_models.nil? || @enable_models) }
|
35
53
|
end
|
36
54
|
|
37
55
|
def enable_models=(enable)
|
@@ -40,7 +58,8 @@ module Brick
|
|
40
58
|
|
41
59
|
# Indicates whether Brick controllers are on or off. Default: true.
|
42
60
|
def enable_controllers
|
43
|
-
|
61
|
+
brick_mode = mode
|
62
|
+
@mutex.synchronize { brick_mode == :on && (@enable_controllers.nil? || @enable_controllers) }
|
44
63
|
end
|
45
64
|
|
46
65
|
def enable_controllers=(enable)
|
@@ -49,7 +68,8 @@ module Brick
|
|
49
68
|
|
50
69
|
# Indicates whether Brick views are on or off. Default: true.
|
51
70
|
def enable_views
|
52
|
-
|
71
|
+
brick_mode = mode
|
72
|
+
@mutex.synchronize { brick_mode == :on && (@enable_views.nil? || @enable_views) }
|
53
73
|
end
|
54
74
|
|
55
75
|
def enable_views=(enable)
|
@@ -58,7 +78,8 @@ module Brick
|
|
58
78
|
|
59
79
|
# Indicates whether Brick routes are on or off. Default: true.
|
60
80
|
def enable_routes
|
61
|
-
|
81
|
+
brick_mode = mode
|
82
|
+
@mutex.synchronize { brick_mode == :on && (@enable_routes.nil? || @enable_routes) }
|
62
83
|
end
|
63
84
|
|
64
85
|
def enable_routes=(enable)
|
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
|
|
@@ -766,7 +775,7 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
|
|
766
775
|
|
767
776
|
alias _brick_find_sti_class find_sti_class
|
768
777
|
def find_sti_class(type_name)
|
769
|
-
if ::Brick.sti_models.key?(type_name)
|
778
|
+
if ::Brick.sti_models.key?(type_name ||= name)
|
770
779
|
_brick_find_sti_class(type_name)
|
771
780
|
else
|
772
781
|
# This auto-STI is more of a brute-force approach, building modules where needed
|
@@ -816,6 +825,8 @@ end
|
|
816
825
|
if Object.const_defined?('ActionView')
|
817
826
|
module ActionView::Helpers::FormTagHelper
|
818
827
|
def link_to_brick(*args, **kwargs)
|
828
|
+
return unless ::Brick.config.mode == :on
|
829
|
+
|
819
830
|
text = (args.first.is_a?(String) && args.first) || args[1]
|
820
831
|
klass_or_obj = ((args.first.is_a?(ActiveRecord::Relation) ||
|
821
832
|
args.first.is_a?(ActiveRecord::Base) ||
|
@@ -860,7 +871,7 @@ if Object.const_defined?('ActionView')
|
|
860
871
|
pk = (klass.primary_key || ActiveRecord::Base.primary_key).to_sym
|
861
872
|
# Used to also have this but it's a bit too permissive to identify a primary key: (path_params.length == 1 && path_params.values.first) ||
|
862
873
|
if ((id = (path_params[pk] || path_params[:id] || path_params["#{klass.name.underscore}_id".to_sym])) && (obj = klass.find_by(pk => id))) ||
|
863
|
-
(['show', 'edit'].include?(action_name) && (obj = klass.first))
|
874
|
+
(['show', 'edit', 'update', 'destroy'].include?(action_name) && (obj = klass.first))
|
864
875
|
obj
|
865
876
|
else
|
866
877
|
# %%% If there is a HMT that refers to some ___id then try to identify an appropriate filter
|
@@ -933,8 +944,13 @@ if ActiveSupport::Dependencies.respond_to?(:autoload_module!) # %%% Only works w
|
|
933
944
|
autoloaded_constants << qualified_name unless autoloaded_constants.include?(qualified_name)
|
934
945
|
klass
|
935
946
|
elsif (base_class = ::Brick.config.sti_namespace_prefixes&.fetch("::#{const_name}", nil)&.constantize)
|
936
|
-
|
937
|
-
|
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
|
938
954
|
else
|
939
955
|
_brick_autoload_module!(*args)
|
940
956
|
end
|
@@ -1507,9 +1523,10 @@ class Object
|
|
1507
1523
|
ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
|
1508
1524
|
order_by, _ = model._brick_calculate_ordering(ordering, true) # Don't do the txt part
|
1509
1525
|
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
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)
|
1513
1530
|
# %%% Add custom HM count columns
|
1514
1531
|
# %%% What happens when the PK is composite?
|
1515
1532
|
counts = model._br_hm_counts.each_with_object([]) do |v, s|
|
@@ -1521,7 +1538,8 @@ class Object
|
|
1521
1538
|
"b_r_#{v.first}.c_t_ AS \"b_r_#{v.first}_ct\""
|
1522
1539
|
end
|
1523
1540
|
end
|
1524
|
-
|
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)
|
1525
1543
|
if namespace && (idx = lookup_context.prefixes.index(table_name))
|
1526
1544
|
lookup_context.prefixes[idx] = "#{namespace.name.underscore}/#{lookup_context.prefixes[idx]}"
|
1527
1545
|
end
|
@@ -1633,7 +1651,11 @@ class Object
|
|
1633
1651
|
code << " end\n"
|
1634
1652
|
self.define_method :destroy do
|
1635
1653
|
::Brick.set_db_schema(params)
|
1636
|
-
|
1654
|
+
if (obj = find_obj).send(:destroy)
|
1655
|
+
redirect_to send("#{model._brick_index}_path".to_sym)
|
1656
|
+
else
|
1657
|
+
redirect_to send("#{model._brick_index(:singular)}_path".to_sym, obj)
|
1658
|
+
end
|
1637
1659
|
end
|
1638
1660
|
end
|
1639
1661
|
|
@@ -1732,10 +1754,16 @@ end
|
|
1732
1754
|
# Get info on all relations during first database connection
|
1733
1755
|
# ==========================================================
|
1734
1756
|
|
1735
|
-
|
1757
|
+
if ActiveRecord.const_defined?('ConnectionHandling')
|
1758
|
+
ActiveRecord::ConnectionHandling
|
1759
|
+
else
|
1760
|
+
ActiveRecord::ConnectionAdapters::ConnectionHandler
|
1761
|
+
end.class_exec do
|
1736
1762
|
alias _brick_establish_connection establish_connection
|
1737
1763
|
def establish_connection(*args)
|
1738
1764
|
conn = _brick_establish_connection(*args)
|
1765
|
+
return conn unless ::Brick.config.mode == :on
|
1766
|
+
|
1739
1767
|
begin
|
1740
1768
|
# Overwrite SQLite's #begin_db_transaction so it opens in IMMEDIATE mode instead of
|
1741
1769
|
# the default DEFERRED mode.
|
@@ -1866,7 +1894,7 @@ module ActiveRecord::ConnectionHandling
|
|
1866
1894
|
case ActiveRecord::Base.connection.adapter_name
|
1867
1895
|
when 'PostgreSQL', 'SQLite' # These bring back a hash for each row because the query uses column aliases
|
1868
1896
|
# schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
1869
|
-
|
1897
|
+
retrieve_schema_and_tables(sql, is_postgres, is_mssql, schema).each do |r|
|
1870
1898
|
# If Apartment gem lists the table as being associated with a non-tenanted model then use whatever it thinks
|
1871
1899
|
# is the default schema, usually 'public'.
|
1872
1900
|
schema_name = if ::Brick.config.schema_behavior[:multitenant]
|
@@ -1915,7 +1943,7 @@ WHERE c.owner IN (#{::Brick.db_schemas.keys.map { |s| "'#{s}'" }.join(', ')})
|
|
1915
1943
|
ORDER BY 1, 2, c.internal_column_id, acc.position"
|
1916
1944
|
ActiveRecord::Base.execute_sql(sql, *ar_tables)
|
1917
1945
|
else
|
1918
|
-
|
1946
|
+
retrieve_schema_and_tables(sql)
|
1919
1947
|
end
|
1920
1948
|
|
1921
1949
|
schema_and_tables.each do |r|
|
@@ -2016,6 +2044,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
|
|
2016
2044
|
end
|
2017
2045
|
::Brick.is_oracle = true if ActiveRecord::Base.connection.adapter_name == 'OracleEnhanced'
|
2018
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'
|
2019
2048
|
fk_references&.each do |fk|
|
2020
2049
|
fk = fk.values unless fk.is_a?(Array)
|
2021
2050
|
# Multitenancy makes things a little more general overall, except for non-tenanted tables
|
@@ -2113,7 +2142,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
|
|
2113
2142
|
else
|
2114
2143
|
'schema_migrations'
|
2115
2144
|
end
|
2116
|
-
ar_imtn = ActiveRecord.version >= ::Gem::Version.new('5.0') ? ActiveRecord::Base.internal_metadata_table_name : ''
|
2145
|
+
ar_imtn = ActiveRecord.version >= ::Gem::Version.new('5.0') ? ActiveRecord::Base.internal_metadata_table_name : 'ar_internal_metadata'
|
2117
2146
|
[ar_smtn, ar_imtn]
|
2118
2147
|
end
|
2119
2148
|
|
@@ -8,10 +8,16 @@ module Brick
|
|
8
8
|
# `brick_enabled_for_controller`.
|
9
9
|
module Controller
|
10
10
|
def self.included(controller)
|
11
|
-
controller.before_action
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
if controller.respond_to?(:before_action)
|
12
|
+
controller.before_action(
|
13
|
+
:set_brick_enabled_for_controller,
|
14
|
+
:set_brick_controller_info
|
15
|
+
)
|
16
|
+
else
|
17
|
+
controller.before_filter(
|
18
|
+
:set_brick_enabled_for_controller,
|
19
|
+
:set_brick_controller_info
|
20
|
+
)
|
15
21
|
end
|
16
22
|
|
17
23
|
protected
|
@@ -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
|
@@ -181,10 +187,15 @@ module Brick
|
|
181
187
|
end
|
182
188
|
end
|
183
189
|
|
184
|
-
|
190
|
+
apartment_default_schema = ::Brick.apartment_multitenant && Apartment.default_schema
|
191
|
+
schema_options = if ::Brick.apartment_multitenant &&
|
192
|
+
(cur_schema = Apartment::Tenant.current) != apartment_default_schema
|
193
|
+
"<option selected value=\"#{cur_schema}\">#{cur_schema}</option>"
|
194
|
+
else
|
195
|
+
::Brick.db_schemas.keys.each_with_object(+'') { |v, s| s << "<option value=\"#{v}\">#{v}</option>" }
|
196
|
+
end.html_safe
|
185
197
|
# %%% If we are not auto-creating controllers (or routes) then omit by default, and if enabled anyway, such as in a development
|
186
198
|
# environment or whatever, then get either the controllers or routes list instead
|
187
|
-
apartment_default_schema = ::Brick.apartment_multitenant && Apartment.default_schema
|
188
199
|
prefix = "#{::Brick.config.path_prefix}/" if ::Brick.config.path_prefix
|
189
200
|
table_options = (::Brick.relations.keys - ::Brick.config.exclude_tables).each_with_object({}) do |tbl, s|
|
190
201
|
binding.pry if tbl.is_a?(Symbol)
|
@@ -329,6 +340,10 @@ a.big-arrow {
|
|
329
340
|
color: red;
|
330
341
|
white-space: nowrap;
|
331
342
|
}
|
343
|
+
.danger {
|
344
|
+
background-color: red;
|
345
|
+
color: white;
|
346
|
+
}
|
332
347
|
|
333
348
|
#revertTemplate {
|
334
349
|
display: none;
|
@@ -446,7 +461,7 @@ var #{table_name}HtColumns;
|
|
446
461
|
// This PageTransitionEvent fires when the page first loads, as well as after any other history
|
447
462
|
// transition such as when using the browser's Back and Forward buttons.
|
448
463
|
window.addEventListener(\"pageshow\", function() {
|
449
|
-
if (schemaSelect) { // First drop-down is only present if multitenant
|
464
|
+
if (schemaSelect && schemaSelect.options.length > 1) { // First drop-down is only present if multitenant
|
450
465
|
brickSchema = changeout(location.href, \"_brick_schema\");
|
451
466
|
if (brickSchema) {
|
452
467
|
[... document.getElementsByTagName(\"A\")].forEach(function (a) { a.href = changeout(a.href, \"_brick_schema\", brickSchema); });
|
@@ -910,12 +925,19 @@ erDiagram
|
|
910
925
|
%><%= link_to(\"#\{bt_class} ##\{poly_id}\", send(\"#\{base_class_underscored}_path\".to_sym, poly_id)) if poly_id %><%
|
911
926
|
else
|
912
927
|
# binding.pry if @_brick_bt_descrip[bt.first][bt[1].first.first].nil?
|
913
|
-
|
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(
|
914
936
|
# 0..62 because Postgres column names are limited to 63 characters
|
915
|
-
#{obj_name},
|
937
|
+
#{obj_name}, descrips[0..-2].map { |id| #{obj_name}.send(id.last[0..62]) }, bt_id_col
|
916
938
|
)
|
917
939
|
bt_txt ||= \"<span class=\\\"orphan\\\"><< Orphaned ID: #\{val} >></span>\".html_safe if val
|
918
|
-
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 } %>
|
919
941
|
<%= bt_id&.first ? link_to(bt_txt, send(\"#\{bt_class.base_class._brick_index(:singular)}_path\".to_sym, bt_id)) : bt_txt %>
|
920
942
|
<% end
|
921
943
|
elsif (hms_col = hms_cols[col_name])
|
@@ -1163,6 +1185,7 @@ end
|
|
1163
1185
|
<% end %>
|
1164
1186
|
|
1165
1187
|
#{unless args.first == 'new'
|
1188
|
+
confirm_are_you_sure = ActionView.version < ::Gem::Version.new('7.0') ? "data: { confirm: 'Are you sure?' }" : "form: { data: { turbo_confirm: 'Are you sure?' } }"
|
1166
1189
|
hms_headers.each_with_object(+'') do |hm, s|
|
1167
1190
|
# %%% Would be able to remove this when multiple foreign keys to same destination becomes bulletproof
|
1168
1191
|
next if hm.first.options[:through] && !hm.first.through_reflection
|
@@ -1173,7 +1196,7 @@ end
|
|
1173
1196
|
s << "<table id=\"#{hm_name}\" class=\"shadow\">
|
1174
1197
|
<tr><th>#{hm[3]}</th></tr>
|
1175
1198
|
<% collection = @#{obj_name}.#{hm_name}
|
1176
|
-
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
|
1177
1200
|
if collection.empty? %>
|
1178
1201
|
<tr><td>(none)</td></tr>
|
1179
1202
|
<% else %>
|
@@ -1185,7 +1208,8 @@ end
|
|
1185
1208
|
else
|
1186
1209
|
s
|
1187
1210
|
end
|
1188
|
-
end
|
1211
|
+
end +
|
1212
|
+
"<%= button_to(\"Delete #\{@#{obj_name}.brick_descrip}\", send(\"#\{#{model_name}._brick_index(:singular)}_path\".to_sym, @#{obj_name}), { method: 'delete', class: 'danger', #{confirm_are_you_sure} }) %>"
|
1189
1213
|
end}
|
1190
1214
|
<% end %>
|
1191
1215
|
#{script}"
|
@@ -1193,7 +1217,7 @@ end}
|
|
1193
1217
|
end
|
1194
1218
|
inline << "
|
1195
1219
|
<% if is_includes_dates %>
|
1196
|
-
<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
|
1220
|
+
<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
|
1197
1221
|
<style>
|
1198
1222
|
.flatpickr-calendar {
|
1199
1223
|
background: #A0FFA0;
|
@@ -1207,6 +1231,11 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
|
|
1207
1231
|
</script>
|
1208
1232
|
<% end %>
|
1209
1233
|
|
1234
|
+
<% if false # is_includes_dropdowns %>
|
1235
|
+
<script src=\"https://cdnjs.cloudflare.com/ajax/libs/slim-select/1.27.1/slimselect.min.js\"></script>
|
1236
|
+
<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdnjs.cloudflare.com/ajax/libs/slim-select/1.27.1/slimselect.min.css\">
|
1237
|
+
<% end %>
|
1238
|
+
|
1210
1239
|
<% if true # @_brick_erd
|
1211
1240
|
%>
|
1212
1241
|
<script>
|
data/lib/brick/util.rb
CHANGED
@@ -84,6 +84,7 @@ module Brick
|
|
84
84
|
|
85
85
|
def self._custom_require_dir
|
86
86
|
unless (custom_require_dir = ::Brick::Util.instance_variable_get(:@_custom_require_dir))
|
87
|
+
require 'tmpdir'
|
87
88
|
::Brick::Util.instance_variable_set(:@_custom_require_dir, (custom_require_dir = Dir.mktmpdir))
|
88
89
|
# So normal Ruby require will now pick this one up
|
89
90
|
$LOAD_PATH.unshift(custom_require_dir)
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -26,27 +26,38 @@ end
|
|
26
26
|
require 'brick/util'
|
27
27
|
|
28
28
|
# Allow ActiveRecord < 3.2 to work with Ruby 2.7 and later
|
29
|
-
if (ruby_version = ::Gem::Version.new(RUBY_VERSION)) >= ::Gem::Version.new('2.7')
|
30
|
-
|
31
|
-
|
32
|
-
::Brick::Util._patch_require(
|
33
|
-
'active_support/values/time_zone.rb', '/activesupport',
|
34
|
-
[' def parse(str, now=now)',
|
35
|
-
' def parse(str, now=now())']
|
36
|
-
)
|
37
|
-
# Remove circular reference for "reflection" for ActiveRecord 3.1
|
38
|
-
if ActiveRecord.version >= ::Gem::Version.new('3.1')
|
29
|
+
if (ruby_version = ::Gem::Version.new(RUBY_VERSION)) >= ::Gem::Version.new('2.7')
|
30
|
+
if ActiveRecord.version < ::Gem::Version.new('3.2')
|
31
|
+
# Remove circular reference for "now"
|
39
32
|
::Brick::Util._patch_require(
|
40
|
-
'
|
41
|
-
['
|
42
|
-
|
43
|
-
:HasManyAssociation # Make sure the path for this guy is available to be autoloaded
|
33
|
+
'active_support/values/time_zone.rb', '/activesupport',
|
34
|
+
[' def parse(str, now=now)',
|
35
|
+
' def parse(str, now=now())']
|
44
36
|
)
|
37
|
+
# Remove circular reference for "reflection" for ActiveRecord 3.1
|
38
|
+
if ActiveRecord.version >= ::Gem::Version.new('3.1')
|
39
|
+
::Brick::Util._patch_require(
|
40
|
+
'active_record/associations/has_many_association.rb', '/activerecord',
|
41
|
+
['reflection = reflection)',
|
42
|
+
'reflection = reflection())'],
|
43
|
+
:HasManyAssociation # Make sure the path for this guy is available to be autoloaded
|
44
|
+
)
|
45
|
+
end
|
45
46
|
end
|
47
|
+
|
48
|
+
# # Create unfrozen route path in Rails 3.2
|
49
|
+
# if ActiveRecord.version < ::Gem::Version.new('4')
|
50
|
+
# ::Brick::Util._patch_require(
|
51
|
+
# 'action_dispatch/routing/route_set.rb', '/actiondispatch',
|
52
|
+
# ["script_name.chomp('/')).to_s",
|
53
|
+
# "script_name.chomp('/')).to_s.dup"],
|
54
|
+
# :RouteSet # Make sure the path for this guy is available to be autoloaded
|
55
|
+
# )
|
56
|
+
# end
|
46
57
|
end
|
47
58
|
|
48
59
|
# Add left_outer_join! to Associations::JoinDependency and Relation::QueryMethods
|
49
|
-
if ActiveRecord.version < ::Gem::Version.new('5')
|
60
|
+
if ActiveRecord.version >= ::Gem::Version.new('4') && ActiveRecord.version < ::Gem::Version.new('5')
|
50
61
|
::Brick::Util._patch_require(
|
51
62
|
'active_record/associations/join_dependency.rb', '/activerecord', # /associations
|
52
63
|
["def join_constraints(outer_joins)
|
@@ -126,7 +137,7 @@ module Brick
|
|
126
137
|
|
127
138
|
def set_db_schema(params = nil)
|
128
139
|
schema = (params ? params['_brick_schema'] : ::Brick.default_schema)
|
129
|
-
if schema && ::Brick.db_schemas&.key?(schema)
|
140
|
+
chosen = if schema && ::Brick.db_schemas&.key?(schema)
|
130
141
|
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?;", schema)
|
131
142
|
schema
|
132
143
|
elsif ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
@@ -135,6 +146,7 @@ module Brick
|
|
135
146
|
# ::Brick.apartment_multitenant && tbl_parts.first == Apartment.default_schema
|
136
147
|
(orig_schema - ['pg_catalog']).first
|
137
148
|
end
|
149
|
+
chosen == ::Brick.default_schema ? nil : chosen
|
138
150
|
end
|
139
151
|
|
140
152
|
# All tables and views (what Postgres calls "relations" including column and foreign key info)
|
@@ -207,7 +219,7 @@ module Brick
|
|
207
219
|
skip_hms[through] = nil if hms[through] && model.is_brick?
|
208
220
|
# End up with a hash of HMT names pointing to join-table associations
|
209
221
|
model._br_associatives[hmt.first] = hms[through] # || hms["#{(opt = hmt.last.options)[:through].to_s.singularize}_#{opt[:source].to_s.pluralize}".to_sym]
|
210
|
-
elsif hmt.last.inverse_of.nil?
|
222
|
+
elsif hmt.last.inverse_of.nil? && ActiveRecord.version >= ::Gem::Version.new('4.2')
|
211
223
|
puts "SKIPPING #{hmt.last.name.inspect}"
|
212
224
|
# %%% If we don't do this then below associative.name will find that associative is nil
|
213
225
|
skip_hms[hmt.last.name] = nil
|
@@ -226,6 +238,11 @@ module Brick
|
|
226
238
|
true
|
227
239
|
end
|
228
240
|
|
241
|
+
# @api public
|
242
|
+
def mode=(setting)
|
243
|
+
Brick.config.mode = setting
|
244
|
+
end
|
245
|
+
|
229
246
|
# Any path prefixing to apply to all auto-generated Brick routes
|
230
247
|
# @api public
|
231
248
|
def path_prefix=(path)
|
@@ -433,7 +450,7 @@ module Brick
|
|
433
450
|
# This is attempted early if a brick initialiser file is found, and then again as a failsafe at the end of our engine's initialisation
|
434
451
|
# %%% Maybe look for differences the second time 'round and just add new stuff instead of entirely deferring
|
435
452
|
def load_additional_references
|
436
|
-
return if @_additional_references_loaded
|
453
|
+
return if @_additional_references_loaded || ::Brick.config.mode != :on
|
437
454
|
|
438
455
|
relations = ::Brick.relations
|
439
456
|
if (ars = ::Brick.config.additional_references) || ::Brick.config.polymorphics
|
@@ -524,7 +541,11 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
524
541
|
::Brick.is_eager_loading = true
|
525
542
|
if ::ActiveSupport.version < ::Gem::Version.new('6') ||
|
526
543
|
::Rails.configuration.instance_variable_get(:@autoloader) == :classic
|
527
|
-
::
|
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
|
528
549
|
else
|
529
550
|
Zeitwerk::Loader.eager_load_all
|
530
551
|
end
|
@@ -546,7 +567,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
546
567
|
|
547
568
|
module RouteSet
|
548
569
|
def finalize!
|
549
|
-
|
570
|
+
# %%% Was: ::Rails.application.routes.named_routes.route_defined?(:brick_status_path)
|
571
|
+
unless ::Rails.application.routes.named_routes.names.include?(:brick_status)
|
550
572
|
path_prefix = ::Brick.config.path_prefix
|
551
573
|
existing_controllers = routes.each_with_object({}) do |r, s|
|
552
574
|
c = r.defaults[:controller]
|
@@ -821,13 +843,21 @@ ActiveSupport.on_load(:active_record) do
|
|
821
843
|
end
|
822
844
|
end
|
823
845
|
|
824
|
-
# This only gets added for ActiveRecord < 3.2
|
825
846
|
module Reflection
|
847
|
+
# This only gets added for ActiveRecord < 3.2
|
826
848
|
unless AssociationReflection.instance_methods.include?(:foreign_key)
|
827
849
|
class AssociationReflection < MacroReflection
|
828
850
|
alias foreign_key association_foreign_key
|
829
851
|
end
|
830
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
|
831
861
|
end
|
832
862
|
|
833
863
|
# ActiveRecord 3.1 and 3.2 didn't try to bring in &block for the .extending() convenience thing
|
@@ -1006,6 +1036,7 @@ ActiveSupport.on_load(:active_record) do
|
|
1006
1036
|
delegate :left_outer_joins, to: :all
|
1007
1037
|
end
|
1008
1038
|
class Relation
|
1039
|
+
alias :model :klass unless respond_to?(:model) # To support AR < 4.2
|
1009
1040
|
unless MULTI_VALUE_METHODS.include?(:left_outer_joins)
|
1010
1041
|
_multi_value_methods = MULTI_VALUE_METHODS + [:left_outer_joins]
|
1011
1042
|
send(:remove_const, :MULTI_VALUE_METHODS)
|
@@ -136,10 +136,16 @@ module Brick
|
|
136
136
|
|
137
137
|
create_file(filename, "# frozen_string_literal: true
|
138
138
|
|
139
|
-
#
|
140
|
-
#
|
139
|
+
# Settings for the Brick gem
|
140
|
+
# (By default this auto-creates models, controllers, views, and routes on-the-fly.)
|
141
141
|
|
142
142
|
if Object.const_defined?('Brick')
|
143
|
+
# Mode -- generally :on or :off, or only in :development. Also available is :diag_env which enables only
|
144
|
+
# when the environment variable BRICK is set.
|
145
|
+
Brick.mode = :development
|
146
|
+
# Can be further overridden by placing this line in development.rb / test.rb / production.rb:
|
147
|
+
# # Brick.mode = :on # (or :off to entirely disable)
|
148
|
+
|
143
149
|
# # Custom path prefix to apply to all auto-generated Brick routes. Also causes auto-generated controllers
|
144
150
|
# # to be created inside a module with the same name.
|
145
151
|
# ::Brick.path_prefix = 'admin'
|
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
|