declare_schema 0.10.0 → 0.10.1
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/CHANGELOG.md +8 -1
- data/Gemfile.lock +1 -1
- data/lib/declare_schema/model/foreign_key_definition.rb +4 -8
- data/lib/declare_schema/model/index_definition.rb +0 -19
- data/lib/declare_schema/schema_change/all.rb +22 -0
- data/lib/declare_schema/schema_change/base.rb +45 -0
- data/lib/declare_schema/schema_change/column_add.rb +27 -0
- data/lib/declare_schema/schema_change/column_change.rb +32 -0
- data/lib/declare_schema/schema_change/column_remove.rb +20 -0
- data/lib/declare_schema/schema_change/column_rename.rb +23 -0
- data/lib/declare_schema/schema_change/foreign_key_add.rb +25 -0
- data/lib/declare_schema/schema_change/foreign_key_remove.rb +20 -0
- data/lib/declare_schema/schema_change/index_add.rb +33 -0
- data/lib/declare_schema/schema_change/index_remove.rb +20 -0
- data/lib/declare_schema/schema_change/primary_key_change.rb +33 -0
- data/lib/declare_schema/schema_change/table_add.rb +37 -0
- data/lib/declare_schema/schema_change/table_change.rb +36 -0
- data/lib/declare_schema/schema_change/table_remove.rb +22 -0
- data/lib/declare_schema/schema_change/table_rename.rb +22 -0
- data/lib/declare_schema/version.rb +1 -1
- data/lib/generators/declare_schema/migration/migrator.rb +172 -174
- data/spec/lib/declare_schema/interactive_primary_key_spec.rb +52 -14
- data/spec/lib/declare_schema/migration_generator_spec.rb +175 -303
- data/spec/lib/declare_schema/model/foreign_key_definition_spec.rb +0 -12
- data/spec/lib/declare_schema/schema_change/base_spec.rb +75 -0
- data/spec/lib/declare_schema/schema_change/column_add_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/column_change_spec.rb +33 -0
- data/spec/lib/declare_schema/schema_change/column_remove_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/column_rename_spec.rb +28 -0
- data/spec/lib/declare_schema/schema_change/foreign_key_add_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/foreign_key_remove_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/index_add_spec.rb +56 -0
- data/spec/lib/declare_schema/schema_change/index_remove_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/primary_key_change_spec.rb +69 -0
- data/spec/lib/declare_schema/schema_change/table_add_spec.rb +50 -0
- data/spec/lib/declare_schema/schema_change/table_change_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/table_remove_spec.rb +27 -0
- data/spec/lib/declare_schema/schema_change/table_rename_spec.rb +27 -0
- data/spec/lib/generators/declare_schema/migration/migrator_spec.rb +59 -11
- data/spec/support/acceptance_spec_helpers.rb +2 -2
- metadata +34 -5
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../../lib/declare_schema/schema_change/table_add'
|
4
|
+
|
5
|
+
RSpec.describe DeclareSchema::SchemaChange::TableAdd do
|
6
|
+
before do
|
7
|
+
load File.expand_path('../prepare_testapp.rb', __dir__)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:table_name) { 'networks' }
|
11
|
+
let(:fields) { [[:string, :title, limit: 255, null: false ], [:boolean, :admin, null: false]] }
|
12
|
+
let(:create_table_options) { { id: :primary_key } }
|
13
|
+
let(:sql_options) { '' }
|
14
|
+
|
15
|
+
subject { described_class.new(table_name, fields, create_table_options, sql_options: sql_options) }
|
16
|
+
|
17
|
+
describe '#up/down' do
|
18
|
+
describe '#up' do
|
19
|
+
it 'responds with command' do
|
20
|
+
expect(subject.up).to eq(<<~EOS)
|
21
|
+
create_table :networks, id: :primary_key do |t|
|
22
|
+
t.string :title, limit: 255, null: false
|
23
|
+
t.boolean :admin, null: false
|
24
|
+
end
|
25
|
+
|
26
|
+
EOS
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with sql_options' do
|
30
|
+
let(:sql_options) { 'CHARACTER SET utf8mb4' }
|
31
|
+
|
32
|
+
it 'responds with command' do
|
33
|
+
expect(subject.up).to eq(<<~EOS)
|
34
|
+
create_table :networks, id: :primary_key, options: "CHARACTER SET utf8mb4" do |t|
|
35
|
+
t.string :title, limit: 255, null: false
|
36
|
+
t.boolean :admin, null: false
|
37
|
+
end
|
38
|
+
|
39
|
+
EOS
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#down' do
|
45
|
+
it 'responds with command' do
|
46
|
+
expect(subject.down).to eq("drop_table :#{table_name}\n")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../../lib/declare_schema/schema_change/table_change'
|
4
|
+
|
5
|
+
RSpec.describe DeclareSchema::SchemaChange::TableChange do
|
6
|
+
before do
|
7
|
+
load File.expand_path('../prepare_testapp.rb', __dir__)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:table_name) { 'networks' }
|
11
|
+
let(:old_options) { { charset: 'utf8', collation: 'utf8_ci' } }
|
12
|
+
let(:new_options) { { charset: 'utf8mb4', collation: 'utf8mb4_bin' } }
|
13
|
+
subject { described_class.new(table_name, old_options, new_options) }
|
14
|
+
|
15
|
+
describe '#up/down' do
|
16
|
+
describe '#up' do
|
17
|
+
it 'responds with command' do
|
18
|
+
statement = "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name)} CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
|
19
|
+
expect(subject.up).to eq("execute #{statement.inspect}\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#down' do
|
24
|
+
it 'responds with command' do
|
25
|
+
statement = "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name)} CHARACTER SET utf8 COLLATE utf8_ci"
|
26
|
+
expect(subject.down).to eq("execute #{statement.inspect}\n")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../../lib/declare_schema/schema_change/table_remove'
|
4
|
+
|
5
|
+
RSpec.describe DeclareSchema::SchemaChange::TableRemove do
|
6
|
+
before do
|
7
|
+
load File.expand_path('../prepare_testapp.rb', __dir__)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:table_name) { 'networks' }
|
11
|
+
let(:add_table_back) { "create table networks(\n)" }
|
12
|
+
subject { described_class.new(table_name, add_table_back) }
|
13
|
+
|
14
|
+
describe '#up/down' do
|
15
|
+
describe '#up' do
|
16
|
+
it 'responds with command' do
|
17
|
+
expect(subject.up).to eq("drop_table :#{table_name}\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#down' do
|
22
|
+
it 'responds with command' do
|
23
|
+
expect(subject.down).to eq("#{add_table_back}\n\n")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../../lib/declare_schema/schema_change/table_rename'
|
4
|
+
|
5
|
+
RSpec.describe DeclareSchema::SchemaChange::TableRename do
|
6
|
+
before do
|
7
|
+
load File.expand_path('../prepare_testapp.rb', __dir__)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:old_name) { 'networks' }
|
11
|
+
let(:new_name) { 'customers' }
|
12
|
+
subject { described_class.new(old_name, new_name) }
|
13
|
+
|
14
|
+
describe '#up/down' do
|
15
|
+
describe '#up' do
|
16
|
+
it 'responds with command' do
|
17
|
+
expect(subject.up).to eq("rename_table :#{old_name}, :#{new_name}\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#down' do
|
22
|
+
it 'responds with command' do
|
23
|
+
expect(subject.down).to eq("rename_table :#{new_name}, :#{old_name}\n")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -11,18 +11,8 @@ module Generators
|
|
11
11
|
module DeclareSchema
|
12
12
|
module Migration
|
13
13
|
RSpec.describe Migrator do
|
14
|
-
before do
|
15
|
-
ActiveRecord::Base.connection.tables
|
16
|
-
end
|
17
|
-
|
18
14
|
subject { described_class.new }
|
19
15
|
|
20
|
-
describe 'format_options' do
|
21
|
-
it 'returns an array of option .inspect strings, with symbols using the modern : hash notation' do
|
22
|
-
expect(subject.format_options({ limit: 4, 'key' => 'value "quoted"' })).to eq(["limit: 4", '"key" => "value \"quoted\""'])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
16
|
describe '#before_generating_migration' do
|
27
17
|
it 'requires a block be passed' do
|
28
18
|
expect { described_class.before_generating_migration }.to raise_error(ArgumentError, 'A block is required when setting the before_generating_migration callback')
|
@@ -67,7 +57,7 @@ module Generators
|
|
67
57
|
end
|
68
58
|
end
|
69
59
|
|
70
|
-
describe 'load_rails_models' do
|
60
|
+
describe '#load_rails_models' do
|
71
61
|
before do
|
72
62
|
expect(Rails.application).to receive(:eager_load!)
|
73
63
|
expect(Rails::Engine).to receive(:subclasses).and_return([])
|
@@ -90,6 +80,64 @@ module Generators
|
|
90
80
|
it { should be_nil }
|
91
81
|
end
|
92
82
|
end
|
83
|
+
|
84
|
+
describe '#order_migrations' do
|
85
|
+
let(:class_name_order) do
|
86
|
+
%w[ TableRename
|
87
|
+
TableAdd
|
88
|
+
TableChange
|
89
|
+
ColumnAdd
|
90
|
+
ColumnRename
|
91
|
+
ColumnChange
|
92
|
+
PrimaryKeyChange
|
93
|
+
IndexAdd
|
94
|
+
ForeignKeyAdd
|
95
|
+
ForeignKeyRemove
|
96
|
+
IndexRemove
|
97
|
+
ColumnRemove
|
98
|
+
TableRemove ]
|
99
|
+
end
|
100
|
+
let(:one_of_each) do
|
101
|
+
class_name_order.map do |class_name|
|
102
|
+
klass = klass_from_class_name(class_name)
|
103
|
+
instance_double(klass).tap do |double|
|
104
|
+
allow(double).to receive(:class).and_return(klass)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
let(:one_of_each_shuffled) { one_of_each.shuffle }
|
109
|
+
|
110
|
+
it 'orders properly' do
|
111
|
+
ordered = subject.order_migrations(one_of_each_shuffled)
|
112
|
+
expect(ordered.map { |c| c.class.name.sub(/.*::/, '') }).to eq(class_name_order)
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when there are dups' do
|
116
|
+
let(:one_of_each_with_dups) do
|
117
|
+
(class_name_order * 2).map do |class_name|
|
118
|
+
klass = klass_from_class_name(class_name)
|
119
|
+
instance_double(klass).tap do |double|
|
120
|
+
allow(double).to receive(:class).and_return(klass)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
let(:one_of_each_with_dups_shuffled) { one_of_each_with_dups.shuffle }
|
125
|
+
let(:one_of_each_with_dups_shuffled_grouped) { one_of_each_with_dups_shuffled.group_by { |c| c.class.name } }
|
126
|
+
|
127
|
+
it 'sorts stably' do
|
128
|
+
ordered = subject.order_migrations(one_of_each_with_dups_shuffled)
|
129
|
+
ordered_grouped = ordered.group_by { |c| c.class.name }
|
130
|
+
ordered_grouped.each do |class_name, schema_changes|
|
131
|
+
shuffled_for_class = one_of_each_with_dups_shuffled_grouped[class_name]
|
132
|
+
expect(schema_changes.map(&:object_id)).to eq(shuffled_for_class.map(&:object_id))
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def klass_from_class_name(class_name)
|
139
|
+
"::DeclareSchema::SchemaChange::#{class_name}".constantize
|
140
|
+
end
|
93
141
|
end
|
94
142
|
end
|
95
143
|
end
|
@@ -45,13 +45,13 @@ module AcceptanceSpecHelpers
|
|
45
45
|
|
46
46
|
class MigrationUpEquals < RSpec::Matchers::BuiltIn::Eq
|
47
47
|
def matches?(subject)
|
48
|
-
super(subject[0].gsub(/, +([a-z_]+:)/i, ', \1')) # normalize multiple spaces to one
|
48
|
+
super(subject[0].strip.gsub(/, +([a-z_]+:)/i, ', \1').gsub(/\n+/, "\n")) # normalize multiple spaces and newlines to one
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
52
|
class MigrationDownEquals < RSpec::Matchers::BuiltIn::Eq
|
53
53
|
def matches?(subject)
|
54
|
-
super(subject[1].gsub(/, +([a-z_]+:)/i, ', \1')) # normalize multiple spaces to one
|
54
|
+
super(subject[1].strip.gsub(/, +([a-z_]+:)/i, ', \1').gsub(/\n+/, "\n")) # normalize multiple spaces and newlines to one
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: declare_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Invoca Development adapted from hobo_fields by Tom Locke
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -69,6 +69,21 @@ files:
|
|
69
69
|
- lib/declare_schema/model/index_definition.rb
|
70
70
|
- lib/declare_schema/model/table_options_definition.rb
|
71
71
|
- lib/declare_schema/railtie.rb
|
72
|
+
- lib/declare_schema/schema_change/all.rb
|
73
|
+
- lib/declare_schema/schema_change/base.rb
|
74
|
+
- lib/declare_schema/schema_change/column_add.rb
|
75
|
+
- lib/declare_schema/schema_change/column_change.rb
|
76
|
+
- lib/declare_schema/schema_change/column_remove.rb
|
77
|
+
- lib/declare_schema/schema_change/column_rename.rb
|
78
|
+
- lib/declare_schema/schema_change/foreign_key_add.rb
|
79
|
+
- lib/declare_schema/schema_change/foreign_key_remove.rb
|
80
|
+
- lib/declare_schema/schema_change/index_add.rb
|
81
|
+
- lib/declare_schema/schema_change/index_remove.rb
|
82
|
+
- lib/declare_schema/schema_change/primary_key_change.rb
|
83
|
+
- lib/declare_schema/schema_change/table_add.rb
|
84
|
+
- lib/declare_schema/schema_change/table_change.rb
|
85
|
+
- lib/declare_schema/schema_change/table_remove.rb
|
86
|
+
- lib/declare_schema/schema_change/table_rename.rb
|
72
87
|
- lib/declare_schema/version.rb
|
73
88
|
- lib/generators/declare_schema/migration/USAGE
|
74
89
|
- lib/generators/declare_schema/migration/migration_generator.rb
|
@@ -91,6 +106,20 @@ files:
|
|
91
106
|
- spec/lib/declare_schema/model/index_definition_spec.rb
|
92
107
|
- spec/lib/declare_schema/model/table_options_definition_spec.rb
|
93
108
|
- spec/lib/declare_schema/prepare_testapp.rb
|
109
|
+
- spec/lib/declare_schema/schema_change/base_spec.rb
|
110
|
+
- spec/lib/declare_schema/schema_change/column_add_spec.rb
|
111
|
+
- spec/lib/declare_schema/schema_change/column_change_spec.rb
|
112
|
+
- spec/lib/declare_schema/schema_change/column_remove_spec.rb
|
113
|
+
- spec/lib/declare_schema/schema_change/column_rename_spec.rb
|
114
|
+
- spec/lib/declare_schema/schema_change/foreign_key_add_spec.rb
|
115
|
+
- spec/lib/declare_schema/schema_change/foreign_key_remove_spec.rb
|
116
|
+
- spec/lib/declare_schema/schema_change/index_add_spec.rb
|
117
|
+
- spec/lib/declare_schema/schema_change/index_remove_spec.rb
|
118
|
+
- spec/lib/declare_schema/schema_change/primary_key_change_spec.rb
|
119
|
+
- spec/lib/declare_schema/schema_change/table_add_spec.rb
|
120
|
+
- spec/lib/declare_schema/schema_change/table_change_spec.rb
|
121
|
+
- spec/lib/declare_schema/schema_change/table_remove_spec.rb
|
122
|
+
- spec/lib/declare_schema/schema_change/table_rename_spec.rb
|
94
123
|
- spec/lib/declare_schema_spec.rb
|
95
124
|
- spec/lib/generators/declare_schema/migration/migrator_spec.rb
|
96
125
|
- spec/spec_helper.rb
|
@@ -99,7 +128,7 @@ homepage: https://github.com/Invoca/declare_schema
|
|
99
128
|
licenses: []
|
100
129
|
metadata:
|
101
130
|
allowed_push_host: https://rubygems.org
|
102
|
-
post_install_message:
|
131
|
+
post_install_message:
|
103
132
|
rdoc_options: []
|
104
133
|
require_paths:
|
105
134
|
- lib
|
@@ -115,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
144
|
version: 1.3.6
|
116
145
|
requirements: []
|
117
146
|
rubygems_version: 3.0.3
|
118
|
-
signing_key:
|
147
|
+
signing_key:
|
119
148
|
specification_version: 4
|
120
149
|
summary: Database schema declaration and migration generator for Rails
|
121
150
|
test_files: []
|