schema_plus_core 0.6.2 → 1.0.0
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/.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
|