schema_plus 2.0.0.pre8 → 2.0.0.pre9
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 -1
- data/lib/schema_plus/version.rb +1 -1
- data/schema_plus.gemspec +1 -0
- metadata +16 -9
- data/lib/schema_plus/enums.rb +0 -6
- data/lib/schema_plus/enums/active_record.rb +0 -69
- data/lib/schema_plus/enums/middleware.rb +0 -22
- data/spec/schema_plus_enums/enum_spec.rb +0 -132
- data/spec/schema_plus_enums/schema_dumper_spec.rb +0 -37
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 61e2c68d4c34a1a67e9dd384a88b39a1c51ac28b
|
|
4
|
+
data.tar.gz: 2d6b58497e571c08e38ce563a74f56b5d1f9a5d3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 70b083aec779efb9afebd741e24ef825d99f0c4dfdd89e416cd3cd4d61f38238a40541e8182dae1de155a96cb5abdd71082666024c145600b391dfc5169cbea5
|
|
7
|
+
data.tar.gz: fa3810d8ba0c11444928631f3d285303c76f1b8bfe272c495cdf82bff2e84285253159d3e51a34c861f0d4adfed5e922fc67ef65eead4b682d83d6397600e97d
|
data/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Gem | Description | Included In `schema_plus` gem?
|
|
|
20
20
|
[schema_plus_columns](https://github.com/SchemaPlus/schema_plus_columns) | Column attributes including `column.indexes` and `column.unique?` | Y
|
|
21
21
|
<p style="color:grey">schema_plus_db_default</p> | Use `ActiveRecord::DB_DEFAULT` to set an attribute to the database default | Y
|
|
22
22
|
<p style="color:grey">schema_plus_default_expr</p> | Use SQL expressions for database default values | Y
|
|
23
|
-
|
|
23
|
+
[schema_plus_enums](https://github.com/SchemaPlus/schema_plus_enums) | Define enum types in migrations | Y
|
|
24
24
|
<p style="color:grey">schema_plus_foreign_keys | Extended support for foreign keys, including creation as column options, `:deferrable`, and SQLite3 support | Y
|
|
25
25
|
[schema_plus_indexes](https://github.com/SchemaPlus/schema_plus_indexes) | Convenience and consistency in using indexes | Y
|
|
26
26
|
[schema_plus_pg_indexes](https://github.com/SchemaPlus/schema_plus_pg_indexes) |PostgreSQL index features: `case_insenstive`, `expression` and `operator_class` | Y
|
data/lib/schema_plus/version.rb
CHANGED
data/schema_plus.gemspec
CHANGED
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |gem|
|
|
|
26
26
|
gem.add_dependency "schema_plus_core", "~> 0.2"
|
|
27
27
|
gem.add_dependency "schema_monkey", "~> 2.1"
|
|
28
28
|
gem.add_dependency "schema_plus_columns", "~> 0.1"
|
|
29
|
+
gem.add_dependency "schema_plus_enums", "~> 0.1"
|
|
29
30
|
gem.add_dependency "schema_plus_indexes", "~> 0.1", ">= 0.1.3"
|
|
30
31
|
gem.add_dependency "schema_plus_pg_indexes", "~> 0.1", ">= 0.1.3"
|
|
31
32
|
gem.add_dependency "schema_plus_tables", "~> 0.1"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: schema_plus
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.0.
|
|
4
|
+
version: 2.0.0.pre9
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ronen Barzel
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2015-
|
|
12
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activerecord
|
|
@@ -81,6 +81,20 @@ dependencies:
|
|
|
81
81
|
- - "~>"
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
83
|
version: '0.1'
|
|
84
|
+
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: schema_plus_enums
|
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - "~>"
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0.1'
|
|
91
|
+
type: :runtime
|
|
92
|
+
prerelease: false
|
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
+
requirements:
|
|
95
|
+
- - "~>"
|
|
96
|
+
- !ruby/object:Gem::Version
|
|
97
|
+
version: '0.1'
|
|
84
98
|
- !ruby/object:Gem::Dependency
|
|
85
99
|
name: schema_plus_indexes
|
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -268,9 +282,6 @@ files:
|
|
|
268
282
|
- lib/schema_plus/default_expr/active_record/connection_adapters/postgresql_adapter.rb
|
|
269
283
|
- lib/schema_plus/default_expr/active_record/connection_adapters/sqlite3_adapter.rb
|
|
270
284
|
- lib/schema_plus/default_expr/middleware.rb
|
|
271
|
-
- lib/schema_plus/enums.rb
|
|
272
|
-
- lib/schema_plus/enums/active_record.rb
|
|
273
|
-
- lib/schema_plus/enums/middleware.rb
|
|
274
285
|
- lib/schema_plus/foreign_keys.rb
|
|
275
286
|
- lib/schema_plus/foreign_keys/active_record/base.rb
|
|
276
287
|
- lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract_adapter.rb
|
|
@@ -296,8 +307,6 @@ files:
|
|
|
296
307
|
- spec/schema_plus_default_expr/column_default_spec.rb
|
|
297
308
|
- spec/schema_plus_default_expr/migration_spec.rb
|
|
298
309
|
- spec/schema_plus_default_expr/schema_dumper_spec.rb
|
|
299
|
-
- spec/schema_plus_enums/enum_spec.rb
|
|
300
|
-
- spec/schema_plus_enums/schema_dumper_spec.rb
|
|
301
310
|
- spec/schema_plus_foreign_keys/foreign_key_definition_spec.rb
|
|
302
311
|
- spec/schema_plus_foreign_keys/foreign_key_spec.rb
|
|
303
312
|
- spec/schema_plus_foreign_keys/migration_spec.rb
|
|
@@ -341,8 +350,6 @@ test_files:
|
|
|
341
350
|
- spec/schema_plus_default_expr/column_default_spec.rb
|
|
342
351
|
- spec/schema_plus_default_expr/migration_spec.rb
|
|
343
352
|
- spec/schema_plus_default_expr/schema_dumper_spec.rb
|
|
344
|
-
- spec/schema_plus_enums/enum_spec.rb
|
|
345
|
-
- spec/schema_plus_enums/schema_dumper_spec.rb
|
|
346
353
|
- spec/schema_plus_foreign_keys/foreign_key_definition_spec.rb
|
|
347
354
|
- spec/schema_plus_foreign_keys/foreign_key_spec.rb
|
|
348
355
|
- spec/schema_plus_foreign_keys/migration_spec.rb
|
data/lib/schema_plus/enums.rb
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
module SchemaPlus::Enums
|
|
2
|
-
module ActiveRecord
|
|
3
|
-
module ConnectionAdapters
|
|
4
|
-
module PostgresqlAdapter
|
|
5
|
-
|
|
6
|
-
def enums
|
|
7
|
-
result = query(<<-SQL)
|
|
8
|
-
SELECT
|
|
9
|
-
N.nspname AS schema_name,
|
|
10
|
-
T.typname AS enum_name,
|
|
11
|
-
E.enumlabel AS enum_label,
|
|
12
|
-
E.enumsortorder AS enum_sort_order
|
|
13
|
-
--array_agg(E.enumlabel ORDER BY enumsortorder) AS labels
|
|
14
|
-
FROM pg_type T
|
|
15
|
-
JOIN pg_enum E ON E.enumtypid = T.oid
|
|
16
|
-
JOIN pg_namespace N ON N.oid = T.typnamespace
|
|
17
|
-
ORDER BY 1, 2, 4
|
|
18
|
-
SQL
|
|
19
|
-
|
|
20
|
-
result.reduce([]) do |res, row|
|
|
21
|
-
last = res.last
|
|
22
|
-
if last && last[0] == row[0] && last[1] == row[1]
|
|
23
|
-
last[2] << row[2]
|
|
24
|
-
else
|
|
25
|
-
res << (row[0..1] << [row[2]])
|
|
26
|
-
end
|
|
27
|
-
res
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def create_enum(name, *values)
|
|
32
|
-
options = values.extract_options!
|
|
33
|
-
list = values.map { |value| escape_enum_value(value) }
|
|
34
|
-
execute "CREATE TYPE #{enum_name(name, options[:schema])} AS ENUM (#{list.join(',')})"
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def alter_enum(name, value, options = {})
|
|
38
|
-
opts = case
|
|
39
|
-
when options[:before] then "BEFORE #{escape_enum_value(options[:before])}"
|
|
40
|
-
when options[:after] then "AFTER #{escape_enum_value(options[:after])}"
|
|
41
|
-
else
|
|
42
|
-
''
|
|
43
|
-
end
|
|
44
|
-
execute "ALTER TYPE #{enum_name(name, options[:schema])} ADD VALUE #{escape_enum_value(value)} #{opts}"
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def drop_enum(name, options = {})
|
|
48
|
-
execute "DROP TYPE #{enum_name(name, options[:schema])}"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def enum_name(name, schema)
|
|
54
|
-
[schema || 'public', name].map { |s|
|
|
55
|
-
%Q{"#{s}"}
|
|
56
|
-
}.join('.')
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def escape_enum_value(value)
|
|
60
|
-
escaped_value = value.sub("'", "''")
|
|
61
|
-
"'#{escaped_value}'"
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
module SchemaPlus::Enums
|
|
2
|
-
module Middleware
|
|
3
|
-
|
|
4
|
-
module Dumper
|
|
5
|
-
module Initial
|
|
6
|
-
|
|
7
|
-
module Postgresql
|
|
8
|
-
|
|
9
|
-
def after(env)
|
|
10
|
-
env.connection.enums.each do |schema, name, values|
|
|
11
|
-
params = [name.inspect]
|
|
12
|
-
params << values.map(&:inspect).join(', ')
|
|
13
|
-
params << ":schema => #{schema.inspect}" if schema != 'public'
|
|
14
|
-
|
|
15
|
-
env.initial << "create_enum #{params.join(', ')}"
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
def enum_fields(name, schema = 'public')
|
|
4
|
-
sql = <<-SQL
|
|
5
|
-
SELECT array_to_string(array_agg(E.enumlabel ORDER BY enumsortorder), ' ') AS "values"
|
|
6
|
-
FROM pg_enum E
|
|
7
|
-
JOIN pg_type T ON E.enumtypid = T.oid
|
|
8
|
-
JOIN pg_namespace N ON N.oid = T.typnamespace
|
|
9
|
-
WHERE N.nspname = '#{schema}' AND T.typname = '#{name}'
|
|
10
|
-
GROUP BY T.oid;
|
|
11
|
-
SQL
|
|
12
|
-
|
|
13
|
-
data = ActiveRecord::Base.connection.select_all(sql)
|
|
14
|
-
return nil if data.empty?
|
|
15
|
-
data[0]['values'].split(' ')
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe 'enum', :postgresql => :only do
|
|
19
|
-
before(:all) do ActiveRecord::Migration.verbose = false end
|
|
20
|
-
|
|
21
|
-
let(:migration) { ActiveRecord::Migration }
|
|
22
|
-
|
|
23
|
-
describe 'enums' do
|
|
24
|
-
it 'should return all enums' do
|
|
25
|
-
begin
|
|
26
|
-
migration.execute 'create schema cmyk'
|
|
27
|
-
migration.create_enum 'color', 'red', 'green', 'blue'
|
|
28
|
-
migration.create_enum 'color', 'cyan', 'magenta', 'yellow', 'black', schema: 'cmyk'
|
|
29
|
-
|
|
30
|
-
expect(migration.enums).to match_array [['cmyk', 'color', %w|cyan magenta yellow black|], ['public', 'color', %w|red green blue|]]
|
|
31
|
-
ensure
|
|
32
|
-
migration.drop_enum 'color'
|
|
33
|
-
migration.execute 'drop schema cmyk cascade'
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
describe 'create_enum' do
|
|
39
|
-
it 'should create enum with given values' do
|
|
40
|
-
begin
|
|
41
|
-
migration.create_enum 'color', *%w|red green blue|
|
|
42
|
-
expect(enum_fields('color')).to eq(%w|red green blue|)
|
|
43
|
-
ensure
|
|
44
|
-
migration.execute 'DROP TYPE IF EXISTS color'
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'should create enum with schema' do
|
|
49
|
-
begin
|
|
50
|
-
migration.execute 'CREATE SCHEMA colors'
|
|
51
|
-
migration.create_enum 'color', *%|red green blue|, schema: 'colors'
|
|
52
|
-
expect(enum_fields('color', 'colors')).to eq(%w|red green blue|)
|
|
53
|
-
ensure
|
|
54
|
-
migration.execute 'DROP SCHEMA IF EXISTS colors CASCADE'
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it 'should escape enum value' do
|
|
59
|
-
begin
|
|
60
|
-
migration.create_enum('names', "O'Neal")
|
|
61
|
-
expect(enum_fields('names')).to eq(["O'Neal"])
|
|
62
|
-
ensure
|
|
63
|
-
migration.execute "DROP TYPE IF EXISTS names"
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it 'should escape schame name and enum name' do
|
|
68
|
-
begin
|
|
69
|
-
migration.execute 'CREATE SCHEMA "select"'
|
|
70
|
-
migration.create_enum 'where', *%|red green blue|, schema: 'select'
|
|
71
|
-
expect(enum_fields('where', 'select')).to eq(%w|red green blue|)
|
|
72
|
-
ensure
|
|
73
|
-
migration.execute 'DROP SCHEMA IF EXISTS "select" CASCADE'
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
describe 'alter_enum' do
|
|
80
|
-
before(:each) do migration.create_enum('color', 'red', 'green', 'blue') end
|
|
81
|
-
after(:each) do migration.execute 'DROP TYPE IF EXISTS color' end
|
|
82
|
-
|
|
83
|
-
it 'should add new value after all values' do
|
|
84
|
-
migration.alter_enum('color', 'magenta')
|
|
85
|
-
expect(enum_fields('color')).to eq(%w|red green blue magenta|)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it 'should add new value after existed' do
|
|
89
|
-
migration.alter_enum('color', 'magenta', after: 'red')
|
|
90
|
-
expect(enum_fields('color')).to eq(%w|red magenta green blue|)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
it 'should add new value before existed' do
|
|
94
|
-
migration.alter_enum('color', 'magenta', before: 'green')
|
|
95
|
-
expect(enum_fields('color')).to eq(%w|red magenta green blue|)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it 'should add new value within given schema' do
|
|
99
|
-
begin
|
|
100
|
-
migration.execute 'CREATE SCHEMA colors'
|
|
101
|
-
migration.create_enum('color', 'red', schema: 'colors')
|
|
102
|
-
migration.alter_enum('color', 'green', schema: 'colors')
|
|
103
|
-
|
|
104
|
-
expect(enum_fields('color', 'colors')).to eq(%w|red green|)
|
|
105
|
-
ensure
|
|
106
|
-
migration.execute 'DROP SCHEMA colors CASCADE'
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
describe 'drop_enum' do
|
|
112
|
-
it 'should drop enum with given name' do
|
|
113
|
-
migration.execute "CREATE TYPE color AS ENUM ('red', 'blue')"
|
|
114
|
-
expect(enum_fields('color')).to eq(%w|red blue|)
|
|
115
|
-
migration.drop_enum('color')
|
|
116
|
-
|
|
117
|
-
expect(enum_fields('color')).to be_nil
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it 'should drop enum within given name and schema' do
|
|
121
|
-
begin
|
|
122
|
-
migration.execute "CREATE SCHEMA colors; CREATE TYPE colors.color AS ENUM ('red', 'blue')"
|
|
123
|
-
expect(enum_fields('color', 'colors')).to eq(%w|red blue|)
|
|
124
|
-
migration.drop_enum('color', schema: 'colors')
|
|
125
|
-
|
|
126
|
-
expect(enum_fields('color', 'colors')).to be_nil
|
|
127
|
-
ensure
|
|
128
|
-
migration.execute "DROP SCHEMA colors CASCADE"
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'stringio'
|
|
3
|
-
|
|
4
|
-
describe "Schema dump" do
|
|
5
|
-
|
|
6
|
-
context 'with enum', :postgresql => :only do
|
|
7
|
-
let(:connection) { ActiveRecord::Base.connection }
|
|
8
|
-
|
|
9
|
-
it 'should include enum' do
|
|
10
|
-
begin
|
|
11
|
-
connection.execute "CREATE TYPE color AS ENUM ('red', 'green', 'blue')"
|
|
12
|
-
expect(dump_schema).to match(%r{create_enum "color", "red", "green", "blue"})
|
|
13
|
-
ensure
|
|
14
|
-
connection.execute "DROP TYPE color"
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'should include enum with schema' do
|
|
19
|
-
begin
|
|
20
|
-
connection.execute "CREATE SCHEMA cmyk; CREATE TYPE cmyk.color AS ENUM ('cyan', 'magenta', 'yellow', 'black')"
|
|
21
|
-
expect(dump_schema).to match(%r{create_enum "color", "cyan", "magenta", "yellow", "black", :schema => "cmyk"})
|
|
22
|
-
ensure
|
|
23
|
-
connection.execute "DROP SCHEMA cmyk CASCADE"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
protected
|
|
29
|
-
|
|
30
|
-
def dump_schema(opts={})
|
|
31
|
-
stream = StringIO.new
|
|
32
|
-
ActiveRecord::SchemaDumper.ignore_tables = Array.wrap(opts[:ignore]) || []
|
|
33
|
-
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
|
34
|
-
stream.string
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
end
|