schema_plus_core 2.2.2 → 3.1.0.beta.3

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/prs.yml +173 -0
  3. data/.gitignore +1 -0
  4. data/.simplecov +20 -0
  5. data/Gemfile +4 -1
  6. data/README.md +17 -9
  7. data/Rakefile +2 -0
  8. data/gemfiles/Gemfile.base +1 -1
  9. data/gemfiles/activerecord-5.2/Gemfile.base +2 -1
  10. data/gemfiles/activerecord-5.2/Gemfile.mysql2 +2 -2
  11. data/gemfiles/activerecord-5.2/Gemfile.postgresql +2 -2
  12. data/gemfiles/activerecord-5.2/Gemfile.sqlite3 +3 -3
  13. data/gemfiles/activerecord-6.0/Gemfile.base +4 -0
  14. data/gemfiles/activerecord-6.0/Gemfile.mysql2 +10 -0
  15. data/gemfiles/activerecord-6.0/Gemfile.postgresql +10 -0
  16. data/gemfiles/{activerecord-5.0 → activerecord-6.0}/Gemfile.sqlite3 +3 -3
  17. data/gemfiles/activerecord-6.1/Gemfile.base +4 -0
  18. data/gemfiles/activerecord-6.1/Gemfile.mysql2 +10 -0
  19. data/gemfiles/activerecord-6.1/Gemfile.postgresql +10 -0
  20. data/gemfiles/{activerecord-5.1 → activerecord-6.1}/Gemfile.sqlite3 +3 -3
  21. data/gemfiles/activerecord-7.0/Gemfile.base +4 -0
  22. data/gemfiles/activerecord-7.0/Gemfile.mysql2 +10 -0
  23. data/gemfiles/activerecord-7.0/Gemfile.postgresql +10 -0
  24. data/gemfiles/activerecord-7.0/Gemfile.sqlite3 +10 -0
  25. data/lib/schema_plus/core/active_record/base.rb +6 -4
  26. data/lib/schema_plus/core/active_record/connection_adapters/abstract_adapter.rb +65 -26
  27. data/lib/schema_plus/core/active_record/connection_adapters/mysql2_adapter.rb +17 -7
  28. data/lib/schema_plus/core/active_record/connection_adapters/postgresql/schema_dumper.rb +11 -5
  29. data/lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb +24 -32
  30. data/lib/schema_plus/core/active_record/connection_adapters/sqlite3_adapter.rb +15 -5
  31. data/lib/schema_plus/core/active_record/connection_adapters/table_definition.rb +18 -10
  32. data/lib/schema_plus/core/active_record/migration/command_recorder.rb +4 -2
  33. data/lib/schema_plus/core/active_record/schema.rb +2 -0
  34. data/lib/schema_plus/core/active_record/schema_dumper.rb +70 -29
  35. data/lib/schema_plus/core/middleware.rb +3 -1
  36. data/lib/schema_plus/core/schema_dump.rb +14 -5
  37. data/lib/schema_plus/core/sql_struct.rb +4 -2
  38. data/lib/schema_plus/core/version.rb +3 -1
  39. data/lib/schema_plus/core.rb +4 -4
  40. data/schema_dev.yml +8 -5
  41. data/schema_plus_core.gemspec +9 -10
  42. data/spec/column_spec.rb +3 -2
  43. data/spec/dumper_spec.rb +33 -9
  44. data/spec/index_spec.rb +2 -0
  45. data/spec/middleware_spec.rb +5 -2
  46. data/spec/spec_helper.rb +3 -3
  47. data/spec/sql_struct_spec.rb +2 -0
  48. data/spec/support/enableable.rb +2 -4
  49. data/spec/support/test_reporter.rb +3 -1
  50. metadata +43 -89
  51. data/.travis.yml +0 -25
  52. data/gemfiles/activerecord-5.0/Gemfile.base +0 -3
  53. data/gemfiles/activerecord-5.0/Gemfile.mysql2 +0 -10
  54. data/gemfiles/activerecord-5.0/Gemfile.postgresql +0 -10
  55. data/gemfiles/activerecord-5.1/Gemfile.base +0 -3
  56. data/gemfiles/activerecord-5.1/Gemfile.mysql2 +0 -10
  57. data/gemfiles/activerecord-5.1/Gemfile.postgresql +0 -10
@@ -1,24 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
7
  module Mysql2Adapter
6
8
 
7
- def change_column(table_name, name, type, options = {})
9
+ def change_column(table_name, name, type, **options)
8
10
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :change, table_name: table_name, column_name: name, type: type, options: options.deep_dup) do |env|
9
- super env.table_name, env.column_name, env.type, env.options
11
+ super env.table_name, env.column_name, env.type, **env.options
10
12
  end
11
13
  end
12
14
 
13
- def add_index(table_name, column_names, options={})
14
- SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
15
- super env.table_name, env.column_names, env.options
15
+ if Gem::Version.new(::ActiveRecord::VERSION::STRING) < Gem::Version.new('6.1')
16
+ def add_index(table_name, column_names, options = {})
17
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
18
+ super env.table_name, env.column_names, env.options
19
+ end
20
+ end
21
+ else
22
+ def add_index(table_name, column_names, **options)
23
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
24
+ super env.table_name, env.column_names, **env.options
25
+ end
16
26
  end
17
27
  end
18
28
 
19
- def drop_table(table_name, options={})
29
+ def drop_table(table_name, **options)
20
30
  SchemaMonkey::Middleware::Migration::DropTable.start(connection: self, table_name: table_name, options: options.dup) do |env|
21
- super env.table_name, env.options
31
+ super env.table_name, **env.options
22
32
  end
23
33
  end
24
34
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
@@ -24,11 +26,15 @@ module SchemaPlus
24
26
  end
25
27
 
26
28
  def extensions(_)
27
- SchemaMonkey::Middleware::Dumper::Initial.start(dumper: self, connection: @connection, dump: @dump, initial: @dump.initial) do |env|
28
- stream = StringIO.new
29
- super stream
30
- env.dump.initial << stream.string unless stream.string.blank?
31
- end
29
+ stream = StringIO.new
30
+ super stream
31
+ @dump.extensions << stream.string unless stream.string.blank?
32
+ end
33
+
34
+ def types(_)
35
+ stream = StringIO.new
36
+ super stream
37
+ @dump.types << stream.string unless stream.string.blank?
32
38
  end
33
39
  end
34
40
  end
@@ -1,42 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
7
  module PostgresqlAdapter
6
-
7
- # quick hack fix quoting of column default functions to allow eval() when we
8
- # capture the stream.
9
- #
10
- # AR's PostgresqlAdapter#prepare_column_options wraps the
11
- # function in double quotes, which doesn't work because the
12
- # function itself may have doublequotes in it which don't get
13
- # escaped properly.
14
- #
15
- # Arguably that's a bug in AR, but then again default function
16
- # expressions don't work well in AR anyway. (hence
17
- # schema_plus_default_expr )
18
- #
19
- def prepare_column_options(column, *) # :nodoc:
20
- spec = super
21
- spec[:default] = "%q{#{column.default_function}}" if column.default_function
22
- spec
23
- end
24
-
25
- def change_column(table_name, name, type, options = {})
8
+
9
+ def change_column(table_name, name, type, **options)
26
10
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :change, table_name: table_name, column_name: name, type: type, options: options.deep_dup) do |env|
27
- super env.table_name, env.column_name, env.type, env.options
11
+ super env.table_name, env.column_name, env.type, **env.options
28
12
  end
29
13
  end
30
14
 
31
- def add_index(table_name, column_names, options={})
32
- SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
33
- super env.table_name, env.column_names, env.options
15
+ if Gem::Version.new(::ActiveRecord::VERSION::STRING) < Gem::Version.new('6.1')
16
+ def add_index(table_name, column_names, options = {})
17
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
18
+ super env.table_name, env.column_names, env.options
19
+ end
20
+ end
21
+ else
22
+ def add_index(table_name, column_names, **options)
23
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
24
+ super env.table_name, env.column_names, **env.options
25
+ end
34
26
  end
35
27
  end
36
28
 
37
- def drop_table(table_name, options={})
29
+ def drop_table(table_name, **options)
38
30
  SchemaMonkey::Middleware::Migration::DropTable.start(connection: self, table_name: table_name, options: options.dup) do |env|
39
- super env.table_name, env.options
31
+ super env.table_name, **env.options
40
32
  end
41
33
  end
42
34
 
@@ -46,15 +38,15 @@ module SchemaPlus
46
38
  end
47
39
  end
48
40
 
49
- def exec_cache(sql, name, binds)
50
- SchemaMonkey::Middleware::Query::Exec.start(connection: self, sql: sql, query_name: name, binds: binds) { |env|
51
- env.result = super env.sql, env.query_name, env.binds
41
+ def exec_cache(sql, name, binds, **options)
42
+ SchemaMonkey::Middleware::Query::Exec.start(connection: self, sql: sql, query_name: name, binds: binds, options: options) { |env|
43
+ env.result = super env.sql, env.query_name, env.binds, **env.options
52
44
  }.result
53
45
  end
54
46
 
55
- def exec_no_cache(sql, name, binds)
56
- SchemaMonkey::Middleware::Query::Exec.start(connection: self, sql: sql, query_name: name, binds: binds) { |env|
57
- env.result = super env.sql, env.query_name, env.binds
47
+ def exec_no_cache(sql, name, binds, **options)
48
+ SchemaMonkey::Middleware::Query::Exec.start(connection: self, sql: sql, query_name: name, binds: binds, options: options) { |env|
49
+ env.result = super env.sql, env.query_name, env.binds, **env.options
58
50
  }.result
59
51
  end
60
52
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
@@ -10,15 +12,23 @@ module SchemaPlus
10
12
  end
11
13
  end
12
14
 
13
- def change_column(table_name, name, type, options = {})
15
+ def change_column(table_name, name, type, **options)
14
16
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :change, table_name: table_name, column_name: name, type: type, options: options.deep_dup) do |env|
15
- super env.table_name, env.column_name, env.type, env.options
17
+ super env.table_name, env.column_name, env.type, **env.options
16
18
  end
17
19
  end
18
20
 
19
- def add_index(table_name, column_names, options={})
20
- SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
21
- super env.table_name, env.column_names, env.options
21
+ if Gem::Version.new(::ActiveRecord::VERSION::STRING) < Gem::Version.new('6.1')
22
+ def add_index(table_name, column_names, options = {})
23
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
24
+ super env.table_name, env.column_names, env.options
25
+ end
26
+ end
27
+ else
28
+ def add_index(table_name, column_names, **options)
29
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :add, table_name: table_name, column_names: column_names, options: options.deep_dup) do |env|
30
+ super env.table_name, env.column_names, **env.options
31
+ end
22
32
  end
23
33
  end
24
34
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
@@ -7,29 +9,35 @@ module SchemaPlus
7
9
  def column(name, type, options = {})
8
10
  options = options.deep_dup
9
11
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: name, type: type, implements_reference: options.delete(:_implements_reference), options: options) do |env|
10
- super env.column_name, env.type, env.options
12
+ super env.column_name, env.type, **env.options
11
13
  end
12
14
  end
13
15
 
14
- def references(name, options = {})
16
+ def references(name, **options)
15
17
  options = options.deep_dup
16
18
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options) do |env|
17
- super env.column_name.sub(/_id$/, ''), env.options.merge(_implements_reference: true)
19
+ super env.column_name.sub(/_id$/, ''), **env.options.merge(_implements_reference: true)
18
20
  end
19
21
  end
20
22
 
21
- def belongs_to(name, options = {})
23
+ def belongs_to(name, **options)
22
24
  options = options.deep_dup
23
25
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options) do |env|
24
- super env.column_name.sub(/_id$/, ''), env.options.merge(_implements_reference: true)
26
+ super env.column_name.sub(/_id$/, ''), **env.options.merge(_implements_reference: true)
25
27
  end
26
28
  end
27
29
 
28
- def index(*args)
29
- options = args.extract_options!
30
- column_name = args.first
31
- SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :define, table_name: self.name, column_names: column_name, options: options.deep_dup) do |env|
32
- super env.column_names, env.options
30
+ if Gem::Version.new(::ActiveRecord::VERSION::STRING) < Gem::Version.new('6.1')
31
+ def index(column_name, options = {})
32
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :define, table_name: self.name, column_names: column_name, options: options.deep_dup) do |env|
33
+ super env.column_names, env.options
34
+ end
35
+ end
36
+ else
37
+ def index(column_name, **options)
38
+ SchemaMonkey::Middleware::Migration::Index.start(caller: self, operation: :define, table_name: self.name, column_names: column_name, options: options.deep_dup) do |env|
39
+ super env.column_names, **env.options
40
+ end
33
41
  end
34
42
  end
35
43
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module ActiveRecord
4
6
  module Migration
5
7
  module CommandRecorder
6
8
 
7
- def add_column(table_name, column_name, type, options = {})
9
+ def add_column(table_name, column_name, type, **options)
8
10
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :record, table_name: table_name, column_name: column_name, type: type, options: options.deep_dup) do |env|
9
- super env.table_name, env.column_name, env.type, env.options
11
+ super env.table_name, env.column_name, env.type, **env.options
10
12
  end
11
13
  end
12
14
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus::Core
2
4
  module ActiveRecord
3
5
  module Schema
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ostruct'
2
4
  require 'tsort'
3
5
 
@@ -30,20 +32,80 @@ module SchemaPlus
30
32
  @dump.trailer = stream.string
31
33
  end
32
34
 
33
- def extensions(_)
35
+ def header(_)
34
36
  SchemaMonkey::Middleware::Dumper::Initial.start(dumper: self, connection: @connection, dump: @dump, initial: @dump.initial) do |env|
35
37
  stream = StringIO.new
36
38
  super stream
37
- env.dump.initial << stream.string unless stream.string.blank?
39
+ env.dump.header = stream.string
38
40
  end
39
41
  end
40
42
 
43
+ def extensions(_)
44
+ stream = StringIO.new
45
+ super stream
46
+ @dump.extensions << stream.string unless stream.string.blank?
47
+ end
48
+
49
+ def types(_)
50
+ stream = StringIO.new
51
+ super stream
52
+ @dump.types << stream.string unless stream.string.blank?
53
+ end
54
+
41
55
  def tables(_)
42
56
  SchemaMonkey::Middleware::Dumper::Tables.start(dumper: self, connection: @connection, dump: @dump) do |env|
43
57
  super nil
44
58
  end
45
59
  end
46
60
 
61
+ TABLE_COLUMN_MATCHES = [
62
+ [ # first match expression index case
63
+ %r{
64
+ ^
65
+ t\.index \s*
66
+ "(?<index_cols>(?:[^"\\]|\\.)*?)" \s*
67
+ , \s*
68
+ name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s*
69
+ ,? \s*
70
+ (?<options>.*)
71
+ $
72
+ }x,
73
+ ->(m) {
74
+ index_cols = m[:index_cols].gsub('\\"', '"')
75
+ SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{" + m[:options] + "}")
76
+ }
77
+ ],
78
+ [ # general matching of columns
79
+ %r{
80
+ ^
81
+ t\.(?<type>\S+) \s*
82
+ [:'"](?<name>[^"\s]+)[,"]? \s*
83
+ ,? \s*
84
+ (?<options>.*)
85
+ $
86
+ }x,
87
+ ->(m) {
88
+ SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: []
89
+ }
90
+ ],
91
+ [ # index definitions with multiple columns
92
+ %r{
93
+ ^
94
+ t\.index \s*
95
+ \[(?<index_cols>.*?)\] \s*
96
+ , \s*
97
+ name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s*
98
+ ,? \s*
99
+ (?<options>.*)
100
+ $
101
+ }x,
102
+ ->(m) {
103
+ index_cols = m[:index_cols].tr(%q{'":}, '').strip.split(/\s*,\s*/)
104
+ SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{#{m[:options]}}")
105
+ }
106
+ ]
107
+ ].freeze
108
+
47
109
  def table(table, _)
48
110
  SchemaMonkey::Middleware::Dumper::Table.start(dumper: self, connection: @connection, dump: @dump, table: @dump.tables[table] = SchemaDump::Table.new(name: table)) do |env|
49
111
  stream = StringIO.new
@@ -68,34 +130,13 @@ module SchemaPlus
68
130
  env.table.trailer = m[:trailer].split("\n").map(&:strip).reject{|s| s.blank?}
69
131
  table_objects = m[:columns].strip.split("\n").map { |col|
70
132
  cs = col.strip
71
- m = cs.match %r{
72
- ^
73
- t\.(?<type>\S+) \s*
74
- [:'"](?<name>[^"\s]+)[,"]? \s*
75
- ,? \s*
76
- (?<options>.*)
77
- $
78
- }x
79
- if !m.nil?
80
- SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: []
81
- else
82
- m = cs.match %r{
83
- ^
84
- t\.index \s*
85
- \[(?<index_cols>.*?)\] \s*
86
- , \s*
87
- name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s*
88
- ,? \s*
89
- (?<options>.*)
90
- $
91
- }x
92
- if m.nil?
93
- nil
94
- else
95
- index_cols = m[:index_cols].tr(%q{'":}, '').strip.split(/\s*,\s*/)
96
- SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{#{m[:options]}}")
97
- end
133
+ result = nil
134
+ # find the first regex that matches and grab the column definition
135
+ TABLE_COLUMN_MATCHES.find do |(r, l)|
136
+ m = cs.match r
137
+ result = m.nil? ? nil : l.call(m)
98
138
  end
139
+ result
99
140
  }.reject { |o| o.nil? }
100
141
  env.table.columns = table_objects.select { |o| o.is_a? SchemaDump::Table::Column }
101
142
  env.table.indexes = table_objects.select { |o| o.is_a? SchemaDump::Table::Index }
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module Middleware
4
6
  module Query
5
7
  module Exec
6
- ENV = [:connection, :sql, :query_name, :binds, :prepare, :result]
8
+ ENV = [:connection, :sql, :query_name, :binds, :options, :prepare, :result]
7
9
  end
8
10
  end
9
11
 
@@ -1,15 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  class SchemaDump
4
6
  include TSort
5
7
 
6
- attr_reader :initial, :tables, :dependencies, :data
7
- attr_accessor :final, :trailer
8
+ attr_reader :initial, :extensions, :types, :tables, :dependencies, :data
9
+ attr_accessor :header, :final, :trailer
8
10
 
9
11
  def initialize(dumper)
10
12
  @dumper = dumper
11
13
  @dependencies = Hash.new { |h, k| h[k] = [] }
14
+ @header = ''
12
15
  @initial = []
16
+ @extensions = []
17
+ @types = []
13
18
  @tables = {}
14
19
  @final = []
15
20
  @data = OpenStruct.new # a place for middleware to leave data
@@ -21,7 +26,10 @@ module SchemaPlus
21
26
  end
22
27
 
23
28
  def assemble(stream)
29
+ stream.puts @header
24
30
  stream.puts @initial.join("\n") if initial.any?
31
+ stream.puts @extensions.join("\n") if extensions.any?
32
+ stream.puts @types.join("\n") if types.any?
25
33
  assemble_tables(stream)
26
34
  final.each do |statement|
27
35
  stream.puts " #{statement}"
@@ -43,7 +51,8 @@ module SchemaPlus
43
51
  @dependencies[tablename].sort.uniq.reject{|t| @dumper.ignored? t}.each(&block)
44
52
  end
45
53
 
46
- class Table < KeyStruct[:name, :pname, :options, :columns, :indexes, :statements, :trailer, :alt]
54
+ class Table < Struct.new(:name, :pname, :options, :columns, :indexes, :statements, :trailer, :alt,
55
+ keyword_init: true)
47
56
  def initialize(*args)
48
57
  super
49
58
  self.columns ||= []
@@ -85,7 +94,7 @@ module SchemaPlus
85
94
  stream.puts ""
86
95
  end
87
96
 
88
- class Column < KeyStruct[:name, :type, :options, :comments]
97
+ class Column < Struct.new(:name, :type, :options, :comments, keyword_init: true)
89
98
 
90
99
  def assemble(stream, typelen, namelen)
91
100
  stream.write "t.%-#{typelen}s " % type
@@ -102,7 +111,7 @@ module SchemaPlus
102
111
  end
103
112
  end
104
113
 
105
- class Index < KeyStruct[:name, :columns, :options]
114
+ class Index < Struct.new(:name, :columns, :options, keyword_init: true)
106
115
 
107
116
  def assemble(stream)
108
117
  stream.write columns.inspect + ", " + {name: name}.merge(options).to_s.sub(/^{(.*)}$/, '\1')
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
5
  module SqlStruct
4
- IndexComponents = KeyStruct[:name, :type, :columns, :options, :algorithm, :using]
6
+ IndexComponents = Struct.new(:name, :type, :columns, :options, :algorithm, :using, keyword_init: true)
5
7
 
6
- class Table < KeyStruct[:command, :name, :body, :options, :quotechar, :inheritance]
8
+ class Table < Struct.new(:command, :name, :body, :options, :quotechar, :inheritance, keyword_init: true)
7
9
 
8
10
  INHERITANCE_REGEX = %r{ \s* (?<inheritance>INHERITS \s* \( [^)]* \)) }mxi
9
11
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SchemaPlus
2
4
  module Core
3
- VERSION = "2.2.2"
5
+ VERSION = "3.1.0.beta.3"
4
6
  end
5
7
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "schema_monkey"
2
- require 'its-it'
4
+ require 'active_support/core_ext/array/wrap'
3
5
  require "pathname"
4
6
 
5
7
  module SchemaPlus
@@ -26,8 +28,6 @@ require_relative "core/schema_dump"
26
28
  require_relative "core/sql_struct"
27
29
  require_relative "core/version"
28
30
 
29
- if ActiveRecord.version >= Gem::Version.new('5.2')
30
- require_relative "core/active_record/connection_adapters/postgresql/schema_dumper"
31
- end
31
+ require_relative "core/active_record/connection_adapters/postgresql/schema_dumper"
32
32
 
33
33
  SchemaMonkey.register(SchemaPlus::Core)
data/schema_dev.yml CHANGED
@@ -1,11 +1,14 @@
1
1
  ruby:
2
- - 2.4.4
3
- - 2.5.1
2
+ - 2.5
3
+ - 2.7
4
+ - 3.0
5
+ - 3.1
4
6
  activerecord:
5
- - 5.0
6
- - 5.1
7
7
  - 5.2
8
+ - 6.0
9
+ - 6.1
10
+ - 7.0
8
11
  db:
12
+ - postgresql
9
13
  - mysql2
10
14
  - sqlite3
11
- - postgresql
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'schema_plus/core/version'
@@ -18,16 +19,14 @@ Gem::Specification.new do |gem|
18
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
20
  gem.require_paths = ["lib"]
20
21
 
21
- gem.add_dependency "activerecord", "~> 5.0"
22
- gem.add_dependency "schema_monkey", "~> 2.1"
23
- gem.add_dependency "its-it", "~> 1.2"
22
+ gem.required_ruby_version = ">= 2.5.0"
23
+
24
+ gem.add_dependency "activerecord", ">= 5.2", "< 7.1"
25
+ gem.add_dependency "schema_monkey", "~> 3.0.2.beta.1"
24
26
 
25
- gem.add_development_dependency "bundler", "~> 1.7"
26
- gem.add_development_dependency "rake", "~> 10.0"
27
+ gem.add_development_dependency "bundler"
28
+ gem.add_development_dependency "rake", "~> 13.0.0"
27
29
  gem.add_development_dependency "rspec", "~> 3.0"
28
30
  gem.add_development_dependency "rspec-given"
29
- gem.add_development_dependency "schema_dev", "~> 3.11"
30
- gem.add_development_dependency "simplecov"
31
- gem.add_development_dependency "simplecov-gem-profile"
32
- gem.add_development_dependency "its-it"
31
+ gem.add_development_dependency "schema_dev", "~> 4.2.beta.1"
33
32
  end
data/spec/column_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  module TestImplementsReference
@@ -27,8 +29,7 @@ describe SchemaMonkey::Middleware::Migration::Column do
27
29
  let (:spy) { described_class.const_get(:SPY) }
28
30
 
29
31
  let (:pk_type) do
30
- if ActiveRecord.version >= Gem::Version.new('5.1') &&
31
- ActiveRecord::Base.connection.adapter_name =~ /mysql|postgresql/i
32
+ if ActiveRecord::Base.connection.adapter_name =~ /mysql|postgresql/i
32
33
  :bigint
33
34
  else
34
35
  :integer