brick 1.0.86 → 1.0.88
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 +20 -31
- data/lib/brick/frameworks/rails/engine.rb +20 -4
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +35 -0
- 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: 9e346878b216d9e54ee0ca15be13ec0c2348f8cdf81d14a1eb4bc24ccb07aadb
|
4
|
+
data.tar.gz: 92b54e7227fad318508104690158b5c756cc37171e7eeaaaba41d7da97c5518f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8797a5e8924e3a89fd958f05d1bd442cf457428257cd697e438e1e6fe93427bc035177cea79fad47c6484427b30d2e3dc778f7a2166bc0fe27d383ce8659c1c
|
7
|
+
data.tar.gz: 0bd6d3cc1ad92a1ec897b1524fde2e3f6849c783705312908d206460f9060677c93c295f3f3b89ddd514e2b3d5faeae4900472b0f4a1419e57e91046a190b3f7
|
data/lib/brick/extensions.rb
CHANGED
@@ -211,7 +211,14 @@ module ActiveRecord
|
|
211
211
|
this_obj = obj
|
212
212
|
bracket_name.split('.').each do |part|
|
213
213
|
obj_name += ".#{part}"
|
214
|
-
this_obj =
|
214
|
+
this_obj = begin
|
215
|
+
caches.fetch(obj_name) { caches[obj_name] = this_obj&.send(part.to_sym) }
|
216
|
+
rescue
|
217
|
+
clsnm = part.camelize
|
218
|
+
if (possible = this_obj.class.reflect_on_all_associations.select { |a| a.class_name == clsnm || a.klass.base_class.name == clsnm }.first)
|
219
|
+
caches[obj_name] = this_obj&.send(possible.name)
|
220
|
+
end
|
221
|
+
end
|
215
222
|
break if this_obj.nil?
|
216
223
|
end
|
217
224
|
if this_obj.is_a?(ActiveRecord::Base) && (obj_descrip = this_obj.class.brick_descrip(this_obj))
|
@@ -834,34 +841,9 @@ if Object.const_defined?('ActionView')
|
|
834
841
|
args.first) ||
|
835
842
|
@_brick_model
|
836
843
|
# If not provided, do a best-effort to automatically determine the resource class or object
|
837
|
-
sti_type = nil
|
838
844
|
filter_parts = []
|
839
845
|
klass_or_obj ||= begin
|
840
|
-
|
841
|
-
v_parts = v.first.split('.')
|
842
|
-
v_parts.shift if v_parts.first == 'public'
|
843
|
-
s[v_parts.join('.')] = v.first
|
844
|
-
end
|
845
|
-
c_path_parts = controller_path.split('/')
|
846
|
-
klass = nil
|
847
|
-
while c_path_parts.present?
|
848
|
-
possible_c_path = c_path_parts.join('.')
|
849
|
-
possible_c_path_singular = c_path_parts[0..-2] + [c_path_parts.last.singularize]
|
850
|
-
possible_sti = possible_c_path_singular.join('/').camelize
|
851
|
-
break if (
|
852
|
-
res_name = res_names[possible_c_path] ||
|
853
|
-
((klass = Brick.config.sti_namespace_prefixes.key?("::#{possible_sti}") && possible_sti.constantize) &&
|
854
|
-
(sti_type = possible_sti)) ||
|
855
|
-
# %%% Used to have the more flexible: (DidYouMean::SpellChecker.new(dictionary: res_names.keys).correct(possible_c_path)).first
|
856
|
-
res_names[possible_c_path] || res_names[possible_c_path_singular.join('.')]
|
857
|
-
) &&
|
858
|
-
(
|
859
|
-
klass ||
|
860
|
-
((rel = ::Brick.relations.fetch(res_name, nil)) &&
|
861
|
-
(klass ||= rel[:class_name]&.constantize))
|
862
|
-
)
|
863
|
-
c_path_parts.shift
|
864
|
-
end
|
846
|
+
klass, sti_type = ::Brick.ctrl_to_klass(controller_path)
|
865
847
|
if klass
|
866
848
|
type_col = klass.inheritance_column # Usually 'type'
|
867
849
|
filter_parts << "#{type_col}=#{sti_type}" if sti_type && klass.column_names.include?(type_col)
|
@@ -1797,12 +1779,18 @@ end.class_exec do
|
|
1797
1779
|
# This is done separately so that during testing it can be called right after a migration
|
1798
1780
|
# in order to make sure everything is good.
|
1799
1781
|
def _brick_reflect_tables
|
1782
|
+
return unless ::Brick.config.mode == :on
|
1783
|
+
|
1800
1784
|
# return if ActiveRecord::Base.connection.current_database == 'postgres'
|
1801
1785
|
|
1802
1786
|
initializer_loaded = false
|
1803
1787
|
orig_schema = nil
|
1804
1788
|
if (relations = ::Brick.relations).empty?
|
1805
|
-
#
|
1789
|
+
# Very first thing, load inflections since we'll be using .pluralize and .singularize on table and model names
|
1790
|
+
if File.exist?(inflections = ::Rails.root.join('config/initializers/inflections.rb'))
|
1791
|
+
load inflections
|
1792
|
+
end
|
1793
|
+
# Now the Brick initializer since there may be important schema things configured
|
1806
1794
|
if File.exist?(brick_initializer = ::Rails.root.join('config/initializers/brick.rb'))
|
1807
1795
|
initializer_loaded = load brick_initializer
|
1808
1796
|
end
|
@@ -1870,8 +1858,9 @@ end.class_exec do
|
|
1870
1858
|
::Brick.db_schemas ||= {}
|
1871
1859
|
|
1872
1860
|
if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
1873
|
-
if (
|
1874
|
-
|
1861
|
+
if (possible_schemas = ::Brick.config.schema_behavior&.[](:multitenant)&.[](:schema_to_analyse))
|
1862
|
+
possible_schemas = [possible_schemas] unless possible_schemas.is_a?(Array)
|
1863
|
+
if (possible_schema = possible_schemas.find { |ps| ::Brick.db_schemas.key?(ps) })
|
1875
1864
|
::Brick.default_schema = schema = possible_schema
|
1876
1865
|
orig_schema = ActiveRecord::Base.execute_sql('SELECT current_schemas(true)').first['current_schemas'][1..-2].split(',')
|
1877
1866
|
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?", schema)
|
@@ -1881,7 +1870,7 @@ end.class_exec do
|
|
1881
1870
|
orig_schema = ActiveRecord::Base.execute_sql('SELECT current_schemas(true)').first['current_schemas'][1..-2].split(',')
|
1882
1871
|
ActiveRecord::Base.execute_sql("SET SEARCH_PATH = ?", schema)
|
1883
1872
|
else
|
1884
|
-
puts "*** In the brick.rb initializer the line \"::Brick.schema_behavior = ...\" refers to
|
1873
|
+
puts "*** In the brick.rb initializer the line \"::Brick.schema_behavior = ...\" refers to schema(s) called #{possible_schemas.map { |s| "\"#{s}\"" }.join(', ')}. No mentioned schema exists. ***"
|
1885
1874
|
end
|
1886
1875
|
end
|
1887
1876
|
end
|
@@ -502,6 +502,16 @@ window.addEventListener(\"pageshow\", function() {
|
|
502
502
|
}
|
503
503
|
});
|
504
504
|
|
505
|
+
// Add \"Are you sure?\" behaviour to any data-confirm buttons out there
|
506
|
+
document.querySelectorAll(\"input[type=submit][data-confirm]\").forEach(function (btn) {
|
507
|
+
btn.addEventListener(\"click\", function (evt) {
|
508
|
+
if (!confirm(this.getAttribute(\"data-confirm\"))) {
|
509
|
+
evt.preventDefault();
|
510
|
+
return false;
|
511
|
+
}
|
512
|
+
});
|
513
|
+
});
|
514
|
+
|
505
515
|
function changeout(href, param, value, trimAfter) {
|
506
516
|
var hrefParts = href.split(\"?\");
|
507
517
|
var params = hrefParts.length > 1 ? hrefParts[1].split(\"&\") : [];
|
@@ -556,13 +566,19 @@ if (grid) {
|
|
556
566
|
if (lastHighCell) lastHighCell.classList.remove(\"highlight\");
|
557
567
|
}
|
558
568
|
var lastHighHeader = gridHighHeader;
|
559
|
-
gridHighHeader = headerCols[gridHighCell.cellIndex]
|
560
|
-
if (lastHighHeader !== gridHighHeader) {
|
569
|
+
if ((gridHighHeader = headerCols[gridHighCell.cellIndex]) && lastHighHeader !== gridHighHeader) {
|
561
570
|
if (gridHighHeader) gridHighHeader.classList.add(\"highlight\");
|
562
571
|
if (lastHighHeader) lastHighHeader.classList.remove(\"highlight\");
|
563
572
|
}
|
564
573
|
}
|
565
574
|
}
|
575
|
+
// // LESS TOUCHY NAVIGATION BACK OR FORWARD IN HISTORY WHEN USING MOUSE WHEEL
|
576
|
+
// grid.addEventListener(\"wheel\", function (evt) {
|
577
|
+
// grid.scrollLeft += evt.deltaX;
|
578
|
+
// document.body.scrollTop += (evt.deltaY * 0.6);
|
579
|
+
// evt.preventDefault();
|
580
|
+
// return false;
|
581
|
+
// });
|
566
582
|
}
|
567
583
|
function setHeaderSizes() {
|
568
584
|
// console.log(\"start\");
|
@@ -1185,7 +1201,7 @@ end
|
|
1185
1201
|
<% end %>
|
1186
1202
|
|
1187
1203
|
#{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?' } }"
|
1204
|
+
confirm_are_you_sure = ActionView.version < ::Gem::Version.new('7.0') ? "data: { confirm: 'Delete #{model_name} -- Are you sure?' }" : "form: { data: { turbo_confirm: 'Delete #{model_name} -- Are you sure?' } }"
|
1189
1205
|
hms_headers.each_with_object(+'') do |hm, s|
|
1190
1206
|
# %%% Would be able to remove this when multiple foreign keys to same destination becomes bulletproof
|
1191
1207
|
next if hm.first.options[:through] && !hm.first.through_reflection
|
@@ -1250,7 +1266,7 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
|
|
1250
1266
|
if (mermaidCode) return; // Cut it short if we've already rendered the diagram
|
1251
1267
|
|
1252
1268
|
mermaidCode = document.createElement(\"SCRIPT\");
|
1253
|
-
mermaidCode.setAttribute(\"src\", \"https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js\");
|
1269
|
+
mermaidCode.setAttribute(\"src\", \"https://cdn.jsdelivr.net/npm/mermaid@9.1.7/dist/mermaid.min.js\");
|
1254
1270
|
mermaidCode.addEventListener(\"load\", function () {
|
1255
1271
|
mermaid.initialize({
|
1256
1272
|
startOnLoad: true,
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -563,6 +563,41 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
563
563
|
end
|
564
564
|
puts "\n"
|
565
565
|
end
|
566
|
+
|
567
|
+
# Attempt to determine an ActiveRecord::Base class and additional STI information when given a controller's path
|
568
|
+
def ctrl_to_klass(ctrl_path, res_names = {})
|
569
|
+
klass = nil
|
570
|
+
sti_type = nil
|
571
|
+
|
572
|
+
if res_names.empty?
|
573
|
+
::Brick.relations.each_with_object({}) do |v, s|
|
574
|
+
v_parts = v.first.split('.')
|
575
|
+
v_parts.shift if v_parts.first == 'public'
|
576
|
+
res_names[v_parts.join('.')] = v.first
|
577
|
+
end
|
578
|
+
end
|
579
|
+
|
580
|
+
c_path_parts = ctrl_path.split('/')
|
581
|
+
while c_path_parts.present?
|
582
|
+
possible_c_path = c_path_parts.join('.')
|
583
|
+
possible_c_path_singular = c_path_parts[0..-2] + [c_path_parts.last.singularize]
|
584
|
+
possible_sti = possible_c_path_singular.join('/').camelize
|
585
|
+
break if (
|
586
|
+
res_name = res_names[possible_c_path] ||
|
587
|
+
((klass = Brick.config.sti_namespace_prefixes.key?("::#{possible_sti}") && possible_sti.constantize) &&
|
588
|
+
(sti_type = possible_sti)) ||
|
589
|
+
# %%% Used to have the more flexible: (DidYouMean::SpellChecker.new(dictionary: res_names.keys).correct(possible_c_path)).first
|
590
|
+
res_names[possible_c_path] || res_names[possible_c_path_singular.join('.')]
|
591
|
+
) &&
|
592
|
+
(
|
593
|
+
klass ||
|
594
|
+
((rel = ::Brick.relations.fetch(res_name, nil)) &&
|
595
|
+
(klass ||= rel[:class_name]&.constantize))
|
596
|
+
)
|
597
|
+
c_path_parts.shift
|
598
|
+
end
|
599
|
+
[klass, sti_type]
|
600
|
+
end
|
566
601
|
end
|
567
602
|
|
568
603
|
module RouteSet
|
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.88
|
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-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|