brick 1.0.59 → 1.0.60
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 +90 -73
- data/lib/brick/frameworks/rails/engine.rb +3 -3
- data/lib/brick/version_number.rb +1 -1
- data/lib/generators/brick/models_generator.rb +3 -2
- 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: 741384ed503092151ed20f360abd8819fdf3b25fc4042e5aa953dae928acab6d
|
4
|
+
data.tar.gz: 11e88b4b7bdc51b9237e095fdaae1297741e1c315737e18d7194c3c84e937797
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: daa2950ea3ff1354c642949797a4ed7e7ed5c14cfcba4e5560572e997e4df43b537ecb12e84dc2d710b3e067870a91c69519ee41735ea7e9ada0d110ae2bd906
|
7
|
+
data.tar.gz: 3e74b2d21d72d84ea7286a7b8959b0abb293c50844b5e3ba4fce73cc4f8b5dd68fa7a50dc9753901f0b82b6a3196ab3fd282c4e709d0ae82af37e5a4e68488a9
|
data/lib/brick/extensions.rb
CHANGED
@@ -373,6 +373,7 @@ module ActiveRecord
|
|
373
373
|
end
|
374
374
|
|
375
375
|
def brick_select(params, selects = nil, order_by = nil, translations = {}, join_array = ::Brick::JoinArray.new)
|
376
|
+
is_mysql = ActiveRecord::Base.connection.adapter_name == 'Mysql2'
|
376
377
|
is_distinct = nil
|
377
378
|
wheres = {}
|
378
379
|
params.each do |k, v|
|
@@ -397,12 +398,14 @@ module ActiveRecord
|
|
397
398
|
if selects&.empty? # Default to all columns
|
398
399
|
tbl_no_schema = table.name.split('.').last
|
399
400
|
columns.each do |col|
|
400
|
-
if (col_name = col.name) == 'class'
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
401
|
+
col_alias = ' AS _class' if (col_name = col.name) == 'class'
|
402
|
+
selects << if is_mysql
|
403
|
+
"`#{tbl_no_schema}`.`#{col_name}`#{col_alias}"
|
404
|
+
else
|
405
|
+
# Postgres can not use DISTINCT with any columns that are XML, so for any of those just convert to text
|
406
|
+
cast_as_text = '::text' if is_distinct && Brick.relations[klass.table_name]&.[](:cols)&.[](col.name)&.first&.start_with?('xml')
|
407
|
+
"\"#{tbl_no_schema}\".\"#{col_name}\"#{cast_as_text}#{col_alias}"
|
408
|
+
end
|
406
409
|
end
|
407
410
|
end
|
408
411
|
|
@@ -430,7 +433,11 @@ module ActiveRecord
|
|
430
433
|
if used_col_aliases.key?(col_alias = "_brfk_#{v.first}__#{sel_col.last}")
|
431
434
|
col_alias = "_brfk_#{v.first}__#{v1[idx][-2..-1].map(&:to_s).join('__')}"
|
432
435
|
end
|
433
|
-
selects <<
|
436
|
+
selects << if is_mysql
|
437
|
+
"`#{field_tbl_name}`.`#{sel_col.last}` AS `#{col_alias}`"
|
438
|
+
else
|
439
|
+
"\"#{field_tbl_name}\".\"#{sel_col.last}\"#{'::text' if is_xml} AS \"#{col_alias}\""
|
440
|
+
end
|
434
441
|
used_col_aliases[col_alias] = nil
|
435
442
|
v1[idx] << col_alias
|
436
443
|
end
|
@@ -439,7 +446,11 @@ module ActiveRecord
|
|
439
446
|
# Accommodate composite primary key by allowing id_col to come in as an array
|
440
447
|
((id_col = k1.primary_key).is_a?(Array) ? id_col : [id_col]).each do |id_part|
|
441
448
|
id_for_tables[v.first] << if id_part
|
442
|
-
selects <<
|
449
|
+
selects << if is_mysql
|
450
|
+
"#{"`#{tbl_name}`.`#{id_part}`"} AS `#{(id_alias = "_brfk_#{v.first}__#{id_part}")}`"
|
451
|
+
else
|
452
|
+
"#{"\"#{tbl_name}\".\"#{id_part}\""} AS \"#{(id_alias = "_brfk_#{v.first}__#{id_part}")}\""
|
453
|
+
end
|
443
454
|
id_alias
|
444
455
|
end
|
445
456
|
end
|
@@ -990,6 +1001,17 @@ class Object
|
|
990
1001
|
self.send(macro, assoc_name, **options)
|
991
1002
|
end
|
992
1003
|
|
1004
|
+
def default_ordering(table_name, pk)
|
1005
|
+
case (order_tbl = ::Brick.config.order[table_name]) && (order_default = order_tbl[:_brick_default])
|
1006
|
+
when Array
|
1007
|
+
order_default.map { |od_part| order_tbl[od_part] || od_part }
|
1008
|
+
when Symbol
|
1009
|
+
order_tbl[order_default] || order_default
|
1010
|
+
else
|
1011
|
+
pk.map(&:to_sym) # If it's not a custom ORDER BY, just use the key
|
1012
|
+
end
|
1013
|
+
end
|
1014
|
+
|
993
1015
|
def build_controller(namespace, class_name, plural_class_name, model, relations)
|
994
1016
|
table_name = ActiveSupport::Inflector.underscore(plural_class_name)
|
995
1017
|
singular_table_name = ActiveSupport::Inflector.singularize(table_name)
|
@@ -1077,27 +1099,9 @@ class Object
|
|
1077
1099
|
# Normal (non-swagger) request
|
1078
1100
|
|
1079
1101
|
# %%% Allow params to define which columns to use for order_by
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
order_default.map { |od_part| order_tbl[od_part] || od_part }
|
1084
|
-
when Symbol
|
1085
|
-
order_tbl[order_default] || order_default
|
1086
|
-
else
|
1087
|
-
pk
|
1088
|
-
end
|
1089
|
-
else
|
1090
|
-
pk # If it's not a custom ORDER BY, just use the key
|
1091
|
-
end
|
1092
|
-
order_by, order_by_txt = model._brick_calculate_ordering(ordering)
|
1093
|
-
if (order_params = params['_brick_order']&.split(',')&.map(&:to_sym)) # Overriding the default by providing a querystring param?
|
1094
|
-
order_by, _ = model._brick_calculate_ordering(order_params, true) # Don't do the txt part
|
1095
|
-
end
|
1096
|
-
|
1097
|
-
code << " def index\n"
|
1098
|
-
code << " @#{table_name} = #{model.name}#{pk&.present? ? ".order(#{order_by_txt.join(', ')})" : '.all'}\n"
|
1099
|
-
code << " @#{table_name}.brick_select(params)\n"
|
1100
|
-
code << " end\n"
|
1102
|
+
# Overriding the default by providing a querystring param?
|
1103
|
+
ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
|
1104
|
+
order_by, _ = model._brick_calculate_ordering(ordering, true) # Don't do the txt part
|
1101
1105
|
|
1102
1106
|
::Brick.set_db_schema(params)
|
1103
1107
|
if request.format == :csv # Asking for a template?
|
@@ -1130,6 +1134,12 @@ class Object
|
|
1130
1134
|
@_brick_join_array = join_array
|
1131
1135
|
end
|
1132
1136
|
|
1137
|
+
_, order_by_txt = model._brick_calculate_ordering(default_ordering(table_name, pk))
|
1138
|
+
code << " def index\n"
|
1139
|
+
code << " @#{table_name} = #{model.name}#{pk&.present? ? ".order(#{order_by_txt.join(', ')})" : '.all'}\n"
|
1140
|
+
code << " @#{table_name}.brick_select(params)\n"
|
1141
|
+
code << " end\n"
|
1142
|
+
|
1133
1143
|
is_pk_string = nil
|
1134
1144
|
if (pk_col = model&.primary_key)
|
1135
1145
|
code << " def show\n"
|
@@ -1316,7 +1326,7 @@ module ActiveRecord::ConnectionHandling
|
|
1316
1326
|
load apartment_initializer
|
1317
1327
|
apartment_excluded = Apartment.excluded_models
|
1318
1328
|
end
|
1319
|
-
# Only for Postgres
|
1329
|
+
# Only for Postgres (Doesn't work in sqlite3 or MySQL)
|
1320
1330
|
# puts ActiveRecord::Base.execute_sql("SELECT current_setting('SEARCH_PATH')").to_a.inspect
|
1321
1331
|
|
1322
1332
|
is_postgres = nil
|
@@ -1351,7 +1361,7 @@ module ActiveRecord::ConnectionHandling
|
|
1351
1361
|
puts "Unfamiliar with connection adapter #{ActiveRecord::Base.connection.adapter_name}"
|
1352
1362
|
end
|
1353
1363
|
|
1354
|
-
::Brick.db_schemas ||=
|
1364
|
+
::Brick.db_schemas ||= {}
|
1355
1365
|
|
1356
1366
|
if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
1357
1367
|
if (possible_schema = ::Brick.config.schema_behavior&.[](:multitenant)&.[](:schema_to_analyse))
|
@@ -1367,41 +1377,11 @@ module ActiveRecord::ConnectionHandling
|
|
1367
1377
|
# %%% Retrieve internal ActiveRecord table names like this:
|
1368
1378
|
# ActiveRecord::Base.internal_metadata_table_name, ActiveRecord::Base.schema_migrations_table_name
|
1369
1379
|
# For if it's not SQLite -- so this is the Postgres and MySQL version
|
1370
|
-
sql ||= "SELECT t.table_schema AS schema, t.table_name AS relation_name, t.table_type,#{"
|
1371
|
-
pg_catalog.obj_description((t.table_schema || '.' || t.table_name)::regclass, 'pg_class') AS table_description," if is_postgres}
|
1372
|
-
c.column_name, c.data_type,
|
1373
|
-
COALESCE(c.character_maximum_length, c.numeric_precision) AS max_length,
|
1374
|
-
tc.constraint_type AS const, kcu.constraint_name AS \"key\",
|
1375
|
-
c.is_nullable
|
1376
|
-
FROM INFORMATION_SCHEMA.tables AS t
|
1377
|
-
LEFT OUTER JOIN INFORMATION_SCHEMA.columns AS c ON t.table_schema = c.table_schema
|
1378
|
-
AND t.table_name = c.table_name
|
1379
|
-
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu ON
|
1380
|
-
-- ON kcu.CONSTRAINT_CATALOG = t.table_catalog AND
|
1381
|
-
kcu.CONSTRAINT_SCHEMA = c.table_schema
|
1382
|
-
AND kcu.TABLE_NAME = c.table_name
|
1383
|
-
AND kcu.position_in_unique_constraint IS NULL
|
1384
|
-
AND kcu.ordinal_position = c.ordinal_position
|
1385
|
-
LEFT OUTER JOIN INFORMATION_SCHEMA.table_constraints AS tc
|
1386
|
-
ON kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA
|
1387
|
-
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
1388
|
-
AND kcu.CONSTRAINT_NAME = tc.constraint_name
|
1389
|
-
WHERE t.table_schema NOT IN ('information_schema', 'pg_catalog')#{"
|
1390
|
-
AND t.table_schema = COALESCE(current_setting('SEARCH_PATH'), 'public')" if schema }
|
1391
|
-
-- AND t.table_type IN ('VIEW') -- 'BASE TABLE', 'FOREIGN TABLE'
|
1392
|
-
AND t.table_name NOT IN ('pg_stat_statements', ?, ?)
|
1393
|
-
ORDER BY 1, t.table_type DESC, c.ordinal_position"
|
1394
1380
|
measures = []
|
1395
1381
|
case ActiveRecord::Base.connection.adapter_name
|
1396
1382
|
when 'PostgreSQL', 'SQLite' # These bring back a hash for each row because the query uses column aliases
|
1397
1383
|
# schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
1398
|
-
|
1399
|
-
ActiveRecord::Base.schema_migrations_table_name
|
1400
|
-
else
|
1401
|
-
'schema_migrations'
|
1402
|
-
end
|
1403
|
-
ar_imtn = ActiveRecord.version >= ::Gem::Version.new('5.0') ? ActiveRecord::Base.internal_metadata_table_name : ''
|
1404
|
-
ActiveRecord::Base.execute_sql(sql, ar_smtn, ar_imtn).each do |r|
|
1384
|
+
ActiveRecord::Base.retrieve_schema_and_tables(sql, is_postgres, schema).each do |r|
|
1405
1385
|
# If Apartment gem lists the table as being associated with a non-tenanted model then use whatever it thinks
|
1406
1386
|
# is the default schema, usually 'public'.
|
1407
1387
|
schema_name = if ::Brick.config.schema_behavior[:multitenant]
|
@@ -1428,23 +1408,23 @@ module ActiveRecord::ConnectionHandling
|
|
1428
1408
|
# puts "KEY! #{r['relation_name']}.#{col_name} #{r['key']} #{r['const']}" if r['key']
|
1429
1409
|
end
|
1430
1410
|
else # MySQL2 acts a little differently, bringing back an array for each row
|
1431
|
-
ActiveRecord::Base.
|
1432
|
-
relation = relations[(relation_name = r[
|
1433
|
-
relation[:isView] = true if r[
|
1434
|
-
col_name = r[
|
1435
|
-
key = case r[
|
1411
|
+
ActiveRecord::Base.retrieve_schema_and_tables(sql).each do |r|
|
1412
|
+
relation = relations[(relation_name = r[1])] # here relation represents a table or view from the database
|
1413
|
+
relation[:isView] = true if r[2] == 'VIEW' # table_type
|
1414
|
+
col_name = r[3]
|
1415
|
+
key = case r[6] # constraint type
|
1436
1416
|
when 'PRIMARY KEY'
|
1437
1417
|
# key
|
1438
|
-
relation[:pkey][r[
|
1418
|
+
relation[:pkey][r[7] || relation_name] ||= []
|
1439
1419
|
when 'UNIQUE'
|
1440
|
-
relation[:ukeys][r[
|
1420
|
+
relation[:ukeys][r[7] || "#{relation_name}.#{col_name}"] ||= []
|
1441
1421
|
# key = (relation[:ukeys] = Hash.new { |h, k| h[k] = [] }) if key.is_a?(Array)
|
1442
1422
|
# key[r['key']]
|
1443
1423
|
end
|
1444
1424
|
key << col_name if key
|
1445
1425
|
cols = relation[:cols] # relation.fetch(:cols) { relation[:cols] = [] }
|
1446
1426
|
# 'data_type', 'max_length'
|
1447
|
-
cols[col_name] = [r[
|
1427
|
+
cols[col_name] = [r[4], r[5], measures&.include?(col_name)]
|
1448
1428
|
# puts "KEY! #{r['relation_name']}.#{col_name} #{r['key']} #{r['const']}" if r['key']
|
1449
1429
|
end
|
1450
1430
|
end
|
@@ -1482,7 +1462,7 @@ module ActiveRecord::ConnectionHandling
|
|
1482
1462
|
AND kcu2.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA
|
1483
1463
|
AND kcu2.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
|
1484
1464
|
AND kcu2.ORDINAL_POSITION = kcu1.ORDINAL_POSITION#{"
|
1485
|
-
WHERE kcu1.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if schema }"
|
1465
|
+
WHERE kcu1.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
|
1486
1466
|
# AND kcu2.TABLE_NAME = ?;", Apartment::Tenant.current, table_name
|
1487
1467
|
when 'SQLite'
|
1488
1468
|
sql = "SELECT m.name, fkl.\"from\", fkl.\"table\", m.name || '_' || fkl.\"from\" AS constraint_name
|
@@ -1498,12 +1478,14 @@ module ActiveRecord::ConnectionHandling
|
|
1498
1478
|
# Multitenancy makes things a little more general overall, except for non-tenanted tables
|
1499
1479
|
if apartment_excluded&.include?(fk[1].singularize.camelize)
|
1500
1480
|
fk[0] = Apartment.default_schema
|
1501
|
-
elsif fk[0] == 'public' || (is_multitenant && fk[0] == schema)
|
1481
|
+
elsif is_postgres && (fk[0] == 'public' || (is_multitenant && fk[0] == schema)) ||
|
1482
|
+
!is_postgres && ['mysql', 'performance_schema', 'sys'].exclude?(fk[0])
|
1502
1483
|
fk[0] = nil
|
1503
1484
|
end
|
1504
1485
|
if apartment_excluded&.include?(fk[4].singularize.camelize)
|
1505
1486
|
fk[3] = Apartment.default_schema
|
1506
|
-
elsif fk[3] == 'public' || (is_multitenant && fk[3] == schema)
|
1487
|
+
elsif is_postgres && (fk[3] == 'public' || (is_multitenant && fk[3] == schema)) ||
|
1488
|
+
!is_postgres && ['mysql', 'performance_schema', 'sys'].exclude?(fk[3])
|
1507
1489
|
fk[3] = nil
|
1508
1490
|
end
|
1509
1491
|
::Brick._add_bt_and_hm(fk, relations)
|
@@ -1537,6 +1519,41 @@ module ActiveRecord::ConnectionHandling
|
|
1537
1519
|
|
1538
1520
|
::Brick.load_additional_references if initializer_loaded
|
1539
1521
|
end
|
1522
|
+
|
1523
|
+
def retrieve_schema_and_tables(sql = nil, is_postgres = nil, schema = nil)
|
1524
|
+
sql ||= "SELECT t.table_schema AS \"schema\", t.table_name AS relation_name, t.table_type,#{"
|
1525
|
+
pg_catalog.obj_description((t.table_schema || '.' || t.table_name)::regclass, 'pg_class') AS table_description," if is_postgres}
|
1526
|
+
c.column_name, c.data_type,
|
1527
|
+
COALESCE(c.character_maximum_length, c.numeric_precision) AS max_length,
|
1528
|
+
tc.constraint_type AS const, kcu.constraint_name AS \"key\",
|
1529
|
+
c.is_nullable
|
1530
|
+
FROM INFORMATION_SCHEMA.tables AS t
|
1531
|
+
LEFT OUTER JOIN INFORMATION_SCHEMA.columns AS c ON t.table_schema = c.table_schema
|
1532
|
+
AND t.table_name = c.table_name
|
1533
|
+
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu ON
|
1534
|
+
-- ON kcu.CONSTRAINT_CATALOG = t.table_catalog AND
|
1535
|
+
kcu.CONSTRAINT_SCHEMA = c.table_schema
|
1536
|
+
AND kcu.TABLE_NAME = c.table_name
|
1537
|
+
AND kcu.position_in_unique_constraint IS NULL
|
1538
|
+
AND kcu.ordinal_position = c.ordinal_position
|
1539
|
+
LEFT OUTER JOIN INFORMATION_SCHEMA.table_constraints AS tc
|
1540
|
+
ON kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA
|
1541
|
+
AND kcu.TABLE_NAME = tc.TABLE_NAME
|
1542
|
+
AND kcu.CONSTRAINT_NAME = tc.constraint_name
|
1543
|
+
WHERE t.table_schema NOT IN ('information_schema', #{
|
1544
|
+
is_postgres ? "'pg_catalog'" : "'mysql', 'performance_schema', 'sys'"})#{"
|
1545
|
+
AND t.table_schema = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }
|
1546
|
+
-- AND t.table_type IN ('VIEW') -- 'BASE TABLE', 'FOREIGN TABLE'
|
1547
|
+
AND t.table_name NOT IN ('pg_stat_statements', ?, ?)
|
1548
|
+
ORDER BY 1, t.table_type DESC, 2, c.ordinal_position"
|
1549
|
+
ar_smtn = if ActiveRecord::Base.respond_to?(:schema_migrations_table_name)
|
1550
|
+
ActiveRecord::Base.schema_migrations_table_name
|
1551
|
+
else
|
1552
|
+
'schema_migrations'
|
1553
|
+
end
|
1554
|
+
ar_imtn = ActiveRecord.version >= ::Gem::Version.new('5.0') ? ActiveRecord::Base.internal_metadata_table_name : ''
|
1555
|
+
ActiveRecord::Base.execute_sql(sql, ar_smtn, ar_imtn)
|
1556
|
+
end
|
1540
1557
|
end
|
1541
1558
|
|
1542
1559
|
# ==========================================
|
@@ -150,7 +150,6 @@ module Brick
|
|
150
150
|
", nil, #{path_keys(hm_assoc, hm_fk_name, obj_name, pk)}"
|
151
151
|
end
|
152
152
|
hm_entry << ']'
|
153
|
-
puts hm_entry
|
154
153
|
hms_columns << hm_entry
|
155
154
|
when 'show', 'update'
|
156
155
|
hm_stuff << if hm_fk_name
|
@@ -615,8 +614,9 @@ if (headerTop) {
|
|
615
614
|
});
|
616
615
|
});
|
617
616
|
</script>
|
618
|
-
<% end
|
619
|
-
|
617
|
+
<% end
|
618
|
+
|
619
|
+
%><table id=\"headerTop\">
|
620
620
|
<table id=\"#{table_name}\">
|
621
621
|
<thead><tr>#{"<th x-order=\"#{pk.join(',')}\"></th>" if pk.present?}<%=
|
622
622
|
# Consider getting the name from the association -- hm.first.name -- if a more \"friendly\" alias should be used for a screwy table name
|
data/lib/brick/version_number.rb
CHANGED
@@ -32,6 +32,7 @@ module Brick
|
|
32
32
|
end
|
33
33
|
models = ::Brick.relations.keys.map do |tbl|
|
34
34
|
tbl_parts = tbl.split('.')
|
35
|
+
tbl_parts.shift if [::Brick.default_schema, 'public'].include?(tbl_parts.first)
|
35
36
|
tbl_parts[-1] = tbl_parts[-1].singularize
|
36
37
|
tbl_parts.join('/').camelize
|
37
38
|
end - existing_models.map(&:name)
|
@@ -54,7 +55,7 @@ module Brick
|
|
54
55
|
chosen = gets_list(list: models, chosen: models.dup)
|
55
56
|
relations = ::Brick.relations
|
56
57
|
chosen.each do |model_name|
|
57
|
-
# If we're in a schema then make sure the module file exists
|
58
|
+
# %%% If we're in a schema then make sure the module file exists
|
58
59
|
base_module = if (model_parts = model_name.split('::')).length > 1
|
59
60
|
"::#{model_parts.first}".constantize
|
60
61
|
else
|
@@ -68,7 +69,7 @@ module Brick
|
|
68
69
|
dir << "/#{path_part}"
|
69
70
|
Dir.mkdir(dir) unless Dir.exists?(dir)
|
70
71
|
end
|
71
|
-
File.open("#{dir}/#{path.last}.rb", 'w') { |f| f.write code }
|
72
|
+
File.open("#{dir}/#{path.last}.rb", 'w') { |f| f.write code } unless code.blank?
|
72
73
|
end
|
73
74
|
puts "\n*** Created #{chosen.length} model files under app/models ***"
|
74
75
|
end
|
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.60
|
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-08-
|
11
|
+
date: 2022-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|