declare_schema 0.3.0 → 0.3.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 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: []