declare_schema 2.0.0 → 2.1.0.pre.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/.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
|