brick 1.0.55 → 1.0.56

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 430a2dfa5ef0caee9b99bc341ccd42a9d29e8f1d54071284aa2469e1baa0c659
4
- data.tar.gz: b36e18de169bd9032e6c383548ec30cce06eeb97a35e8c3e4f4da935aff8f603
3
+ metadata.gz: b696c53c9d9d359d49de147b06b5342820ca230451c860d097f44bcae3b23bb0
4
+ data.tar.gz: 7b0f6ff365f918a97d64305eabf70fcfe78cf764514ca22b3731b780da04b22c
5
5
  SHA512:
6
- metadata.gz: c51491575b9ee56c3789619bfc74a2d9c0525750687224e94e120cbae42fad8db1abda9d82978115d9266c55fa0c6f914ce273a3613915657d8a0cf4e7fe6aeb
7
- data.tar.gz: a0646cfdc9a2c844fd1149968d0175346c48835c6245d7fe92d0126d60708cf76514704e29dc3f506d2e06e546c8c995bf7103d6ef42be481bb931b4d2bfa73f
6
+ metadata.gz: 43ab6db28554fb7502d0f03267d2f5bab27d310fb988701d371232f6604090cd679767a12097a7c217401b05e938c787844ae11138a2c8143c1e675b93599656
7
+ data.tar.gz: 8d2e592ba27bba30e100ea23a2bf951d6f3861c422ef355bad7cd38e146c20c2cf53380aa7ee440f40aa2d111c7f33eadc8dc09f73d1689432fff071e04228c4
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 55
8
+ TINY = 56
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
@@ -87,6 +87,8 @@ module Brick
87
87
  done = []
88
88
  fks = {}
89
89
  stuck = {}
90
+ indexes = {} # Track index names to make sure things are unique
91
+ versions = [] # Resulting versions to be used when updating the schema_migrations table
90
92
  # Start by making migrations for fringe tables (those with no foreign keys).
91
93
  # Continue layer by layer, creating migrations for tables that reference ones already done, until
92
94
  # no more migrations can be created. (At that point hopefully all tables are accounted for.)
@@ -134,14 +136,29 @@ module Brick
134
136
  ', id: :bigserial'
135
137
  else
136
138
  ", id: :#{SQL_TYPES[pkey_col_first] || pkey_col_first}" # Something like: id: :integer, primary_key: :businessentityid
137
- end + (pkey_cols.first ? ", primary_key: :#{pkey_cols.first}" : '')
139
+ end +
140
+ (pkey_cols.first ? ", primary_key: :#{pkey_cols.first}" : '') +
141
+ (!is_4x_rails && (comment = relation&.fetch(:description, nil))&.present? ? ", comment: #{comment.inspect}" : '')
138
142
  end
139
143
  end
144
+ # Find the ActiveRecord class in order to see if the columns have comments
145
+ unless is_4x_rails
146
+ klass = begin
147
+ tbl.tr('.', '/').singularize.camelize.constantize
148
+ rescue StandardError
149
+ end
150
+ if klass
151
+ unless ActiveRecord::Migration.table_exists?(klass.table_name)
152
+ puts "WARNING: Unable to locate table #{klass.table_name} (for #{klass.name})."
153
+ klass = nil
154
+ end
155
+ end
156
+ end
140
157
  # Refer to this table name as a symbol or dotted string as appropriate
141
- tbl = tbl_parts.length == 1 ? ":#{tbl_parts.first}" : "'#{tbl}'"
142
- mig << " def change\n return unless reverting? || !table_exists?(#{tbl})\n\n"
158
+ tbl_code = tbl_parts.length == 1 ? ":#{tbl_parts.first}" : "'#{tbl}'"
159
+ mig << " def change\n return unless reverting? || !table_exists?(#{tbl_code})\n\n"
143
160
  mig << " create_schema :#{schema} unless schema_exists?(:#{schema})\n" if schema
144
- mig << " create_table #{tbl}#{id_option} do |t|\n"
161
+ mig << " create_table #{tbl_code}#{id_option} do |t|\n"
145
162
  possible_ts = [] # Track possible generic timestamps
146
163
  add_fks = [] # Track foreign keys to add after table creation
147
164
  relation[:cols].each do |col, col_type|
@@ -156,6 +173,9 @@ module Brick
156
173
 
157
174
  sql_type ||= col_type.first
158
175
  suffix = col_type[3] ? +', null: false' : +''
176
+ if !is_4x_rails && klass && (comment = klass.columns_hash.fetch(col, nil)&.comment)&.present?
177
+ suffix << ", comment: #{comment.inspect}"
178
+ end
159
179
  # Determine if this column is used as part of a foreign key
160
180
  if fk = fkey_cols.find { |assoc| col == assoc[:fk] }
161
181
  to_table = fk[:inverse_table].split('.')
@@ -166,6 +186,18 @@ module Brick
166
186
  add_fks << [to_table, column, ::Brick.relations[fk[:inverse_table]]]
167
187
  else
168
188
  suffix << ", type: :#{sql_type}" unless sql_type == key_type
189
+ # Will the resulting default index name be longer than what Postgres allows? (63 characters)
190
+ if (idx_name = ActiveRecord::Base.connection.index_name(tbl, {column: col})).length > 63
191
+ # Try to find a shorter name that hasn't been used yet
192
+ unless indexes.key?(shorter = idx_name[0..62]) ||
193
+ indexes.key?(shorter = idx_name.tr('_', '')[0..62]) ||
194
+ indexes.key?(shorter = idx_name.tr('aeio', '')[0..62])
195
+ puts "Unable to easily find unique name for index #{idx_name} that is shorter than 64 characters,"
196
+ puts "so have resorted to this GUID-based identifier: #{shorter = "#{tbl[0..25]}_#{::SecureRandom.uuid}"}."
197
+ end
198
+ suffix << ", index: { name: '#{shorter || idx_name}' }"
199
+ indexes[shorter || idx_name] = nil
200
+ end
169
201
  mig << " t.references :#{fk[:assoc_name]}#{suffix}, foreign_key: { to_table: #{to_table} }\n"
170
202
  end
171
203
  else
@@ -190,11 +222,12 @@ module Brick
190
222
  pk = (add_fk[2][:cols].key?(add_fk[1]) && add_fk[1]) || '???'
191
223
  end
192
224
  # to_table column
193
- mig << " #{'# ' if is_commented}add_foreign_key #{tbl}, #{add_fk[0]}, column: :#{add_fk[1]}, primary_key: :#{pk}\n"
225
+ mig << " #{'# ' if is_commented}add_foreign_key #{tbl_code}, #{add_fk[0]}, column: :#{add_fk[1]}, primary_key: :#{pk}\n"
194
226
  end
195
227
  mig << " end\nend\n"
196
228
  current_mig_time += 1.minute
197
- File.open("#{mig_path}/#{current_mig_time.strftime('%Y%m%d%H%M00')}_create_#{full_table_name}.rb", "w") { |f| f.write mig }
229
+ versions << (version = current_mig_time.strftime('%Y%m%d%H%M00'))
230
+ File.open("#{mig_path}/#{version}_create_#{full_table_name}.rb", "w") { |f| f.write mig }
198
231
  end
199
232
  done.concat(fringe)
200
233
  chosen -= done
@@ -209,13 +242,17 @@ module Brick
209
242
  if mig_path.start_with?(cur_path = ::Rails.root.to_s)
210
243
  pretty_mig_path = mig_path[cur_path.length..-1]
211
244
  end
212
- puts "*** Created #{done.length} migration files under #{pretty_mig_path || mig_path} ***"
245
+ puts "\n*** Created #{done.length} migration files under #{pretty_mig_path || mig_path} ***"
213
246
  if (stuck_sorted = stuck_counts.to_a.sort { |a, b| b.last <=> a.last }).length.positive?
214
247
  puts "-----------------------------------------"
215
248
  puts "Unable to create migrations for #{stuck_sorted.length} tables#{
216
249
  ". Here's the top 5 blockers" if stuck_sorted.length > 5
217
250
  }:"
218
251
  pp stuck_sorted[0..4]
252
+ else # Successful, and now we can update the schema_migrations table accordingly
253
+ ActiveRecord::Base.execute_sql("INSERT INTO #{ActiveRecord::Base.schema_migrations_table_name} (version) VALUES #{
254
+ versions.map { |version| "('#{version}')" }.join(', ')
255
+ }")
219
256
  end
220
257
  end
221
258
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.55
4
+ version: 1.0.56
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits