strong_migrations 0.4.2 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a77b960928e0167e1842dbd337dc0e47ecae009fec7e6b13cdfba539cb2addc5
4
- data.tar.gz: 154e03c69d7790a81051bf55b0d2a04a0a1ce0ed83d347f5a44f7255f950f794
3
+ metadata.gz: 372efa1cc2267462dd7294cf7d39cd710941b223df3d38ec4d24fd7a91feb7ad
4
+ data.tar.gz: '0139953c4aee0b08a15e9169af644eca36aa3ecd49d5c7c23a678d7423c35233'
5
5
  SHA512:
6
- metadata.gz: 90839d0e1af71af600a220dd689262c6472190d437a61e97da40bd79c7ec5f4d418d45c2b3ff88514e3ab1ceca8cc04bb912f1f3e6553ba3efac53eb6d171992
7
- data.tar.gz: bbf6f7b9645391d8fdaa54b8edf59904d2f75c806bcd7d0940eb762cc102c2355fafa231114d20a1cb8cae603eea807fd654868da3f6f40846a8fe022bd58778
6
+ metadata.gz: b1d8049950bb0a8d38d01479b5a00e6ca9ed80878d2a7b8d21a8217efaf51e7727793d82845c9287c4e18619aa4a36d581b69de47e8ab48f16612ebf9188601c
7
+ data.tar.gz: 7b9f3a70ec40ffa42fe8e2928998de861cca4bcbdb23ad3ad9134b4fea09cc0228439b32cb8ec19910d5faf6f331445ba692bca1b8d0a5681d1d77df78554374
@@ -1,93 +1,99 @@
1
- ## 0.4.2
1
+ ## 0.5.0 (2019-12-05)
2
+
3
+ - Added ability to disable checks
4
+ - Added Postgres-specific check for `change_column_null`
5
+ - Added optional remove index check
6
+
7
+ ## 0.4.2 (2019-10-27)
2
8
 
3
9
  - Allow `add_reference` with concurrent indexes
4
10
 
5
- ## 0.4.1
11
+ ## 0.4.1 (2019-07-12)
6
12
 
7
13
  - Added `target_postgresql_version`
8
14
  - Added `unscoped` to backfill instructions
9
15
 
10
- ## 0.4.0
16
+ ## 0.4.0 (2019-05-27)
11
17
 
12
18
  - Added check for `add_foreign_key`
13
19
  - Fixed instructions for adding default value with NOT NULL constraint
14
20
  - Removed support for Rails 4.2
15
21
 
16
- ## 0.3.1
22
+ ## 0.3.1 (2018-10-18)
17
23
 
18
24
  - Fixed error with `remove_column` and `type` argument
19
25
  - Improved message customization
20
26
 
21
- ## 0.3.0
27
+ ## 0.3.0 (2018-10-15)
22
28
 
23
29
  - Added support for custom checks
24
30
  - Adding a column with a non-null default value is safe in Postgres 11+
25
31
  - Added checks for `add_belongs_to`, `remove_belongs_to`, `remove_columns`, and `remove_reference`
26
32
  - Customized messages
27
33
 
28
- ## 0.2.3
34
+ ## 0.2.3 (2018-07-22)
29
35
 
30
36
  - Added check for `change_column_null`
31
37
  - Added support for alphabetize columns with Makara
32
38
  - Fixed migration reversibility with `auto_analyze`
33
39
 
34
- ## 0.2.2
40
+ ## 0.2.2 (2018-02-14)
35
41
 
36
42
  - Friendlier output
37
43
  - Better method of hooking into ActiveRecord
38
44
 
39
- ## 0.2.1
45
+ ## 0.2.1 (2018-02-07)
40
46
 
41
47
  - Recommend `disable_ddl_transaction!` over `commit_db_transaction`
42
48
  - Suggest `jsonb` over `json` in Postgres 9.4+
43
49
  - Changing `varchar` to `text` is safe in Postgres 9.1+
44
50
  - Do not check number of columns for unique indexes
45
51
 
46
- ## 0.2.0
52
+ ## 0.2.0 (2018-01-07)
47
53
 
48
54
  - Added customizable error messages
49
55
  - Updated instructions for adding a column with a default value
50
56
 
51
- ## 0.1.9
57
+ ## 0.1.9 (2017-06-14)
52
58
 
53
59
  - Added `start_after` option
54
60
 
55
- ## 0.1.8
61
+ ## 0.1.8 (2017-05-31)
56
62
 
57
63
  - Fixed error with `create_table`
58
64
  - Added check for executing arbitrary SQL
59
65
 
60
- ## 0.1.7
66
+ ## 0.1.7 (2017-05-29)
61
67
 
62
68
  - Added check for `force` option with `create_table`
63
69
  - Added `auto_analyze` option
64
70
 
65
- ## 0.1.6
71
+ ## 0.1.6 (2017-03-23)
66
72
 
67
73
  - Adding an index to a newly created table is now safe
68
74
 
69
- ## 0.1.5
75
+ ## 0.1.5 (2016-07-23)
70
76
 
71
77
  - Fixed error with Ruby 2.3 frozen strings
72
78
 
73
- ## 0.1.4
79
+ ## 0.1.4 (2016-03-22)
74
80
 
75
81
  - Added alphabetize columns
76
82
 
77
- ## 0.1.3
83
+ ## 0.1.3 (2016-03-12)
78
84
 
79
85
  - Disabled dangerous rake tasks in production
80
86
  - Added ability to use `SAFETY_ASSURED` env var
81
87
 
82
- ## 0.1.2
88
+ ## 0.1.2 (2016-02-24)
83
89
 
84
90
  - Skip checks on down migrations and rollbacks
85
91
  - Added check for indexes with more than 3 columns
86
92
 
87
- ## 0.1.1
93
+ ## 0.1.1 (2015-11-29)
88
94
 
89
95
  - Fixed `add_index` check for MySQL
90
96
 
91
- ## 0.1.0
97
+ ## 0.1.0 (2015-11-22)
92
98
 
93
99
  - First release
data/README.md CHANGED
@@ -34,10 +34,14 @@ The following operations can cause downtime or errors:
34
34
  - [[+]](#renaming-or-changing-the-type-of-a-column) renaming a column
35
35
  - [[+]](#renaming-a-table) renaming a table
36
36
  - [[+]](#creating-a-table-with-the-force-option) creating a table with the `force` option
37
- - [[+]](#using-change_column_null-with-a-default-value) using `change_column_null` with a default value
37
+ - [[+]](#using-change_column_null) using `change_column_null`
38
38
  - [[+]](#adding-a-json-column) adding a `json` column
39
39
 
40
- Also checks for best practices:
40
+ Optional checks:
41
+
42
+ - [[+]](#removing-an-index) removing an index non-concurrently
43
+
44
+ Best practices:
41
45
 
42
46
  - [[+]](#keeping-non-unique-indexes-to-three-columns-or-less) keeping non-unique indexes to three columns or less
43
47
 
@@ -82,6 +86,8 @@ end
82
86
 
83
87
  ### Adding a column with a default value
84
88
 
89
+ Note: This operation is safe in Postgres 11+.
90
+
85
91
  #### Bad
86
92
 
87
93
  Adding a column with a default value to an existing table causes the entire table to be rewritten.
@@ -94,8 +100,6 @@ class AddSomeColumnToUsers < ActiveRecord::Migration[6.0]
94
100
  end
95
101
  ```
96
102
 
97
- > This operation is safe in Postgres 11+
98
-
99
103
  #### Good
100
104
 
101
105
  Instead, add the column without a default value, then change the default.
@@ -153,7 +157,7 @@ end
153
157
 
154
158
  #### Bad
155
159
 
156
- In Postgres, adding a non-concurrent index locks the table.
160
+ In Postgres, adding an index non-concurrently locks the table.
157
161
 
158
162
  ```ruby
159
163
  class AddSomeIndexToUsers < ActiveRecord::Migration[6.0]
@@ -183,7 +187,7 @@ If you forget `disable_ddl_transaction!`, the migration will fail. Also, note th
183
187
 
184
188
  #### Bad
185
189
 
186
- Rails adds a non-concurrent index to references by default, which is problematic for Postgres.
190
+ Rails adds an index non-concurrently to references by default, which is problematic for Postgres.
187
191
 
188
192
  ```ruby
189
193
  class AddReferenceToUsers < ActiveRecord::Migration[6.0]
@@ -207,13 +211,11 @@ class AddReferenceToUsers < ActiveRecord::Migration[6.0]
207
211
  end
208
212
  ```
209
213
 
210
- For polymorphic references, add a compound index on type and id.
211
-
212
214
  ### Adding a foreign key
213
215
 
214
216
  #### Bad
215
217
 
216
- In Postgres, new foreign keys are validated by default, which acquires an `AccessExclusiveLock` that can be [expensive on large tables](https://travisofthenorth.com/blog/2017/2/2/postgres-adding-foreign-keys-with-zero-downtime).
218
+ In Postgres, new foreign keys are validated by default, which acquires a `ShareRowExclusiveLock` that can be [expensive on large tables](https://travisofthenorth.com/blog/2017/2/2/postgres-adding-foreign-keys-with-zero-downtime).
217
219
 
218
220
  ```ruby
219
221
  class AddForeignKeyOnUsers < ActiveRecord::Migration[6.0]
@@ -359,7 +361,49 @@ class CreateUsers < ActiveRecord::Migration[6.0]
359
361
  end
360
362
  ```
361
363
 
362
- ### Using change_column_null with a default value
364
+ ### Using change_column_null
365
+
366
+ #### Bad
367
+
368
+ In Postgres, setting `NOT NULL` on an existing column requires an `AccessExclusiveLock`, which is expensive on large tables.
369
+
370
+ ```ruby
371
+ class SetSomeColumnNotNull < ActiveRecord::Migration[6.0]
372
+ def change
373
+ change_column_null :users, :some_column, false
374
+ end
375
+ end
376
+ ```
377
+
378
+ #### Good
379
+
380
+ Instead, add a constraint:
381
+
382
+ ```ruby
383
+ class SetSomeColumnNotNull < ActiveRecord::Migration[6.0]
384
+ def change
385
+ safety_assured do
386
+ execute 'ALTER TABLE "users" ADD CONSTRAINT "users_some_column_null" CHECK ("some_column" IS NOT NULL) NOT VALID'
387
+ end
388
+ end
389
+ end
390
+ ```
391
+
392
+ Then validate it in a separate migration.
393
+
394
+ ```ruby
395
+ class ValidateSomeColumnNotNull < ActiveRecord::Migration[6.0]
396
+ def change
397
+ safety_assured do
398
+ execute 'ALTER TABLE "users" VALIDATE CONSTRAINT "users_some_column_null"'
399
+ end
400
+ end
401
+ end
402
+ ```
403
+
404
+ Note: This is not 100% the same as `NOT NULL` column constraint. Here’s a [good explanation](https://medium.com/doctolib/adding-a-not-null-constraint-on-pg-faster-with-minimal-locking-38b2c00c4d1c).
405
+
406
+ ### Using change_column_null with a default value (non-Postgres)
363
407
 
364
408
  #### Bad
365
409
 
@@ -385,11 +429,13 @@ class ChangeSomeColumnNull < ActiveRecord::Migration[6.0]
385
429
  end
386
430
  ```
387
431
 
432
+ Note: In Postgres, `change_column_null` is still [not safe](#using-change_column_null) with this method.
433
+
388
434
  ### Adding a json column
389
435
 
390
436
  #### Bad
391
437
 
392
- In Postgres, there’s no equality operator for the `json` column type, which causes issues for `SELECT DISTINCT` queries.
438
+ In Postgres, there’s no equality operator for the `json` column type, which can cause errors for existing `SELECT DISTINCT` queries.
393
439
 
394
440
  ```ruby
395
441
  class AddPropertiesToUsers < ActiveRecord::Migration[6.0]
@@ -411,6 +457,48 @@ class AddPropertiesToUsers < ActiveRecord::Migration[6.0]
411
457
  end
412
458
  ```
413
459
 
460
+ ## Optional Checks
461
+
462
+ Some operations rarely cause issues in practice, but can be checked if desired. Enable checks with:
463
+
464
+ ```ruby
465
+ StrongMigrations.enable_check(:remove_index)
466
+ ```
467
+
468
+ To start a check only after a specific migration, use:
469
+
470
+ ```ruby
471
+ StrongMigrations.enable_check(:remove_index, start_after: 20170101000000)
472
+ ```
473
+
474
+ ### Removing an index
475
+
476
+ #### Bad
477
+
478
+ In Postgres, removing an index non-concurrently locks the table for a brief period.
479
+
480
+ ```ruby
481
+ class RemoveSomeIndexFromUsers < ActiveRecord::Migration[6.0]
482
+ def change
483
+ remove_index :users, :some_column
484
+ end
485
+ end
486
+ ```
487
+
488
+ #### Good
489
+
490
+ Remove indexes concurrently.
491
+
492
+ ```ruby
493
+ class RemoveSomeIndexFromUsers < ActiveRecord::Migration[6.0]
494
+ disable_ddl_transaction!
495
+
496
+ def change
497
+ remove_index :users, column: :some_column, algorithm: :concurrently
498
+ end
499
+ end
500
+ ```
501
+
414
502
  ## Best Practices
415
503
 
416
504
  ### Keeping non-unique indexes to three columns or less
@@ -439,7 +527,7 @@ class AddSomeIndexToUsers < ActiveRecord::Migration[6.0]
439
527
  end
440
528
  ```
441
529
 
442
- > For Postgres, be sure to add them concurrently
530
+ For Postgres, be sure to add them concurrently.
443
531
 
444
532
  ## Assuring Safety
445
533
 
@@ -469,7 +557,17 @@ end
469
557
 
470
558
  Use the `stop!` method to stop migrations.
471
559
 
472
- > Since `remove_column` always requires a `safety_assured` block, it’s not possible to add a custom check for `remove_column` operations
560
+ Note: Since `remove_column` always requires a `safety_assured` block, it’s not possible to add a custom check for `remove_column` operations.
561
+
562
+ ## Disable Checks
563
+
564
+ Disable specific checks with:
565
+
566
+ ```ruby
567
+ StrongMigrations.disable_check(:add_index)
568
+ ```
569
+
570
+ Check the [source code](https://github.com/ankane/strong_migrations/blob/master/lib/strong_migrations.rb) for the list of keys.
473
571
 
474
572
  ## Existing Migrations
475
573
 
@@ -500,7 +598,7 @@ ActiveRecord::Base.dump_schema_after_migration = Rails.env.development? &&
500
598
 
501
599
  ## Schema Sanity
502
600
 
503
- Columns can flip order in `db/schema.rb` when you have multiple developers. One way to prevent this is to [alphabetize them](https://www.pgrs.net/2008/03/13/alphabetize-schema-rb-columns/). Add to the end of your `Rakefile`:
601
+ Columns can flip order in `db/schema.rb` when you have multiple developers. One way to prevent this is to [alphabetize them](https://www.pgrs.net/2008/03/12/alphabetize-schema-rb-columns/). Add to the end of your `Rakefile`:
504
602
 
505
603
  ```ruby
506
604
  task "db:schema:dump": "strong_migrations:alphabetize_columns"
@@ -9,7 +9,7 @@ require "strong_migrations/version"
9
9
 
10
10
  module StrongMigrations
11
11
  class << self
12
- attr_accessor :auto_analyze, :start_after, :checks, :error_messages, :target_postgresql_version
12
+ attr_accessor :auto_analyze, :start_after, :checks, :error_messages, :target_postgresql_version, :enabled_checks
13
13
  end
14
14
  self.auto_analyze = false
15
15
  self.start_after = 0
@@ -41,8 +41,8 @@ class Backfill%{migration_name} < ActiveRecord::Migration%{migration_suffix}
41
41
  end%{append}",
42
42
 
43
43
  add_column_json:
44
- "There's no equality operator for the json column type, which
45
- causes issues for SELECT DISTINCT queries. Use jsonb instead.",
44
+ "There's no equality operator for the json column type, which can
45
+ cause errors for existing SELECT DISTINCT queries. Use jsonb instead.",
46
46
 
47
47
  change_column:
48
48
  "Changing the type of an existing column requires the entire
@@ -91,7 +91,7 @@ end",
91
91
  6. Drop the old table",
92
92
 
93
93
  add_reference:
94
- "Adding a non-concurrent index locks the table. Instead, use:
94
+ "Adding an index non-concurrently locks the table. Instead, use:
95
95
 
96
96
  class %{migration_name} < ActiveRecord::Migration%{migration_suffix}
97
97
  disable_ddl_transaction!
@@ -102,7 +102,18 @@ class %{migration_name} < ActiveRecord::Migration%{migration_suffix}
102
102
  end",
103
103
 
104
104
  add_index:
105
- "Adding a non-concurrent index locks the table. Instead, use:
105
+ "Adding an index non-concurrently locks the table. Instead, use:
106
+
107
+ class %{migration_name} < ActiveRecord::Migration%{migration_suffix}
108
+ disable_ddl_transaction!
109
+
110
+ def change
111
+ %{command}
112
+ end
113
+ end",
114
+
115
+ remove_index:
116
+ "Removing an index non-concurrently locks the table. Instead, use:
106
117
 
107
118
  class %{migration_name} < ActiveRecord::Migration%{migration_suffix}
108
119
  disable_ddl_transaction!
@@ -144,6 +155,23 @@ class Backfill%{migration_name} < ActiveRecord::Migration%{migration_suffix}
144
155
  end
145
156
  end",
146
157
 
158
+ change_column_null_postgresql:
159
+ "Setting NOT NULL on a column requires an AccessExclusiveLock,
160
+ which is expensive on large tables. Instead, use a constraint and
161
+ validate it in a separate migration with a more agreeable RowShareLock.
162
+
163
+ class %{migration_name} < ActiveRecord::Migration%{migration_suffix}
164
+ def change
165
+ %{add_constraint_code}
166
+ end
167
+ end
168
+
169
+ class Validate%{migration_name} < ActiveRecord::Migration%{migration_suffix}
170
+ def change
171
+ %{validate_constraint_code}
172
+ end
173
+ end",
174
+
147
175
  add_foreign_key:
148
176
  "New foreign keys are validated by default. This acquires an AccessExclusiveLock,
149
177
  which is expensive on large tables. Instead, validate it in a separate migration
@@ -161,10 +189,28 @@ class Validate%{migration_name} < ActiveRecord::Migration%{migration_suffix}
161
189
  end
162
190
  end",
163
191
  }
192
+ self.enabled_checks = (error_messages.keys - [:remove_index]).map { |k| [k, {}] }.to_h
164
193
 
165
194
  def self.add_check(&block)
166
195
  checks << block
167
196
  end
197
+
198
+ def self.enable_check(check, start_after: nil)
199
+ enabled_checks[check] = {start_after: start_after}
200
+ end
201
+
202
+ def self.disable_check(check)
203
+ enabled_checks.delete(check)
204
+ end
205
+
206
+ def self.check_enabled?(check, version: nil)
207
+ if enabled_checks[check]
208
+ start_after = enabled_checks[check][:start_after] || StrongMigrations.start_after
209
+ !version || version > start_after
210
+ else
211
+ false
212
+ end
213
+ end
168
214
  end
169
215
 
170
216
  ActiveSupport.on_load(:active_record) do
@@ -59,9 +59,19 @@ module StrongMigrations
59
59
  if columns.is_a?(Array) && columns.size > 3 && !options[:unique]
60
60
  raise_error :add_index_columns, header: "Best practice"
61
61
  end
62
- if postgresql? && options[:algorithm] != :concurrently && !@new_tables.include?(table.to_s)
62
+ if postgresql? && options[:algorithm] != :concurrently && !new_table?(table)
63
63
  raise_error :add_index, command: command_str("add_index", [table, columns, options.merge(algorithm: :concurrently)])
64
64
  end
65
+ when :remove_index
66
+ table, options = args
67
+ unless options.is_a?(Hash)
68
+ options = {column: options}
69
+ end
70
+ options ||= {}
71
+
72
+ if postgresql? && options[:algorithm] != :concurrently && !new_table?(table)
73
+ raise_error :remove_index, command: command_str("remove_index", [table, options.merge(algorithm: :concurrently)])
74
+ end
65
75
  when :add_column
66
76
  table, column, type, options = args
67
77
  options ||= {}
@@ -73,13 +83,7 @@ module StrongMigrations
73
83
  options = options.except(:null)
74
84
  append = "
75
85
 
76
- Then add the NOT NULL constraint.
77
-
78
- class %{migration_name}NotNull < ActiveRecord::Migration%{migration_suffix}
79
- def change
80
- #{command_str("change_column_null", [table, column, false])}
81
- end
82
- end"
86
+ Then add the NOT NULL constraint."
83
87
  end
84
88
 
85
89
  raise_error :add_column_default,
@@ -133,9 +137,18 @@ end"
133
137
  raise_error :execute, header: "Possibly dangerous operation"
134
138
  when :change_column_null
135
139
  table, column, null, default = args
136
- if !null && !default.nil?
137
- raise_error :change_column_null,
138
- code: backfill_code(table, column, default)
140
+ if !null
141
+ if postgresql?
142
+ # match https://github.com/nullobject/rein
143
+ constraint_name = "#{table}_#{column}_null"
144
+
145
+ raise_error :change_column_null_postgresql,
146
+ add_constraint_code: constraint_str("ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s IS NOT NULL) NOT VALID", [table, constraint_name, column]),
147
+ validate_constraint_code: constraint_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [table, constraint_name])
148
+ elsif !default.nil?
149
+ raise_error :change_column_null,
150
+ code: backfill_code(table, column, default)
151
+ end
139
152
  end
140
153
  when :add_foreign_key
141
154
  from_table, to_table, options = args
@@ -159,8 +172,8 @@ end"
159
172
  fk_name = options[:name] || "fk_rails_#{hashed_identifier}"
160
173
 
161
174
  raise_error :add_foreign_key,
162
- add_foreign_key_code: foreign_key_str("ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s) NOT VALID", [from_table, fk_name, column, to_table, primary_key]),
163
- validate_foreign_key_code: foreign_key_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [from_table, fk_name])
175
+ add_foreign_key_code: constraint_str("ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s) NOT VALID", [from_table, fk_name, column, to_table, primary_key]),
176
+ validate_foreign_key_code: constraint_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [from_table, fk_name])
164
177
  end
165
178
  end
166
179
  end
@@ -214,6 +227,8 @@ end"
214
227
  end
215
228
 
216
229
  def raise_error(message_key, header: nil, **vars)
230
+ return unless StrongMigrations.check_enabled?(message_key, version: version)
231
+
217
232
  message = StrongMigrations.error_messages[message_key] || "Missing message"
218
233
 
219
234
  vars[:migration_name] = self.class.name
@@ -229,7 +244,7 @@ end"
229
244
  @migration.stop!(message.gsub(/%(?!{)/, "%%") % vars, header: header || "Dangerous operation detected")
230
245
  end
231
246
 
232
- def foreign_key_str(statement, identifiers)
247
+ def constraint_str(statement, identifiers)
233
248
  # not all identifiers are tables, but this method of quoting should be fine
234
249
  code = statement % identifiers.map { |v| connection.quote_table_name(v) }
235
250
  "safety_assured do\n execute '#{code}' \n end"
@@ -262,5 +277,9 @@ end"
262
277
  model = table.to_s.classify
263
278
  "#{model}.unscoped.in_batches do |relation| \n relation.update_all #{column}: #{default.inspect}\n sleep(0.1)\n end"
264
279
  end
280
+
281
+ def new_table?(table)
282
+ @new_tables.include?(table.to_s)
283
+ end
265
284
  end
266
285
  end
@@ -1,3 +1,3 @@
1
1
  module StrongMigrations
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_migrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-10-28 00:00:00.000000000 Z
13
+ date: 2019-12-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord