ridgepole 3.0.3 → 3.1.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: 5d9ad7e2017aa2af02dd9f0fb5c45cdc7fd1a4f3925778e966246589e352d5ea
4
- data.tar.gz: b07a08f0001ed86483597794962e0293be0dc609b7c0a5fdc4425c28c10b8b49
3
+ metadata.gz: d387024f72e2f0cadf0c913d9d6d1863753401ed8cdd35759effd47e5405d3fd
4
+ data.tar.gz: ed16c2c4ce6e91797eba24c94384dc2e03db5e39ca18e9119daa4e19a67bd97e
5
5
  SHA512:
6
- metadata.gz: 5747b6d95e0fb69c35c40508935d5474f1ed3750d09354218cfdda6a35de7b5ecbe2a45307bcdca718f2d15a1af12e9c7d95271837c1ae46e0903def31568e09
7
- data.tar.gz: 1ca608fb67b6fcfb6b21fd2c2d4a6fd354a1f7e93333c7e183b5af01a7fbf711693ba4910a43019145d342cb311523c6b54395c5afceb5624b36fddb7a0d361d
6
+ metadata.gz: ea58375d9d0f3aa45084f08dabdea2719bbdd973229214dd60388fdd375d05dc3814b9131afb48a0c3b445b505a23f7c25b99a27f255549db81abf948a88a04e
7
+ data.tar.gz: 692d7e680804f86feab03fdebf1aa8f0f88af8f752e04cafec57a5406be64240114d6327a1651a74dae483d31336d0ab09b0f566524f8bd7f133a3e0e9862bb7
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## 3.0
4
4
 
5
+ ### 3.1.0 (2025/10/30)
6
+
7
+ - Support Rails 8.1 [pull#589](https://github.com/ridgepole/ridgepole/pull/589)
8
+ - Support for migrating PostgreSQL table comments [pull#587](https://github.com/ridgepole/ridgepole/pull/587)
9
+
10
+ ### 3.0.4 (2025/08/31)
11
+
12
+ - Fix checking foreign key without index [pull#571](https://github.com/ridgepole/ridgepole/pull/571)
13
+ - Use `change_column_comment` for comment-only column changes [pull#567](https://github.com/ridgepole/ridgepole/pull/567)
14
+
5
15
  ### 3.0.3 (2025/07/23)
6
16
 
7
17
  - Fix for index `algorithm` option [pull#555](https://github.com/ridgepole/ridgepole/pull/555)
data/README.md CHANGED
@@ -181,6 +181,13 @@ create_table "user_comments", force: :cascade, renamed_from: "comments" do |t|
181
181
  end
182
182
  ```
183
183
 
184
+ > [!note]
185
+ > When using `renamed_from` on a table, Ridgepole will only perform the rename operation. All other changes to that table (columns, indexes, foreign keys, etc.) will not be detected during the same migration.
186
+ >
187
+ > If you need to rename AND modify a table, do it in two separate steps:
188
+ > 1. First migration: Add `renamed_from` to rename the table
189
+ > 2. Second migration: Remove `renamed_from` and apply your desired changes
190
+
184
191
  ## Foreign Key
185
192
  ```ruby
186
193
  create_table "parent", force: :cascade do |t|
@@ -329,6 +336,42 @@ Apply `Schemafile`
329
336
  ...
330
337
  ```
331
338
 
339
+ ## Define a partial index in PostgreSQL
340
+
341
+ Partial indexes in PostgreSQL are normalized so differences are always detected.
342
+
343
+ ```ruby
344
+ create_table "users", id: :serial, force: :cascade do |t|
345
+ t.text "email"
346
+ t.text "name"
347
+ t.index ["email"], name: "idx_users_email", unique: true, where: "email is not null"
348
+ end
349
+ ```
350
+
351
+ ```sh
352
+ % ridgepole -a -c database.yml --dry-run --verbose
353
+ Apply `Schemafile` (dry-run)
354
+ # Parse DSL
355
+ # ...
356
+ # Compare definitions
357
+ # users
358
+ :options=>
359
+ {:name=>"idx_users_email",
360
+ :unique=>true,
361
+ - :where=>"(email IS NOT NULL)"}}},
362
+ + :where=>"email is not null"}}},
363
+ :options=>{:id=>:serial}}
364
+ ```
365
+
366
+ Use a normalized WHERE clause to avoid detecting differences.
367
+
368
+ ```ruby
369
+ #t.index ["email"], name: "idx_users_email", unique: true, where: "email is not null"
370
+ t.index ["email"], name: "idx_users_email", unique: true, where: "(email IS NOT NULL)"
371
+ ```
372
+
373
+ see https://github.com/ridgepole/ridgepole/issues/568
374
+
332
375
  ## Run tests
333
376
 
334
377
 
data/bin/ridgepole CHANGED
@@ -139,6 +139,7 @@ ARGV.options do |opt|
139
139
  opt.on('', '--drop-table-only') { options[:drop_table_only] = true }
140
140
  opt.on('', '--mysql-change-table-options') { options[:mysql_change_table_options] = true }
141
141
  opt.on('', '--mysql-change-table-comment') { options[:mysql_change_table_comment] = true }
142
+ opt.on('', '--pg-change-table-comment') { options[:postgresql_change_table_comment] = true }
142
143
  opt.on('', '--check-relation-type DEF_PK') { |v| options[:check_relation_type] = v }
143
144
  opt.on('', '--ignore-table-comment') { options[:ignore_table_comment] = true }
144
145
  opt.on('', '--skip-column-comment-change') { options[:skip_column_comment_change] = true }
@@ -3,14 +3,15 @@
3
3
  module Ridgepole
4
4
  class DefaultsLimit
5
5
  DEFAULT_LIMIT_FOR_MYSQL = {
6
- boolean: 1,
7
6
  integer: 4,
8
7
  bigint: 8,
9
8
  float: 24,
10
9
  string: 255,
11
10
  text: 65_535,
12
11
  binary: 65_535,
13
- }.freeze
12
+ }.tap do |limits|
13
+ limits[:boolean] = 1 if ActiveRecord.gem_version < Gem::Version.new('8.1.0.beta1')
14
+ end.freeze
14
15
 
15
16
  DEFAULTS_LIMITS = {
16
17
  mysql2: DEFAULT_LIMIT_FOR_MYSQL,
@@ -328,8 +328,14 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
328
328
  end
329
329
 
330
330
  def append_change_table_comment(table_name, table_comment, buf)
331
- comment_literal = "COMMENT=#{ActiveRecord::Base.connection.quote(table_comment)}"
332
- append_change_table_options(table_name, comment_literal, buf)
331
+ if Ridgepole::ConnectionAdapters.postgresql?
332
+ buf.puts(<<-RUBY)
333
+ change_table_comment(#{table_name.inspect}, #{table_comment.inspect})
334
+ RUBY
335
+ else
336
+ comment_literal = "COMMENT=#{ActiveRecord::Base.connection.quote(table_comment)}"
337
+ append_change_table_options(table_name, comment_literal, buf)
338
+ end
333
339
  end
334
340
 
335
341
  def append_change(table_name, attrs, buf, pre_buf_for_fk, post_buf_for_fk)
@@ -344,6 +350,7 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
344
350
  table_charset = attrs[:table_charset]
345
351
  table_collation = attrs[:table_collation]
346
352
  table_comment = attrs[:table_comment]
353
+ column_comments = attrs[:column_comments] || {}
347
354
 
348
355
  if !definition.empty? || !indices.empty? || !primary_key_definition.empty?
349
356
  append_change_table(table_name, buf) do
@@ -365,12 +372,21 @@ execute "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name
365
372
  end
366
373
 
367
374
  append_change_table_comment(table_name, table_comment, buf) if table_comment
375
+ append_change_column_comments(table_name, column_comments, buf) unless column_comments.empty?
368
376
 
369
377
  buf.puts
370
378
  pre_buf_for_fk.puts
371
379
  post_buf_for_fk.puts
372
380
  end
373
381
 
382
+ def append_change_column_comments(table_name, column_comments, buf)
383
+ column_comments.each do |column_name, comment|
384
+ buf.puts(<<-RUBY)
385
+ change_column_comment(#{table_name.inspect}, #{column_name.inspect}, #{comment.inspect})
386
+ RUBY
387
+ end
388
+ end
389
+
374
390
  def append_change_table(table_name, buf)
375
391
  buf.puts "change_table(#{table_name.inspect}, bulk: true) do |t|" if @options[:bulk_change]
376
392
  yield
@@ -428,7 +444,7 @@ rename_column(#{table_name.inspect}, #{from_column_name.inspect}, #{to_column_na
428
444
  options = attrs[:options] || {}
429
445
 
430
446
  # Fix for https://github.com/rails/rails/commit/7f0567b43b73b1bd1a16bfac9cd32fcbf1321b51
431
- if Ridgepole::ConnectionAdapters.mysql? && ActiveRecord::VERSION::STRING !~ /\A5\.0\./
447
+ if Ridgepole::ConnectionAdapters.mysql?
432
448
  options[:comment] = nil unless options.key?(:comment)
433
449
  end
434
450
 
@@ -157,6 +157,14 @@ module Ridgepole
157
157
  end
158
158
  end
159
159
 
160
+ if Ridgepole::ConnectionAdapters.postgresql?
161
+ if @options[:postgresql_change_table_comment] && (from[:comment] != to[:comment])
162
+ from.delete(:comment)
163
+ to_comment = to.delete(:comment)
164
+ table_delta[:table_comment] = to_comment
165
+ end
166
+ end
167
+
160
168
  if @options[:dump_without_table_options]
161
169
  from.delete(:options)
162
170
  from.delete(:charset)
@@ -234,6 +242,7 @@ module Ridgepole
234
242
  from = (from || {}).dup
235
243
  to = (to || {}).dup
236
244
  definition_delta = {}
245
+ column_comments = {}
237
246
 
238
247
  scan_column_rename(from, to, definition_delta)
239
248
 
@@ -249,10 +258,14 @@ module Ridgepole
249
258
  next if ignore_column
250
259
 
251
260
  if from_attrs
252
- to_attrs = build_attrs_if_changed(to_attrs, from_attrs)
253
- if to_attrs
254
- definition_delta[:change] ||= {}
255
- definition_delta[:change][column_name] = to_attrs
261
+ changed_attrs = build_attrs_if_changed(to_attrs, from_attrs)
262
+ if changed_attrs
263
+ if comment_only_change?(from_attrs, to_attrs)
264
+ column_comments[column_name] = to_attrs[:options][:comment]
265
+ else
266
+ definition_delta[:change] ||= {}
267
+ definition_delta[:change][column_name] = changed_attrs
268
+ end
256
269
  end
257
270
  else
258
271
  definition_delta[:add] ||= {}
@@ -307,6 +320,7 @@ module Ridgepole
307
320
  end
308
321
 
309
322
  table_delta[:definition] = definition_delta unless definition_delta.empty?
323
+ table_delta[:column_comments] = column_comments unless column_comments.empty?
310
324
  end
311
325
 
312
326
  def scan_column_rename(from, to, definition_delta)
@@ -626,6 +640,19 @@ module Ridgepole
626
640
  attrs1 == attrs2
627
641
  end
628
642
 
643
+ def comment_only_change?(attrs1, attrs2)
644
+ return false if @options[:skip_column_comment_change]
645
+
646
+ attrs1 = attrs1.merge(options: attrs1.fetch(:options, {}).dup)
647
+ attrs2 = attrs2.merge(options: attrs2.fetch(:options, {}).dup)
648
+ normalize_default_proc_options!(attrs1[:options], attrs2[:options])
649
+
650
+ comment1 = attrs1.fetch(:options).delete(:comment)
651
+ comment2 = attrs2.fetch(:options).delete(:comment)
652
+
653
+ attrs1 == attrs2 && comment1 != comment2
654
+ end
655
+
629
656
  def normalize_default_proc_options!(opts1, opts2)
630
657
  if opts1[:default].is_a?(Proc) && opts2[:default].is_a?(Proc)
631
658
  opts1[:default] = opts1[:default].call
@@ -31,8 +31,9 @@ module Ridgepole
31
31
  end
32
32
 
33
33
  def check_foreign_key_without_index(table_name, attrs)
34
+ return if Ridgepole::ConnectionAdapters.postgresql?
34
35
  return unless attrs[:foreign_keys]
35
- return unless attrs[:options][:options]&.include?('ENGINE=InnoDB')
36
+ return unless innodb_table?(attrs)
36
37
 
37
38
  attrs[:foreign_keys].each_value do |foreign_key_attrs|
38
39
  fk_index = foreign_key_attrs[:options][:column] || "#{foreign_key_attrs[:to_table].singularize}_id"
@@ -53,5 +54,10 @@ module Ridgepole
53
54
  Array(index_column_name).first == fk_index
54
55
  end
55
56
  end
57
+
58
+ def innodb_table?(attrs)
59
+ engine = attrs[:options][:options]&.match(/ENGINE=([^ ]+)/) && Regexp.last_match(1)
60
+ engine.nil? || engine == 'InnoDB'
61
+ end
56
62
  end
57
63
  end
@@ -3,6 +3,7 @@
3
3
  module Ridgepole
4
4
  class Logger < ::Logger
5
5
  include Singleton
6
+
6
7
  cattr_accessor :verbose
7
8
 
8
9
  def initialize
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ridgepole
4
- VERSION = '3.0.3'
4
+ VERSION = '3.1.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridgepole
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -18,7 +18,7 @@ dependencies:
18
18
  version: '6.1'
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
- version: '8.1'
21
+ version: '8.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -28,7 +28,7 @@ dependencies:
28
28
  version: '6.1'
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
- version: '8.1'
31
+ version: '8.2'
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: diffy
34
34
  requirement: !ruby/object:Gem::Requirement
@@ -217,28 +217,28 @@ dependencies:
217
217
  requirements:
218
218
  - - ">="
219
219
  - !ruby/object:Gem::Version
220
- version: 0.1.3
220
+ version: 0.2.0
221
221
  type: :development
222
222
  prerelease: false
223
223
  version_requirements: !ruby/object:Gem::Requirement
224
224
  requirements:
225
225
  - - ">="
226
226
  - !ruby/object:Gem::Version
227
- version: 0.1.3
227
+ version: 0.2.0
228
228
  - !ruby/object:Gem::Dependency
229
229
  name: rubocop
230
230
  requirement: !ruby/object:Gem::Requirement
231
231
  requirements:
232
232
  - - '='
233
233
  - !ruby/object:Gem::Version
234
- version: 1.78.0
234
+ version: 1.81.6
235
235
  type: :development
236
236
  prerelease: false
237
237
  version_requirements: !ruby/object:Gem::Requirement
238
238
  requirements:
239
239
  - - '='
240
240
  - !ruby/object:Gem::Version
241
- version: 1.78.0
241
+ version: 1.81.6
242
242
  - !ruby/object:Gem::Dependency
243
243
  name: rubocop-rake
244
244
  requirement: !ruby/object:Gem::Requirement
@@ -318,22 +318,10 @@ executables:
318
318
  extensions: []
319
319
  extra_rdoc_files: []
320
320
  files:
321
- - ".rspec"
322
- - ".rubocop.yml"
323
- - ".simplecov"
324
- - Appraisals
325
321
  - CHANGELOG.md
326
- - Gemfile
327
322
  - LICENSE.txt
328
323
  - README.md
329
- - Rakefile
330
324
  - bin/ridgepole
331
- - compose.yml
332
- - gemfiles/activerecord_6.1.gemfile
333
- - gemfiles/activerecord_7.0.gemfile
334
- - gemfiles/activerecord_7.1.gemfile
335
- - gemfiles/activerecord_7.2.gemfile
336
- - gemfiles/activerecord_8.0.gemfile
337
325
  - lib/ridgepole.rb
338
326
  - lib/ridgepole/cli/config.rb
339
327
  - lib/ridgepole/client.rb
@@ -356,7 +344,6 @@ files:
356
344
  - lib/ridgepole/schema_dumper_ext.rb
357
345
  - lib/ridgepole/schema_statements_ext.rb
358
346
  - lib/ridgepole/version.rb
359
- - ridgepole.gemspec
360
347
  homepage: https://github.com/ridgepole/ridgepole
361
348
  licenses:
362
349
  - MIT
@@ -376,7 +363,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
376
363
  - !ruby/object:Gem::Version
377
364
  version: '0'
378
365
  requirements: []
379
- rubygems_version: 3.6.7
366
+ rubygems_version: 3.7.2
380
367
  specification_version: 4
381
368
  summary: Ridgepole is a tool to manage DB schema.
382
369
  test_files: []
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --require spec_helper
3
- --format HidePendingFormatter
data/.rubocop.yml DELETED
@@ -1,64 +0,0 @@
1
- AllCops:
2
- Exclude:
3
- - "gemfiles/**/*"
4
- - "omnibus-ridgepole/**/*"
5
- - "vendor/bundle/**/*"
6
- - "Schemafile"
7
- - "**/*.schema"
8
- TargetRubyVersion: 2.7
9
- NewCops: enable
10
- SuggestExtensions: false
11
- Bundler/OrderedGems:
12
- Include:
13
- - "Appraisals"
14
- Layout/HeredocIndentation:
15
- Enabled: false
16
- Metrics/AbcSize:
17
- Enabled: false
18
- Metrics/BlockLength:
19
- Enabled: false
20
- Metrics/BlockNesting:
21
- Enabled: false
22
- Metrics/ClassLength:
23
- Enabled: false
24
- Metrics/CyclomaticComplexity:
25
- Enabled: false
26
- Layout/LineLength:
27
- Max: 200
28
- Metrics/MethodLength:
29
- Enabled: false
30
- Metrics/ModuleLength:
31
- Max: 106
32
- Metrics/ParameterLists:
33
- Enabled: false
34
- Metrics/PerceivedComplexity:
35
- Enabled: false
36
- Style/Documentation:
37
- Enabled: false
38
- Style/GuardClause:
39
- Enabled: false
40
- Style/MixinUsage:
41
- Exclude:
42
- - "spec/**/*"
43
- Style/TrailingCommaInHashLiteral:
44
- EnforcedStyleForMultiline: consistent_comma
45
- Layout/ClosingHeredocIndentation:
46
- Enabled: false
47
- Style/NumericPredicate:
48
- Enabled: false
49
- Lint/MissingSuper:
50
- Enabled: false
51
- Style/StringConcatenation:
52
- Enabled: false
53
- Style/SoleNestedConditional:
54
- Enabled: false
55
- Lint/DuplicateBranch:
56
- Enabled: false
57
- Style/OptionalBooleanParameter:
58
- Enabled: false
59
- Gemspec/DevelopmentDependencies:
60
- Enabled: false
61
- Lint/LiteralInInterpolation:
62
- Enabled: false
63
- Naming/PredicateMethod:
64
- Enabled: false
data/.simplecov DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- SimpleCov.configure do
4
- # exclude directories and files
5
- add_filter '/spec/'
6
- end
data/Appraisals DELETED
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- appraise 'activerecord-6.1' do
4
- gem 'activerecord', '~> 6.1.7'
5
- end
6
-
7
- appraise 'activerecord-7.0' do
8
- gem 'activerecord', '~> 7.0.4'
9
- end
10
-
11
- appraise 'activerecord-7.1' do
12
- gem 'activerecord', '~> 7.1.0'
13
- end
14
-
15
- appraise 'activerecord-7.2' do
16
- gem 'activerecord', '~> 7.2.0'
17
- end
18
-
19
- appraise 'activerecord-8.0' do
20
- gem 'activerecord', '~> 8.0.0'
21
- end
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Specify your gem's dependencies in ridgepole.gemspec
6
- gemspec
7
-
8
- gem 'mutex_m' if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.4.0')
data/Rakefile DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
- require 'rubocop/rake_task'
6
-
7
- RSpec::Core::RakeTask.new('spec')
8
-
9
- RuboCop::RakeTask.new do |task|
10
- task.options = %w[-c .rubocop.yml]
11
- end
12
-
13
- task default: %i[rubocop spec]
data/compose.yml DELETED
@@ -1,20 +0,0 @@
1
- services:
2
- mysql57:
3
- image: "mysql:5.7"
4
- platform: linux/amd64
5
- ports:
6
- - "13316:3306"
7
- environment:
8
- MYSQL_ROOT_PASSWORD: password
9
- mysql80:
10
- image: "mysql:8.0"
11
- ports:
12
- - "13318:3306"
13
- environment:
14
- MYSQL_ROOT_PASSWORD: password
15
- postgres:
16
- image: "postgres:14"
17
- ports:
18
- - "15442:5432"
19
- environment:
20
- POSTGRES_PASSWORD: password
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 6.1.7"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 7.0.4"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 7.1.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 7.2.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 8.0.0"
6
-
7
- gemspec path: "../"
data/ridgepole.gemspec DELETED
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'ridgepole/version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = 'ridgepole'
9
- spec.version = Ridgepole::VERSION
10
- spec.authors = ['Genki Sugawara']
11
- spec.email = ['sugawara@winebarrel.jp']
12
- spec.summary = 'Ridgepole is a tool to manage DB schema.'
13
- spec.description = 'Ridgepole is a tool to manage DB schema. It defines DB schema using Rails DSL, and updates DB schema according to DSL.'
14
- spec.homepage = 'https://github.com/ridgepole/ridgepole'
15
- spec.license = 'MIT'
16
- spec.platform = Gem::Platform::RUBY
17
-
18
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
- `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
21
- end
22
- end
23
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
- spec.require_paths = ['lib']
25
-
26
- spec.required_ruby_version = Gem::Requirement.new('>= 2.7')
27
-
28
- spec.add_dependency 'activerecord', '>= 6.1', '< 8.1'
29
- spec.add_dependency 'diffy'
30
- spec.add_dependency 'logger'
31
-
32
- spec.add_development_dependency 'appraisal', '>= 2.2.0'
33
- spec.add_development_dependency 'bigdecimal'
34
- spec.add_development_dependency 'bundler'
35
- spec.add_development_dependency 'erbh', '>= 0.2.1'
36
- spec.add_development_dependency 'hash_modern_inspect', '>= 0.1.1'
37
- spec.add_development_dependency 'hash_order_helper', '>= 0.1.6'
38
- spec.add_development_dependency 'mysql2'
39
- spec.add_development_dependency 'pg'
40
- spec.add_development_dependency 'rake'
41
- spec.add_development_dependency 'rspec', '>= 3.0.0'
42
- spec.add_development_dependency 'rspec-match_fuzzy', '>= 0.2.0'
43
- spec.add_development_dependency 'rspec-match_ruby', '>= 0.1.3'
44
- spec.add_development_dependency 'rubocop', '1.78.0'
45
- spec.add_development_dependency 'rubocop-rake', '>= 0.5.1'
46
- spec.add_development_dependency 'rubocop-rspec', '>= 2.1.0'
47
- spec.add_development_dependency 'simplecov'
48
- spec.add_development_dependency 'simplecov-lcov'
49
- spec.add_development_dependency 'trilogy'
50
- spec.metadata['rubygems_mfa_required'] = 'true'
51
- end