schema_plus_core 0.6.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +8 -10
- data/gemfiles/activerecord-4.2/Gemfile.base +1 -1
- data/gemfiles/activerecord-4.2/Gemfile.mysql2 +2 -2
- data/lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb +18 -0
- data/lib/schema_plus/core/active_record/schema_dumper.rb +2 -2
- data/lib/schema_plus/core/schema_dump.rb +5 -21
- data/lib/schema_plus/core/version.rb +1 -1
- data/schema_plus_core.gemspec +1 -1
- data/spec/dumper_spec.rb +17 -8
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 931e01737ac5749b51d990bfa8114372d6c2d136
|
4
|
+
data.tar.gz: af03d82fa6dbd69359cd92a85ddb2d0f074a3ac5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39cdbc108fffe0448e25985532abe46ae8ba94297990fdd4a59893d3977c72227d479832136a3471785dc0b5713cb9ac29a0aeb58d6dc896e693a3c99d0156e5
|
7
|
+
data.tar.gz: 57f38c4464a784504498225f021346e3aeb1226100e7e7deccef7d622d11f8015a504d0d94aa955991cdcc6d0d70958d29320052243a6d656f4ee2a8ed77d0d8
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -101,7 +101,7 @@ Stacks for general operations queries pertaining to the entire database schema:
|
|
101
101
|
* `Schema::Define`
|
102
102
|
|
103
103
|
Wrapper around the `ActiveRecord::Schema.define` method loads a dumped schema file (`schema.rb`).
|
104
|
-
|
104
|
+
|
105
105
|
Env Field | Description | Initial value
|
106
106
|
--- | --- | ---
|
107
107
|
`:info` | Schema information hash | *args*
|
@@ -377,10 +377,8 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
|
|
377
377
|
|
378
378
|
* `column.name` - the column name
|
379
379
|
* `column.type` - the column type (i.e., what comes after `"t."`)
|
380
|
-
* `column.options` -
|
381
|
-
* `column.comments` - an
|
382
|
-
* `column.add_option(option)` - adds an option to the current string, separating with a "," if the current set isn't blank
|
383
|
-
* `column.add_comment(comment)` - adds an option to the current string, separating with a ";" if the current string isn't blank
|
380
|
+
* `column.options` - a hash containing the options for the column
|
381
|
+
* `column.comments` - an array of comment strings for the column
|
384
382
|
|
385
383
|
* `Class SchemaPlus::Core::SchemaDump::Table::Index`
|
386
384
|
|
@@ -388,8 +386,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
|
|
388
386
|
|
389
387
|
* `index.name` - the index name
|
390
388
|
* `index.columns` - the columns that are in the index
|
391
|
-
* `index.options` -
|
392
|
-
* `index.add_option(option)` - adds an option to the current string, separating with a "," if the current set isn't blank
|
389
|
+
* `index.options` - a hash containing the options for the column
|
393
390
|
|
394
391
|
#### Schema Dump Middleware stacks
|
395
392
|
|
@@ -450,14 +447,15 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
|
|
450
447
|
The base method appends the collection of SchemaDump::Table::Index objects to `env.table.indexes`
|
451
448
|
|
452
449
|
## History
|
450
|
+
* 1.0.0 Clean up `SchemaDump::Table::Column` and `SchemaDump::Table::Index` API: `#options` is now a hash and `#comments` is now an array; no longer have `add_option` and `add_comment` methods.
|
453
451
|
* 0.6.2 Bug fix: don't choke on INHERITANCE in table definition (#7). Thanks to [@ADone](https://github.com/ADone).
|
454
452
|
* 0.6.1 Make sure to require pathname (#5)
|
455
453
|
* 0.6.0 Added `table.alt` to dumper; Bug fix: Don't crash when AR fails to dump a table. Thanks to [@stenver](https://github.com/stenver) for tracking it down
|
456
|
-
* 0.5.1 Bug fix: Don't choke on a quoted newline in a `CREATE TABLE` statement ([#3](https://github.com/SchemaPlus/schema_plus_core/pull/3)). Thanks to [@mikeauclair](https://github.com/mikeauclair)
|
454
|
+
* 0.5.1 Bug fix: Don't choke on a quoted newline in a `CREATE TABLE` statement ([#3](https://github.com/SchemaPlus/schema_plus_core/pull/3)). Thanks to [@mikeauclair](https://github.com/mikeauclair)
|
457
455
|
* 0.5.0 Added `Migration::DropTable`
|
458
456
|
* 0.4.0 Added `implements_reference` to `Migration::Column` stack env
|
459
|
-
* 0.3.1 Pass along (undocumented) return values from association declarations ([#2](https://github.com/SchemaPlus/schema_plus_core/pull/2)). Thanks to [@lowjoel](https://github.com/lowjoel)
|
460
|
-
* 0.3.0 Added `Model::Association::Declaration` ([#1](https://github.com/SchemaPlus/schema_plus_core/pull/1)). Thanks to [@lowjoel](https://github.com/lowjoel).
|
457
|
+
* 0.3.1 Pass along (undocumented) return values from association declarations ([#2](https://github.com/SchemaPlus/schema_plus_core/pull/2)). Thanks to [@lowjoel](https://github.com/lowjoel)
|
458
|
+
* 0.3.0 Added `Model::Association::Declaration` ([#1](https://github.com/SchemaPlus/schema_plus_core/pull/1)). Thanks to [@lowjoel](https://github.com/lowjoel).
|
461
459
|
* 0.2.1 Added `Migration::CreateTable` and `Schema::Define`; removed dependency on (defunct) `schema_monkey_rails` gem. [Oops, this should have been a minor version bump]
|
462
460
|
* 0.2.0 Added `Migration::DropTable`
|
463
461
|
* 0.1.0 Initial release
|
@@ -4,6 +4,24 @@ module SchemaPlus
|
|
4
4
|
module ConnectionAdapters
|
5
5
|
module PostgresqlAdapter
|
6
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, types) # :nodoc:
|
20
|
+
spec = super
|
21
|
+
spec[:default] = "%q{#{column.default_function}}" if column.default_function
|
22
|
+
spec
|
23
|
+
end
|
24
|
+
|
7
25
|
def change_column(table_name, name, type, options = {})
|
8
26
|
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
27
|
super env.table_name, env.column_name, env.type, env.options
|
@@ -75,7 +75,7 @@ module SchemaPlus
|
|
75
75
|
(?<options>.*)
|
76
76
|
$
|
77
77
|
}x
|
78
|
-
SchemaDump::Table::Column.new
|
78
|
+
SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: []
|
79
79
|
}
|
80
80
|
end
|
81
81
|
end
|
@@ -96,7 +96,7 @@ module SchemaPlus
|
|
96
96
|
$
|
97
97
|
}x
|
98
98
|
columns = m[:columns].tr(%q{[]'":}, '').strip.split(/\s*,\s*/)
|
99
|
-
SchemaDump::Table::Index.new name: m[:name], columns: columns, options: m[:options]
|
99
|
+
SchemaDump::Table::Index.new name: m[:name], columns: columns, options: eval("{#{m[:options]}}")
|
100
100
|
}
|
101
101
|
end
|
102
102
|
end
|
@@ -85,41 +85,25 @@ module SchemaPlus
|
|
85
85
|
|
86
86
|
class Column < KeyStruct[:name, :type, :options, :comments]
|
87
87
|
|
88
|
-
def add_option(option)
|
89
|
-
self.options = [options, option].reject(&:blank?).join(', ')
|
90
|
-
end
|
91
|
-
|
92
|
-
def add_comment(comment)
|
93
|
-
self.comments = [comments, comment].reject(&:blank?).join('; ')
|
94
|
-
end
|
95
|
-
|
96
88
|
def assemble(stream, typelen, namelen)
|
97
89
|
stream.write "t.%-#{typelen}s " % type
|
98
90
|
if options.blank? && comments.blank?
|
99
91
|
stream.write name.inspect
|
100
92
|
else
|
101
93
|
pr = name.inspect
|
102
|
-
pr +=
|
94
|
+
pr += ',' unless options.blank?
|
103
95
|
stream.write "%-#{namelen+3}s " % pr
|
104
96
|
end
|
105
|
-
stream.write
|
106
|
-
stream.write
|
107
|
-
stream.write
|
97
|
+
stream.write options.to_s.sub(/^{(.*)}$/, '\1') unless options.blank?
|
98
|
+
stream.write ' ' unless options.blank? or comments.blank?
|
99
|
+
stream.write '# ' + comments.join('; ') unless comments.blank?
|
108
100
|
end
|
109
101
|
end
|
110
102
|
|
111
103
|
class Index < KeyStruct[:name, :columns, :options]
|
112
104
|
|
113
|
-
def add_option(option)
|
114
|
-
self.options = [options, option].reject(&:blank?).join(', ')
|
115
|
-
end
|
116
|
-
|
117
105
|
def assemble(stream)
|
118
|
-
stream.write
|
119
|
-
columns.inspect,
|
120
|
-
"name: #{name.inspect}",
|
121
|
-
options
|
122
|
-
].reject(&:blank?).join(", ")
|
106
|
+
stream.write columns.inspect + ", " + {name: name}.merge(options).to_s.sub(/^{(.*)}$/, '\1')
|
123
107
|
end
|
124
108
|
end
|
125
109
|
end
|
data/schema_plus_core.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.add_development_dependency "rake", "~> 10.0"
|
26
26
|
gem.add_development_dependency "rspec", "~> 3.0.0"
|
27
27
|
gem.add_development_dependency "rspec-given"
|
28
|
-
gem.add_development_dependency "schema_dev", "~> 3.
|
28
|
+
gem.add_development_dependency "schema_dev", "~> 3.6"
|
29
29
|
gem.add_development_dependency "simplecov"
|
30
30
|
gem.add_development_dependency "simplecov-gem-profile"
|
31
31
|
end
|
data/spec/dumper_spec.rb
CHANGED
@@ -24,8 +24,8 @@ module TestDumper
|
|
24
24
|
def after(env)
|
25
25
|
return unless middleware = enabled_middleware(TestDumper, env)
|
26
26
|
if column = env.table.columns.first
|
27
|
-
column.
|
28
|
-
column.
|
27
|
+
column.options[:option] = middleware.to_s
|
28
|
+
column.comments << "comment: #{middleware}"
|
29
29
|
end
|
30
30
|
env.table.statements << "statement: #{middleware}"
|
31
31
|
env.table.trailer << "trailer: #{middleware}"
|
@@ -36,7 +36,7 @@ module TestDumper
|
|
36
36
|
def after(env)
|
37
37
|
return unless env.table.indexes.any?
|
38
38
|
return unless middleware = enabled_middleware(TestDumper, env)
|
39
|
-
env.table.indexes.first.
|
39
|
+
env.table.indexes.first.options[:option] = middleware.to_s
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -72,6 +72,15 @@ describe SchemaMonkey::Middleware::Dumper do
|
|
72
72
|
migration.execute "CREATE TABLE custom_table ( my_column custom_type DEFAULT 'a'::custom_type NOT NULL)" if TestCustomType
|
73
73
|
end
|
74
74
|
|
75
|
+
context "column default expressions", postgresql: :only do
|
76
|
+
|
77
|
+
before(:each) do
|
78
|
+
migration.execute %Q{ALTER TABLE "things" ADD "defexpr" character varying DEFAULT substring((random())::text, 3, 6)}
|
79
|
+
end
|
80
|
+
|
81
|
+
Then { expect(dump use_middleware: false).to match(/\\"substring\\"\(\(random/) }
|
82
|
+
end
|
83
|
+
|
75
84
|
context TestDumper::Middleware::Dumper::Initial do
|
76
85
|
Then { expect(dump).to match(/Schema[.]define.*do\s+#{middleware}/) }
|
77
86
|
end
|
@@ -81,13 +90,13 @@ describe SchemaMonkey::Middleware::Dumper do
|
|
81
90
|
end
|
82
91
|
|
83
92
|
context TestDumper::Middleware::Dumper::Table do
|
84
|
-
Then { expect(dump).to match(/t[.]integer
|
93
|
+
Then { expect(dump).to match(/t[.]integer.*:option=>"#{middleware}" \# comment: #{middleware}/) }
|
85
94
|
Then { expect(dump).to match(/statement: #{middleware}\s+end\s+(add_index.*)?\s+trailer: #{middleware}/) }
|
86
95
|
Then { expect(dump).to match(/could not dump table.*custom_table.*unknown type.*custom_type/mi) } if TestCustomType
|
87
96
|
end
|
88
97
|
|
89
98
|
context TestDumper::Middleware::Dumper::Indexes do
|
90
|
-
Then { expect(dump).to match(/add_index
|
99
|
+
Then { expect(dump).to match(/add_index.*:option=>"#{middleware}"/) }
|
91
100
|
end
|
92
101
|
|
93
102
|
|
@@ -97,14 +106,14 @@ describe SchemaMonkey::Middleware::Dumper do
|
|
97
106
|
described_class
|
98
107
|
end
|
99
108
|
|
100
|
-
def dump
|
109
|
+
def dump(use_middleware: true)
|
101
110
|
begin
|
102
|
-
middleware.enable once:false
|
111
|
+
middleware.enable once:false if use_middleware
|
103
112
|
stream = StringIO.new
|
104
113
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
105
114
|
return stream.string
|
106
115
|
ensure
|
107
|
-
middleware.disable
|
116
|
+
middleware.disable if use_middleware
|
108
117
|
end
|
109
118
|
end
|
110
119
|
|
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: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ronen barzel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '3.
|
103
|
+
version: '3.6'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '3.
|
110
|
+
version: '3.6'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: simplecov
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|