schema_plus_core 2.2.2 → 3.1.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
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