brick 1.0.82 → 1.0.83
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 +94 -0
- data/lib/brick/frameworks/rails/engine.rb +7 -1
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +9 -5
- 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: fd1f37f0785af48f35bc1292e9eec44cd8ebc6a81a6ed7163e53aeaeb753ccc7
|
|
4
|
+
data.tar.gz: e532a10b06419ce64369e7a397a8eb4d268d87dc5a18c936847ab693cbf159bb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7d9dbf20d1bcdc3d3ac2beaf905392ba4990574a8165c1111bdb8f035bd8b53765f1555bd672da134cd342edadb45a2b62151e49cfa6279ebc957f16d34fc449
|
|
7
|
+
data.tar.gz: 276c8e4b831a866baa1b4e84a288a0137ae19afba54d08d342432f358ff4b7a45f234521c35f6d1a6ab96fd69ceb68aa30ba41bfb4b18caef7a12e25cedec8ed
|
data/lib/brick/extensions.rb
CHANGED
|
@@ -813,6 +813,100 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
|
|
|
813
813
|
end
|
|
814
814
|
end
|
|
815
815
|
|
|
816
|
+
if Object.const_defined?('ActionView')
|
|
817
|
+
module ActionView::Helpers::FormTagHelper
|
|
818
|
+
def link_to_brick(*args, **kwargs)
|
|
819
|
+
text = (args.first.is_a?(String) && args.first) || args[1]
|
|
820
|
+
klass_or_obj = ((args.first.is_a?(ActiveRecord::Relation) ||
|
|
821
|
+
args.first.is_a?(ActiveRecord::Base) ||
|
|
822
|
+
args.first.is_a?(Class)) &&
|
|
823
|
+
args.first) ||
|
|
824
|
+
@_brick_model
|
|
825
|
+
# If not provided, do a best-effort to automatically determine the resource class or object
|
|
826
|
+
sti_type = nil
|
|
827
|
+
filter_parts = []
|
|
828
|
+
klass_or_obj ||= begin
|
|
829
|
+
res_names = ::Brick.relations.each_with_object({}) do |v, s|
|
|
830
|
+
v_parts = v.first.split('.')
|
|
831
|
+
v_parts.shift if v_parts.first == 'public'
|
|
832
|
+
s[v_parts.join('.')] = v.first
|
|
833
|
+
end
|
|
834
|
+
c_path_parts = controller_path.split('/')
|
|
835
|
+
klass = nil
|
|
836
|
+
while c_path_parts.present?
|
|
837
|
+
possible_c_path = c_path_parts.join('.')
|
|
838
|
+
possible_c_path_singular = c_path_parts[0..-2] + [c_path_parts.last.singularize]
|
|
839
|
+
possible_sti = possible_c_path_singular.join('/').camelize
|
|
840
|
+
break if (
|
|
841
|
+
res_name = res_names[possible_c_path] ||
|
|
842
|
+
((klass = Brick.config.sti_namespace_prefixes.key?("::#{possible_sti}") && possible_sti.constantize) &&
|
|
843
|
+
(sti_type = possible_sti)) ||
|
|
844
|
+
# %%% Used to have the more flexible: (DidYouMean::SpellChecker.new(dictionary: res_names.keys).correct(possible_c_path)).first
|
|
845
|
+
res_names[possible_c_path] || res_names[possible_c_path_singular.join('.')]
|
|
846
|
+
) &&
|
|
847
|
+
(
|
|
848
|
+
klass ||
|
|
849
|
+
((rel = ::Brick.relations.fetch(res_name, nil)) &&
|
|
850
|
+
(klass ||= rel[:class_name]&.constantize))
|
|
851
|
+
)
|
|
852
|
+
c_path_parts.shift
|
|
853
|
+
end
|
|
854
|
+
if klass
|
|
855
|
+
type_col = klass.inheritance_column # Usually 'type'
|
|
856
|
+
filter_parts << "#{type_col}=#{sti_type}" if sti_type && klass.column_names.include?(type_col)
|
|
857
|
+
path_params = request.path_parameters.dup
|
|
858
|
+
path_params.delete(:controller)
|
|
859
|
+
path_params.delete(:action)
|
|
860
|
+
pk = (klass.primary_key || ActiveRecord::Base.primary_key).to_sym
|
|
861
|
+
# 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
|
+
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))
|
|
864
|
+
obj
|
|
865
|
+
else
|
|
866
|
+
# %%% If there is a HMT that refers to some ___id then try to identify an appropriate filter
|
|
867
|
+
# %%% If there is a polymorphic association that might relate to stuff in the path_params,
|
|
868
|
+
# try to identify an appropriate ___able_id and ___able_type filter
|
|
869
|
+
((klass.column_names - [pk.to_s]) & path_params.keys.map(&:to_s)).each do |path_param|
|
|
870
|
+
filter_parts << "#{path_param}=#{path_params[path_param.to_sym]}"
|
|
871
|
+
end
|
|
872
|
+
klass
|
|
873
|
+
end
|
|
874
|
+
end
|
|
875
|
+
rescue
|
|
876
|
+
end
|
|
877
|
+
if klass_or_obj
|
|
878
|
+
if klass_or_obj.is_a?(ActiveRecord::Relation)
|
|
879
|
+
klass_or_obj.where_values_hash.each do |whr|
|
|
880
|
+
filter_parts << "#{whr.first}=#{whr.last}" unless whr.last.is_a?(Array)
|
|
881
|
+
end
|
|
882
|
+
klass_or_obj = klass_or_obj.klass
|
|
883
|
+
end
|
|
884
|
+
filter = "?#{filter_parts.join('&')}" if filter_parts.present?
|
|
885
|
+
if klass_or_obj&.is_a?(Class) && klass_or_obj < ActiveRecord::Base
|
|
886
|
+
lt_args = [text || "Index for #{klass_or_obj.name.pluralize}",
|
|
887
|
+
"#{send("#{klass_or_obj._brick_index}_path")}#{filter}"]
|
|
888
|
+
else
|
|
889
|
+
# If there are multiple incoming parameters then last one is probably the actual ID, and first few might be some nested tree of stuff leading up to it
|
|
890
|
+
lt_args = [text || "Show this #{klass_or_obj.class.name}",
|
|
891
|
+
"#{send("#{klass_or_obj.class._brick_index(:singular)}_path", klass_or_obj)}#{filter}"]
|
|
892
|
+
end
|
|
893
|
+
link_to(*lt_args, **kwargs)
|
|
894
|
+
else
|
|
895
|
+
# puts "Warning: link_to_brick could not find a class for \"#{controller_path}\" -- consider setting @_brick_model within that controller."
|
|
896
|
+
# if (hits = res_names.keys & instance_variables.map { |v| v.to_s[1..-1] }).present?
|
|
897
|
+
links = instance_variables.each_with_object([]) do |name, s|
|
|
898
|
+
iv_name = name.to_s[1..-1]
|
|
899
|
+
case (val = instance_variable_get(name))
|
|
900
|
+
when ActiveRecord::Relation, ActiveRecord::Base
|
|
901
|
+
s << link_to_brick(val, iv_name) if val
|
|
902
|
+
end
|
|
903
|
+
end
|
|
904
|
+
links.join(' ').html_safe
|
|
905
|
+
end
|
|
906
|
+
end
|
|
907
|
+
end
|
|
908
|
+
end
|
|
909
|
+
|
|
816
910
|
if ActiveSupport::Dependencies.respond_to?(:autoload_module!) # %%% Only works with previous non-zeitwerk auto-loading
|
|
817
911
|
module ActiveSupport::Dependencies
|
|
818
912
|
class << self
|
|
@@ -166,7 +166,13 @@ module Brick
|
|
|
166
166
|
hms_columns << hm_entry
|
|
167
167
|
when 'show', 'new', 'update'
|
|
168
168
|
hm_stuff << if hm_fk_name
|
|
169
|
-
|
|
169
|
+
if hm_assoc.klass.column_names.include?(hm_fk_name)
|
|
170
|
+
"<%= link_to '#{assoc_name}', #{hm_assoc.klass._brick_index}_path({ #{path_keys(hm_assoc, hm_fk_name, "@#{obj_name}", pk)} }) %>\n"
|
|
171
|
+
else
|
|
172
|
+
puts "Warning: has_many :#{hm_assoc.name} in model #{hm_assoc.active_record.name} currently looks for a foreign key called \"#{hm_assoc.foreign_key}\". "\
|
|
173
|
+
"Instead it should use the clause \"foreign_key: :#{hm_assoc.inverse_of&.foreign_key}\"."
|
|
174
|
+
assoc_name
|
|
175
|
+
end
|
|
170
176
|
else # %%% Would be able to remove this when multiple foreign keys to same destination becomes bulletproof
|
|
171
177
|
assoc_name
|
|
172
178
|
end
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
|
@@ -547,7 +547,11 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
|
547
547
|
module RouteSet
|
|
548
548
|
def finalize!
|
|
549
549
|
unless ::Rails.application.routes.named_routes.route_defined?(:brick_status_path)
|
|
550
|
-
|
|
550
|
+
path_prefix = ::Brick.config.path_prefix
|
|
551
|
+
existing_controllers = routes.each_with_object({}) do |r, s|
|
|
552
|
+
c = r.defaults[:controller]
|
|
553
|
+
s[c] = nil if c
|
|
554
|
+
end
|
|
551
555
|
::Rails.application.routes.append do
|
|
552
556
|
tables = []
|
|
553
557
|
views = []
|
|
@@ -566,7 +570,7 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
|
566
570
|
|
|
567
571
|
# %%% TODO: If no auto-controllers then enumerate the controllers folder in order to build matching routes
|
|
568
572
|
# If auto-controllers and auto-models are both enabled then this makes sense:
|
|
569
|
-
controller_prefix = (
|
|
573
|
+
controller_prefix = (path_prefix ? "#{path_prefix}/" : '')
|
|
570
574
|
::Brick.relations.each do |k, v|
|
|
571
575
|
unless !(controller_name = v.fetch(:resource, nil)&.pluralize) || existing_controllers.key?(controller_name)
|
|
572
576
|
options = {}
|
|
@@ -581,9 +585,9 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
|
581
585
|
send(:get, "#{::Brick.api_root}#{v[:resource]}", { to: "#{controller_prefix}#{controller_name}#index" }) if Object.const_defined?('Rswag::Ui')
|
|
582
586
|
end
|
|
583
587
|
# Now the normal routes
|
|
584
|
-
if
|
|
585
|
-
# Was: send(:scope, path:
|
|
586
|
-
send(:namespace,
|
|
588
|
+
if path_prefix
|
|
589
|
+
# Was: send(:scope, path: path_prefix) do
|
|
590
|
+
send(:namespace, path_prefix) do
|
|
587
591
|
brick_routes_create.call(schema_name, controller_name, v, options)
|
|
588
592
|
end
|
|
589
593
|
else
|
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.83
|
|
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-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|