declare_schema 2.0.0 → 2.1.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/Dockerfile +19 -0
- data/.devcontainer/boot.sh +1 -0
- data/.devcontainer/devcontainer.json +55 -0
- data/.devcontainer/docker-compose.yml +40 -0
- data/.github/workflows/declare_schema_build.yml +35 -11
- data/Appraisals +2 -10
- data/CHANGELOG.md +5 -0
- data/CODE-OF-CONDUCT.md +16 -0
- data/CONTRIBUTING.md +46 -0
- data/Gemfile +6 -1
- data/Gemfile.lock +87 -77
- data/README.md +38 -14
- data/Rakefile +5 -15
- data/catalog-info.yaml +35 -0
- data/config/brakeman.ignore +2 -2
- data/gemfiles/{rails_6_1_sqlite3.gemfile → rails_6_1.gemfile} +3 -0
- data/gemfiles/{rails_7_0_sqlite3.gemfile → rails_7_0.gemfile} +3 -0
- data/gemfiles/{rails_7_1_sqlite3.gemfile → rails_7_1.gemfile} +3 -0
- data/gemfiles/{rails_7_0_mysql2.gemfile → rails_7_2.gemfile} +4 -1
- data/lib/declare_schema/command.rb +2 -8
- data/lib/declare_schema/model/column.rb +1 -1
- data/lib/declare_schema/model/foreign_key_definition.rb +9 -12
- data/lib/declare_schema/model/index_definition.rb +16 -8
- data/lib/declare_schema/model.rb +10 -14
- data/lib/declare_schema/schema_change/base.rb +4 -0
- data/lib/declare_schema/schema_change/primary_key_change.rb +19 -6
- data/lib/declare_schema/version.rb +1 -1
- data/lib/declare_schema.rb +20 -8
- data/lib/generators/declare_schema/migration/migration_generator.rb +15 -2
- data/lib/generators/declare_schema/migration/migrator.rb +16 -9
- data/spec/fixtures/migrations/mysql2/will_generate_unique_constraint_names_rails_6.txt +15 -0
- data/spec/fixtures/migrations/mysql2/will_generate_unique_constraint_names_rails_7.txt +15 -0
- data/spec/fixtures/migrations/postgresql/will_generate_unique_constraint_names_rails_6.txt +15 -0
- data/spec/fixtures/migrations/postgresql/will_generate_unique_constraint_names_rails_7.txt +15 -0
- data/spec/fixtures/migrations/sqlite3/will_generate_unique_constraint_names_rails_6.txt +15 -0
- data/spec/fixtures/migrations/sqlite3/will_generate_unique_constraint_names_rails_7.txt +15 -0
- data/spec/lib/declare_schema/api_spec.rb +1 -3
- data/spec/lib/declare_schema/field_declaration_dsl_spec.rb +3 -3
- data/spec/lib/declare_schema/field_spec_spec.rb +68 -45
- data/spec/lib/declare_schema/generator_spec.rb +2 -4
- data/spec/lib/declare_schema/interactive_primary_key_spec.rb +3 -10
- data/spec/lib/declare_schema/migration_generator_spec.rb +248 -249
- data/spec/lib/declare_schema/model/column_spec.rb +89 -41
- data/spec/lib/declare_schema/model/foreign_key_definition_spec.rb +14 -8
- data/spec/lib/declare_schema/model/habtm_model_shim_spec.rb +4 -9
- data/spec/lib/declare_schema/model/index_definition_spec.rb +18 -10
- data/spec/lib/declare_schema/model/table_options_definition_spec.rb +11 -11
- data/spec/lib/declare_schema/schema_change/base_spec.rb +5 -7
- data/spec/lib/declare_schema/schema_change/column_add_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/column_change_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/column_remove_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/column_rename_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/foreign_key_add_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/foreign_key_remove_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/index_add_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/index_remove_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/primary_key_change_spec.rb +39 -15
- data/spec/lib/declare_schema/schema_change/table_add_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/table_change_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/table_remove_spec.rb +1 -3
- data/spec/lib/declare_schema/schema_change/table_rename_spec.rb +1 -3
- data/spec/lib/generators/declare_schema/migration/migrator_spec.rb +0 -4
- data/spec/spec_helper.rb +3 -0
- data/spec/support/adapter_specific_test_helpers.rb +25 -0
- data/spec/{lib/declare_schema → support}/prepare_testapp.rb +3 -1
- data/spec/support/test_app_spec_helpers.rb +7 -0
- metadata +22 -9
- data/gemfiles/rails_6_1_mysql2.gemfile +0 -23
- data/gemfiles/rails_7_1_mysql2.gemfile +0 -23
@@ -1,53 +1,52 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
begin
|
4
|
-
require 'mysql2'
|
5
|
-
rescue LoadError
|
6
|
-
end
|
7
|
-
|
8
|
-
begin
|
9
|
-
require 'sqlite3'
|
10
|
-
rescue LoadError
|
11
|
-
end
|
12
|
-
|
13
3
|
RSpec.describe 'DeclareSchema Migration Generator' do
|
14
|
-
|
15
|
-
|
16
|
-
end
|
4
|
+
include_context 'prepare test app'
|
5
|
+
|
17
6
|
let(:text_limit) do
|
18
|
-
if
|
7
|
+
if current_adapter == 'mysql2'
|
19
8
|
", limit: 4294967295"
|
20
9
|
end
|
21
10
|
end
|
22
11
|
let(:charset_and_collation) do
|
23
|
-
if
|
12
|
+
if current_adapter == 'mysql2'
|
24
13
|
', charset: "utf8mb4", collation: "utf8mb4_bin"'
|
25
14
|
end
|
26
15
|
end
|
16
|
+
let(:primary_key_type) do
|
17
|
+
if current_adapter == 'postgresql'
|
18
|
+
':bigserial'
|
19
|
+
else
|
20
|
+
':bigint'
|
21
|
+
end
|
22
|
+
end
|
27
23
|
let(:create_table_charset_and_collation) do
|
28
|
-
if
|
24
|
+
if current_adapter == 'mysql2'
|
29
25
|
", options: \"CHARACTER SET utf8mb4 COLLATE utf8mb4_bin\""
|
30
26
|
end
|
31
27
|
end
|
32
28
|
let(:datetime_precision) do
|
33
29
|
if ActiveSupport::VERSION::MAJOR >= 7
|
34
30
|
', precision: 6'
|
35
|
-
elsif
|
31
|
+
elsif current_adapter == 'mysql2'
|
36
32
|
', precision: 0'
|
37
33
|
end
|
38
34
|
end
|
39
35
|
let(:table_options) do
|
40
|
-
|
36
|
+
case current_adapter
|
37
|
+
when 'mysql2'
|
41
38
|
', options: "DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", charset: "utf8mb4", collation: "utf8mb4_bin"'
|
39
|
+
when 'postgresql'
|
40
|
+
""
|
42
41
|
else
|
43
42
|
", id: :integer"
|
44
43
|
end
|
45
44
|
end
|
46
45
|
let(:lock_version_limit) do
|
47
|
-
if
|
48
|
-
", limit: 4"
|
49
|
-
else
|
46
|
+
if current_adapter == 'sqlite3'
|
50
47
|
''
|
48
|
+
else
|
49
|
+
', limit: 4'
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
@@ -58,8 +57,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
58
57
|
|
59
58
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to migrate_up("").and migrate_down("")
|
60
59
|
|
61
|
-
class Advert < ActiveRecord::Base
|
62
|
-
end
|
60
|
+
class Advert < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
63
61
|
|
64
62
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to migrate_up("").and migrate_down("")
|
65
63
|
|
@@ -68,7 +66,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
68
66
|
Advert.connection.schema_cache.clear!
|
69
67
|
Advert.reset_column_information
|
70
68
|
|
71
|
-
class Advert < ActiveRecord::Base
|
69
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
72
70
|
declare_schema do
|
73
71
|
string :name, limit: 250, null: true
|
74
72
|
end
|
@@ -77,18 +75,18 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
77
75
|
up, _ = Generators::DeclareSchema::Migration::Migrator.run.tap do |migrations|
|
78
76
|
expect(migrations).to(
|
79
77
|
migrate_up(<<~EOS.strip)
|
80
|
-
create_table :adverts, id:
|
78
|
+
create_table :adverts, id: #{primary_key_type}#{create_table_charset_and_collation} do |t|
|
81
79
|
t.string :name, limit: 250, null: true#{charset_and_collation}
|
82
80
|
end
|
83
81
|
EOS
|
84
|
-
.and
|
82
|
+
.and(migrate_down("drop_table :adverts"))
|
85
83
|
)
|
86
84
|
end
|
87
85
|
|
88
86
|
ActiveRecord::Migration.class_eval(up)
|
89
87
|
expect(Advert.columns.map(&:name)).to eq(["id", "name"])
|
90
88
|
|
91
|
-
class Advert < ActiveRecord::Base
|
89
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
92
90
|
declare_schema do
|
93
91
|
string :name, limit: 250, null: true
|
94
92
|
text :body, null: true
|
@@ -104,14 +102,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
104
102
|
add_column :adverts, :body, :text#{text_limit}, null: true#{charset_and_collation}
|
105
103
|
add_column :adverts, :published_at, :datetime, null: true
|
106
104
|
EOS
|
107
|
-
.and
|
108
|
-
|
109
|
-
|
105
|
+
.and(migrate_down(<<~EOS.strip))
|
106
|
+
remove_column :adverts, :published_at
|
107
|
+
remove_column :adverts, :body
|
110
108
|
EOS
|
111
109
|
)
|
112
110
|
|
113
111
|
Advert.field_specs.clear # not normally needed
|
114
|
-
class Advert < ActiveRecord::Base
|
112
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
115
113
|
declare_schema do
|
116
114
|
string :name, limit: 250, null: true
|
117
115
|
text :body, null: true
|
@@ -119,13 +117,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
119
117
|
end
|
120
118
|
|
121
119
|
expect(migrate).to(
|
122
|
-
|
123
|
-
|
124
|
-
|
120
|
+
migrate_up("remove_column :adverts, :published_at").and(
|
121
|
+
migrate_down("add_column :adverts, :published_at, :datetime#{datetime_precision}, null: true")
|
122
|
+
)
|
125
123
|
)
|
126
124
|
|
127
125
|
nuke_model_class(Advert)
|
128
|
-
class Advert < ActiveRecord::Base
|
126
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
129
127
|
declare_schema do
|
130
128
|
string :title, limit: 250, null: true
|
131
129
|
text :body, null: true
|
@@ -137,21 +135,21 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
137
135
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
138
136
|
remove_column :adverts, :name
|
139
137
|
EOS
|
140
|
-
.and
|
141
|
-
|
142
|
-
|
138
|
+
.and(migrate_down(<<~EOS.strip))
|
139
|
+
add_column :adverts, :name, :string, limit: 250, null: true#{charset_and_collation}
|
140
|
+
remove_column :adverts, :title
|
143
141
|
EOS
|
144
142
|
)
|
145
143
|
|
146
144
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { name: :title })).to(
|
147
|
-
|
148
|
-
|
149
|
-
|
145
|
+
migrate_up("rename_column :adverts, :name, :title").and(
|
146
|
+
migrate_down("rename_column :adverts, :title, :name")
|
147
|
+
)
|
150
148
|
)
|
151
149
|
|
152
150
|
migrate
|
153
151
|
|
154
|
-
class Advert < ActiveRecord::Base
|
152
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
155
153
|
declare_schema do
|
156
154
|
text :title, null: true
|
157
155
|
text :body, null: true
|
@@ -159,12 +157,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
159
157
|
end
|
160
158
|
|
161
159
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
162
|
-
|
163
|
-
|
164
|
-
|
160
|
+
migrate_up("change_column :adverts, :title, :text#{text_limit}, null: true#{charset_and_collation}").and(
|
161
|
+
migrate_down("change_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}")
|
162
|
+
)
|
165
163
|
)
|
166
164
|
|
167
|
-
class Advert < ActiveRecord::Base
|
165
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
168
166
|
declare_schema do
|
169
167
|
string :title, default: "Untitled", limit: 250, null: true
|
170
168
|
text :body, null: true
|
@@ -172,17 +170,17 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
172
170
|
end
|
173
171
|
|
174
172
|
expect(migrate).to(
|
175
|
-
|
173
|
+
migrate_up(<<~EOS.strip)
|
176
174
|
change_column :adverts, :title, :string, limit: 250, null: true, default: "Untitled"#{charset_and_collation}
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
175
|
+
EOS
|
176
|
+
.and(migrate_down(<<~EOS.strip))
|
177
|
+
change_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
178
|
+
EOS
|
181
179
|
)
|
182
180
|
|
183
181
|
### Limits
|
184
182
|
|
185
|
-
class Advert < ActiveRecord::Base
|
183
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
186
184
|
declare_schema do
|
187
185
|
integer :price, null: true, limit: 2
|
188
186
|
end
|
@@ -195,23 +193,23 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
195
193
|
# Now run the migration, then change the limit:
|
196
194
|
|
197
195
|
ActiveRecord::Migration.class_eval(up)
|
198
|
-
class Advert < ActiveRecord::Base
|
196
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
199
197
|
declare_schema do
|
200
198
|
integer :price, null: true, limit: 3
|
201
199
|
end
|
202
200
|
end
|
203
201
|
|
204
202
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
205
|
-
|
203
|
+
migrate_up(<<~EOS.strip)
|
206
204
|
change_column :adverts, :price, :integer, limit: 3, null: true
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
205
|
+
EOS
|
206
|
+
.and(migrate_down(<<~EOS.strip))
|
207
|
+
change_column :adverts, :price, :integer, limit: 2, null: true
|
208
|
+
EOS
|
211
209
|
)
|
212
210
|
|
213
|
-
ActiveRecord::Migration.class_eval("remove_column :adverts, :price")
|
214
|
-
class Advert < ActiveRecord::Base
|
211
|
+
ActiveRecord::Migration.class_eval("remove_column :adverts, :price", __FILE__, __LINE__)
|
212
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
215
213
|
declare_schema do
|
216
214
|
decimal :price, precision: 4, scale: 1, null: true
|
217
215
|
end
|
@@ -222,11 +220,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
222
220
|
# If a `limit` is given, it will only be used in MySQL, to choose the smallest TEXT field that will accommodate
|
223
221
|
# that limit (0xff for TINYTEXT, 0xffff for TEXT, 0xffffff for MEDIUMTEXT, 0xffffffff for LONGTEXT).
|
224
222
|
|
225
|
-
if
|
223
|
+
if current_adapter == 'sqlite3'
|
226
224
|
expect(::DeclareSchema::Model::FieldSpec.mysql_text_limits?).to be_falsey
|
227
225
|
end
|
228
226
|
|
229
|
-
class Advert < ActiveRecord::Base
|
227
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
230
228
|
declare_schema do
|
231
229
|
text :notes
|
232
230
|
text :description, limit: 30000
|
@@ -234,11 +232,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
234
232
|
end
|
235
233
|
|
236
234
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
237
|
-
|
235
|
+
migrate_up(<<~EOS.strip)
|
238
236
|
add_column :adverts, :price, :decimal, precision: 4, scale: 1, null: true
|
239
237
|
add_column :adverts, :notes, :text#{text_limit}, null: false#{charset_and_collation}
|
240
|
-
add_column :adverts, :description, :text#{', limit: 65535' if
|
241
|
-
|
238
|
+
add_column :adverts, :description, :text#{', limit: 65535' if current_adapter == 'mysql2'}, null: false#{charset_and_collation}
|
239
|
+
EOS
|
242
240
|
)
|
243
241
|
|
244
242
|
Advert.field_specs.delete :price
|
@@ -247,7 +245,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
247
245
|
|
248
246
|
# In MySQL, limits are applied, rounded up:
|
249
247
|
|
250
|
-
if
|
248
|
+
if current_adapter == 'mysql2'
|
251
249
|
expect(::DeclareSchema::Model::FieldSpec.mysql_text_limits?).to be_truthy
|
252
250
|
|
253
251
|
class Advert < ActiveRecord::Base
|
@@ -258,10 +256,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
258
256
|
end
|
259
257
|
|
260
258
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
261
|
-
|
259
|
+
migrate_up(<<~EOS.strip)
|
262
260
|
add_column :adverts, :notes, :text, limit: 4294967295, null: false#{charset_and_collation}
|
263
261
|
add_column :adverts, :description, :text, limit: 255, null: false#{charset_and_collation}
|
264
|
-
|
262
|
+
EOS
|
265
263
|
)
|
266
264
|
|
267
265
|
Advert.field_specs.delete :notes
|
@@ -269,7 +267,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
269
267
|
# Limits that are too high for MySQL will raise an exception.
|
270
268
|
|
271
269
|
expect do
|
272
|
-
class Advert < ActiveRecord::Base
|
270
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
273
271
|
declare_schema do
|
274
272
|
text :notes
|
275
273
|
text :description, limit: 0x1_0000_0000
|
@@ -286,8 +284,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
286
284
|
Advert.connection.execute "ALTER TABLE adverts ADD COLUMN description TINYTEXT"
|
287
285
|
Advert.connection.schema_cache.clear!
|
288
286
|
Advert.reset_column_information
|
289
|
-
expect(Advert.connection.tables - Generators::DeclareSchema::Migration::Migrator.always_ignore_tables).
|
290
|
-
to eq(["adverts"])
|
287
|
+
expect(Advert.connection.tables - Generators::DeclareSchema::Migration::Migrator.always_ignore_tables).to eq(["adverts"])
|
291
288
|
expect(Advert.columns.map(&:name)).to eq(["id", "body", "title", "description"])
|
292
289
|
|
293
290
|
# Now migrate to an unstated text limit:
|
@@ -299,12 +296,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
299
296
|
end
|
300
297
|
|
301
298
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
302
|
-
|
299
|
+
migrate_up(<<~EOS.strip)
|
303
300
|
change_column :adverts, :description, :text, limit: 4294967295, null: false#{charset_and_collation}
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
301
|
+
EOS
|
302
|
+
.and(migrate_down(<<~EOS.strip))
|
303
|
+
change_column :adverts, :description, :text#{', limit: 255' if current_adapter == 'mysql2'}, null: true#{charset_and_collation}
|
304
|
+
EOS
|
308
305
|
)
|
309
306
|
|
310
307
|
# And migrate to a stated text limit that is the same as the unstated one:
|
@@ -316,19 +313,20 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
316
313
|
end
|
317
314
|
|
318
315
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
319
|
-
|
316
|
+
migrate_up(<<~EOS.strip)
|
320
317
|
change_column :adverts, :description, :text, limit: 4294967295, null: false#{charset_and_collation}
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
318
|
+
EOS
|
319
|
+
.and(migrate_down(<<~EOS.strip))
|
320
|
+
change_column :adverts, :description, :text#{', limit: 255' if current_adapter == 'mysql2'}, null: true#{charset_and_collation}
|
321
|
+
EOS
|
325
322
|
)
|
326
323
|
end
|
327
324
|
|
328
325
|
Advert.field_specs.clear
|
329
326
|
Advert.connection.schema_cache.clear!
|
330
327
|
Advert.reset_column_information
|
331
|
-
|
328
|
+
|
329
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
332
330
|
declare_schema do
|
333
331
|
string :name, limit: 250, null: true
|
334
332
|
end
|
@@ -345,8 +343,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
345
343
|
# DeclareSchema extends the `belongs_to` macro so that it also declares the
|
346
344
|
# foreign-key field. It also generates an index on the field.
|
347
345
|
|
348
|
-
class Category < ActiveRecord::Base; end
|
349
|
-
class Advert < ActiveRecord::Base
|
346
|
+
class Category < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
347
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
350
348
|
declare_schema do
|
351
349
|
string :name, limit: 250, null: true
|
352
350
|
end
|
@@ -357,12 +355,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
357
355
|
migrate_up(<<~EOS.strip)
|
358
356
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
359
357
|
add_index :adverts, [:category_id], name: :index_adverts_on_category_id
|
360
|
-
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n"
|
358
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" unless current_adapter == 'sqlite3'}
|
361
359
|
EOS
|
362
|
-
.and
|
363
|
-
|
364
|
-
|
365
|
-
|
360
|
+
.and(migrate_down(<<~EOS.strip))
|
361
|
+
#{'remove_foreign_key :adverts, name: :index_adverts_on_category_id' unless current_adapter == 'sqlite3'}
|
362
|
+
remove_index :adverts, name: :index_adverts_on_category_id
|
363
|
+
remove_column :adverts, :category_id
|
366
364
|
EOS
|
367
365
|
)
|
368
366
|
|
@@ -371,8 +369,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
371
369
|
|
372
370
|
# If you specify a custom foreign key, the migration generator observes that:
|
373
371
|
|
374
|
-
class Category < ActiveRecord::Base; end
|
375
|
-
|
372
|
+
class Category < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
373
|
+
|
374
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
376
375
|
declare_schema { }
|
377
376
|
belongs_to :category, foreign_key: "c_id", class_name: 'Category'
|
378
377
|
end
|
@@ -381,8 +380,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
381
380
|
migrate_up(<<~EOS.strip)
|
382
381
|
add_column :adverts, :c_id, :integer, limit: 8, null: false
|
383
382
|
add_index :adverts, [:c_id], name: :index_adverts_on_c_id
|
384
|
-
#{
|
385
|
-
|
383
|
+
#{unless current_adapter == 'sqlite3'
|
384
|
+
"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" \
|
385
|
+
'add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id'
|
386
|
+
end}
|
386
387
|
EOS
|
387
388
|
)
|
388
389
|
|
@@ -392,8 +393,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
392
393
|
|
393
394
|
# You can avoid generating the index by specifying `index: false`
|
394
395
|
|
395
|
-
class Category < ActiveRecord::Base; end
|
396
|
-
|
396
|
+
class Category < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
397
|
+
|
398
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
397
399
|
declare_schema { }
|
398
400
|
belongs_to :category, index: false
|
399
401
|
end
|
@@ -401,8 +403,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
401
403
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
402
404
|
migrate_up(<<~EOS.strip)
|
403
405
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
404
|
-
#{
|
405
|
-
|
406
|
+
#{'add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id' unless current_adapter == 'sqlite3'}
|
407
|
+
EOS
|
406
408
|
)
|
407
409
|
|
408
410
|
Advert.field_specs.delete(:category_id)
|
@@ -411,10 +413,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
411
413
|
|
412
414
|
# You can specify the index name with index: 'name' [deprecated]
|
413
415
|
|
414
|
-
expect(
|
416
|
+
expect(DeclareSchema.deprecator).to(
|
417
|
+
receive(:warn).with(/belongs_to :category, index: 'name' is deprecated; use index: \{ name: 'name' \} instead/i)
|
418
|
+
)
|
419
|
+
|
420
|
+
class Category < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
415
421
|
|
416
|
-
class
|
417
|
-
class Advert < ActiveRecord::Base
|
422
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
418
423
|
declare_schema { }
|
419
424
|
belongs_to :category, index: 'my_index'
|
420
425
|
end
|
@@ -423,7 +428,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
423
428
|
migrate_up(<<~EOS.strip)
|
424
429
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
425
430
|
add_index :adverts, [:category_id], name: :my_index
|
426
|
-
#{
|
431
|
+
#{'add_foreign_key :adverts, :categories, column: :category_id, name: :my_index' unless current_adapter == 'sqlite3'}
|
427
432
|
EOS
|
428
433
|
)
|
429
434
|
|
@@ -433,8 +438,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
433
438
|
|
434
439
|
# You can specify the index name with index: { name: }'name', unique: true|false }
|
435
440
|
|
436
|
-
class Category < ActiveRecord::Base; end
|
437
|
-
|
441
|
+
class Category < ActiveRecord::Base; end # rubocop:disable Lint/ConstantDefinitionInBlock
|
442
|
+
|
443
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
438
444
|
declare_schema { }
|
439
445
|
belongs_to :category, index: { name: 'my_index', unique: false }
|
440
446
|
end
|
@@ -443,7 +449,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
443
449
|
migrate_up(<<~EOS.strip)
|
444
450
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
445
451
|
add_index :adverts, [:category_id], name: :my_index
|
446
|
-
#{
|
452
|
+
#{'add_foreign_key :adverts, :categories, column: :category_id, name: :my_index' unless current_adapter == 'sqlite3'}
|
447
453
|
EOS
|
448
454
|
)
|
449
455
|
|
@@ -456,7 +462,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
456
462
|
# `updated_at` and `created_at` can be declared with the shorthand `timestamps`.
|
457
463
|
# Similarly, `lock_version` can be declared with the "shorthand" `optimimistic_lock`.
|
458
464
|
|
459
|
-
class Advert < ActiveRecord::Base
|
465
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
460
466
|
declare_schema do
|
461
467
|
timestamps
|
462
468
|
optimistic_lock
|
@@ -469,10 +475,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
469
475
|
add_column :adverts, :updated_at, :datetime, null: true
|
470
476
|
add_column :adverts, :lock_version, :integer#{lock_version_limit}, null: false, default: 1
|
471
477
|
EOS
|
472
|
-
.and
|
473
|
-
|
474
|
-
|
475
|
-
|
478
|
+
.and(migrate_down(<<~EOS.strip))
|
479
|
+
remove_column :adverts, :lock_version
|
480
|
+
remove_column :adverts, :updated_at
|
481
|
+
remove_column :adverts, :created_at
|
476
482
|
EOS
|
477
483
|
)
|
478
484
|
|
@@ -484,10 +490,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
484
490
|
|
485
491
|
# You can add an index to a field definition
|
486
492
|
|
487
|
-
expect(
|
488
|
-
|
493
|
+
expect(DeclareSchema.deprecator).to(
|
494
|
+
receive(:warn).with(/belongs_to :category, index: 'name' is deprecated; use index: \{ name: 'name' \} instead/i)
|
495
|
+
)
|
496
|
+
expect(DeclareSchema.deprecator).to(
|
497
|
+
receive(:warn).with(/belongs_to :category, unique: true\|false is deprecated; use index: \{ unique: true\|false \} instead/i)
|
498
|
+
)
|
489
499
|
|
490
|
-
class Advert < ActiveRecord::Base
|
500
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
491
501
|
declare_schema do
|
492
502
|
string :title, index: true, limit: 250, null: true
|
493
503
|
end
|
@@ -500,7 +510,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
500
510
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
501
511
|
add_index :adverts, [:title], name: :index_adverts_on_title
|
502
512
|
add_index :adverts, [:category_id], name: :my_index
|
503
|
-
#{
|
513
|
+
#{'add_foreign_key :adverts, :categories, column: :category_id, name: :my_index' unless current_adapter == 'sqlite3'}
|
504
514
|
EOS
|
505
515
|
)
|
506
516
|
|
@@ -510,7 +520,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
510
520
|
|
511
521
|
# You can ask for a unique index (deprecated syntax; use index: { unique: true } instead).
|
512
522
|
|
513
|
-
class Advert < ActiveRecord::Base
|
523
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
514
524
|
declare_schema do
|
515
525
|
string :title, index: true, unique: true, null: true, limit: 250
|
516
526
|
end
|
@@ -527,7 +537,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
527
537
|
|
528
538
|
# You can specify the name for the index
|
529
539
|
|
530
|
-
class Advert < ActiveRecord::Base
|
540
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
531
541
|
declare_schema do
|
532
542
|
string :title, index: 'my_index', limit: 250, null: true
|
533
543
|
end
|
@@ -544,7 +554,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
544
554
|
|
545
555
|
# You can ask for an index outside of the fields block
|
546
556
|
|
547
|
-
class Advert < ActiveRecord::Base
|
557
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
548
558
|
declare_schema do
|
549
559
|
string :title, limit: 250, null: true
|
550
560
|
end
|
@@ -562,7 +572,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
562
572
|
|
563
573
|
# The available options for the index function are :unique, :name, :where, and :length.
|
564
574
|
|
565
|
-
class Advert < ActiveRecord::Base
|
575
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
566
576
|
index :title, unique: false, name: 'my_index', length: 10
|
567
577
|
end
|
568
578
|
|
@@ -577,7 +587,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
577
587
|
|
578
588
|
# You can create an index on more than one field
|
579
589
|
|
580
|
-
class Advert < ActiveRecord::Base
|
590
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
581
591
|
index [:title, :category_id]
|
582
592
|
end
|
583
593
|
|
@@ -598,7 +608,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
598
608
|
|
599
609
|
# The migration generator respects the `set_table_name` declaration, although as before, we need to explicitly tell the generator that we want a rename rather than a create and a drop.
|
600
610
|
|
601
|
-
class Advert < ActiveRecord::Base
|
611
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
602
612
|
self.table_name = "ads"
|
603
613
|
declare_schema do
|
604
614
|
string :title, limit: 250, null: true
|
@@ -613,20 +623,20 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
613
623
|
migrate_up(<<~EOS.strip)
|
614
624
|
rename_table :adverts, :ads
|
615
625
|
add_column :ads, :title, :string, limit: 250, null: true#{charset_and_collation}
|
616
|
-
add_column :ads, :body, :text#{', limit: 4294967295' if
|
626
|
+
add_column :ads, :body, :text#{', limit: 4294967295' if current_adapter == 'mysql2'}, null: true#{charset_and_collation}
|
627
|
+
EOS
|
628
|
+
.and(migrate_down(<<~EOS.strip))
|
629
|
+
remove_column :ads, :body
|
630
|
+
remove_column :ads, :title
|
631
|
+
rename_table :ads, :adverts
|
617
632
|
EOS
|
618
|
-
.and migrate_down(<<~EOS.strip)
|
619
|
-
remove_column :ads, :body
|
620
|
-
remove_column :ads, :title
|
621
|
-
rename_table :ads, :adverts
|
622
|
-
EOS
|
623
633
|
)
|
624
634
|
|
625
635
|
# Set the table name back to what it should be and confirm we're in sync:
|
626
636
|
|
627
637
|
nuke_model_class(Advert)
|
628
638
|
|
629
|
-
class Advert < ActiveRecord::Base
|
639
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
630
640
|
self.table_name = "adverts"
|
631
641
|
end
|
632
642
|
|
@@ -638,7 +648,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
638
648
|
|
639
649
|
nuke_model_class(Advert)
|
640
650
|
|
641
|
-
class Advertisement < ActiveRecord::Base
|
651
|
+
class Advertisement < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
642
652
|
declare_schema do
|
643
653
|
string :title, limit: 250, null: true
|
644
654
|
text :body, null: true
|
@@ -649,14 +659,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
649
659
|
migrate_up(<<~EOS.strip)
|
650
660
|
rename_table :adverts, :advertisements
|
651
661
|
add_column :advertisements, :title, :string, limit: 250, null: true#{charset_and_collation}
|
652
|
-
add_column :advertisements, :body, :text#{', limit: 4294967295' if
|
662
|
+
add_column :advertisements, :body, :text#{', limit: 4294967295' if current_adapter == 'mysql2'}, null: true#{charset_and_collation}
|
653
663
|
remove_column :advertisements, :name
|
654
664
|
EOS
|
655
|
-
.and
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
665
|
+
.and(migrate_down(<<~EOS.strip))
|
666
|
+
add_column :advertisements, :name, :string, limit: 250, null: true#{charset_and_collation}
|
667
|
+
remove_column :advertisements, :body
|
668
|
+
remove_column :advertisements, :title
|
669
|
+
rename_table :advertisements, :adverts
|
660
670
|
EOS
|
661
671
|
)
|
662
672
|
|
@@ -672,10 +682,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
672
682
|
migrate_up(<<~EOS.strip)
|
673
683
|
drop_table :adverts
|
674
684
|
EOS
|
675
|
-
.and
|
676
|
-
|
677
|
-
|
678
|
-
|
685
|
+
.and(migrate_down(<<~EOS.strip))
|
686
|
+
create_table "adverts"#{table_options}, force: :cascade do |t|
|
687
|
+
t.string "name", limit: 250#{charset_and_collation}
|
688
|
+
end
|
679
689
|
EOS
|
680
690
|
)
|
681
691
|
|
@@ -685,7 +695,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
685
695
|
|
686
696
|
# Adding a subclass or two should introduce the 'type' column and no other changes
|
687
697
|
|
688
|
-
class Advert < ActiveRecord::Base
|
698
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
689
699
|
declare_schema do
|
690
700
|
text :body, null: true
|
691
701
|
string :title, default: "Untitled", limit: 250, null: true
|
@@ -694,9 +704,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
694
704
|
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
695
705
|
ActiveRecord::Migration.class_eval(up)
|
696
706
|
|
697
|
-
class FancyAdvert < Advert
|
707
|
+
class FancyAdvert < Advert # rubocop:disable Lint/ConstantDefinitionInBlock
|
698
708
|
end
|
699
|
-
|
709
|
+
|
710
|
+
class SuperFancyAdvert < FancyAdvert # rubocop:disable Lint/ConstantDefinitionInBlock
|
700
711
|
end
|
701
712
|
|
702
713
|
expect(Generators::DeclareSchema::Migration::Migrator.run.first).to be_present
|
@@ -707,9 +718,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
707
718
|
add_column :adverts, :type, :string, limit: 250, null: true#{charset_and_collation}
|
708
719
|
add_index :adverts, [:type], name: :on_type
|
709
720
|
EOS
|
710
|
-
.and
|
711
|
-
|
712
|
-
|
721
|
+
.and(migrate_down(<<~EOS.strip))
|
722
|
+
remove_index :adverts, name: :on_type
|
723
|
+
remove_column :adverts, :type
|
713
724
|
EOS
|
714
725
|
)
|
715
726
|
end
|
@@ -729,17 +740,16 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
729
740
|
Advert.connection.schema_cache.clear!
|
730
741
|
Advert.reset_column_information
|
731
742
|
|
732
|
-
expect(Advert.connection.tables - Generators::DeclareSchema::Migration::Migrator.always_ignore_tables)
|
733
|
-
|
743
|
+
expect(Advert.connection.tables - Generators::DeclareSchema::Migration::Migrator.always_ignore_tables)
|
744
|
+
.to eq(["adverts"])
|
734
745
|
expect(Advert.columns.map(&:name).sort).to eq(["body", "id", "title"])
|
735
746
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to eq(["", ""])
|
736
747
|
|
737
|
-
|
738
748
|
### Rename a column and change the default
|
739
749
|
|
740
750
|
Advert.field_specs.clear
|
741
751
|
|
742
|
-
class Advert < ActiveRecord::Base
|
752
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
743
753
|
declare_schema do
|
744
754
|
string :name, default: "No Name", limit: 250, null: true
|
745
755
|
text :body, null: true
|
@@ -751,16 +761,16 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
751
761
|
rename_column :adverts, :title, :name
|
752
762
|
change_column :adverts, :name, :string, limit: 250, null: true, default: "No Name"#{charset_and_collation}
|
753
763
|
EOS
|
754
|
-
.and
|
755
|
-
|
756
|
-
|
764
|
+
.and(migrate_down(<<~EOS.strip))
|
765
|
+
change_column :adverts, :name, :string, limit: 250, null: true, default: "Untitled"#{charset_and_collation}
|
766
|
+
rename_column :adverts, :name, :title
|
757
767
|
EOS
|
758
768
|
)
|
759
769
|
|
760
770
|
### Rename a table and add a column
|
761
771
|
|
762
772
|
nuke_model_class(Advert)
|
763
|
-
class Ad < ActiveRecord::Base
|
773
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
764
774
|
declare_schema do
|
765
775
|
string :title, default: "Untitled", limit: 250
|
766
776
|
text :body, null: true
|
@@ -776,7 +786,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
776
786
|
EOS
|
777
787
|
)
|
778
788
|
|
779
|
-
class Advert < ActiveRecord::Base
|
789
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
780
790
|
declare_schema do
|
781
791
|
text :body, null: true
|
782
792
|
string :title, default: "Untitled", limit: 250, null: true
|
@@ -789,7 +799,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
789
799
|
|
790
800
|
nuke_model_class(Ad)
|
791
801
|
|
792
|
-
class Advert < ActiveRecord::Base
|
802
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
793
803
|
declare_schema do
|
794
804
|
text :body, null: true
|
795
805
|
end
|
@@ -803,13 +813,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
803
813
|
)
|
804
814
|
|
805
815
|
nuke_model_class(Advert)
|
806
|
-
ActiveRecord::Base.connection.execute("
|
816
|
+
ActiveRecord::Base.connection.execute("DROP TABLE #{ActiveRecord::Base.connection.quote_table_name('adverts')};")
|
807
817
|
|
808
818
|
## DSL
|
809
819
|
|
810
820
|
# The DSL allows lambdas and constants
|
811
821
|
|
812
|
-
class User < ActiveRecord::Base
|
822
|
+
class User < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
813
823
|
declare_schema do
|
814
824
|
string :company, limit: 250, ruby_default: -> { "BigCorp" }
|
815
825
|
end
|
@@ -823,14 +833,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
823
833
|
|
824
834
|
# DeclareSchema can accept a validates hash in the field options.
|
825
835
|
|
826
|
-
class Ad < ActiveRecord::Base
|
836
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
827
837
|
class << self
|
828
838
|
def validates(field_name, options)
|
829
839
|
end
|
830
840
|
end
|
831
841
|
end
|
832
842
|
expect(Ad).to receive(:validates).with(:company, presence: true, uniqueness: { case_sensitive: false })
|
833
|
-
class Ad < ActiveRecord::Base
|
843
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
834
844
|
declare_schema do
|
835
845
|
string :company, limit: 250, index: true, unique: true, validates: { presence: true, uniqueness: { case_sensitive: false } }
|
836
846
|
end
|
@@ -843,13 +853,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
843
853
|
# DeclareSchema supports has_and_belongs_to_many relationships and generates the intersection ("join") table
|
844
854
|
# with appropriate primary key, indexes, and foreign keys.
|
845
855
|
|
846
|
-
class Advertiser < ActiveRecord::Base
|
856
|
+
class Advertiser < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
847
857
|
declare_schema do
|
848
858
|
string :name, limit: 250
|
849
859
|
end
|
850
860
|
has_and_belongs_to_many :creatives
|
851
861
|
end
|
852
|
-
|
862
|
+
|
863
|
+
class Creative < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
853
864
|
declare_schema do
|
854
865
|
string :url, limit: 500
|
855
866
|
end
|
@@ -863,10 +874,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
863
874
|
t.integer :advertiser_id, limit: 8, null: false
|
864
875
|
t.integer :creative_id, limit: 8, null: false
|
865
876
|
end
|
866
|
-
create_table :creatives, id:
|
877
|
+
create_table :creatives, id: #{primary_key_type}#{create_table_charset_and_collation} do |t|
|
867
878
|
t.string :url, limit: 500, null: false#{charset_and_collation}
|
868
879
|
end
|
869
|
-
create_table :advertisers, id:
|
880
|
+
create_table :advertisers, id: #{primary_key_type}#{create_table_charset_and_collation} do |t|
|
870
881
|
t.string :name, limit: 250, null: false#{charset_and_collation}
|
871
882
|
end
|
872
883
|
add_index :advertisers_creatives, [:creative_id], name: :index_advertisers_creatives_on_creative_id
|
@@ -875,14 +886,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
875
886
|
EOS
|
876
887
|
else
|
877
888
|
migrate_up(<<~EOS.strip)
|
878
|
-
create_table :advertisers, id:
|
889
|
+
create_table :advertisers, id: #{primary_key_type}#{create_table_charset_and_collation} do |t|
|
879
890
|
t.string :name, limit: 250, null: false#{charset_and_collation}
|
880
891
|
end
|
881
892
|
create_table :advertisers_creatives, primary_key: [:advertiser_id, :creative_id]#{create_table_charset_and_collation} do |t|
|
882
893
|
t.integer :advertiser_id, limit: 8, null: false
|
883
894
|
t.integer :creative_id, limit: 8, null: false
|
884
895
|
end
|
885
|
-
create_table :creatives, id:
|
896
|
+
create_table :creatives, id: #{primary_key_type}#{create_table_charset_and_collation} do |t|
|
886
897
|
t.string :url, limit: 500, null: false#{charset_and_collation}
|
887
898
|
end
|
888
899
|
add_index :advertisers_creatives, [:creative_id], name: :index_advertisers_creatives_on_creative_id
|
@@ -898,19 +909,25 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
898
909
|
end
|
899
910
|
|
900
911
|
context 'models with the same parent foreign key relation' do
|
912
|
+
include_context 'skip if' do
|
913
|
+
let(:adapter) { 'sqlite3' }
|
914
|
+
end
|
915
|
+
|
901
916
|
before do
|
902
|
-
class Category < ActiveRecord::Base
|
917
|
+
class Category < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
903
918
|
declare_schema do
|
904
919
|
string :name, limit: 250, null: true
|
905
920
|
end
|
906
921
|
end
|
907
|
-
|
922
|
+
|
923
|
+
class Advertiser < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
908
924
|
declare_schema do
|
909
925
|
string :name, limit: 250, null: true
|
910
926
|
end
|
911
927
|
belongs_to :category, limit: 8
|
912
928
|
end
|
913
|
-
|
929
|
+
|
930
|
+
class Affiliate < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
914
931
|
declare_schema do
|
915
932
|
string :name, limit: 250, null: true
|
916
933
|
end
|
@@ -918,56 +935,27 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
918
935
|
end
|
919
936
|
end
|
920
937
|
|
938
|
+
let(:fixture_file_path) do
|
939
|
+
if ActiveSupport.version >= Gem::Version.new('7.0.0') && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.1.0')
|
940
|
+
"../../fixtures/migrations/#{current_adapter}/will_generate_unique_constraint_names_rails_7.txt"
|
941
|
+
else
|
942
|
+
"../../fixtures/migrations/#{current_adapter}/will_generate_unique_constraint_names_rails_6.txt"
|
943
|
+
end
|
944
|
+
end
|
945
|
+
|
921
946
|
it 'will generate unique constraint names' do
|
922
|
-
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
923
|
-
|
924
|
-
migrate_up(<<~EOS.strip)
|
925
|
-
create_table :affiliates, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
926
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
927
|
-
t.integer :category_id, limit: 8, null: false
|
928
|
-
end
|
929
|
-
create_table :advertisers, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
930
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
931
|
-
t.integer :category_id, limit: 8, null: false
|
932
|
-
end
|
933
|
-
create_table :categories, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
934
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
935
|
-
end
|
936
|
-
add_index :affiliates, [:category_id], name: :index_affiliates_on_category_id
|
937
|
-
add_index :advertisers, [:category_id], name: :index_advertisers_on_category_id
|
938
|
-
add_foreign_key :affiliates, :categories, column: :category_id, name: :index_affiliates_on_category_id
|
939
|
-
add_foreign_key :advertisers, :categories, column: :category_id, name: :index_advertisers_on_category_id
|
940
|
-
EOS
|
941
|
-
else
|
942
|
-
migrate_up(<<~EOS.strip)
|
943
|
-
create_table :categories, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
944
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
945
|
-
end
|
946
|
-
create_table :advertisers, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
947
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
948
|
-
t.integer :category_id, limit: 8, null: false
|
949
|
-
end
|
950
|
-
create_table :affiliates, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
951
|
-
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
952
|
-
t.integer :category_id, limit: 8, null: false
|
953
|
-
end
|
954
|
-
add_index :advertisers, [:category_id], name: :index_advertisers_on_category_id
|
955
|
-
add_index :affiliates, [:category_id], name: :index_affiliates_on_category_id
|
956
|
-
add_foreign_key :advertisers, :categories, column: :category_id, name: :index_advertisers_on_category_id
|
957
|
-
add_foreign_key :affiliates, :categories, column: :category_id, name: :index_affiliates_on_category_id
|
958
|
-
EOS
|
959
|
-
end
|
960
|
-
)
|
947
|
+
expect(Generators::DeclareSchema::Migration::Migrator.run).to(migrate_up(File.read(File.expand_path(fixture_file_path, __dir__)).chomp))
|
948
|
+
|
961
949
|
migrate
|
962
950
|
|
963
951
|
nuke_model_class(Advertiser)
|
964
952
|
nuke_model_class(Affiliate)
|
965
953
|
end
|
966
|
-
end
|
954
|
+
end
|
967
955
|
|
968
956
|
describe 'serialize' do
|
969
957
|
before do
|
970
|
-
class Ad < ActiveRecord::Base
|
958
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
971
959
|
@serialize_args = []
|
972
960
|
|
973
961
|
class << self
|
@@ -982,7 +970,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
982
970
|
|
983
971
|
describe 'untyped' do
|
984
972
|
it 'allows serialize: true' do
|
985
|
-
class Ad < ActiveRecord::Base
|
973
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
986
974
|
declare_schema do
|
987
975
|
text :allow_list, limit: 0xFFFF, serialize: true
|
988
976
|
end
|
@@ -992,7 +980,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
992
980
|
end
|
993
981
|
|
994
982
|
it 'converts defaults with .to_yaml' do
|
995
|
-
class Ad < ActiveRecord::Base
|
983
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
996
984
|
declare_schema do
|
997
985
|
string :allow_list, limit: 250, serialize: true, null: true, default: []
|
998
986
|
string :allow_hash, limit: 250, serialize: true, null: true, default: {}
|
@@ -1010,7 +998,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1010
998
|
|
1011
999
|
describe 'Array' do
|
1012
1000
|
it 'allows serialize: Array' do
|
1013
|
-
class Ad < ActiveRecord::Base
|
1001
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1014
1002
|
declare_schema do
|
1015
1003
|
string :allow_list, limit: 250, serialize: Array, null: true
|
1016
1004
|
end
|
@@ -1020,7 +1008,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1020
1008
|
end
|
1021
1009
|
|
1022
1010
|
it 'allows Array defaults' do
|
1023
|
-
class Ad < ActiveRecord::Base
|
1011
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1024
1012
|
declare_schema do
|
1025
1013
|
string :allow_list, limit: 250, serialize: Array, null: true, default: [2]
|
1026
1014
|
string :allow_string, limit: 250, serialize: Array, null: true, default: ['abc']
|
@@ -1038,7 +1026,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1038
1026
|
|
1039
1027
|
describe 'Hash' do
|
1040
1028
|
it 'allows serialize: Hash' do
|
1041
|
-
class Ad < ActiveRecord::Base
|
1029
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1042
1030
|
declare_schema do
|
1043
1031
|
string :allow_list, limit: 250, serialize: Hash, null: true
|
1044
1032
|
end
|
@@ -1048,7 +1036,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1048
1036
|
end
|
1049
1037
|
|
1050
1038
|
it 'allows Hash defaults' do
|
1051
|
-
class Ad < ActiveRecord::Base
|
1039
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1052
1040
|
declare_schema do
|
1053
1041
|
string :allow_loc, limit: 250, serialize: Hash, null: true, default: { 'state' => 'CA' }
|
1054
1042
|
string :allow_hash, limit: 250, serialize: Hash, null: true, default: {}
|
@@ -1064,7 +1052,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1064
1052
|
|
1065
1053
|
describe 'JSON' do
|
1066
1054
|
it 'allows serialize: JSON' do
|
1067
|
-
class Ad < ActiveRecord::Base
|
1055
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1068
1056
|
declare_schema do
|
1069
1057
|
string :allow_list, limit: 250, serialize: JSON
|
1070
1058
|
end
|
@@ -1074,7 +1062,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1074
1062
|
end
|
1075
1063
|
|
1076
1064
|
it 'allows JSON defaults' do
|
1077
|
-
class Ad < ActiveRecord::Base
|
1065
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1078
1066
|
declare_schema do
|
1079
1067
|
string :allow_hash, limit: 250, serialize: JSON, null: true, default: { 'state' => 'CA' }
|
1080
1068
|
string :allow_empty_array, limit: 250, serialize: JSON, null: true, default: []
|
@@ -1090,7 +1078,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1090
1078
|
end
|
1091
1079
|
end
|
1092
1080
|
|
1093
|
-
class ValueClass
|
1081
|
+
class ValueClass # rubocop:disable Lint/ConstantDefinitionInBlock
|
1094
1082
|
delegate :present?, :inspect, to: :@value
|
1095
1083
|
|
1096
1084
|
def initialize(value)
|
@@ -1114,7 +1102,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1114
1102
|
|
1115
1103
|
describe 'custom coder' do
|
1116
1104
|
it 'allows serialize: ValueClass' do
|
1117
|
-
class Ad < ActiveRecord::Base
|
1105
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1118
1106
|
declare_schema do
|
1119
1107
|
string :allow_list, limit: 250, serialize: ValueClass
|
1120
1108
|
end
|
@@ -1124,7 +1112,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1124
1112
|
end
|
1125
1113
|
|
1126
1114
|
it 'allows ValueClass defaults' do
|
1127
|
-
class Ad < ActiveRecord::Base
|
1115
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1128
1116
|
declare_schema do
|
1129
1117
|
string :allow_hash, limit: 250, serialize: ValueClass, null: true, default: ValueClass.new([2])
|
1130
1118
|
string :allow_empty_array, limit: 250, serialize: ValueClass, null: true, default: ValueClass.new([])
|
@@ -1140,7 +1128,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1140
1128
|
|
1141
1129
|
it 'disallows serialize: with a non-string column type' do
|
1142
1130
|
expect do
|
1143
|
-
class Ad < ActiveRecord::Base
|
1131
|
+
class Ad < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1144
1132
|
declare_schema do
|
1145
1133
|
integer :allow_list, limit: 8, serialize: true
|
1146
1134
|
end
|
@@ -1163,7 +1151,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1163
1151
|
end
|
1164
1152
|
end
|
1165
1153
|
|
1166
|
-
class Advert < ActiveRecord::Base
|
1154
|
+
class Advert < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1167
1155
|
declare_schema do
|
1168
1156
|
string :name, limit: 250, null: true
|
1169
1157
|
integer :category_id, limit: 8
|
@@ -1175,7 +1163,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1175
1163
|
end
|
1176
1164
|
|
1177
1165
|
it 'passes through optional: when given' do
|
1178
|
-
class AdvertBelongsTo < ActiveRecord::Base
|
1166
|
+
class AdvertBelongsTo < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1179
1167
|
self.table_name = 'adverts'
|
1180
1168
|
declare_schema { }
|
1181
1169
|
reset_column_information
|
@@ -1186,7 +1174,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1186
1174
|
|
1187
1175
|
describe 'contradictory settings' do # contradictory settings are ok--for example, during migration
|
1188
1176
|
it 'passes through optional: true, null: false' do
|
1189
|
-
class AdvertBelongsTo < ActiveRecord::Base
|
1177
|
+
class AdvertBelongsTo < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1190
1178
|
self.table_name = 'adverts'
|
1191
1179
|
declare_schema { }
|
1192
1180
|
reset_column_information
|
@@ -1197,7 +1185,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1197
1185
|
end
|
1198
1186
|
|
1199
1187
|
it 'passes through optional: false, null: true' do
|
1200
|
-
class AdvertBelongsTo < ActiveRecord::Base
|
1188
|
+
class AdvertBelongsTo < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1201
1189
|
self.table_name = 'adverts'
|
1202
1190
|
declare_schema { }
|
1203
1191
|
reset_column_information
|
@@ -1211,7 +1199,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1211
1199
|
[false, true].each do |nullable|
|
1212
1200
|
context "nullable=#{nullable}" do
|
1213
1201
|
it 'infers optional: from null:' do
|
1214
|
-
eval <<~EOS
|
1202
|
+
eval <<~EOS # rubocop:disable Style/EvalWithLocation,Security/Eval
|
1215
1203
|
class AdvertBelongsTo < ActiveRecord::Base
|
1216
1204
|
declare_schema { }
|
1217
1205
|
belongs_to :ad_category, null: #{nullable}
|
@@ -1222,7 +1210,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1222
1210
|
end
|
1223
1211
|
|
1224
1212
|
it 'infers null: from optional:' do
|
1225
|
-
eval <<~EOS
|
1213
|
+
eval <<~EOS # rubocop:disable Style/EvalWithLocation,Security/Eval
|
1226
1214
|
class AdvertBelongsTo < ActiveRecord::Base
|
1227
1215
|
declare_schema { }
|
1228
1216
|
belongs_to :ad_category, optional: #{nullable}
|
@@ -1235,8 +1223,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1235
1223
|
end
|
1236
1224
|
|
1237
1225
|
it 'deprecates limit:' do
|
1238
|
-
expect(
|
1239
|
-
eval <<~EOS
|
1226
|
+
expect(DeclareSchema.deprecator).to receive(:warn).with("belongs_to :ad_category, limit: is deprecated since it is now inferred")
|
1227
|
+
eval <<~EOS # rubocop:disable Style/EvalWithLocation
|
1240
1228
|
class UsingLimit < ActiveRecord::Base
|
1241
1229
|
declare_schema { }
|
1242
1230
|
belongs_to :ad_category, limit: 4
|
@@ -1247,18 +1235,21 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1247
1235
|
|
1248
1236
|
context 'when parent object PKs have different limits' do
|
1249
1237
|
before do
|
1250
|
-
class IdDefault < ActiveRecord::Base
|
1238
|
+
class IdDefault < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1251
1239
|
declare_schema { }
|
1252
1240
|
end
|
1253
|
-
|
1241
|
+
|
1242
|
+
class Id4 < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1254
1243
|
declare_schema id: :integer do
|
1255
1244
|
end
|
1256
1245
|
end
|
1257
|
-
|
1246
|
+
|
1247
|
+
class Id8 < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1258
1248
|
declare_schema id: :bigint do
|
1259
1249
|
end
|
1260
1250
|
end
|
1261
|
-
|
1251
|
+
|
1252
|
+
class Fk < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1262
1253
|
declare_schema { }
|
1263
1254
|
belongs_to :id_default
|
1264
1255
|
belongs_to :id4
|
@@ -1271,7 +1262,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1271
1262
|
|
1272
1263
|
create_id4_defaults = up.split("\n").grep(/create_table :id_defaults/).first
|
1273
1264
|
expect(create_id4_defaults).to be, up
|
1274
|
-
|
1265
|
+
case current_adapter
|
1266
|
+
when 'postgresql'
|
1267
|
+
expect(create_id4_defaults).to match(/, id: :bigserial/)
|
1268
|
+
else
|
1269
|
+
expect(create_id4_defaults).to match(/, id: :bigint/)
|
1270
|
+
end
|
1275
1271
|
|
1276
1272
|
create_id4s = up.split("\n").grep(/create_table :id4s/).first
|
1277
1273
|
expect(create_id4s).to be, up
|
@@ -1286,7 +1282,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1286
1282
|
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
1287
1283
|
|
1288
1284
|
create_fks = up.split("\n").grep(/t\.integer /).map { |command| command.gsub(', null: false', '').gsub(/^ +/, '') }
|
1289
|
-
if
|
1285
|
+
if current_adapter == 'sqlite3'
|
1290
1286
|
create_fks.map! { |command| command.gsub(/limit: [a-z0-9]+/, 'limit: X') }
|
1291
1287
|
expect(create_fks).to eq([
|
1292
1288
|
't.integer :id_default_id, limit: X',
|
@@ -1312,20 +1308,22 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1312
1308
|
nuke_model_class(Fk)
|
1313
1309
|
ActiveRecord::Base.connection.schema_cache.clear!
|
1314
1310
|
|
1315
|
-
|
1316
|
-
class NewIdDefault < ActiveRecord::Base
|
1311
|
+
class NewIdDefault < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1317
1312
|
self.table_name = 'id_defaults'
|
1318
1313
|
declare_schema { }
|
1319
1314
|
end
|
1320
|
-
|
1315
|
+
|
1316
|
+
class NewId4 < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1321
1317
|
self.table_name = 'id4s'
|
1322
1318
|
declare_schema { }
|
1323
1319
|
end
|
1324
|
-
|
1320
|
+
|
1321
|
+
class NewId8 < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1325
1322
|
self.table_name = 'id8s'
|
1326
1323
|
declare_schema { }
|
1327
1324
|
end
|
1328
|
-
|
1325
|
+
|
1326
|
+
class NewFk < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
|
1329
1327
|
declare_schema { }
|
1330
1328
|
belongs_to :new_id_default
|
1331
1329
|
belongs_to :new_id4
|
@@ -1337,7 +1335,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1337
1335
|
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
1338
1336
|
|
1339
1337
|
create_fks = up.split("\n").grep(/t\.integer /).map { |command| command.gsub(', null: false', '').gsub(/^ +/, '') }
|
1340
|
-
if
|
1338
|
+
if current_adapter == 'sqlite3'
|
1341
1339
|
create_fks.map! { |command| command.gsub(/limit: [a-z0-9]+/, 'limit: X') }
|
1342
1340
|
expect(create_fks).to eq([
|
1343
1341
|
't.integer :new_id_default_id, limit: X',
|
@@ -1359,7 +1357,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1359
1357
|
|
1360
1358
|
describe 'migration base class' do
|
1361
1359
|
it 'adapts to Rails 4' do
|
1362
|
-
class Advert < active_record_base_class.constantize
|
1360
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1363
1361
|
declare_schema do
|
1364
1362
|
string :title, limit: 100
|
1365
1363
|
end
|
@@ -1379,7 +1377,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1379
1377
|
|
1380
1378
|
context 'Does not generate migrations' do
|
1381
1379
|
it 'for aliased fields bigint -> integer limit 8' do
|
1382
|
-
class Advert < active_record_base_class.constantize
|
1380
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1383
1381
|
declare_schema do
|
1384
1382
|
bigint :price
|
1385
1383
|
end
|
@@ -1390,7 +1388,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1390
1388
|
migrations = Dir.glob('db/migrate/*declare_schema_migration*.rb')
|
1391
1389
|
expect(migrations.size).to eq(1), migrations.inspect
|
1392
1390
|
|
1393
|
-
class Advert < active_record_base_class.constantize
|
1391
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1394
1392
|
declare_schema do
|
1395
1393
|
integer :price, limit: 8
|
1396
1394
|
end
|
@@ -1404,7 +1402,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1404
1402
|
let(:default_schema_block) { nil }
|
1405
1403
|
let(:declare_model) do
|
1406
1404
|
-> do
|
1407
|
-
class Advert < active_record_base_class.constantize
|
1405
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1408
1406
|
declare_schema do
|
1409
1407
|
integer :price, limit: 8
|
1410
1408
|
end
|
@@ -1444,7 +1442,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1444
1442
|
|
1445
1443
|
context 'and the model sets default_schema: false' do
|
1446
1444
|
before do
|
1447
|
-
class Advert < active_record_base_class.constantize
|
1445
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1448
1446
|
declare_schema default_schema: false do
|
1449
1447
|
integer :price, limit: 8
|
1450
1448
|
end
|
@@ -1458,7 +1456,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1458
1456
|
|
1459
1457
|
context 'and the block has redundant fields' do
|
1460
1458
|
before do
|
1461
|
-
class Advert < active_record_base_class.constantize
|
1459
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1462
1460
|
declare_schema do
|
1463
1461
|
integer :price, limit: 8
|
1464
1462
|
timestamps
|
@@ -1475,7 +1473,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1475
1473
|
|
1476
1474
|
context 'index' do
|
1477
1475
|
before do
|
1478
|
-
class Advert < active_record_base_class.constantize
|
1476
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1479
1477
|
declare_schema { }
|
1480
1478
|
belongs_to :ad_category
|
1481
1479
|
end
|
@@ -1501,7 +1499,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1501
1499
|
|
1502
1500
|
context 'constraint' do
|
1503
1501
|
before do
|
1504
|
-
class Advert < active_record_base_class.constantize
|
1502
|
+
class Advert < active_record_base_class.constantize # rubocop:disable Lint/ConstantDefinitionInBlock
|
1505
1503
|
declare_schema { }
|
1506
1504
|
belongs_to :ad_category
|
1507
1505
|
end
|
@@ -1509,13 +1507,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1509
1507
|
|
1510
1508
|
it "when exactly equal, it is idempotent and doesn't raise" do
|
1511
1509
|
expect do
|
1512
|
-
Advert.constraint
|
1510
|
+
Advert.constraint(:ad_category_id, parent_table_name: 'ad_categories',
|
1511
|
+
constraint_name: :index_adverts_on_ad_category_id, parent_class_name: 'AdCategory')
|
1513
1512
|
end.to_not change { Advert.index_definitions.size }
|
1514
1513
|
end
|
1515
1514
|
|
1516
1515
|
it "when equivalent, it is idempotent and doesn't raise" do
|
1517
1516
|
expect do
|
1518
|
-
Advert.constraint
|
1517
|
+
Advert.constraint(:ad_category_id, parent_table_name: 'ad_categories', constraint_name: :constraint_1, parent_class_name: 'AdCategory')
|
1519
1518
|
end.to_not change { Advert.index_definitions.size }
|
1520
1519
|
end
|
1521
1520
|
end
|