brick 1.0.109 → 1.0.110
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 +22 -5
- data/lib/brick/frameworks/rails/engine.rb +37 -19
- data/lib/brick/frameworks/rails/form_tags.rb +4 -3
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +40 -27
- 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: 3d11240139b576ead983fbe9811f4476b8819878068c46db852b515fbc0849c6
|
4
|
+
data.tar.gz: 2db932779fcd8517f7e5be524ce387061d4e8cab193715be76893dc1e675d1c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd22a1ab8d2b13f2d289fe02262ae8aecb3be921094bbb5dd0392fe5cd46ecadda259e72a18c3ecb7daea0fd5f5a50d697383a4bb949b068976e3b6007769d04
|
7
|
+
data.tar.gz: 39d26f6c99511d3651003c660fed495223ebd4fb34865b1eaa3b8554e294ed0fb3672b17e7dc43ca43fecbd1b7dda2ec6b9a4371025880e12c83694f45557173
|
data/lib/brick/extensions.rb
CHANGED
@@ -261,9 +261,16 @@ module ActiveRecord
|
|
261
261
|
assoc_html_name ? "#{assoc_name}-#{link}".html_safe : link
|
262
262
|
end
|
263
263
|
|
264
|
-
|
264
|
+
# Providing a relation object allows auto-modules built from table name prefixes to work
|
265
|
+
def self._brick_index(mode = nil, separator = '_', relation = nil)
|
265
266
|
tbl_parts = ((mode == :singular) ? table_name.singularize : table_name).split('.')
|
266
267
|
tbl_parts.shift if ::Brick.apartment_multitenant && tbl_parts.length > 1 && tbl_parts.first == ::Brick.apartment_default_tenant
|
268
|
+
if (aps = relation&.fetch(:auto_prefixed_schema, nil)) && tbl_parts.last.start_with?(aps)
|
269
|
+
last_part = tbl_parts.last[aps.length..-1]
|
270
|
+
aps = aps[0..-2] if aps[-1] == '_'
|
271
|
+
tbl_parts[-1] = aps
|
272
|
+
tbl_parts << last_part
|
273
|
+
end
|
267
274
|
tbl_parts.unshift(::Brick.config.path_prefix) if ::Brick.config.path_prefix
|
268
275
|
index = tbl_parts.map(&:underscore).join(separator)
|
269
276
|
# Rails applies an _index suffix to that route when the resource name is singular
|
@@ -1005,7 +1012,8 @@ Module.class_exec do
|
|
1005
1012
|
|
1006
1013
|
# MODULE
|
1007
1014
|
elsif (::Brick.enable_models? || ::Brick.enable_controllers?) && # Schema match?
|
1008
|
-
|
1015
|
+
# %%% This works for Person::Person -- but also limits us to not being able to allow more than one level of namespacing
|
1016
|
+
(base_module == Object || (camelize_prefix && base_module == Object.const_get(camelize_prefix))) &&
|
1009
1017
|
(schema_name = [(singular_table_name = class_name.underscore),
|
1010
1018
|
(table_name = singular_table_name.pluralize),
|
1011
1019
|
::Brick.is_oracle ? class_name.upcase : class_name,
|
@@ -1437,7 +1445,7 @@ class Object
|
|
1437
1445
|
is_postgres = ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
1438
1446
|
is_mysql = ['Mysql2', 'Trilogy'].include?(ActiveRecord::Base.connection.adapter_name)
|
1439
1447
|
|
1440
|
-
code = +"class #{class_name} < #{controller_base&.name || 'ApplicationController'}\n"
|
1448
|
+
code = +"class #{namespace}::#{class_name} < #{controller_base&.name || 'ApplicationController'}\n"
|
1441
1449
|
built_controller = Class.new(controller_base || ActionController::Base) do |new_controller_class|
|
1442
1450
|
(namespace || Object).const_set(class_name.to_sym, new_controller_class)
|
1443
1451
|
|
@@ -2272,11 +2280,20 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
|
|
2272
2280
|
schema_names.shift if ::Brick.apartment_multitenant && schema_names.first == ::Brick.apartment_default_tenant
|
2273
2281
|
v[:schema] = schema_names.join('.') unless schema_names.empty?
|
2274
2282
|
# %%% If more than one schema has the same table name, will need to add a schema name prefix to have uniqueness
|
2275
|
-
v[:resource] = rel_name.last
|
2276
2283
|
if (singular = rel_name.last.singularize).blank?
|
2277
2284
|
singular = rel_name.last
|
2278
2285
|
end
|
2279
|
-
|
2286
|
+
name_parts = if (tnp = ::Brick.config.table_name_prefixes
|
2287
|
+
.find { |k1, _v1| singular.start_with?(k1) && singular.length > k1.length }
|
2288
|
+
).present?
|
2289
|
+
v[:auto_prefixed_schema] = tnp.first
|
2290
|
+
v[:resource] = rel_name.last[(tnp_length = tnp.first.length)..-1]
|
2291
|
+
[tnp.last, singular[tnp_length..-1]]
|
2292
|
+
else
|
2293
|
+
v[:resource] = rel_name.last
|
2294
|
+
[singular]
|
2295
|
+
end
|
2296
|
+
v[:class_name] = (schema_names + name_parts).map(&:camelize).join('::')
|
2280
2297
|
end
|
2281
2298
|
::Brick.load_additional_references if ::Brick.initializer_loaded
|
2282
2299
|
|
@@ -10,10 +10,13 @@ module Brick
|
|
10
10
|
if (param === undefined || param === null || param === -1) {
|
11
11
|
hrefParts = hrefParts[0].split(\"://\");
|
12
12
|
var pathParts = hrefParts[hrefParts.length - 1].split(\"/\").filter(function (pp) {return pp !== \"\";});
|
13
|
-
if (value === undefined)
|
13
|
+
if (value === undefined) {
|
14
14
|
// A couple possibilities if it's namespaced, starting with two parts in the path -- and then try just one
|
15
|
-
|
16
|
-
|
15
|
+
if (pathParts.length > 3)
|
16
|
+
return [pathParts.slice(1, 4).join('/'), pathParts.slice(1, 3).join('/')];
|
17
|
+
else
|
18
|
+
return [pathParts.slice(1, 3).join('/'), pathParts[1]];
|
19
|
+
} else {
|
17
20
|
var queryString = param ? \"?\" + params.join(\"&\") : \"\";
|
18
21
|
return hrefParts[0] + \"://\" + pathParts[0] + \"/\" + value + queryString;
|
19
22
|
}
|
@@ -187,7 +190,8 @@ function linkSchemas() {
|
|
187
190
|
s[r.name[0..-9]] = nil if r.name.end_with?('Resource')
|
188
191
|
end
|
189
192
|
::Brick.relations.each do |k, v|
|
190
|
-
unless existing.key?(class_name = v[:class_name]) || Brick.config.exclude_tables.include?(k) ||
|
193
|
+
unless existing.key?(class_name = v[:class_name]) || Brick.config.exclude_tables.include?(k) ||
|
194
|
+
class_name.blank? || class_name.include?('::')
|
191
195
|
Object.const_get("#{class_name}Resource")
|
192
196
|
end
|
193
197
|
end
|
@@ -452,11 +456,22 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
452
456
|
# %%% If we are not auto-creating controllers (or routes) then omit by default, and if enabled anyway, such as in a development
|
453
457
|
# environment or whatever, then get either the controllers or routes list instead
|
454
458
|
prefix = "#{::Brick.config.path_prefix}/" if ::Brick.config.path_prefix
|
455
|
-
table_options =
|
456
|
-
if
|
457
|
-
|
459
|
+
table_options = ::Brick.relations.each_with_object({}) do |rel, s|
|
460
|
+
next if ::Brick.config.exclude_tables.include?(rel.first)
|
461
|
+
|
462
|
+
tbl_parts = rel.first.split('.')
|
463
|
+
if (aps = rel.last.fetch(:auto_prefixed_schema, nil))
|
464
|
+
tbl_parts << tbl_parts.last[aps.length..-1]
|
465
|
+
aps = aps[0..-2] if aps[-1] == '_'
|
466
|
+
tbl_parts[-2] = aps
|
467
|
+
end
|
468
|
+
if tbl_parts.first == apartment_default_schema
|
469
|
+
tbl_parts.shift
|
458
470
|
end
|
459
|
-
|
471
|
+
# %%% When table_name_prefixes are use then during rendering empty non-TNP
|
472
|
+
# entries get added at some point when an attempt is made to find the table.
|
473
|
+
# Will have to hunt that down at some point.
|
474
|
+
s[tbl_parts.join('.')] = nil unless rel.last[:cols].empty?
|
460
475
|
end.keys.sort.each_with_object(+'') do |v, s|
|
461
476
|
s << "<option value=\"#{prefix}#{v.underscore.gsub('.', '/')}\">#{v}</option>"
|
462
477
|
end.html_safe
|
@@ -881,7 +896,8 @@ if (grid) {
|
|
881
896
|
// });
|
882
897
|
}
|
883
898
|
function setHeaderSizes() {
|
884
|
-
|
899
|
+
if (grid.clientWidth > window.outerWidth)
|
900
|
+
document.getElementById(\"titleBox\").style.width = grid.clientWidth;
|
885
901
|
// console.log(\"start\");
|
886
902
|
// See if the headerTop is already populated
|
887
903
|
// %%% Grab the TRs from headerTop, clear it out, do this stuff, add them back
|
@@ -1136,12 +1152,13 @@ erDiagram
|
|
1136
1152
|
<td><h1><%= td_count = 2
|
1137
1153
|
model.name %></h1></td>
|
1138
1154
|
<td id=\"imgErd\" title=\"Show ERD\"></td>
|
1139
|
-
<% if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace)
|
1155
|
+
<% if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) && model.name.exclude?('::')
|
1140
1156
|
td_count += 1 %>
|
1141
1157
|
<td><%= link_to_brick(
|
1142
1158
|
avo_svg,
|
1143
|
-
{ index_proc: Proc.new do |avo_model|
|
1144
|
-
|
1159
|
+
{ index_proc: Proc.new do |avo_model, relation|
|
1160
|
+
path_helper = \"resources_#\{relation.fetch(:auto_prefixed_schema, nil)}#\{model.model_name.route_key}_path\".to_sym
|
1161
|
+
::Avo.railtie_routes_url_helpers.send(path_helper) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
|
1145
1162
|
end,
|
1146
1163
|
title: \"#\{model.name} in Avo\" }
|
1147
1164
|
) %></td>
|
@@ -1328,8 +1345,9 @@ erDiagram
|
|
1328
1345
|
<% if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) %>
|
1329
1346
|
<td><%= link_to_brick(
|
1330
1347
|
avo_svg,
|
1331
|
-
{ show_proc: Proc.new do |obj|
|
1332
|
-
|
1348
|
+
{ show_proc: Proc.new do |obj, relation|
|
1349
|
+
path_helper = \"resources_#\{relation.fetch(:auto_prefixed_schema, nil)}#\{obj.class.base_class.model_name.singular_route_key}_path\".to_sym
|
1350
|
+
::Avo.railtie_routes_url_helpers.send(path_helper, obj) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
|
1333
1351
|
end,
|
1334
1352
|
title: \"#\{page_title} in Avo\" }
|
1335
1353
|
) %></td>
|
@@ -1408,8 +1426,8 @@ end
|
|
1408
1426
|
\"<span class=\\\"orphan\\\">Orphaned ID: #\{val}</span>\".html_safe
|
1409
1427
|
end %>
|
1410
1428
|
<% else
|
1411
|
-
col_type = col
|
1412
|
-
case (col_type ||= col
|
1429
|
+
col_type = col&.sql_type == 'geography' ? col.sql_type : col&.type
|
1430
|
+
case (col_type ||= col&.sql_type)
|
1413
1431
|
when :string, :text %>
|
1414
1432
|
<% if is_bcrypt?(val) # || .readonly?
|
1415
1433
|
is_revert = false %>
|
@@ -1489,9 +1507,9 @@ end
|
|
1489
1507
|
# association that points to an STI model then filtering for the __able_type column is done
|
1490
1508
|
# with a .where(). And the polymorphic class name it points to is the base class name of
|
1491
1509
|
# the STI model instead of its subclass.
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1510
|
+
poly_type = #{poly_type.inspect}
|
1511
|
+
if poly_type && @#{obj_name}.respond_to?(:#{@_brick_model.inheritance_column}) &&
|
1512
|
+
(base_type = collection.where_values_hash[poly_type])
|
1495
1513
|
collection = collection.rewhere(poly_type => [base_type, @#{obj_name}.#{@_brick_model.inheritance_column}])
|
1496
1514
|
end"
|
1497
1515
|
end
|
@@ -162,8 +162,9 @@ module Brick::Rails::FormTags
|
|
162
162
|
@_brick_model
|
163
163
|
# If not provided, do a best-effort to automatically determine the resource class or object
|
164
164
|
filter_parts = []
|
165
|
+
rel_name = nil
|
165
166
|
klass_or_obj ||= begin
|
166
|
-
klass, sti_type = ::Brick.ctrl_to_klass(controller_path)
|
167
|
+
klass, sti_type, rel_name = ::Brick.ctrl_to_klass(controller_path)
|
167
168
|
if klass
|
168
169
|
type_col = klass.inheritance_column # Usually 'type'
|
169
170
|
filter_parts << "#{type_col}=#{sti_type}" if sti_type && klass.column_names.include?(type_col)
|
@@ -202,11 +203,11 @@ module Brick::Rails::FormTags
|
|
202
203
|
app_routes = Rails.application.routes # In case we're operating in another engine, reference the application since Brick routes are placed there.
|
203
204
|
if (klass_or_obj&.is_a?(Class) && klass_or_obj < ActiveRecord::Base) ||
|
204
205
|
(klass_or_obj&.is_a?(ActiveRecord::Base) && klass_or_obj.new_record? && (klass_or_obj = klass_or_obj.class))
|
205
|
-
path = (proc = kwargs[:index_proc]) ? proc.call(klass_or_obj) : "#{app_routes.path_for(controller: klass_or_obj.base_class._brick_index(nil, '/'), action: :index)}#{filter}"
|
206
|
+
path = (proc = kwargs[:index_proc]) ? proc.call(klass_or_obj, relation) : "#{app_routes.path_for(controller: klass_or_obj.base_class._brick_index(nil, '/', relation), action: :index)}#{filter}"
|
206
207
|
lt_args = [text || "Index for #{klass_or_obj.name.pluralize}", path]
|
207
208
|
else
|
208
209
|
# 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
|
209
|
-
path = (proc = kwargs[:show_proc]) ? proc.call(klass_or_obj) : "#{app_routes.path_for(controller: klass_or_obj.class.base_class._brick_index(nil, '/'), action: :show, id: klass_or_obj)}#{filter}"
|
210
|
+
path = (proc = kwargs[:show_proc]) ? proc.call(klass_or_obj, relation) : "#{app_routes.path_for(controller: klass_or_obj.class.base_class._brick_index(nil, '/', relation), action: :show, id: klass_or_obj)}#{filter}"
|
210
211
|
lt_args = [text || "Show this #{klass_or_obj.class.name}", path]
|
211
212
|
end
|
212
213
|
kwargs.delete(:visited)
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -601,7 +601,7 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
601
601
|
def display_classes(prefix, rels, max_length)
|
602
602
|
rels.sort.each do |rel|
|
603
603
|
(::Brick.auto_models ||= []) << rel.first
|
604
|
-
puts "#{rel.first}#{' ' * (max_length - rel.first.length)} /#{prefix}#{rel.last}"
|
604
|
+
puts "#{rel.first}#{' ' * (max_length - rel.first.length)} /#{prefix}#{"#{rel[1]}/" if rel[1]}#{rel.last}"
|
605
605
|
end
|
606
606
|
puts "\n"
|
607
607
|
end
|
@@ -620,16 +620,21 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
620
620
|
end
|
621
621
|
|
622
622
|
c_path_parts = ctrl_path.split('/')
|
623
|
+
found = nil
|
623
624
|
while c_path_parts.present?
|
624
625
|
possible_c_path = c_path_parts.join('.')
|
625
626
|
possible_c_path_singular = c_path_parts[0..-2] + [c_path_parts.last.singularize]
|
626
627
|
possible_sti = possible_c_path_singular.join('/').camelize
|
627
628
|
break if (
|
628
|
-
res_name = res_names[possible_c_path] ||
|
629
|
+
res_name = res_names[found = possible_c_path] ||
|
629
630
|
((klass = Brick.config.sti_namespace_prefixes.key?("::#{possible_sti}") && possible_sti.constantize) &&
|
630
631
|
(sti_type = possible_sti)) ||
|
631
632
|
# %%% Used to have the more flexible: (DidYouMean::SpellChecker.new(dictionary: res_names.keys).correct(possible_c_path)).first
|
632
|
-
res_names[possible_c_path] || res_names[possible_c_path_singular.join('.')]
|
633
|
+
res_names[found = possible_c_path] || res_names[found = possible_c_path_singular.join('.')] ||
|
634
|
+
((::Brick.config.table_name_prefixes.key?(tn_prefix = c_path_parts.first) ||
|
635
|
+
::Brick.config.table_name_prefixes.key?(tn_prefix = "#{c_path_parts.first}_")) &&
|
636
|
+
res_names[found = tn_prefix + c_path_parts.last]
|
637
|
+
)
|
633
638
|
) &&
|
634
639
|
(
|
635
640
|
klass ||
|
@@ -638,7 +643,7 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
638
643
|
)
|
639
644
|
c_path_parts.shift
|
640
645
|
end
|
641
|
-
[klass, sti_type]
|
646
|
+
[klass, sti_type, found]
|
642
647
|
end
|
643
648
|
end
|
644
649
|
|
@@ -657,10 +662,14 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
657
662
|
table_class_length = 38 # Length of "Classes that can be built from tables:"
|
658
663
|
view_class_length = 37 # Length of "Classes that can be built from views:"
|
659
664
|
|
660
|
-
|
661
|
-
if
|
662
|
-
|
663
|
-
|
665
|
+
brick_namespace_create = lambda do |path_names, res_name, options|
|
666
|
+
if path_names&.present?
|
667
|
+
if (path_name = path_names.pop).is_a?(Array)
|
668
|
+
module_name = path_name[1]
|
669
|
+
path_name = path_name.first
|
670
|
+
end
|
671
|
+
send(:scope, { module: module_name || path_name, path: path_name, as: path_name }) do
|
672
|
+
brick_namespace_create.call(path_names, res_name, options)
|
664
673
|
end
|
665
674
|
else
|
666
675
|
send(:resources, res_name.to_sym, **options)
|
@@ -676,13 +685,24 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
676
685
|
end
|
677
686
|
versioned_views = {} # Track which views have already been done for each api_root
|
678
687
|
::Brick.relations.each do |k, v|
|
679
|
-
next if !(controller_name = v.fetch(:resource, nil)&.pluralize) || existing_controllers.key?(controller_name)
|
680
|
-
|
681
|
-
object_name = k.split('.').last # Take off any first schema part
|
682
688
|
if (schema_name = v.fetch(:schema, nil))
|
683
689
|
schema_prefix = "#{schema_name}."
|
684
690
|
end
|
685
691
|
|
692
|
+
next if !(resource_name = v.fetch(:resource, nil)) ||
|
693
|
+
existing_controllers.key?(controller_name = (
|
694
|
+
resource_name = "#{schema_prefix&.tr('.', '/')}#{resource_name}"
|
695
|
+
).pluralize)
|
696
|
+
|
697
|
+
object_name = k.split('.').last # Take off any first schema part
|
698
|
+
|
699
|
+
full_schema_prefix = if (aps = v.fetch(:auto_prefixed_schema, nil))
|
700
|
+
aps = aps[0..-2] if aps[-1] == '_'
|
701
|
+
(schema_prefix&.dup || +'') << "#{aps}."
|
702
|
+
else
|
703
|
+
schema_prefix
|
704
|
+
end
|
705
|
+
|
686
706
|
# Track routes being built
|
687
707
|
if (class_name = v.fetch(:class_name, nil))
|
688
708
|
if v.key?(:isView)
|
@@ -691,26 +711,20 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
691
711
|
else
|
692
712
|
table_class_length = class_name.length if class_name.length > table_class_length
|
693
713
|
tables
|
694
|
-
end << [class_name,
|
714
|
+
end << [class_name, aps, resource_name]
|
695
715
|
end
|
696
716
|
|
697
717
|
options = {}
|
698
718
|
options[:only] = [:index, :show] if v.key?(:isView)
|
699
719
|
|
700
720
|
# First do the normal routes
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
end
|
709
|
-
else
|
710
|
-
brick_routes_create.call(schema_name, v[:resource], options)
|
711
|
-
sti_subclasses.fetch(class_name, nil)&.each do |sc| # Add any STI subclass routes for this relation
|
712
|
-
brick_routes_create.call(schema_name, sc.underscore.tr('/', '_').pluralize, options)
|
713
|
-
end
|
721
|
+
prefixes = []
|
722
|
+
prefixes << [aps, v[:class_name]&.split('::')[-2]&.underscore] if aps
|
723
|
+
prefixes << schema_name if schema_name
|
724
|
+
prefixes << path_prefix if path_prefix
|
725
|
+
brick_namespace_create.call(prefixes, v[:resource], options)
|
726
|
+
sti_subclasses.fetch(class_name, nil)&.each do |sc| # Add any STI subclass routes for this relation
|
727
|
+
brick_namespace_create.call(prefixes, sc.underscore.tr('/', '_').pluralize, options)
|
714
728
|
end
|
715
729
|
|
716
730
|
# Now the API routes if necessary
|
@@ -815,9 +829,8 @@ In config/initializers/brick.rb appropriate entries would look something like:
|
|
815
829
|
# view_ver_num = if (first_part = k.split('_').first) =~ /^v[\d_]+/
|
816
830
|
# first_part[1..-1].gsub('_', '.').to_i
|
817
831
|
# end
|
818
|
-
|
819
832
|
controller_name = if (last = view_relation.fetch(:resource, nil)&.pluralize)
|
820
|
-
"#{
|
833
|
+
"#{full_schema_prefix}#{last}"
|
821
834
|
else
|
822
835
|
found
|
823
836
|
end.tr('.', '/')
|
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.110
|
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-01-
|
11
|
+
date: 2023-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|