schema_plus_views 0.2.0 → 0.2.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
  SHA1:
3
- metadata.gz: f120d0fd9e453a3e35a2ba8b71630edb81a93d96
4
- data.tar.gz: 5b84b184193e12d27e883953d787d8f4b45f4743
3
+ metadata.gz: f2a5ea547ab99bca7ef7d039c784b580065ef142
4
+ data.tar.gz: b1dc65dab6140a1c68de87da4c2d6eb54620879b
5
5
  SHA512:
6
- metadata.gz: db00fa4def6a06f90503c86bbbca407e9e61f911c9f7e3f2d99b6ab17d0ae57759f75aa880ce8f032093adf1ff569c2207600e8ff513bc255d5adb7890121b82
7
- data.tar.gz: 5a993567b4ba203f891b8dd205640f41bc37aea6f74f90d27bca7caab7b8fa54f2051ce055b253e2f06b84559898ec6f8fedf8154d832fcd23e981ec111a8d8c
6
+ metadata.gz: f5e60a51b299a09aa1429f1da508a217c9306bb7a126ad0f499849255b1d7942edac5b2b905e3c82abc4cc2aeb3fc261451882f8786b30d5c981004c6e199725
7
+ data.tar.gz: 01eb9ee07f00334652b549e81bd20a280ba6d9b0b5ac48d806d1eafe7dde63273817078566aa06245775f7a38322355884cb2e5296c1ceae857b09d56b2669fd
data/README.md CHANGED
@@ -109,6 +109,7 @@ This returns just the body of the definition, i.e. the part after the `CREATE VI
109
109
 
110
110
  ## History
111
111
 
112
+ * 0.2.1 - Fix db:rollback
112
113
  * 0.2.0 - Added :allow_replace option (thanks to [@hcarver](https://github.com/hcarver))
113
114
  * 0.1.0 - Initial release, extracted from schema_plus 1.x
114
115
 
@@ -0,0 +1,20 @@
1
+ module SchemaPlus::Views
2
+ module ActiveRecord
3
+ module Migration
4
+ module CommandRecorder
5
+ def create_view(*args, &block)
6
+ record(:create_view, args, &block)
7
+ end
8
+
9
+ def drop_view(*args, &block)
10
+ record(:drop_view, args, &block)
11
+ end
12
+
13
+ def invert_create_view(args)
14
+ [ :drop_view, [args.first] ]
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module SchemaPlus
2
2
  module Views
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  require_relative 'views/version'
9
9
  require_relative 'views/active_record/connection_adapters/abstract_adapter'
10
+ require_relative 'views/active_record/migration/command_recorder'
10
11
  require_relative 'views/middleware'
11
12
 
12
13
  module SchemaPlus::Views
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ class Item < ActiveRecord::Base
4
+ end
5
+
6
+ describe "Dumper" do
7
+
8
+ let(:schema) { ActiveRecord::Schema }
9
+
10
+ let(:migration) { ActiveRecord::Migration }
11
+
12
+ let(:connection) { ActiveRecord::Base.connection }
13
+
14
+ before(:each) do
15
+ define_schema_and_data
16
+ end
17
+
18
+ it "should include view definitions" do
19
+ expect(dump).to match(%r{create_view "a_ones", " ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1.*, :force => true}mi)
20
+ expect(dump).to match(%r{create_view "ab_ones", " ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1.*, :force => true}mi)
21
+ end
22
+
23
+ it "should include views in dependency order" do
24
+ expect(dump).to match(%r{create_table "items".*create_view "a_ones".*create_view "ab_ones"}m)
25
+ end
26
+
27
+ it "should not include views listed in ignore_tables" do
28
+ dump(ignore_tables: /b_/) do |dump|
29
+ expect(dump).to match(%r{create_view "a_ones", " ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1.*, :force => true}mi)
30
+ expect(dump).not_to match(%r{"ab_ones"})
31
+ end
32
+ end
33
+
34
+ it "should not reference current database" do
35
+ # why check this? mysql default to providing the view definition
36
+ # with tables explicitly scoped to the current database, which
37
+ # resulted in the dump being bound to the current database. this
38
+ # caused trouble for rails, in which creates the schema dump file
39
+ # when in the (say) development database, but then uses it to
40
+ # initialize the test database when testing. this meant that the
41
+ # test database had views into the development database.
42
+ db = connection.respond_to?(:current_database)? connection.current_database : SchemaDev::Rspec.db_configuration[:database]
43
+ expect(dump).not_to match(%r{#{connection.quote_table_name(db)}[.]})
44
+ end
45
+
46
+ protected
47
+
48
+ def define_schema_and_data
49
+ connection.views.each do |view| connection.drop_view view end
50
+ connection.tables.each do |table| connection.drop_table table, cascade: true end
51
+
52
+ schema.define do
53
+
54
+ create_table :items, :force => true do |t|
55
+ t.integer :a
56
+ t.integer :b
57
+ t.string :s
58
+ end
59
+
60
+ create_view :a_ones, Item.select('b, s').where(:a => 1)
61
+ create_view :ab_ones, "select s from a_ones where b = 1"
62
+ end
63
+ connection.execute "insert into items (a, b, s) values (1, 1, 'one_one')"
64
+ connection.execute "insert into items (a, b, s) values (1, 2, 'one_two')"
65
+ connection.execute "insert into items (a, b, s) values (2, 1, 'two_one')"
66
+ connection.execute "insert into items (a, b, s) values (2, 2, 'two_two')"
67
+ end
68
+
69
+ def dump(opts={})
70
+ StringIO.open { |stream|
71
+ ActiveRecord::SchemaDumper.ignore_tables = Array.wrap(opts[:ignore_tables])
72
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
73
+ yield stream.string if block_given?
74
+ stream.string
75
+ }
76
+ end
77
+
78
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+
3
+ class Item < ActiveRecord::Base
4
+ end
5
+
6
+ describe "Introspection" do
7
+
8
+ let(:schema) { ActiveRecord::Schema }
9
+
10
+ let(:migration) { ActiveRecord::Migration }
11
+
12
+ let(:connection) { ActiveRecord::Base.connection }
13
+
14
+ before(:each) do
15
+ define_schema_and_data
16
+ end
17
+
18
+ it "should list all views" do
19
+ expect(connection.views.sort).to eq(%W[a_ones ab_ones])
20
+ expect(connection.view_definition('a_ones')).to match(%r{^ ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1}mi)
21
+ expect(connection.view_definition('ab_ones')).to match(%r{^ ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1}mi)
22
+ end
23
+
24
+ it "should ignore views named pg_*", postgresql: :only do
25
+ begin
26
+ migration.create_view :pg_dummy_internal, "select 1"
27
+ expect(connection.views.sort).to eq(%W[a_ones ab_ones])
28
+ ensure
29
+ migration.drop_view :pg_dummy_internal
30
+ end
31
+ end
32
+
33
+ it "should not be listed as a table" do
34
+ expect(connection.tables).not_to include('a_ones')
35
+ expect(connection.tables).not_to include('ab_ones')
36
+ end
37
+
38
+ it "should introspect definition" do
39
+ expect(connection.view_definition('a_ones')).to match(%r{^ ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1}mi)
40
+ expect(connection.view_definition('ab_ones')).to match(%r{^ ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1}mi)
41
+ end
42
+
43
+ context "in mysql", :mysql => :only do
44
+
45
+ around(:each) do |example|
46
+ begin
47
+ migration.drop_view :check if connection.views.include? 'check'
48
+ example.run
49
+ ensure
50
+ migration.drop_view :check if connection.views.include? 'check'
51
+ end
52
+ end
53
+
54
+ it "should introspect WITH CHECK OPTION" do
55
+ migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH CHECK OPTION'
56
+ expect(connection.view_definition('check')).to match(%r{WITH CASCADED CHECK OPTION$})
57
+ end
58
+
59
+ it "should introspect WITH CASCADED CHECK OPTION" do
60
+ migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH CASCADED CHECK OPTION'
61
+ expect(connection.view_definition('check')).to match(%r{WITH CASCADED CHECK OPTION$})
62
+ end
63
+
64
+ it "should introspect WITH LOCAL CHECK OPTION" do
65
+ migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH LOCAL CHECK OPTION'
66
+ expect(connection.view_definition('check')).to match(%r{WITH LOCAL CHECK OPTION$})
67
+ end
68
+ end
69
+
70
+ protected
71
+
72
+ def define_schema_and_data
73
+ connection.views.each do |view| connection.drop_view view end
74
+ connection.tables.each do |table| connection.drop_table table, cascade: true end
75
+
76
+ schema.define do
77
+
78
+ create_table :items, :force => true do |t|
79
+ t.integer :a
80
+ t.integer :b
81
+ t.string :s
82
+ end
83
+
84
+ create_view :a_ones, Item.select('b, s').where(:a => 1)
85
+ create_view :ab_ones, "select s from a_ones where b = 1"
86
+ end
87
+ connection.execute "insert into items (a, b, s) values (1, 1, 'one_one')"
88
+ connection.execute "insert into items (a, b, s) values (1, 2, 'one_two')"
89
+ connection.execute "insert into items (a, b, s) values (2, 1, 'two_one')"
90
+ connection.execute "insert into items (a, b, s) values (2, 2, 'two_two')"
91
+ end
92
+
93
+ end
@@ -0,0 +1,116 @@
1
+ require 'spec_helper'
2
+
3
+ class Item < ActiveRecord::Base
4
+ end
5
+
6
+ class AOnes < ActiveRecord::Base
7
+ end
8
+
9
+ class ABOnes < ActiveRecord::Base
10
+ end
11
+
12
+ describe "Migration" do
13
+
14
+ let(:migration) { ActiveRecord::Migration }
15
+ let(:connection) { ActiveRecord::Base.connection }
16
+ let(:schema) { ActiveRecord::Schema }
17
+
18
+ before(:each) do
19
+ define_schema_and_data
20
+ end
21
+
22
+ context "creation" do
23
+ it "should create correct views" do
24
+ expect(AOnes.all.collect(&:s)).to eq(%W[one_one one_two])
25
+ expect(ABOnes.all.collect(&:s)).to eq(%W[one_one])
26
+ end
27
+ end
28
+
29
+ context "duplicate creation" do
30
+ before(:each) do
31
+ migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=1)')
32
+ end
33
+
34
+ it "should raise an error by default" do
35
+ expect {migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)')}.to raise_error ActiveRecord::StatementInvalid
36
+ end
37
+
38
+ it "should override existing definition if :force true" do
39
+ migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)', :force => true)
40
+ expect(connection.view_definition('dupe_me')).to match(%r{WHERE .*a.*=.*2}i)
41
+ end
42
+
43
+ context "Postgres and MySQL only", :sqlite3 => :skip do
44
+ it "should override existing definition if :allow_replace is true" do
45
+ migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)', :allow_replace => true)
46
+ expect(connection.view_definition('dupe_me')).to match(%r{WHERE .*a.*=.*2}i)
47
+ end
48
+ end
49
+ end
50
+
51
+ context "dropping" do
52
+ it "should raise an error if the view doesn't exist" do
53
+ expect { migration.drop_view('doesnt_exist') }.to raise_error ActiveRecord::StatementInvalid
54
+ end
55
+
56
+ it "should fail silently when using if_exists option" do
57
+ expect { migration.drop_view('doesnt_exist', :if_exists => true) }.not_to raise_error
58
+ end
59
+
60
+ context "with a view that exists" do
61
+ before { migration.create_view('view_that_exists', 'SELECT * FROM items WHERE (a=1)') }
62
+
63
+ it "should succeed" do
64
+ migration.drop_view('view_that_exists')
65
+ expect(connection.views).not_to include('view_that_exists')
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "rollback" do
71
+ it "properly rolls back a create_view" do
72
+ m = Class.new ::ActiveRecord::Migration do
73
+ define_method(:change) {
74
+ create_view :copy, "SELECT * FROM items"
75
+ }
76
+ end
77
+ m.migrate(:up)
78
+ expect(connection.views).to include("copy")
79
+ m.migrate(:down)
80
+ expect(connection.views).not_to include("copy")
81
+ end
82
+
83
+ it "raises error for drop_view" do
84
+ m = Class.new ::ActiveRecord::Migration do
85
+ define_method(:change) {
86
+ drop_view :a_ones
87
+ }
88
+ end
89
+ expect { m.migrate(:down) }.to raise_error(::ActiveRecord::IrreversibleMigration)
90
+ end
91
+ end
92
+
93
+
94
+ protected
95
+
96
+ def define_schema_and_data
97
+ connection.views.each do |view| connection.drop_view view end
98
+ connection.tables.each do |table| connection.drop_table table, cascade: true end
99
+
100
+ schema.define do
101
+
102
+ create_table :items, :force => true do |t|
103
+ t.integer :a
104
+ t.integer :b
105
+ t.string :s
106
+ end
107
+
108
+ create_view :a_ones, Item.select('b, s').where(:a => 1)
109
+ create_view :ab_ones, "select s from a_ones where b = 1"
110
+ end
111
+ connection.execute "insert into items (a, b, s) values (1, 1, 'one_one')"
112
+ connection.execute "insert into items (a, b, s) values (1, 2, 'one_two')"
113
+ connection.execute "insert into items (a, b, s) values (2, 1, 'two_one')"
114
+ connection.execute "insert into items (a, b, s) values (2, 2, 'two_two')"
115
+ end
116
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_plus_views
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ronen barzel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-02 00:00:00.000000000 Z
11
+ date: 2015-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -145,15 +145,18 @@ files:
145
145
  - lib/schema_plus/views/active_record/connection_adapters/mysql2_adapter.rb
146
146
  - lib/schema_plus/views/active_record/connection_adapters/postgresql_adapter.rb
147
147
  - lib/schema_plus/views/active_record/connection_adapters/sqlite3_adapter.rb
148
+ - lib/schema_plus/views/active_record/migration/command_recorder.rb
148
149
  - lib/schema_plus/views/middleware.rb
149
150
  - lib/schema_plus/views/version.rb
150
151
  - lib/schema_plus_views.rb
151
152
  - schema_dev.yml
152
153
  - schema_plus_views.gemspec
154
+ - spec/dumper_spec.rb
155
+ - spec/introspection_spec.rb
156
+ - spec/migration_spec.rb
153
157
  - spec/named_schemas_spec.rb
154
158
  - spec/sanity_spec.rb
155
159
  - spec/spec_helper.rb
156
- - spec/views_spec.rb
157
160
  homepage: https://github.com/SchemaPlus/schema_plus_views
158
161
  licenses:
159
162
  - MIT
@@ -179,7 +182,9 @@ signing_key:
179
182
  specification_version: 4
180
183
  summary: Adds support for views to ActiveRecord
181
184
  test_files:
185
+ - spec/dumper_spec.rb
186
+ - spec/introspection_spec.rb
187
+ - spec/migration_spec.rb
182
188
  - spec/named_schemas_spec.rb
183
189
  - spec/sanity_spec.rb
184
190
  - spec/spec_helper.rb
185
- - spec/views_spec.rb
data/spec/views_spec.rb DELETED
@@ -1,193 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class Item < ActiveRecord::Base
4
- end
5
-
6
- class AOnes < ActiveRecord::Base
7
- end
8
-
9
- class ABOnes < ActiveRecord::Base
10
- end
11
-
12
- describe "Views" do
13
-
14
- let(:schema) { ActiveRecord::Schema }
15
-
16
- let(:migration) { ActiveRecord::Migration }
17
-
18
- let(:connection) { ActiveRecord::Base.connection }
19
-
20
- before(:each) do
21
- define_schema_and_data
22
- end
23
-
24
- context "querys" do
25
-
26
- it "should query correctly" do
27
- expect(AOnes.all.collect(&:s)).to eq(%W[one_one one_two])
28
- expect(ABOnes.all.collect(&:s)).to eq(%W[one_one])
29
- end
30
-
31
- end
32
-
33
- context "introspection" do
34
-
35
- it "should list all views" do
36
- expect(connection.views.sort).to eq(%W[a_ones ab_ones])
37
- expect(connection.view_definition('a_ones')).to match(%r{^ ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1}mi)
38
- expect(connection.view_definition('ab_ones')).to match(%r{^ ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1}mi)
39
- end
40
-
41
- it "should ignore views named pg_*", postgresql: :only do
42
- begin
43
- migration.create_view :pg_dummy_internal, "select 1"
44
- expect(connection.views.sort).to eq(%W[a_ones ab_ones])
45
- ensure
46
- migration.drop_view :pg_dummy_internal
47
- end
48
- end
49
-
50
- it "should not be listed as a table" do
51
- expect(connection.tables).not_to include('a_ones')
52
- expect(connection.tables).not_to include('ab_ones')
53
- end
54
-
55
- it "should introspect definition" do
56
- expect(connection.view_definition('a_ones')).to match(%r{^ ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1}mi)
57
- expect(connection.view_definition('ab_ones')).to match(%r{^ ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1}mi)
58
- end
59
- end
60
-
61
-
62
- context "dumper" do
63
-
64
- it "should include view definitions" do
65
- expect(dump).to match(%r{create_view "a_ones", " ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1.*, :force => true}mi)
66
- expect(dump).to match(%r{create_view "ab_ones", " ?SELECT .*s.* FROM .*a_ones.* WHERE .*b.* = 1.*, :force => true}mi)
67
- end
68
-
69
- it "should include views in dependency order" do
70
- expect(dump).to match(%r{create_table "items".*create_view "a_ones".*create_view "ab_ones"}m)
71
- end
72
-
73
- it "should not include views listed in ignore_tables" do
74
- dump(ignore_tables: /b_/) do |dump|
75
- expect(dump).to match(%r{create_view "a_ones", " ?SELECT .*b.*,.*s.* FROM .*items.* WHERE .*a.* = 1.*, :force => true}mi)
76
- expect(dump).not_to match(%r{"ab_ones"})
77
- end
78
- end
79
-
80
- it "should not reference current database" do
81
- # why check this? mysql default to providing the view definition
82
- # with tables explicitly scoped to the current database, which
83
- # resulted in the dump being bound to the current database. this
84
- # caused trouble for rails, in which creates the schema dump file
85
- # when in the (say) development database, but then uses it to
86
- # initialize the test database when testing. this meant that the
87
- # test database had views into the development database.
88
- db = connection.respond_to?(:current_database)? connection.current_database : SchemaDev::Rspec.db_configuration[:database]
89
- expect(dump).not_to match(%r{#{connection.quote_table_name(db)}[.]})
90
- end
91
- end
92
-
93
- context "duplicate creation" do
94
- before(:each) do
95
- migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=1)')
96
- end
97
-
98
- it "should raise an error by default" do
99
- expect {migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)')}.to raise_error ActiveRecord::StatementInvalid
100
- end
101
-
102
- it "should override existing definition if :force true" do
103
- migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)', :force => true)
104
- expect(connection.view_definition('dupe_me')).to match(%r{WHERE .*a.*=.*2}i)
105
- end
106
-
107
- context "Postgres and MySQL only", :sqlite3 => :skip do
108
- it "should override existing definition if :allow_replace is true" do
109
- migration.create_view('dupe_me', 'SELECT * FROM items WHERE (a=2)', :allow_replace => true)
110
- expect(connection.view_definition('dupe_me')).to match(%r{WHERE .*a.*=.*2}i)
111
- end
112
- end
113
- end
114
-
115
- context "dropping" do
116
- it "should raise an error if the view doesn't exist" do
117
- expect { migration.drop_view('doesnt_exist') }.to raise_error ActiveRecord::StatementInvalid
118
- end
119
-
120
- it "should fail silently when using if_exists option" do
121
- expect { migration.drop_view('doesnt_exist', :if_exists => true) }.not_to raise_error
122
- end
123
-
124
- context "with a view that exists" do
125
- before { migration.create_view('view_that_exists', 'SELECT * FROM items WHERE (a=1)') }
126
-
127
- it "should succeed" do
128
- migration.drop_view('view_that_exists')
129
- expect(connection.views).not_to include('view_that_exists')
130
- end
131
- end
132
- end
133
-
134
- context "in mysql", :mysql => :only do
135
-
136
- around(:each) do |example|
137
- begin
138
- migration.drop_view :check if connection.views.include? 'check'
139
- example.run
140
- ensure
141
- migration.drop_view :check if connection.views.include? 'check'
142
- end
143
- end
144
-
145
- it "should introspect WITH CHECK OPTION" do
146
- migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH CHECK OPTION'
147
- expect(connection.view_definition('check')).to match(%r{WITH CASCADED CHECK OPTION$})
148
- end
149
-
150
- it "should introspect WITH CASCADED CHECK OPTION" do
151
- migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH CASCADED CHECK OPTION'
152
- expect(connection.view_definition('check')).to match(%r{WITH CASCADED CHECK OPTION$})
153
- end
154
-
155
- it "should introspect WITH LOCAL CHECK OPTION" do
156
- migration.create_view :check, 'SELECT * FROM items WHERE (a=2) WITH LOCAL CHECK OPTION'
157
- expect(connection.view_definition('check')).to match(%r{WITH LOCAL CHECK OPTION$})
158
- end
159
- end
160
-
161
- protected
162
-
163
- def define_schema_and_data
164
- connection.views.each do |view| connection.drop_view view end
165
- connection.tables.each do |table| connection.drop_table table, cascade: true end
166
-
167
- schema.define do
168
-
169
- create_table :items, :force => true do |t|
170
- t.integer :a
171
- t.integer :b
172
- t.string :s
173
- end
174
-
175
- create_view :a_ones, Item.select('b, s').where(:a => 1)
176
- create_view :ab_ones, "select s from a_ones where b = 1"
177
- end
178
- connection.execute "insert into items (a, b, s) values (1, 1, 'one_one')"
179
- connection.execute "insert into items (a, b, s) values (1, 2, 'one_two')"
180
- connection.execute "insert into items (a, b, s) values (2, 1, 'two_one')"
181
- connection.execute "insert into items (a, b, s) values (2, 2, 'two_two')"
182
- end
183
-
184
- def dump(opts={})
185
- StringIO.open { |stream|
186
- ActiveRecord::SchemaDumper.ignore_tables = Array.wrap(opts[:ignore_tables])
187
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
188
- yield stream.string if block_given?
189
- stream.string
190
- }
191
- end
192
-
193
- end