declare_schema 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3ae0814480b116b32a822887c83612b33458cc910384ae0c2122e547757f141
4
- data.tar.gz: 133b7bd6d7d91dae9320a4e8002a8591e43ebb97f57013cbe266cef40a169088
3
+ metadata.gz: 8b82febb09d3ef72dd3e219c6900abd790e6401e9b15c9ca05c8cd9fc20c5bf4
4
+ data.tar.gz: 3f2520292af5845df795dba3f26ee62385d1166da51ce5c6a980d1fdc52460a3
5
5
  SHA512:
6
- metadata.gz: 77b840eb5feb07d38c4fd96f4212d4c81f19c61a2aa2b4bbffb4f4f11594ba55c30e65ca4b77a68e7b29448f7762dba52782f1845307c5bbc02f7603f080c2e8
7
- data.tar.gz: 2f85affbd44a6973595883afa01766ede6c950a70c4e783f3064e5c2a59ec5c71a3731d7d484bab133c18c698584077e2c14a8b98c81ce024e2e55bae59dabba
6
+ metadata.gz: bb726c72430d5b44d94239c3d00abfa42a1c4e2a9c23ad316bd66ec6567857a81c6f7766136bf3d4d78d1df7a43edec2da7e0162cabd60080892b29a2f6b69ce
7
+ data.tar.gz: 4f39c4534895f33f5d30181ef18b09c2fd9eb535e9da14b0ce502c9117cf28e58404e4c6b2254ffb322a3faea99f0433de6450b9fca96a0585bc87d25047c7b8
@@ -4,6 +4,10 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
5
  Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.1] - 2020-11-13
8
+ ### Fixed
9
+ - When passing `belongs_to` to Rails, suppress the `optional:` option in Rails 4, since that option was added in Rails 5.
10
+
7
11
  ## [0.3.0] - 2020-11-02
8
12
  ### Added
9
13
  - Added support for `belongs_to optional:`.
@@ -43,6 +47,7 @@ using the appropriate Rails configuration attributes.
43
47
  ### Added
44
48
  - Initial version from https://github.com/Invoca/hobo_fields v4.1.0.
45
49
 
50
+ [0.3.1]: https://github.com/Invoca/declare_schema/compare/v0.3.0...v0.3.1
46
51
  [0.3.0]: https://github.com/Invoca/declare_schema/compare/v0.2.0...v0.3.0
47
52
  [0.2.0]: https://github.com/Invoca/declare_schema/compare/v0.1.3...v0.2.0
48
53
  [0.1.3]: https://github.com/Invoca/declare_schema/compare/v0.1.2...v0.1.3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- declare_schema (0.3.0)
4
+ declare_schema (0.3.1)
5
5
  rails (>= 4.2)
6
6
 
7
7
  GEM
@@ -54,7 +54,7 @@ GEM
54
54
  thor (>= 0.14.0)
55
55
  arel (9.0.0)
56
56
  ast (2.4.1)
57
- bootsnap (1.4.8)
57
+ bootsnap (1.5.0)
58
58
  msgpack (~> 1.0)
59
59
  builder (3.2.4)
60
60
  byebug (11.1.3)
@@ -134,19 +134,19 @@ GEM
134
134
  actionpack (>= 5.0)
135
135
  railties (>= 5.0)
136
136
  rexml (3.2.4)
137
- rspec (3.9.0)
138
- rspec-core (~> 3.9.0)
139
- rspec-expectations (~> 3.9.0)
140
- rspec-mocks (~> 3.9.0)
141
- rspec-core (3.9.2)
142
- rspec-support (~> 3.9.3)
143
- rspec-expectations (3.9.2)
137
+ rspec (3.10.0)
138
+ rspec-core (~> 3.10.0)
139
+ rspec-expectations (~> 3.10.0)
140
+ rspec-mocks (~> 3.10.0)
141
+ rspec-core (3.10.0)
142
+ rspec-support (~> 3.10.0)
143
+ rspec-expectations (3.10.0)
144
144
  diff-lcs (>= 1.2.0, < 2.0)
145
- rspec-support (~> 3.9.0)
146
- rspec-mocks (3.9.1)
145
+ rspec-support (~> 3.10.0)
146
+ rspec-mocks (3.10.0)
147
147
  diff-lcs (>= 1.2.0, < 2.0)
148
- rspec-support (~> 3.9.0)
149
- rspec-support (3.9.3)
148
+ rspec-support (~> 3.10.0)
149
+ rspec-support (3.10.0)
150
150
  rubocop (0.91.0)
151
151
  parallel (~> 1.10)
152
152
  parser (>= 2.7.1.1)
@@ -106,7 +106,7 @@ module DeclareSchema
106
106
  end
107
107
 
108
108
  # Extend belongs_to so that it creates a FieldSpec for the foreign key
109
- def belongs_to(name, scope = nil, **options, &block)
109
+ def belongs_to(name, scope = nil, **options)
110
110
  column_options = {}
111
111
 
112
112
  column_options[:null] = if options.has_key?(:null)
@@ -128,13 +128,17 @@ module DeclareSchema
128
128
 
129
129
  fk = options[:foreign_key]&.to_s || "#{name}_id"
130
130
 
131
- if !options.has_key?(:optional) && Rails::VERSION::MAJOR >= 5
131
+ if !options.has_key?(:optional)
132
132
  options[:optional] = column_options[:null] # infer :optional from :null
133
133
  end
134
134
 
135
135
  fk_options[:dependent] = options.delete(:far_end_dependent) if options.has_key?(:far_end_dependent)
136
136
 
137
- super(name, scope, options)
137
+ if Rails::VERSION::MAJOR >= 5
138
+ super
139
+ else
140
+ super(name, scope, options.except(:optional))
141
+ end
138
142
 
139
143
  refl = reflections[name.to_s] or raise "Couldn't find reflection #{name} in #{reflections.keys}"
140
144
  fkey = refl.foreign_key or raise "Couldn't find foreign_key for #{name} in #{refl.inspect}"
@@ -145,7 +149,6 @@ module DeclareSchema
145
149
  index([foreign_type, fkey], index_options) if index_options[:name] != false
146
150
  else
147
151
  index(fkey, index_options) if index_options[:name] != false
148
- options[:constraint_name] = options
149
152
  constraint(fkey, fk_options) if fk_options[:constraint_name] != false
150
153
  end
151
154
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeclareSchema
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.1"
5
5
  end
@@ -413,7 +413,7 @@ module Generators
413
413
  col_name = old_names[c] || c
414
414
  col = db_columns[col_name]
415
415
  spec = model.field_specs[c]
416
- if spec.different_to?(col) # TODO: DRY this up to a diff function that returns the differences. It's different if it has differences. -Colin
416
+ if spec.different_to?(col) # TODO: TECH-4814 DRY this up to a diff function that returns the differences. It's different if it has differences. -Colin
417
417
  change_spec = fk_field_options(model, c)
418
418
  change_spec[:limit] ||= spec.limit if (spec.sql_type != :text ||
419
419
  ::DeclareSchema::Model::FieldSpec.mysql_text_limits?) &&
@@ -10,14 +10,14 @@ RSpec.describe 'DeclareSchema API' do
10
10
 
11
11
  describe 'example models' do
12
12
  it 'generates a model' do
13
- expect(system("bundle exec rails generate declare_schema:model advert title:string body:text")).to be_truthy
13
+ generate_model 'advert', 'title:string', 'body:text'
14
14
 
15
15
  # The above will generate the test, fixture and a model file like this:
16
16
  # model_declaration = Rails::Generators.invoke('declare_schema:model', ['advert2', 'title:string', 'body:text'])
17
17
  # expect(model_declaration.first).to eq([["Advert"], nil, "app/models/advert.rb", nil,
18
18
  # [["AdvertTest"], "test/models/advert_test.rb", nil, "test/fixtures/adverts.yml"]])
19
19
 
20
- expect(File.read("#{TESTAPP_PATH}/app/models/advert.rb")).to eq(<<~EOS)
20
+ expect_model_definition_to_eq('advert', <<~EOS)
21
21
  class Advert < #{active_record_base_class}
22
22
 
23
23
  fields do
@@ -27,7 +27,8 @@ RSpec.describe 'DeclareSchema API' do
27
27
 
28
28
  end
29
29
  EOS
30
- system("rm -rf #{TESTAPP_PATH}/app/models/advert2.rb #{TESTAPP_PATH}/test/models/advert2.rb #{TESTAPP_PATH}/test/fixtures/advert2.rb")
30
+
31
+ clean_up_model('advert2')
31
32
 
32
33
  # The migration generator uses this information to create a migration.
33
34
  # The following creates and runs the migration:
@@ -36,13 +37,11 @@ RSpec.describe 'DeclareSchema API' do
36
37
 
37
38
  # We're now ready to start demonstrating the API
38
39
 
39
- Rails.application.config.autoload_paths += ["#{TESTAPP_PATH}/app/models"]
40
-
41
- $LOAD_PATH << "#{TESTAPP_PATH}/app/models"
40
+ load_models
42
41
 
43
42
  unless Rails::VERSION::MAJOR >= 6
44
43
  # TODO: get this to work on Travis for Rails 6
45
- Rails::Generators.invoke('declare_schema:migration', %w[-n -m])
44
+ generate_migrations '-n', '-m'
46
45
  end
47
46
 
48
47
  require 'advert'
@@ -6,22 +6,20 @@ RSpec.describe 'DeclareSchema Migration Generator' do
6
6
  end
7
7
 
8
8
  it "generates nested models" do
9
- Rails::Generators.invoke('declare_schema:model', %w[alpha/beta one:string two:integer])
9
+ generate_model 'alpha/beta', 'one:string', 'two:integer'
10
10
 
11
- expect(File.exist?('app/models/alpha/beta.rb')).to be_truthy
12
-
13
- expect(File.read('app/models/alpha/beta.rb')).to eq(<<~EOS)
11
+ expect_model_definition_to_eq('alpha/beta', <<~EOS)
14
12
  class Alpha::Beta < #{active_record_base_class}
15
-
13
+
16
14
  fields do
17
15
  one :string, limit: 255
18
16
  two :integer
19
17
  end
20
-
18
+
21
19
  end
22
20
  EOS
23
21
 
24
- expect(File.read('app/models/alpha.rb')).to eq(<<~EOS)
22
+ expect_model_definition_to_eq('alpha', <<~EOS)
25
23
  module Alpha
26
24
  def self.table_name_prefix
27
25
  'alpha_'
@@ -29,9 +27,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
29
27
  end
30
28
  EOS
31
29
 
32
- expect(File.read('test/models/alpha/beta_test.rb')).to eq(<<~EOS)
30
+ expect_test_definition_to_eq('alpha/beta', <<~EOS)
33
31
  require 'test_helper'
34
-
32
+
35
33
  class Alpha::BetaTest < ActiveSupport::TestCase
36
34
  # test "the truth" do
37
35
  # assert true
@@ -39,7 +37,50 @@ RSpec.describe 'DeclareSchema Migration Generator' do
39
37
  end
40
38
  EOS
41
39
 
42
- expect(File.exist?('test/fixtures/alpha/beta.yml')).to be_truthy
40
+ case Rails::VERSION::MAJOR
41
+ when 4
42
+ expect_test_fixture_to_eq('alpha/beta', <<~EOS)
43
+ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
44
+
45
+ # This model initially had no columns defined. If you add columns to the
46
+ # model remove the '{}' from the fixture names and add the columns immediately
47
+ # below each fixture, per the syntax in the comments below
48
+ #
49
+ one: {}
50
+ # column: value
51
+ #
52
+ two: {}
53
+ # column: value
54
+ EOS
55
+ when 5
56
+ expect_test_fixture_to_eq('alpha/beta', <<~EOS)
57
+ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
58
+
59
+ # This model initially had no columns defined. If you add columns to the
60
+ # model remove the '{}' from the fixture names and add the columns immediately
61
+ # below each fixture, per the syntax in the comments below
62
+ #
63
+ one: {}
64
+ # column: value
65
+ #
66
+ two: {}
67
+ # column: value
68
+ EOS
69
+ when 6
70
+ expect_test_fixture_to_eq('alpha/beta', <<~EOS)
71
+ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
72
+
73
+ # This model initially had no columns defined. If you add columns to the
74
+ # model remove the '{}' from the fixture names and add the columns immediately
75
+ # below each fixture, per the syntax in the comments below
76
+ #
77
+ one: {}
78
+ # column: value
79
+ #
80
+ two: {}
81
+ # column: value
82
+ EOS
83
+ end
43
84
 
44
85
  $LOAD_PATH << "#{TESTAPP_PATH}/app/models"
45
86
 
@@ -12,7 +12,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
12
12
  self.primary_key = "foo_id"
13
13
  end
14
14
 
15
- Rails::Generators.invoke('declare_schema:migration', %w[-n -m])
15
+ generate_migrations '-n', '-m'
16
16
  expect(Foo.primary_key).to eq('foo_id')
17
17
 
18
18
  ### migrate from
@@ -24,7 +24,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
24
24
  end
25
25
 
26
26
  puts "\n\e[45m Please enter 'id' (no quotes) at the next prompt \e[0m"
27
- Rails::Generators.invoke('declare_schema:migration', %w[-n -m])
27
+ generate_migrations '-n', '-m'
28
28
  expect(Foo.primary_key).to eq('id')
29
29
 
30
30
  nuke_model_class(Foo)
@@ -39,7 +39,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
39
39
  end
40
40
 
41
41
  puts "\n\e[45m Please enter 'drop id' (no quotes) at the next prompt \e[0m"
42
- Rails::Generators.invoke('declare_schema:migration', %w[-n -m])
42
+ generate_migrations '-n', '-m'
43
43
  expect(Foo.primary_key).to eq('foo_id')
44
44
 
45
45
  ### ensure it doesn't cause further migrations
@@ -11,14 +11,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
11
11
  it 'generates migrations' do
12
12
  ## The migration generator -- introduction
13
13
 
14
- up_down = Generators::DeclareSchema::Migration::Migrator.run
15
- expect(up_down).to eq(["", ""])
14
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to migrate_up("").and migrate_down("")
16
15
 
17
16
  class Advert < ActiveRecord::Base
18
17
  end
19
18
 
20
- up_down = Generators::DeclareSchema::Migration::Migrator.run
21
- expect(up_down).to eq(["", ""])
19
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to migrate_up("").and migrate_down("")
22
20
 
23
21
  Generators::DeclareSchema::Migration::Migrator.ignore_tables = ["green_fishes"]
24
22
 
@@ -30,13 +28,17 @@ RSpec.describe 'DeclareSchema Migration Generator' do
30
28
  name :string, limit: 255, null: true
31
29
  end
32
30
  end
33
- up, down = Generators::DeclareSchema::Migration::Migrator.run
34
- expect(up).to eq(<<~EOS.strip)
35
- create_table :adverts, id: :bigint do |t|
36
- t.string :name, limit: 255
37
- end
38
- EOS
39
- expect(down).to eq("drop_table :adverts")
31
+
32
+ up, _ = Generators::DeclareSchema::Migration::Migrator.run.tap do |migrations|
33
+ expect(migrations).to(
34
+ migrate_up(<<~EOS.strip)
35
+ create_table :adverts, id: :bigint do |t|
36
+ t.string :name, limit: 255
37
+ end
38
+ EOS
39
+ .and migrate_down("drop_table :adverts")
40
+ )
41
+ end
40
42
 
41
43
  ActiveRecord::Migration.class_eval(up)
42
44
  expect(Advert.columns.map(&:name)).to eq(["id", "name"])
@@ -48,19 +50,20 @@ RSpec.describe 'DeclareSchema Migration Generator' do
48
50
  published_at :datetime, null: true
49
51
  end
50
52
  end
51
- up, down = migrate
52
- expect(up).to eq(<<~EOS.strip)
53
- add_column :adverts, :body, :text
54
- add_column :adverts, :published_at, :datetime
55
53
 
56
- add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
57
- EOS
58
- # TODO: ^ TECH-4975 add_index should not be there
54
+ expect(migrate).to(
55
+ migrate_up(<<~EOS.strip)
56
+ add_column :adverts, :body, :text
57
+ add_column :adverts, :published_at, :datetime
59
58
 
60
- expect(down).to eq(<<~EOS.strip)
61
- remove_column :adverts, :body
62
- remove_column :adverts, :published_at
63
- EOS
59
+ add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
60
+ EOS
61
+ .and migrate_down(<<~EOS.strip)
62
+ remove_column :adverts, :body
63
+ remove_column :adverts, :published_at
64
+ EOS
65
+ )
66
+ # TODO: ^ TECH-4975 add_index should not be there
64
67
 
65
68
  Advert.field_specs.clear # not normally needed
66
69
  class Advert < ActiveRecord::Base
@@ -70,9 +73,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
70
73
  end
71
74
  end
72
75
 
73
- up, down = migrate
74
- expect(up).to eq("remove_column :adverts, :published_at")
75
- expect(down).to eq("add_column :adverts, :published_at, :datetime")
76
+ expect(migrate).to(
77
+ migrate_up("remove_column :adverts, :published_at").and(
78
+ migrate_down("add_column :adverts, :published_at, :datetime")
79
+ )
80
+ )
76
81
 
77
82
  nuke_model_class(Advert)
78
83
  class Advert < ActiveRecord::Base
@@ -82,20 +87,22 @@ RSpec.describe 'DeclareSchema Migration Generator' do
82
87
  end
83
88
  end
84
89
 
85
- up, down = Generators::DeclareSchema::Migration::Migrator.run
86
- expect(up).to eq(<<~EOS.strip)
87
- add_column :adverts, :title, :string, limit: 255
88
- remove_column :adverts, :name
89
- EOS
90
-
91
- expect(down).to eq(<<~EOS.strip)
92
- remove_column :adverts, :title
93
- add_column :adverts, :name, :string, limit: 255
94
- EOS
90
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
91
+ migrate_up(<<~EOS.strip)
92
+ add_column :adverts, :title, :string, limit: 255
93
+ remove_column :adverts, :name
94
+ EOS
95
+ .and migrate_down(<<~EOS.strip)
96
+ remove_column :adverts, :title
97
+ add_column :adverts, :name, :string, limit: 255
98
+ EOS
99
+ )
95
100
 
96
- up, down = Generators::DeclareSchema::Migration::Migrator.run(adverts: { name: :title })
97
- expect(up).to eq("rename_column :adverts, :name, :title")
98
- expect(down).to eq("rename_column :adverts, :title, :name")
101
+ expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { name: :title })).to(
102
+ migrate_up("rename_column :adverts, :name, :title").and(
103
+ migrate_down("rename_column :adverts, :title, :name")
104
+ )
105
+ )
99
106
 
100
107
  migrate
101
108
 
@@ -106,9 +113,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
106
113
  end
107
114
  end
108
115
 
109
- up_down = Generators::DeclareSchema::Migration::Migrator.run
110
- expect(up_down).to eq(["change_column :adverts, :title, :text",
111
- "change_column :adverts, :title, :string, limit: 255"])
116
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
117
+ migrate_up("change_column :adverts, :title, :text").and(
118
+ migrate_down("change_column :adverts, :title, :string, limit: 255")
119
+ )
120
+ )
112
121
 
113
122
  class Advert < ActiveRecord::Base
114
123
  fields do
@@ -117,11 +126,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
117
126
  end
118
127
  end
119
128
 
120
- up, down = migrate
121
- expect(up.split(',').slice(0,3).join(',')).to eq('change_column :adverts, :title, :string')
122
- expect(up.split(',').slice(3,2).sort.join(',')).to eq(" default: \"Untitled\", limit: 255")
123
- expect(down).to eq("change_column :adverts, :title, :string, limit: 255")
124
-
129
+ expect(migrate).to(
130
+ migrate_up(<<~EOS.strip)
131
+ change_column :adverts, :title, :string, limit: 255, default: "Untitled"
132
+ EOS
133
+ .and migrate_down(<<~EOS.strip)
134
+ change_column :adverts, :title, :string, limit: 255
135
+ EOS
136
+ )
125
137
 
126
138
  ### Limits
127
139
 
@@ -131,8 +143,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
131
143
  end
132
144
  end
133
145
 
134
- up = Generators::DeclareSchema::Migration::Migrator.run.first
135
- expect(up).to eq("add_column :adverts, :price, :integer, limit: 2")
146
+ up, _ = Generators::DeclareSchema::Migration::Migrator.run.tap do |migrations|
147
+ expect(migrations).to migrate_up("add_column :adverts, :price, :integer, limit: 2")
148
+ end
136
149
 
137
150
  # Now run the migration, then change the limit:
138
151
 
@@ -143,9 +156,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
143
156
  end
144
157
  end
145
158
 
146
- up, down = Generators::DeclareSchema::Migration::Migrator.run
147
- expect(up).to eq("change_column :adverts, :price, :integer, limit: 3")
148
- expect(down).to eq("change_column :adverts, :price, :integer, limit: 2")
159
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
160
+ migrate_up(<<~EOS.strip)
161
+ change_column :adverts, :price, :integer, limit: 3
162
+ EOS
163
+ .and migrate_down(<<~EOS.strip)
164
+ change_column :adverts, :price, :integer, limit: 2
165
+ EOS
166
+ )
149
167
 
150
168
  # Note that limit on a decimal column is ignored (use :scale and :precision)
151
169
 
@@ -156,8 +174,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
156
174
  end
157
175
  end
158
176
 
159
- up = Generators::DeclareSchema::Migration::Migrator.run.first
160
- expect(up).to eq("add_column :adverts, :price, :decimal")
177
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to migrate_up("add_column :adverts, :price, :decimal")
161
178
 
162
179
  # Limits are generally not needed for `text` fields, because by default, `text` fields will use the maximum size
163
180
  # allowed for that database type (0xffffffff for LONGTEXT in MySQL unlimited in Postgres, 1 billion in Sqlite).
@@ -172,12 +189,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
172
189
  end
173
190
  end
174
191
 
175
- up = Generators::DeclareSchema::Migration::Migrator.run.first
176
- expect(up).to eq(<<~EOS.strip)
177
- add_column :adverts, :price, :decimal
178
- add_column :adverts, :notes, :text, null: false
179
- add_column :adverts, :description, :text, null: false
180
- EOS
192
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
193
+ migrate_up(<<~EOS.strip)
194
+ add_column :adverts, :price, :decimal
195
+ add_column :adverts, :notes, :text, null: false
196
+ add_column :adverts, :description, :text, null: false
197
+ EOS
198
+ )
181
199
 
182
200
  # (There is no limit on `add_column ... :description` above since these tests are run against SQLite.)
183
201
 
@@ -196,11 +214,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
196
214
  end
197
215
  end
198
216
 
199
- up = Generators::DeclareSchema::Migration::Migrator.run.first
200
- expect(up).to eq(<<~EOS.strip)
201
- add_column :adverts, :notes, :text, null: false, limit: 4294967295
202
- add_column :adverts, :description, :text, null: false, limit: 255
203
- EOS
217
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
218
+ migrate_up(<<~EOS.strip)
219
+ add_column :adverts, :notes, :text, null: false, limit: 4294967295
220
+ add_column :adverts, :description, :text, null: false, limit: 255
221
+ EOS
222
+ )
204
223
 
205
224
  Advert.field_specs.delete :notes
206
225
 
@@ -239,9 +258,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
239
258
  end
240
259
  end
241
260
 
242
- up, down = Generators::DeclareSchema::Migration::Migrator.run
243
- expect(up).to eq("change_column :adverts, :description, :text, limit: 4294967295, null: false")
244
- expect(down).to eq("change_column :adverts, :description, :text")
261
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
262
+ migrate_up(<<~EOS.strip)
263
+ change_column :adverts, :description, :text, limit: 4294967295, null: false
264
+ EOS
265
+ .and migrate_down(<<~EOS.strip)
266
+ change_column :adverts, :description, :text
267
+ EOS
268
+ )
245
269
 
246
270
  # TODO TECH-4814: The above test should have this output:
247
271
  # TODO => "change_column :adverts, :description, :text, limit: 255
@@ -254,9 +278,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
254
278
  end
255
279
  end
256
280
 
257
- up, down = Generators::DeclareSchema::Migration::Migrator.run
258
- expect(up).to eq("change_column :adverts, :description, :text, limit: 4294967295, null: false")
259
- expect(down).to eq("change_column :adverts, :description, :text")
281
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
282
+ migrate_up(<<~EOS.strip)
283
+ change_column :adverts, :description, :text, limit: 4294967295, null: false
284
+ EOS
285
+ .and migrate_down(<<~EOS.strip)
286
+ change_column :adverts, :description, :text
287
+ EOS
288
+ )
260
289
  ::DeclareSchema::Model::FieldSpec::instance_variable_set(:@mysql_text_limits, false)
261
290
 
262
291
  Advert.field_specs.clear
@@ -286,18 +315,21 @@ RSpec.describe 'DeclareSchema Migration Generator' do
286
315
  belongs_to :category
287
316
  end
288
317
 
289
- up, down = Generators::DeclareSchema::Migration::Migrator.run
290
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
291
- add_column :adverts, :category_id, :integer, limit: 8, null: false
292
- add_index :adverts, [:category_id], name: 'on_category_id'
293
- EOS
294
- expect(down.sub(/\n+/, "\n")).to eq(<<~EOS.strip)
295
- remove_column :adverts, :category_id
296
- remove_index :adverts, name: :on_category_id rescue ActiveRecord::StatementInvalid
297
- EOS
318
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
319
+ migrate_up(<<~EOS.strip)
320
+ add_column :adverts, :category_id, :integer, limit: 8, null: false
321
+
322
+ add_index :adverts, [:category_id], name: 'on_category_id'
323
+ EOS
324
+ .and migrate_down(<<~EOS.strip)
325
+ remove_column :adverts, :category_id
326
+
327
+ remove_index :adverts, name: :on_category_id rescue ActiveRecord::StatementInvalid
328
+ EOS
329
+ )
298
330
 
299
331
  Advert.field_specs.delete(:category_id)
300
- Advert.index_specs.delete_if {|spec| spec.fields==["category_id"]}
332
+ Advert.index_specs.delete_if { |spec| spec.fields==["category_id"] }
301
333
 
302
334
  # If you specify a custom foreign key, the migration generator observes that:
303
335
 
@@ -306,11 +338,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
306
338
  fields { }
307
339
  belongs_to :category, foreign_key: "c_id", class_name: 'Category'
308
340
  end
309
- up = Generators::DeclareSchema::Migration::Migrator.run.first
310
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
311
- add_column :adverts, :c_id, :integer, limit: 8, null: false
312
- add_index :adverts, [:c_id], name: 'on_c_id'
313
- EOS
341
+
342
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
343
+ migrate_up(<<~EOS.strip)
344
+ add_column :adverts, :c_id, :integer, limit: 8, null: false
345
+
346
+ add_index :adverts, [:c_id], name: 'on_c_id'
347
+ EOS
348
+ )
314
349
 
315
350
  Advert.field_specs.delete(:c_id)
316
351
  Advert.index_specs.delete_if { |spec| spec.fields == ["c_id"] }
@@ -322,8 +357,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
322
357
  fields { }
323
358
  belongs_to :category, index: false
324
359
  end
325
- up = Generators::DeclareSchema::Migration::Migrator.run.first
326
- expect(up.gsub(/\n+/, "\n")).to eq("add_column :adverts, :category_id, :integer, limit: 8, null: false")
360
+
361
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
362
+ migrate_up(<<~EOS.strip)
363
+ add_column :adverts, :category_id, :integer, limit: 8, null: false
364
+ EOS
365
+ )
327
366
 
328
367
  Advert.field_specs.delete(:category_id)
329
368
  Advert.index_specs.delete_if { |spec| spec.fields == ["category_id"] }
@@ -335,11 +374,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
335
374
  fields { }
336
375
  belongs_to :category, index: 'my_index'
337
376
  end
338
- up = Generators::DeclareSchema::Migration::Migrator.run.first
339
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
340
- add_column :adverts, :category_id, :integer, limit: 8, null: false
341
- add_index :adverts, [:category_id], name: 'my_index'
342
- EOS
377
+
378
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
379
+ migrate_up(<<~EOS.strip)
380
+ add_column :adverts, :category_id, :integer, limit: 8, null: false
381
+
382
+ add_index :adverts, [:category_id], name: 'my_index'
383
+ EOS
384
+ )
343
385
 
344
386
  Advert.field_specs.delete(:category_id)
345
387
  Advert.index_specs.delete_if { |spec| spec.fields == ["category_id"] }
@@ -355,17 +397,19 @@ RSpec.describe 'DeclareSchema Migration Generator' do
355
397
  optimistic_lock
356
398
  end
357
399
  end
358
- up, down = Generators::DeclareSchema::Migration::Migrator.run
359
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
360
- add_column :adverts, :created_at, :datetime
361
- add_column :adverts, :updated_at, :datetime
362
- add_column :adverts, :lock_version, :integer, null: false, default: 1
363
- EOS
364
- expect(down.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
365
- remove_column :adverts, :created_at
366
- remove_column :adverts, :updated_at
367
- remove_column :adverts, :lock_version
368
- EOS
400
+
401
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
402
+ migrate_up(<<~EOS.strip)
403
+ add_column :adverts, :created_at, :datetime
404
+ add_column :adverts, :updated_at, :datetime
405
+ add_column :adverts, :lock_version, :integer, null: false, default: 1
406
+ EOS
407
+ .and migrate_down(<<~EOS.strip)
408
+ remove_column :adverts, :created_at
409
+ remove_column :adverts, :updated_at
410
+ remove_column :adverts, :lock_version
411
+ EOS
412
+ )
369
413
 
370
414
  Advert.field_specs.delete(:updated_at)
371
415
  Advert.field_specs.delete(:created_at)
@@ -380,11 +424,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
380
424
  title :string, index: true, limit: 255, null: true
381
425
  end
382
426
  end
383
- up = Generators::DeclareSchema::Migration::Migrator.run.first
384
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
385
- add_column :adverts, :title, :string, limit: 255
386
- add_index :adverts, [:title], name: 'on_title'
387
- EOS
427
+
428
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
429
+ migrate_up(<<~EOS.strip)
430
+ add_column :adverts, :title, :string, limit: 255
431
+
432
+ add_index :adverts, [:title], name: 'on_title'
433
+ EOS
434
+ )
388
435
 
389
436
  Advert.index_specs.delete_if { |spec| spec.fields==["title"] }
390
437
 
@@ -395,11 +442,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
395
442
  title :string, index: true, unique: true, null: true, limit: 255
396
443
  end
397
444
  end
398
- up = Generators::DeclareSchema::Migration::Migrator.run.first
399
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
400
- add_column :adverts, :title, :string, limit: 255
401
- add_index :adverts, [:title], unique: true, name: 'on_title'
402
- EOS
445
+
446
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
447
+ migrate_up(<<~EOS.strip)
448
+ add_column :adverts, :title, :string, limit: 255
449
+
450
+ add_index :adverts, [:title], unique: true, name: 'on_title'
451
+ EOS
452
+ )
403
453
 
404
454
  Advert.index_specs.delete_if { |spec| spec.fields == ["title"] }
405
455
 
@@ -410,11 +460,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
410
460
  title :string, index: 'my_index', limit: 255, null: true
411
461
  end
412
462
  end
413
- up = Generators::DeclareSchema::Migration::Migrator.run.first
414
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
415
- add_column :adverts, :title, :string, limit: 255
416
- add_index :adverts, [:title], name: 'my_index'
417
- EOS
463
+
464
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
465
+ migrate_up(<<~EOS.strip)
466
+ add_column :adverts, :title, :string, limit: 255
467
+
468
+ add_index :adverts, [:title], name: 'my_index'
469
+ EOS
470
+ )
418
471
 
419
472
  Advert.index_specs.delete_if { |spec| spec.fields==["title"] }
420
473
 
@@ -423,11 +476,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
423
476
  class Advert < ActiveRecord::Base
424
477
  index :title
425
478
  end
426
- up = Generators::DeclareSchema::Migration::Migrator.run.first
427
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
428
- add_column :adverts, :title, :string, limit: 255
429
- add_index :adverts, [:title], name: 'on_title'
430
- EOS
479
+
480
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
481
+ migrate_up(<<~EOS.strip)
482
+ add_column :adverts, :title, :string, limit: 255
483
+
484
+ add_index :adverts, [:title], name: 'on_title'
485
+ EOS
486
+ )
431
487
 
432
488
  Advert.index_specs.delete_if { |spec| spec.fields == ["title"] }
433
489
 
@@ -436,11 +492,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
436
492
  class Advert < ActiveRecord::Base
437
493
  index :title, unique: true, name: 'my_index'
438
494
  end
439
- up = Generators::DeclareSchema::Migration::Migrator.run.first
440
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
441
- add_column :adverts, :title, :string, limit: 255
442
- add_index :adverts, [:title], unique: true, name: 'my_index'
443
- EOS
495
+
496
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
497
+ migrate_up(<<~EOS.strip)
498
+ add_column :adverts, :title, :string, limit: 255
499
+
500
+ add_index :adverts, [:title], unique: true, name: 'my_index'
501
+ EOS
502
+ )
444
503
 
445
504
  Advert.index_specs.delete_if { |spec| spec.fields == ["title"] }
446
505
 
@@ -449,11 +508,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
449
508
  class Advert < ActiveRecord::Base
450
509
  index [:title, :category_id]
451
510
  end
452
- up = Generators::DeclareSchema::Migration::Migrator.run.first
453
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
454
- add_column :adverts, :title, :string, limit: 255
455
- add_index :adverts, [:title, :category_id], name: 'on_title_and_category_id'
456
- EOS
511
+
512
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
513
+ migrate_up(<<~EOS.strip)
514
+ add_column :adverts, :title, :string, limit: 255
515
+
516
+ add_index :adverts, [:title, :category_id], name: 'on_title_and_category_id'
517
+ EOS
518
+ )
457
519
 
458
520
  Advert.index_specs.delete_if { |spec| spec.fields==["title", "category_id"] }
459
521
 
@@ -476,19 +538,24 @@ RSpec.describe 'DeclareSchema Migration Generator' do
476
538
  Advert.connection.schema_cache.clear!
477
539
  Advert.reset_column_information
478
540
 
479
- up, down = Generators::DeclareSchema::Migration::Migrator.run("adverts" => "ads")
480
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
481
- rename_table :adverts, :ads
482
- add_column :ads, :title, :string, limit: 255
483
- add_column :ads, :body, :text
484
- add_index :ads, [:id], unique: true, name: 'PRIMARY_KEY'
485
- EOS
486
- expect(down.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
487
- remove_column :ads, :title
488
- remove_column :ads, :body
489
- rename_table :ads, :adverts
490
- add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
491
- EOS
541
+ expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "ads")).to(
542
+ migrate_up(<<~EOS.strip)
543
+ rename_table :adverts, :ads
544
+
545
+ add_column :ads, :title, :string, limit: 255
546
+ add_column :ads, :body, :text
547
+
548
+ add_index :ads, [:id], unique: true, name: 'PRIMARY_KEY'
549
+ EOS
550
+ .and migrate_down(<<~EOS.strip)
551
+ remove_column :ads, :title
552
+ remove_column :ads, :body
553
+
554
+ rename_table :ads, :adverts
555
+
556
+ add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
557
+ EOS
558
+ )
492
559
 
493
560
  # Set the table name back to what it should be and confirm we're in sync:
494
561
 
@@ -512,21 +579,27 @@ RSpec.describe 'DeclareSchema Migration Generator' do
512
579
  body :text, null: true
513
580
  end
514
581
  end
515
- up, down = Generators::DeclareSchema::Migration::Migrator.run("adverts" => "advertisements")
516
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
517
- rename_table :adverts, :advertisements
518
- add_column :advertisements, :title, :string, limit: 255
519
- add_column :advertisements, :body, :text
520
- remove_column :advertisements, :name
521
- add_index :advertisements, [:id], unique: true, name: 'PRIMARY_KEY'
522
- EOS
523
- expect(down.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
524
- remove_column :advertisements, :title
525
- remove_column :advertisements, :body
526
- add_column :adverts, :name, :string, limit: 255
527
- rename_table :advertisements, :adverts
528
- add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
529
- EOS
582
+
583
+ expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "advertisements")).to(
584
+ migrate_up(<<~EOS.strip)
585
+ rename_table :adverts, :advertisements
586
+
587
+ add_column :advertisements, :title, :string, limit: 255
588
+ add_column :advertisements, :body, :text
589
+ remove_column :advertisements, :name
590
+
591
+ add_index :advertisements, [:id], unique: true, name: 'PRIMARY_KEY'
592
+ EOS
593
+ .and migrate_down(<<~EOS.strip)
594
+ remove_column :advertisements, :title
595
+ remove_column :advertisements, :body
596
+ add_column :adverts, :name, :string, limit: 255
597
+
598
+ rename_table :advertisements, :adverts
599
+
600
+ add_index :adverts, [:id], unique: true, name: 'PRIMARY_KEY'
601
+ EOS
602
+ )
530
603
 
531
604
  ### Drop a table
532
605
 
@@ -536,9 +609,28 @@ RSpec.describe 'DeclareSchema Migration Generator' do
536
609
 
537
610
  # Dropping tables is where the automatic down-migration really comes in handy:
538
611
 
539
- up, down = Generators::DeclareSchema::Migration::Migrator.run
540
- expect(up).to eq("drop_table :adverts")
541
- expect(down.gsub(/,.*/m, '')).to eq("create_table \"adverts\"")
612
+ rails4_table_create = <<~EOS.strip
613
+ create_table "adverts", id: false, force: :cascade do |t|
614
+ t.integer "id", limit: 8
615
+ t.string "name", limit: 255
616
+ end
617
+
618
+ add_index "adverts", ["id"], name: "PRIMARY_KEY", unique: true
619
+ EOS
620
+
621
+ rails5_table_create = <<~EOS.strip
622
+ create_table "adverts", id: :integer, force: :cascade do |t|
623
+ t.string "name", limit: 255
624
+ t.index ["id"], name: "PRIMARY_KEY", unique: true
625
+ end
626
+ EOS
627
+
628
+ expect(Generators::DeclareSchema::Migration::Migrator.run).to(
629
+ migrate_up(<<~EOS.strip)
630
+ drop_table :adverts
631
+ EOS
632
+ .and migrate_down(Rails::VERSION::MAJOR >= 5 ? rails5_table_create : rails4_table_create)
633
+ )
542
634
 
543
635
  ## STI
544
636
 
@@ -559,15 +651,21 @@ RSpec.describe 'DeclareSchema Migration Generator' do
559
651
  end
560
652
  class SuperFancyAdvert < FancyAdvert
561
653
  end
562
- up, down = Generators::DeclareSchema::Migration::Migrator.run
563
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
564
- add_column :adverts, :type, :string, limit: 255
565
- add_index :adverts, [:type], name: 'on_type'
566
- EOS
567
- expect(down.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
568
- remove_column :adverts, :type
569
- remove_index :adverts, name: :on_type rescue ActiveRecord::StatementInvalid
570
- EOS
654
+
655
+ up, _ = Generators::DeclareSchema::Migration::Migrator.run do |migrations|
656
+ expect(migrations).to(
657
+ migrate_up(<<~EOS.strip)
658
+ add_column :adverts, :type, :string, limit: 255
659
+
660
+ add_index :adverts, [:type], name: 'on_type'
661
+ EOS
662
+ .and migrate_down(<<~EOS.strip)
663
+ remove_column :adverts, :type
664
+
665
+ remove_index :adverts, name: :on_type rescue ActiveRecord::StatementInvalid
666
+ EOS
667
+ )
668
+ end
571
669
 
572
670
  Advert.field_specs.delete(:type)
573
671
  nuke_model_class(SuperFancyAdvert)
@@ -600,16 +698,17 @@ RSpec.describe 'DeclareSchema Migration Generator' do
600
698
  body :text, null: true
601
699
  end
602
700
  end
603
- up, down = Generators::DeclareSchema::Migration::Migrator.run(adverts: { title: :name })
604
- expect(up).to eq(<<~EOS.strip)
605
- rename_column :adverts, :title, :name
606
- change_column :adverts, :name, :string, limit: 255, default: \"No Name\"
607
- EOS
608
701
 
609
- expect(down).to eq(<<~EOS.strip)
610
- rename_column :adverts, :name, :title
611
- change_column :adverts, :title, :string, limit: 255, default: \"Untitled\"
612
- EOS
702
+ expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { title: :name })).to(
703
+ migrate_up(<<~EOS.strip)
704
+ rename_column :adverts, :title, :name
705
+ change_column :adverts, :name, :string, limit: 255, default: "No Name"
706
+ EOS
707
+ .and migrate_down(<<~EOS.strip)
708
+ rename_column :adverts, :name, :title
709
+ change_column :adverts, :title, :string, limit: 255, default: "Untitled"
710
+ EOS
711
+ )
613
712
 
614
713
  ### Rename a table and add a column
615
714
 
@@ -621,13 +720,17 @@ RSpec.describe 'DeclareSchema Migration Generator' do
621
720
  created_at :datetime
622
721
  end
623
722
  end
624
- up = Generators::DeclareSchema::Migration::Migrator.run(adverts: :ads).first
625
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
626
- rename_table :adverts, :ads
627
- add_column :ads, :created_at, :datetime, null: false
628
- change_column :ads, :title, :string, limit: 255, null: false, default: \"Untitled\"
629
- add_index :ads, [:id], unique: true, name: 'PRIMARY_KEY'
630
- EOS
723
+
724
+ expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: :ads)).to(
725
+ migrate_up(<<~EOS.strip)
726
+ rename_table :adverts, :ads
727
+
728
+ add_column :ads, :created_at, :datetime, null: false
729
+ change_column :ads, :title, :string, limit: 255, null: false, default: \"Untitled\"
730
+
731
+ add_index :ads, [:id], unique: true, name: 'PRIMARY_KEY'
732
+ EOS
733
+ )
631
734
 
632
735
  class Advert < ActiveRecord::Base
633
736
  fields do
@@ -648,11 +751,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
648
751
  end
649
752
  self.primary_key = "advert_id"
650
753
  end
651
- up, _down = Generators::DeclareSchema::Migration::Migrator.run(adverts: { id: :advert_id })
652
- expect(up.gsub(/\n+/, "\n")).to eq(<<~EOS.strip)
653
- rename_column :adverts, :id, :advert_id
654
- add_index :adverts, [:advert_id], unique: true, name: 'PRIMARY_KEY'
655
- EOS
754
+
755
+ expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { id: :advert_id })).to(
756
+ migrate_up(<<~EOS.strip)
757
+ rename_column :adverts, :id, :advert_id
758
+
759
+ add_index :adverts, [:advert_id], unique: true, name: 'PRIMARY_KEY'
760
+ EOS
761
+ )
656
762
 
657
763
  nuke_model_class(Advert)
658
764
  ActiveRecord::Base.connection.execute("drop table `adverts`;")
@@ -691,7 +797,16 @@ RSpec.describe 'DeclareSchema Migration Generator' do
691
797
  expect(Ad.field_specs['company'].options[:validates].inspect).to eq("{:presence=>true, :uniqueness=>{:case_sensitive=>false}}")
692
798
  end
693
799
 
694
- if Rails::VERSION::MAJOR >= 5
800
+ context "for Rails #{Rails::VERSION::MAJOR}" do
801
+ if Rails::VERSION::MAJOR >= 5
802
+ let(:optional_true) { { optional: true } }
803
+ let(:optional_false) { { optional: false } }
804
+ else
805
+ let(:optional_true) { {} }
806
+ let(:optional_false) { {} }
807
+ end
808
+ let(:optional_flag) { { false => optional_false, true => optional_true } }
809
+
695
810
  describe 'belongs_to' do
696
811
  before do
697
812
  unless defined?(AdCategory)
@@ -718,10 +833,10 @@ RSpec.describe 'DeclareSchema Migration Generator' do
718
833
  reset_column_information
719
834
  belongs_to :ad_category, optional: true
720
835
  end
721
- expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional: true)
836
+ expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_true)
722
837
  end
723
838
 
724
- describe 'contradictory settings' do # contradictory settings are ok during migration
839
+ describe 'contradictory settings' do # contradictory settings are ok--for example, during migration
725
840
  it 'passes through optional: true, null: false' do
726
841
  class AdvertBelongsTo < ActiveRecord::Base
727
842
  self.table_name = 'adverts'
@@ -729,7 +844,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
729
844
  reset_column_information
730
845
  belongs_to :ad_category, optional: true, null: false
731
846
  end
732
- expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional: true)
847
+ expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_true)
733
848
  expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(false)
734
849
  end
735
850
 
@@ -740,7 +855,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
740
855
  reset_column_information
741
856
  belongs_to :ad_category, optional: false, null: true
742
857
  end
743
- expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional: false)
858
+ expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_false)
744
859
  expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(true)
745
860
  end
746
861
  end
@@ -754,7 +869,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
754
869
  belongs_to :ad_category, null: #{nullable}
755
870
  end
756
871
  EOS
757
- expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional: nullable)
872
+ expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_flag[nullable])
758
873
  expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(nullable)
759
874
  end
760
875
 
@@ -765,7 +880,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
765
880
  belongs_to :ad_category, optional: #{nullable}
766
881
  end
767
882
  EOS
768
- expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional: nullable)
883
+ expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_flag[nullable])
769
884
  expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(nullable)
770
885
  end
771
886
  end
@@ -781,7 +896,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
781
896
  end
782
897
  end
783
898
 
784
- Rails::Generators.invoke('declare_schema:migration', %w[-n -m])
899
+ generate_migrations '-n', '-m'
785
900
 
786
901
  migrations = Dir.glob('db/migrate/*declare_schema_migration*.rb')
787
902
  expect(migrations.size).to eq(1), migrations.inspect
@@ -4,7 +4,11 @@ require "bundler/setup"
4
4
  require "declare_schema"
5
5
  require "climate_control"
6
6
 
7
+ require_relative "./support/acceptance_spec_helpers"
8
+
7
9
  RSpec.configure do |config|
10
+ config.include AcceptanceSpecHelpers
11
+
8
12
  # Enable flags like --only-failures and --next-failure
9
13
  config.example_status_persistence_file_path = ".rspec_status"
10
14
 
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AcceptanceSpecHelpers
4
+ def generate_model(model_name, *fields)
5
+ Rails::Generators.invoke('declare_schema:model', [model_name, *fields])
6
+ end
7
+
8
+ def generate_migrations(*flags)
9
+ Rails::Generators.invoke('declare_schema:migration', flags)
10
+ end
11
+
12
+ def expect_model_definition_to_eq(model, expectation)
13
+ expect_file_to_eq("#{TESTAPP_PATH}/app/models/#{model}.rb", expectation)
14
+ end
15
+
16
+ def expect_test_definition_to_eq(model, expectation)
17
+ expect_file_to_eq("#{TESTAPP_PATH}/test/models/#{model}_test.rb", expectation)
18
+ end
19
+
20
+ def expect_test_fixture_to_eq(model, expectation)
21
+ expect_file_to_eq("#{TESTAPP_PATH}/test/fixtures/#{model}.yml", expectation)
22
+ end
23
+
24
+ def expect_file_to_eq(file_path, expectation)
25
+ expect(File.exist?(file_path)).to be_truthy
26
+ expect(File.read(file_path)).to eq(expectation)
27
+ end
28
+
29
+ def clean_up_model(model)
30
+ system("rm -rf #{TESTAPP_PATH}/app/models/#{model}.rb #{TESTAPP_PATH}/test/models/#{model}.rb #{TESTAPP_PATH}/test/fixtures/#{model}.rb")
31
+ end
32
+
33
+ def load_models
34
+ Rails.application.config.autoload_paths += ["#{TESTAPP_PATH}/app/models"]
35
+ $LOAD_PATH << "#{TESTAPP_PATH}/app/models"
36
+ end
37
+
38
+ def migrate_up(expected_value)
39
+ MigrationUpEquals.new(expected_value)
40
+ end
41
+
42
+ def migrate_down(expected_value)
43
+ MigrationDownEquals.new(expected_value)
44
+ end
45
+
46
+ class MigrationUpEquals < RSpec::Matchers::BuiltIn::Eq
47
+ def matches?(subject)
48
+ super(subject[0])
49
+ end
50
+ end
51
+
52
+ class MigrationDownEquals < RSpec::Matchers::BuiltIn::Eq
53
+ def matches?(subject)
54
+ super(subject[1])
55
+ end
56
+ end
57
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declare_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca Development adapted from hobo_fields by Tom Locke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-02 00:00:00.000000000 Z
11
+ date: 2020-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -79,6 +79,7 @@ files:
79
79
  - spec/lib/declare_schema/prepare_testapp.rb
80
80
  - spec/lib/generators/declare_schema/migration/migrator_spec.rb
81
81
  - spec/spec_helper.rb
82
+ - spec/support/acceptance_spec_helpers.rb
82
83
  - test_responses.txt
83
84
  homepage: https://github.com/Invoca/declare_schema
84
85
  licenses: []