schema_plus_core 2.2.2 → 2.2.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/README.md +1 -0
- data/lib/schema_plus/core/active_record/schema_dumper.rb +54 -27
- data/lib/schema_plus/core/version.rb +1 -1
- data/spec/dumper_spec.rb +14 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5c91ca6a28894c17bf6b73d7b8c57f03500dd6474194e5df25afe8727a3691c
|
4
|
+
data.tar.gz: 32d4f2437d5d3ff1f31f050fb407f26dc80bdaabeb81f8779dfbfd72182de49e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2778bbf477a925da8a58dbb577e0a2ac292a919fd3db813f2d404cce2957438f329f7ed2d567fe1f24ebcde15ea5225cafea854b831db4bb23168983b0d165bd
|
7
|
+
data.tar.gz: 8571518821c17bf21cbf6ff77c4dec9c4ac29d501323446fd2df30d9453e8918597ca41d2c5aec09aea580feae7ad9ff9a57b7c08c8cc270ec7df73c0d64913f
|
data/README.md
CHANGED
@@ -444,6 +444,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
|
|
444
444
|
|
445
445
|
## Release Notes
|
446
446
|
|
447
|
+
* 2.2.3 Fix dumping complex expression based indexes in AR 5.x
|
447
448
|
* 2.2.2 Fixed dumping tables in postgresql in AR 5.2 when the PK is not a bigint.
|
448
449
|
* 2.2.1 Fixed expression index handling in AR5.x.
|
449
450
|
* 2.2.0 Added AR5.2 support. Thanks to [@jeremyyap](https://github.com/jeremyyap)
|
@@ -44,6 +44,54 @@ module SchemaPlus
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
TABLE_COLUMN_MATCHES = [
|
48
|
+
[ # first match expression index case
|
49
|
+
%r{
|
50
|
+
^
|
51
|
+
t\.index \s*
|
52
|
+
"(?<index_cols>(?:[^"\\]|\\.)*?)" \s*
|
53
|
+
, \s*
|
54
|
+
name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s*
|
55
|
+
,? \s*
|
56
|
+
(?<options>.*)
|
57
|
+
$
|
58
|
+
}x,
|
59
|
+
->(m) {
|
60
|
+
index_cols = m[:index_cols].gsub('\\"', '"')
|
61
|
+
SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{" + m[:options] + "}")
|
62
|
+
}
|
63
|
+
],
|
64
|
+
[ # general matching of columns
|
65
|
+
%r{
|
66
|
+
^
|
67
|
+
t\.(?<type>\S+) \s*
|
68
|
+
[:'"](?<name>[^"\s]+)[,"]? \s*
|
69
|
+
,? \s*
|
70
|
+
(?<options>.*)
|
71
|
+
$
|
72
|
+
}x,
|
73
|
+
->(m) {
|
74
|
+
SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: []
|
75
|
+
}
|
76
|
+
],
|
77
|
+
[ # index definitions with multiple columns
|
78
|
+
%r{
|
79
|
+
^
|
80
|
+
t\.index \s*
|
81
|
+
\[(?<index_cols>.*?)\] \s*
|
82
|
+
, \s*
|
83
|
+
name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s*
|
84
|
+
,? \s*
|
85
|
+
(?<options>.*)
|
86
|
+
$
|
87
|
+
}x,
|
88
|
+
->(m) {
|
89
|
+
index_cols = m[:index_cols].tr(%q{'":}, '').strip.split(/\s*,\s*/)
|
90
|
+
SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{#{m[:options]}}")
|
91
|
+
}
|
92
|
+
]
|
93
|
+
].freeze
|
94
|
+
|
47
95
|
def table(table, _)
|
48
96
|
SchemaMonkey::Middleware::Dumper::Table.start(dumper: self, connection: @connection, dump: @dump, table: @dump.tables[table] = SchemaDump::Table.new(name: table)) do |env|
|
49
97
|
stream = StringIO.new
|
@@ -68,34 +116,13 @@ module SchemaPlus
|
|
68
116
|
env.table.trailer = m[:trailer].split("\n").map(&:strip).reject{|s| s.blank?}
|
69
117
|
table_objects = m[:columns].strip.split("\n").map { |col|
|
70
118
|
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
|
119
|
+
result = nil
|
120
|
+
# find the first regex that matches and grab the column definition
|
121
|
+
TABLE_COLUMN_MATCHES.find do |(r, l)|
|
122
|
+
m = cs.match r
|
123
|
+
result = m.nil? ? nil : l.call(m)
|
98
124
|
end
|
125
|
+
result
|
99
126
|
}.reject { |o| o.nil? }
|
100
127
|
env.table.columns = table_objects.select { |o| o.is_a? SchemaDump::Table::Column }
|
101
128
|
env.table.indexes = table_objects.select { |o| o.is_a? SchemaDump::Table::Index }
|
data/spec/dumper_spec.rb
CHANGED
@@ -91,6 +91,20 @@ describe SchemaMonkey::Middleware::Dumper do
|
|
91
91
|
|
92
92
|
Then { expect(dump).to_not match(/create_table "inttable", id: :serial.*default:/m) }
|
93
93
|
end
|
94
|
+
|
95
|
+
context 'expression index handling', postgresql: :only do
|
96
|
+
before(:each) do
|
97
|
+
migration.create_table "expressions" do |t|
|
98
|
+
t.string :field
|
99
|
+
t.string :column
|
100
|
+
t.index 'lower(field), id', name: 'index_expression_field'
|
101
|
+
t.index 'lower("column"), id', name: 'index_expression_column'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
Then { expect(dump).to match(/index "lower.+field.+, id", :name=>"index_expression_field"/) }
|
106
|
+
Then { expect(dump).to match(/index "lower.+"column\\".+, id", :name=>"index_expression_column"/) }
|
107
|
+
end
|
94
108
|
end
|
95
109
|
|
96
110
|
context TestDumper::Middleware::Dumper::Table do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_plus_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ronen barzel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|