brick 1.0.137 → 1.0.139
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/brick/extensions.rb +52 -5
- data/lib/brick/frameworks/rails/engine.rb +15 -10
- data/lib/brick/frameworks/rails/form_builder.rb +1 -1
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +12 -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: e13ace06f3c894715f631be750cd0571b9ab1cfe44b15780e9278d7b6a1c88f3
|
4
|
+
data.tar.gz: fd0d89eb66a8878fc968e95e7a3c27f1fcf619a06c652c0c58c468d4cf66e451
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58665ea6c29d49542ae83096fa3ad5fa371ed0a12920f86492111319e3ab9a46c8c7d83ab9277377b6dabb51a75adf0a7cb32c4aa37234f54d796fe206563172
|
7
|
+
data.tar.gz: f5ee7ebdfa31f76133db652ff0beec175aa5eb319a7f1472da56f0e8e7c79aba12bceb9c26b73fc4c305e69143529416cb5d683660025d1b1e08aa72209a688b
|
data/lib/brick/extensions.rb
CHANGED
@@ -1042,7 +1042,7 @@ if ActiveSupport::Dependencies.respond_to?(:autoload_module!) # %%% Only works w
|
|
1042
1042
|
end
|
1043
1043
|
end
|
1044
1044
|
|
1045
|
-
|
1045
|
+
::Brick::ADD_CONST_MISSING = lambda do
|
1046
1046
|
alias _brick_const_missing const_missing
|
1047
1047
|
def const_missing(*args)
|
1048
1048
|
requested = args.first.to_s
|
@@ -1136,6 +1136,12 @@ Module.class_exec do
|
|
1136
1136
|
plural_class_name == 'BrickGem'
|
1137
1137
|
) ||
|
1138
1138
|
model = self.const_get(full_class_name)
|
1139
|
+
# In the very rare case that we've picked up a MODULE which has the same name as what would be the
|
1140
|
+
# resource's MODEL name, just build out an appropriate auto-model on-the-fly. (RailsDevs code has this in PayCustomer.)
|
1141
|
+
# %%% We don't yet display the code for this new model
|
1142
|
+
if model && !model.is_a?(Class)
|
1143
|
+
model, _code = Object.send(:build_model, relations, model.module_parent, model.module_parent.name, singular_class_name)
|
1144
|
+
end
|
1139
1145
|
# if it's a controller and no match or a model doesn't really use the same table name, eager load all models and try to find a model class of the right name.
|
1140
1146
|
Object.send(:build_controller, self, class_name, plural_class_name, model, relations)
|
1141
1147
|
end
|
@@ -1313,7 +1319,14 @@ class Object
|
|
1313
1319
|
if (base_model = ::Brick.sti_models[full_model_name]&.fetch(:base, nil) || ::Brick.existing_stis[full_model_name]&.constantize)
|
1314
1320
|
is_sti = true
|
1315
1321
|
else
|
1316
|
-
|
1322
|
+
# Class for auto-generated models to inherit from
|
1323
|
+
base_model = (::Brick.config.models_inherit_from ||= (app.config.brick.fetch(:models_inherit_from, nil) ||
|
1324
|
+
begin
|
1325
|
+
::ApplicationRecord
|
1326
|
+
rescue StandardError => ex
|
1327
|
+
::ActiveRecord::Base
|
1328
|
+
end))
|
1329
|
+
|
1317
1330
|
end
|
1318
1331
|
hmts = nil
|
1319
1332
|
code = +"class #{full_name} < #{base_model.name}\n"
|
@@ -1480,8 +1493,10 @@ class Object
|
|
1480
1493
|
assoc[:assoc_name]
|
1481
1494
|
end
|
1482
1495
|
options[:optional] = true if assoc.key?(:optional)
|
1483
|
-
if assoc.key?(:polymorphic)
|
1484
|
-
|
1496
|
+
if assoc.key?(:polymorphic) ||
|
1497
|
+
# If a polymorphic association is missing but could be established then go ahead and put it into place.
|
1498
|
+
relations[assoc[:inverse_table]][:class_name].constantize.reflect_on_all_associations.find { |inv_assoc| !inv_assoc.belongs_to? && inv_assoc.options[:as].to_s == assoc[:assoc_name] }
|
1499
|
+
assoc[:polymorphic] ||= (options[:polymorphic] = true)
|
1485
1500
|
else
|
1486
1501
|
need_class_name = singular_table_name.underscore != assoc_name
|
1487
1502
|
need_fk = "#{assoc_name}_id" != assoc[:fk]
|
@@ -1542,7 +1557,11 @@ class Object
|
|
1542
1557
|
assoc[:fk].to_sym
|
1543
1558
|
end
|
1544
1559
|
end
|
1545
|
-
|
1560
|
+
if inverse_assoc_name && (need_class_name || need_fk || need_inverse_of) &&
|
1561
|
+
(klass = options[:class_name]&.constantize) && (ian = inverse_assoc_name.tr('.', '_').to_sym) &&
|
1562
|
+
(klass.is_brick? || klass.reflect_on_association(ian))
|
1563
|
+
options[:inverse_of] = ian
|
1564
|
+
end
|
1546
1565
|
|
1547
1566
|
# Prepare a list of entries for "has_many :through"
|
1548
1567
|
if macro == :has_many
|
@@ -1585,14 +1604,38 @@ class Object
|
|
1585
1604
|
built_controller = Class.new(controller_base || ActionController::Base) do |new_controller_class|
|
1586
1605
|
(namespace || Object).const_set(class_name.to_sym, new_controller_class)
|
1587
1606
|
|
1607
|
+
# Add a hash for the inline style to the content-security-policy if one is present
|
1608
|
+
self.define_method(:add_csp_hash) do |style_value = nil|
|
1609
|
+
if (csp = request.content_security_policy)
|
1610
|
+
if (cspd = csp.directives.fetch('style-src'))
|
1611
|
+
if style_value
|
1612
|
+
if (nonce = ::ActionDispatch::ContentSecurityPolicy::Request::NONCE)
|
1613
|
+
request.env[nonce] = '' # Generally 'action_dispatch.content_security_policy_nonce'
|
1614
|
+
end
|
1615
|
+
# Keep only self, if present, and also add this value
|
1616
|
+
cspd.select! { |val| val == "'self'" }
|
1617
|
+
cspd << style_value
|
1618
|
+
else
|
1619
|
+
cspd << "'sha256-QHKxqKcUq7AER1QwEu5uQXRQwC8j4iTWkE8mpOmP7ms='"
|
1620
|
+
end
|
1621
|
+
cspd << 'https://cdn.jsdelivr.net'
|
1622
|
+
end
|
1623
|
+
if (cspd = csp.directives.fetch('script-src'))
|
1624
|
+
cspd << 'https://cdn.jsdelivr.net'
|
1625
|
+
end
|
1626
|
+
end
|
1627
|
+
end
|
1628
|
+
|
1588
1629
|
# Brick-specific pages
|
1589
1630
|
case plural_class_name
|
1590
1631
|
when 'BrickGem'
|
1591
1632
|
self.define_method :status do
|
1592
1633
|
instance_variable_set(:@resources, ::Brick.get_status_of_resources)
|
1634
|
+
add_csp_hash
|
1593
1635
|
end
|
1594
1636
|
self.define_method :orphans do
|
1595
1637
|
instance_variable_set(:@orphans, ::Brick.find_orphans(::Brick.set_db_schema(params).first))
|
1638
|
+
add_csp_hash
|
1596
1639
|
end
|
1597
1640
|
self.define_method :crosstab do
|
1598
1641
|
@relations = ::Brick.relations.each_with_object({}) do |r, s|
|
@@ -1875,6 +1918,7 @@ class Object
|
|
1875
1918
|
@_brick_hm_counts = real_model._br_hm_counts
|
1876
1919
|
@_brick_join_array = join_array
|
1877
1920
|
@_brick_erd = params['_brick_erd']&.to_i
|
1921
|
+
add_csp_hash
|
1878
1922
|
end
|
1879
1923
|
end
|
1880
1924
|
|
@@ -1905,6 +1949,7 @@ class Object
|
|
1905
1949
|
self.define_method :show do
|
1906
1950
|
_schema, @_is_show_schema_list = ::Brick.set_db_schema(params)
|
1907
1951
|
instance_variable_set("@#{singular_table_name}".to_sym, find_obj)
|
1952
|
+
add_csp_hash("'unsafe-inline'")
|
1908
1953
|
end
|
1909
1954
|
end
|
1910
1955
|
|
@@ -1922,6 +1967,7 @@ class Object
|
|
1922
1967
|
end if Object.const_defined?('ActiveStorage')
|
1923
1968
|
end
|
1924
1969
|
instance_variable_set("@#{singular_table_name}".to_sym, new_obj)
|
1970
|
+
add_csp_hash
|
1925
1971
|
end
|
1926
1972
|
|
1927
1973
|
params_name_sym = (params_name = "#{singular_table_name}_params").to_sym
|
@@ -1962,6 +2008,7 @@ class Object
|
|
1962
2008
|
self.define_method :edit do
|
1963
2009
|
_schema, @_is_show_schema_list = ::Brick.set_db_schema(params)
|
1964
2010
|
instance_variable_set("@#{singular_table_name}".to_sym, find_obj)
|
2011
|
+
add_csp_hash
|
1965
2012
|
end
|
1966
2013
|
|
1967
2014
|
code << " def update\n"
|
@@ -209,6 +209,7 @@ function linkSchemas() {
|
|
209
209
|
# paths['app/models'] << 'lib/brick/frameworks/active_record/models'
|
210
210
|
config.brick = ActiveSupport::OrderedOptions.new
|
211
211
|
ActiveSupport.on_load(:before_initialize) do |app|
|
212
|
+
::Rails.application.reloader.to_prepare { Module.class_exec &::Brick::ADD_CONST_MISSING }
|
212
213
|
is_development = (ENV['RAILS_ENV'] || ENV['RACK_ENV']) == 'development'
|
213
214
|
::Brick.enable_models = app.config.brick.fetch(:enable_models, true)
|
214
215
|
::Brick.enable_controllers = app.config.brick.fetch(:enable_controllers, is_development)
|
@@ -736,7 +737,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
736
737
|
end
|
737
738
|
when 'show', 'new', 'update'
|
738
739
|
hm_stuff << if hm_fk_name
|
739
|
-
if hm_assoc.klass.column_names.include?(hm_fk_name) ||
|
740
|
+
if hm_assoc.klass.column_names.include?(hm_fk_name.to_s) ||
|
740
741
|
(hm_fk_name.is_a?(String) && hm_fk_name.include?('.')) # HMT? (Could do a better check for this)
|
741
742
|
predicates = path_keys(hm_assoc, hm_fk_name, pk).map do |k, v|
|
742
743
|
if v == '[sti_type]'
|
@@ -798,6 +799,10 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
798
799
|
left: 0;
|
799
800
|
}
|
800
801
|
|
802
|
+
.flashNotice {
|
803
|
+
color: green;
|
804
|
+
}
|
805
|
+
|
801
806
|
h1, h3 {
|
802
807
|
margin-bottom: 0;
|
803
808
|
}
|
@@ -1313,7 +1318,7 @@ erDiagram
|
|
1313
1318
|
</head>
|
1314
1319
|
<body>
|
1315
1320
|
<div id=\"titleBox\"><div id=\"titleSticky\">
|
1316
|
-
<p
|
1321
|
+
<p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
|
1317
1322
|
#{schema_options}" if schema_options}
|
1318
1323
|
<select id=\"tbl\">#{table_options}</select>
|
1319
1324
|
<table id=\"resourceName\"><tr>
|
@@ -1453,7 +1458,7 @@ end
|
|
1453
1458
|
# Must load all models, and then find what table names are represented
|
1454
1459
|
# Easily could be multiple files involved (STI for instance)
|
1455
1460
|
+"#{css}
|
1456
|
-
<p
|
1461
|
+
<p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
|
1457
1462
|
#{schema_options}" if schema_options}
|
1458
1463
|
<select id=\"tbl\">#{table_options}</select>
|
1459
1464
|
<h1>Status</h1>
|
@@ -1476,7 +1481,7 @@ end
|
|
1476
1481
|
kls = Object.const_get(::Brick.relations.fetch(r[0], nil)&.fetch(:class_name, nil))
|
1477
1482
|
rescue
|
1478
1483
|
end
|
1479
|
-
kls ? link_to(r[0], send(\"#\{kls._brick_index}_path\".to_sym)) : r[0] %></td>
|
1484
|
+
kls.is_a?(Class) ? link_to(r[0], send(\"#\{kls._brick_index}_path\".to_sym)) : r[0] %></td>
|
1480
1485
|
<td<%= if r[1]
|
1481
1486
|
' class=\"orphan\"' unless ::Brick.relations.key?(r[1])
|
1482
1487
|
else
|
@@ -1503,7 +1508,7 @@ end
|
|
1503
1508
|
when 'orphans'
|
1504
1509
|
if is_orphans
|
1505
1510
|
+"#{css}
|
1506
|
-
<p
|
1511
|
+
<p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
|
1507
1512
|
#{schema_options}" if schema_options}
|
1508
1513
|
<select id=\"tbl\">#{table_options}</select>
|
1509
1514
|
<h1>Orphans<%= \" for #\{}\" if false %></h1>
|
@@ -1550,7 +1555,7 @@ end
|
|
1550
1555
|
c23.141-70.188,89.141-120.906,167.063-120.906c97.25,0,176,78.813,176,176C511.828,227.078,404.391,119.641,271.844,119.641z\" />
|
1551
1556
|
</svg>
|
1552
1557
|
|
1553
|
-
<p
|
1558
|
+
<p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
|
1554
1559
|
#{schema_options}" if schema_options}
|
1555
1560
|
<select id=\"tbl\">#{table_options}</select>
|
1556
1561
|
<table id=\"resourceName\"><td><h1><%= page_title %></h1></td>
|
@@ -1716,11 +1721,11 @@ end
|
|
1716
1721
|
if collection2.empty? %>
|
1717
1722
|
<tr><td>(none)</td></tr>
|
1718
1723
|
<% else
|
1719
|
-
collection2.each do
|
1720
|
-
<tr><td><%= br_descrip = #{hm_singular_name}.brick_descrip(
|
1721
|
-
descrip_cols&.first&.map { |col| #{hm_singular_name}.send(col.last) }
|
1724
|
+
collection2.each do |br_#{hm_singular_name}| %>
|
1725
|
+
<tr><td><%= br_descrip = br_#{hm_singular_name}.brick_descrip(
|
1726
|
+
descrip_cols&.first&.map { |col| br_#{hm_singular_name}.send(col.last) }
|
1722
1727
|
)
|
1723
|
-
link_to(br_descrip, #{hm.first.klass._brick_index(:singular)}_path(slashify(#{obj_pk}))) %></td></tr>
|
1728
|
+
link_to(br_descrip, #{hm.first.klass._brick_index(:singular)}_path(slashify(br_#{obj_pk}))) %></td></tr>
|
1724
1729
|
<% end %>
|
1725
1730
|
<% end %>
|
1726
1731
|
</table>"
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -254,7 +254,7 @@ module Brick
|
|
254
254
|
next
|
255
255
|
end
|
256
256
|
else
|
257
|
-
if !a.options.key?(:as) && a.klass.column_names.exclude?(a.foreign_key)
|
257
|
+
if !a.options.key?(:as) && a.klass.column_names.exclude?(a.foreign_key.to_s)
|
258
258
|
options = ", #{a.options.map { |k, v| "#{k.inspect} => #{v.inspect}" }.join(', ')}" if a.options.present?
|
259
259
|
puts "WARNING: Model #{model.name} has this association:
|
260
260
|
has_many :#{a.name}#{options}
|
@@ -922,11 +922,19 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
922
922
|
end
|
923
923
|
end
|
924
924
|
|
925
|
-
if ::Brick.config.add_status &&
|
926
|
-
|
925
|
+
if ::Brick.config.add_status && (status_as = "#{controller_prefix.tr('/', '_')}brick_status".to_sym)
|
926
|
+
(
|
927
|
+
!(status_route = instance_variable_get(:@set).named_routes.find { |route| route.first == status_as }&.last) ||
|
928
|
+
!status_route.ast.to_s.include?("/#{controller_prefix}brick_status/")
|
929
|
+
)
|
930
|
+
get("/#{controller_prefix}brick_status", to: 'brick_gem#status', as: status_as.to_s)
|
927
931
|
end
|
928
932
|
|
929
|
-
if ::Brick.config.add_orphans &&
|
933
|
+
if ::Brick.config.add_orphans && (orphans_as = "#{controller_prefix.tr('/', '_')}brick_orphans".to_sym)
|
934
|
+
(
|
935
|
+
!(orphans_route = instance_variable_get(:@set).named_routes.find { |route| route.first == orphans_as }&.last) ||
|
936
|
+
!orphans_route.ast.to_s.include?("/#{controller_prefix}brick_orphans/")
|
937
|
+
)
|
930
938
|
get("/#{controller_prefix}brick_orphans", to: 'brick_gem#orphans', as: 'brick_orphans')
|
931
939
|
end
|
932
940
|
|
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.139
|
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-05-
|
11
|
+
date: 2023-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|