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.
- checksums.yaml +4 -4
- data/.github/workflows/prs.yml +173 -0
- data/.gitignore +1 -0
- data/.simplecov +20 -0
- data/Gemfile +4 -1
- data/README.md +17 -9
- data/Rakefile +2 -0
- data/gemfiles/Gemfile.base +1 -1
- data/gemfiles/activerecord-5.2/Gemfile.base +2 -1
- data/gemfiles/activerecord-5.2/Gemfile.mysql2 +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.postgresql +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.sqlite3 +3 -3
- data/gemfiles/activerecord-6.0/Gemfile.base +4 -0
- data/gemfiles/activerecord-6.0/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-6.0/Gemfile.postgresql +10 -0
- data/gemfiles/{activerecord-5.0 → activerecord-6.0}/Gemfile.sqlite3 +3 -3
- data/gemfiles/activerecord-6.1/Gemfile.base +4 -0
- data/gemfiles/activerecord-6.1/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-6.1/Gemfile.postgresql +10 -0
- data/gemfiles/{activerecord-5.1 → activerecord-6.1}/Gemfile.sqlite3 +3 -3
- data/gemfiles/activerecord-7.0/Gemfile.base +4 -0
- data/gemfiles/activerecord-7.0/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-7.0/Gemfile.postgresql +10 -0
- data/gemfiles/activerecord-7.0/Gemfile.sqlite3 +10 -0
- data/lib/schema_plus/core/active_record/base.rb +6 -4
- data/lib/schema_plus/core/active_record/connection_adapters/abstract_adapter.rb +65 -26
- data/lib/schema_plus/core/active_record/connection_adapters/mysql2_adapter.rb +17 -7
- data/lib/schema_plus/core/active_record/connection_adapters/postgresql/schema_dumper.rb +11 -5
- data/lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb +24 -32
- data/lib/schema_plus/core/active_record/connection_adapters/sqlite3_adapter.rb +15 -5
- data/lib/schema_plus/core/active_record/connection_adapters/table_definition.rb +18 -10
- data/lib/schema_plus/core/active_record/migration/command_recorder.rb +4 -2
- data/lib/schema_plus/core/active_record/schema.rb +2 -0
- data/lib/schema_plus/core/active_record/schema_dumper.rb +70 -29
- data/lib/schema_plus/core/middleware.rb +3 -1
- data/lib/schema_plus/core/schema_dump.rb +14 -5
- data/lib/schema_plus/core/sql_struct.rb +4 -2
- data/lib/schema_plus/core/version.rb +3 -1
- data/lib/schema_plus/core.rb +4 -4
- data/schema_dev.yml +8 -5
- data/schema_plus_core.gemspec +9 -10
- data/spec/column_spec.rb +3 -2
- data/spec/dumper_spec.rb +33 -9
- data/spec/index_spec.rb +2 -0
- data/spec/middleware_spec.rb +5 -2
- data/spec/spec_helper.rb +3 -3
- data/spec/sql_struct_spec.rb +2 -0
- data/spec/support/enableable.rb +2 -4
- data/spec/support/test_reporter.rb +3 -1
- metadata +43 -89
- data/.travis.yml +0 -25
- data/gemfiles/activerecord-5.0/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.0/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.1/Gemfile.mysql2 +0 -10
- 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
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
29
|
-
options =
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
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
|
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.
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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 <
|
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 <
|
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 <
|
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 =
|
6
|
+
IndexComponents = Struct.new(:name, :type, :columns, :options, :algorithm, :using, keyword_init: true)
|
5
7
|
|
6
|
-
class Table <
|
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
|
|
data/lib/schema_plus/core.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "schema_monkey"
|
2
|
-
require '
|
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
|
-
|
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
data/schema_plus_core.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
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.
|
22
|
-
|
23
|
-
gem.add_dependency "
|
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"
|
26
|
-
gem.add_development_dependency "rake", "~>
|
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", "~>
|
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
|
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
|