sequel-rails 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/History.md +14 -0
- data/LICENSE +1 -1
- data/README.md +150 -8
- data/lib/sequel_rails/configuration.rb +13 -6
- data/lib/sequel_rails/migrations.rb +25 -13
- data/lib/sequel_rails/railties/database.rake +1 -1
- data/lib/sequel_rails/shellwords.rb +33 -0
- data/lib/sequel_rails/storage.rb +1 -0
- data/lib/sequel_rails/storage/abstract.rb +35 -7
- data/lib/sequel_rails/storage/jdbc.rb +23 -3
- data/lib/sequel_rails/storage/mysql.rb +27 -26
- data/lib/sequel_rails/storage/postgres.rb +79 -39
- data/lib/sequel_rails/storage/sqlite.rb +6 -2
- data/lib/sequel_rails/version.rb +1 -1
- data/sequel-rails.gemspec +2 -1
- data/spec/lib/sequel_rails/configuration_spec.rb +104 -79
- data/spec/lib/sequel_rails/migrations_spec.rb +10 -2
- data/spec/lib/sequel_rails/storage/mysql_spec.rb +64 -0
- data/spec/lib/sequel_rails/storage/postgres_spec.rb +121 -0
- data/spec/lib/sequel_rails/storage/sqlite_spec.rb +88 -0
- data/spec/spec_helper.rb +3 -0
- metadata +13 -6
- data/.document +0 -5
@@ -35,7 +35,8 @@ module SequelRails
|
|
35
35
|
db.execute("CREATE DATABASE IF NOT EXISTS `#{db_name}` DEFAULT CHARACTER SET #{charset} DEFAULT COLLATE #{collation}")
|
36
36
|
end
|
37
37
|
elsif _is_postgres?
|
38
|
-
|
38
|
+
adapter = ::SequelRails::Storage::Postgres.new(config)
|
39
|
+
adapter._create
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
@@ -48,14 +49,33 @@ module SequelRails
|
|
48
49
|
db.execute("DROP DATABASE IF EXISTS `#{db_name}`")
|
49
50
|
end
|
50
51
|
elsif _is_postgres?
|
51
|
-
|
52
|
+
adapter = ::SequelRails::Storage::Postgres.new(config)
|
53
|
+
adapter._drop
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def _dump(filename)
|
58
|
+
if _is_postgres?
|
59
|
+
adapter = ::SequelRails::Storage::Postgres.new(config)
|
60
|
+
adapter._dump(filename)
|
61
|
+
else
|
62
|
+
raise NotImplementedError
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def _load(filename)
|
67
|
+
if _is_postgres?
|
68
|
+
adapter = ::SequelRails::Storage::Postgres.new(config)
|
69
|
+
adapter._load(filename)
|
70
|
+
else
|
71
|
+
raise NotImplementedError
|
52
72
|
end
|
53
73
|
end
|
54
74
|
|
55
75
|
private
|
56
76
|
|
57
77
|
def collation
|
58
|
-
@collation ||=
|
78
|
+
@collation ||= super || "utf8_unicode_ci"
|
59
79
|
end
|
60
80
|
|
61
81
|
def in_memory?
|
@@ -1,49 +1,50 @@
|
|
1
|
-
require 'shellwords'
|
2
|
-
|
3
1
|
module SequelRails
|
4
2
|
module Storage
|
5
3
|
class Mysql < Abstract
|
4
|
+
|
6
5
|
def _create
|
7
|
-
execute
|
6
|
+
execute "CREATE DATABASE IF NOT EXISTS `#{database}` DEFAULT CHARACTER SET #{charset} DEFAULT COLLATE #{collation}"
|
8
7
|
end
|
9
8
|
|
10
9
|
def _drop
|
11
|
-
execute
|
10
|
+
execute "DROP DATABASE IF EXISTS `#{database}`"
|
12
11
|
end
|
13
12
|
|
14
13
|
def _dump(filename)
|
15
|
-
commands =
|
16
|
-
commands
|
17
|
-
commands
|
18
|
-
commands
|
19
|
-
commands << "--result-file" << filename
|
14
|
+
commands = ["mysqldump"]
|
15
|
+
add_connection_settings commands
|
16
|
+
add_flag commands, "--no-data"
|
17
|
+
add_option commands, "--result-file", filename
|
20
18
|
commands << database
|
21
|
-
|
19
|
+
safe_exec commands
|
22
20
|
end
|
23
21
|
|
24
22
|
def _load(filename)
|
25
|
-
commands =
|
26
|
-
commands
|
27
|
-
commands
|
28
|
-
commands
|
29
|
-
commands
|
30
|
-
|
31
|
-
|
23
|
+
commands = ["mysql"]
|
24
|
+
add_connection_settings commands
|
25
|
+
add_option commands, "--database", database
|
26
|
+
add_option commands, "--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}
|
27
|
+
safe_exec commands
|
28
|
+
end
|
29
|
+
|
30
|
+
def collation
|
31
|
+
@collation ||= super || "utf8_unicode_ci"
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
def
|
37
|
-
commands
|
38
|
-
commands
|
39
|
-
commands
|
40
|
-
commands
|
41
|
-
commands << "-e" << statement
|
42
|
-
system(*commands)
|
36
|
+
def add_connection_settings(commands)
|
37
|
+
add_option commands, "--user", username
|
38
|
+
add_option commands, "--password", password
|
39
|
+
add_option commands, "--host", host
|
40
|
+
add_option commands, "--port", port.to_s
|
43
41
|
end
|
44
42
|
|
45
|
-
def
|
46
|
-
|
43
|
+
def execute(statement)
|
44
|
+
commands = ["mysql"]
|
45
|
+
add_connection_settings commands
|
46
|
+
add_option commands, "--execute", statement
|
47
|
+
safe_exec commands
|
47
48
|
end
|
48
49
|
|
49
50
|
end
|
@@ -1,55 +1,55 @@
|
|
1
1
|
module SequelRails
|
2
2
|
module Storage
|
3
3
|
class Postgres < Abstract
|
4
|
+
|
4
5
|
def _create
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
6
|
+
with_pgpassword do
|
7
|
+
commands = ["createdb"]
|
8
|
+
add_connection_settings commands
|
9
|
+
add_option commands, "--maintenance-db", maintenance_db
|
10
|
+
add_option commands, "--encoding", encoding
|
11
|
+
add_option commands, "--locale", locale
|
12
|
+
add_option commands, "--lc-collate", collation
|
13
|
+
add_option commands, "--lc-ctype", ctype
|
14
|
+
add_option commands, "--template", template
|
15
|
+
add_option commands, "--tablespace", tablespace
|
16
|
+
add_option commands, "--owner", owner
|
17
|
+
commands << database
|
18
|
+
safe_exec commands
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
def _drop
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
res = system(*commands)
|
25
|
-
ENV["PGPASSWORD"] = nil unless password.blank?
|
26
|
-
res
|
23
|
+
with_pgpassword do
|
24
|
+
commands = ["dropdb"]
|
25
|
+
add_connection_settings commands
|
26
|
+
commands << database
|
27
|
+
safe_exec commands
|
28
|
+
end
|
27
29
|
end
|
28
30
|
|
29
31
|
def _dump(filename)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
with_pgpassword do
|
33
|
+
commands = ["pg_dump"]
|
34
|
+
add_connection_settings commands
|
35
|
+
add_flag commands, "-i"
|
36
|
+
add_flag commands, "-s"
|
37
|
+
add_flag commands, "-x"
|
38
|
+
add_flag commands, "-O"
|
39
|
+
add_option commands, "--file", filename
|
40
|
+
commands << database
|
41
|
+
safe_exec commands
|
42
|
+
end
|
40
43
|
end
|
41
44
|
|
42
45
|
def _load(filename)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
res = system(*commands)
|
51
|
-
ENV["PGPASSWORD"] = nil unless password.blank?
|
52
|
-
res
|
46
|
+
with_pgpassword do
|
47
|
+
commands = ["psql"]
|
48
|
+
add_connection_settings commands
|
49
|
+
add_option commands, "--file", filename
|
50
|
+
commands << database
|
51
|
+
safe_exec commands
|
52
|
+
end
|
53
53
|
end
|
54
54
|
|
55
55
|
def close_connections
|
@@ -68,6 +68,46 @@ module SequelRails
|
|
68
68
|
# are closed
|
69
69
|
end
|
70
70
|
end
|
71
|
+
|
72
|
+
def encoding
|
73
|
+
@encoding ||= config["encoding"] || charset
|
74
|
+
end
|
75
|
+
|
76
|
+
def locale
|
77
|
+
@locale ||= config["locale"] || ""
|
78
|
+
end
|
79
|
+
|
80
|
+
def template
|
81
|
+
@template ||= config["template"] || ""
|
82
|
+
end
|
83
|
+
|
84
|
+
def ctype
|
85
|
+
@ctype ||= config["ctype"] || ""
|
86
|
+
end
|
87
|
+
|
88
|
+
def tablespace
|
89
|
+
@tablespace ||= config["tablespace"] || ""
|
90
|
+
end
|
91
|
+
|
92
|
+
def maintenance_db
|
93
|
+
@maintenance_db ||= config["maintenance_db"] || ""
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def with_pgpassword
|
99
|
+
ENV["PGPASSWORD"] = password unless password.blank?
|
100
|
+
yield
|
101
|
+
ensure
|
102
|
+
ENV["PGPASSWORD"] = nil unless password.blank?
|
103
|
+
end
|
104
|
+
|
105
|
+
def add_connection_settings(commands)
|
106
|
+
add_option commands, "--username", username
|
107
|
+
add_option commands, "--host", host
|
108
|
+
add_option commands, "--port", port.to_s
|
109
|
+
end
|
110
|
+
|
71
111
|
end
|
72
112
|
end
|
73
113
|
end
|
@@ -13,12 +13,16 @@ module SequelRails
|
|
13
13
|
|
14
14
|
def _dump(filename)
|
15
15
|
return if in_memory?
|
16
|
-
|
16
|
+
escaped_path = SequelRails::Shellwords.shellescape(path.to_s)
|
17
|
+
escaped_filename = SequelRails::Shellwords.shellescape(filename)
|
18
|
+
exec "sqlite3 #{escaped_path} .schema > #{escaped_filename}"
|
17
19
|
end
|
18
20
|
|
19
21
|
def _load(filename)
|
20
22
|
return if in_memory?
|
21
|
-
|
23
|
+
escaped_path = SequelRails::Shellwords.shellescape(path.to_s)
|
24
|
+
escaped_filename = SequelRails::Shellwords.shellescape(filename)
|
25
|
+
exec "sqlite3 #{escaped_path} < #{escaped_filename}"
|
22
26
|
end
|
23
27
|
|
24
28
|
private
|
data/lib/sequel_rails/version.rb
CHANGED
data/sequel-rails.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.authors = ["Brasten Sager (brasten)", "Jonathan TRON"]
|
11
11
|
s.email = ["brasten@gmail.com", "jonathan.tron@metrilio.com"]
|
12
|
-
s.homepage = "
|
12
|
+
s.homepage = "http://talentbox.github.io/sequel-rails/"
|
13
13
|
s.description = "Integrate Sequel with Rails 3"
|
14
14
|
s.summary = "Use Sequel with Rails 3"
|
15
15
|
s.files = `git ls-files`.split("\n")
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
s.extra_rdoc_files = ["LICENSE", "README.md"]
|
20
20
|
s.rdoc_options = ["--charset=UTF-8"]
|
21
|
+
s.license = "MIT"
|
21
22
|
|
22
23
|
s.add_runtime_dependency "sequel", [">= 3.28", "< 5.0"]
|
23
24
|
s.add_runtime_dependency "railties", ">= 3.2.0"
|
@@ -1,9 +1,89 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe SequelRails
|
3
|
+
describe SequelRails do
|
4
4
|
|
5
5
|
describe ".setup" do
|
6
|
+
let(:environment) { "development" }
|
7
|
+
let(:configuration) { SequelRails::Configuration.new }
|
8
|
+
|
9
|
+
it "delegates to current configuration" do
|
10
|
+
SequelRails.configuration = configuration
|
11
|
+
configuration.should_receive(:connect).with(environment)
|
12
|
+
SequelRails.setup environment
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe SequelRails::Configuration do
|
19
|
+
|
20
|
+
describe "#schema_dump" do
|
21
|
+
before{ Rails.stub(:env).and_return environment }
|
22
|
+
subject{ described_class.new }
|
6
23
|
|
24
|
+
context "in test environment" do
|
25
|
+
let(:environment) { "test" }
|
26
|
+
it "defaults to false" do
|
27
|
+
subject.schema_dump.should be_false
|
28
|
+
end
|
29
|
+
it "can be assigned" do
|
30
|
+
subject.schema_dump = true
|
31
|
+
subject.schema_dump.should be_true
|
32
|
+
end
|
33
|
+
it "can be set from merging another hash" do
|
34
|
+
subject.merge!(:schema_dump => true)
|
35
|
+
subject.schema_dump.should be_true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "in production environment" do
|
40
|
+
let(:environment) { "production" }
|
41
|
+
it "defaults to false" do
|
42
|
+
subject.schema_dump.should be_false
|
43
|
+
end
|
44
|
+
it "can be assigned" do
|
45
|
+
subject.schema_dump = true
|
46
|
+
subject.schema_dump.should be_true
|
47
|
+
end
|
48
|
+
it "can be set from merging another hash" do
|
49
|
+
subject.merge!(:schema_dump => true)
|
50
|
+
subject.schema_dump.should be_true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "in other environments" do
|
55
|
+
let(:environment) { "development" }
|
56
|
+
it "defaults to true" do
|
57
|
+
subject.schema_dump.should be_true
|
58
|
+
end
|
59
|
+
it "can be assigned" do
|
60
|
+
subject.schema_dump = false
|
61
|
+
subject.schema_dump.should be_false
|
62
|
+
end
|
63
|
+
it "can be set from merging another hash" do
|
64
|
+
subject.merge!(:schema_dump => false)
|
65
|
+
subject.schema_dump.should be_false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#load_database_tasks" do
|
71
|
+
subject{ described_class.new }
|
72
|
+
|
73
|
+
it "defaults to true" do
|
74
|
+
subject.load_database_tasks.should be_true
|
75
|
+
end
|
76
|
+
it "can be assigned" do
|
77
|
+
subject.load_database_tasks = false
|
78
|
+
subject.load_database_tasks.should be_false
|
79
|
+
end
|
80
|
+
it "can be set from merging another hash" do
|
81
|
+
subject.merge!(:load_database_tasks => false)
|
82
|
+
subject.load_database_tasks.should be_false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#connect" do
|
7
87
|
let(:environments) do
|
8
88
|
{
|
9
89
|
"development" => {
|
@@ -38,21 +118,20 @@ describe SequelRails::Configuration do
|
|
38
118
|
end
|
39
119
|
let(:is_jruby) { false }
|
40
120
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
SequelRails.stub(:jruby?).and_return is_jruby
|
121
|
+
subject do
|
122
|
+
config = described_class.new
|
123
|
+
config.raw = environments
|
124
|
+
config
|
46
125
|
end
|
47
126
|
|
48
|
-
|
127
|
+
before { SequelRails.stub(:jruby?).and_return is_jruby }
|
49
128
|
|
50
129
|
shared_examples "max_connections" do
|
51
130
|
context "with max_connections config option" do
|
52
131
|
let(:max_connections) { 31337 }
|
53
132
|
before do
|
54
133
|
environments[environment]["max_connections"] = 7
|
55
|
-
|
134
|
+
subject.max_connections = max_connections
|
56
135
|
end
|
57
136
|
|
58
137
|
it "overrides the option from the configuration" do
|
@@ -63,7 +142,7 @@ describe SequelRails::Configuration do
|
|
63
142
|
hash_or_url.should include("max_connections=#{max_connections}")
|
64
143
|
end
|
65
144
|
end
|
66
|
-
subject
|
145
|
+
subject.connect environment
|
67
146
|
end
|
68
147
|
end
|
69
148
|
end
|
@@ -75,7 +154,7 @@ describe SequelRails::Configuration do
|
|
75
154
|
let(:search_path) { ['secret', 'private', 'public'] }
|
76
155
|
before do
|
77
156
|
environments[environment]["search_path"] = "private, public"
|
78
|
-
|
157
|
+
subject.search_path = search_path
|
79
158
|
end
|
80
159
|
|
81
160
|
it "overrides the option from the configuration" do
|
@@ -86,7 +165,7 @@ describe SequelRails::Configuration do
|
|
86
165
|
hash_or_url.should include("search_path=secret,private,public")
|
87
166
|
end
|
88
167
|
end
|
89
|
-
subject
|
168
|
+
subject.connect environment
|
90
169
|
end
|
91
170
|
end
|
92
171
|
end
|
@@ -102,7 +181,7 @@ describe SequelRails::Configuration do
|
|
102
181
|
::Sequel.should_receive(:connect) do |hash|
|
103
182
|
hash['adapter'].should == 'postgres'
|
104
183
|
end
|
105
|
-
subject
|
184
|
+
subject.connect environment
|
106
185
|
end
|
107
186
|
|
108
187
|
end
|
@@ -120,7 +199,7 @@ describe SequelRails::Configuration do
|
|
120
199
|
hash['adapter'].should == 'jdbc:postgresql'
|
121
200
|
hash['host'].should == '127.0.0.1'
|
122
201
|
end
|
123
|
-
subject
|
202
|
+
subject.connect environment
|
124
203
|
end
|
125
204
|
|
126
205
|
context "when url is already given" do
|
@@ -132,7 +211,7 @@ describe SequelRails::Configuration do
|
|
132
211
|
url.should == "jdbc:adapter_name://HOST/DB?user=U&password=P&ssl=true&sslfactory=sslFactoryOption"
|
133
212
|
hash['adapter'].should == 'jdbc:adapter_name'
|
134
213
|
end
|
135
|
-
subject
|
214
|
+
subject.connect environment
|
136
215
|
end
|
137
216
|
|
138
217
|
end
|
@@ -151,7 +230,7 @@ describe SequelRails::Configuration do
|
|
151
230
|
::Sequel.should_receive(:connect) do |hash|
|
152
231
|
hash['adapter'].should == 'mysql'
|
153
232
|
end
|
154
|
-
subject
|
233
|
+
subject.connect environment
|
155
234
|
end
|
156
235
|
end
|
157
236
|
|
@@ -167,7 +246,7 @@ describe SequelRails::Configuration do
|
|
167
246
|
hash['adapter'].should == 'jdbc:mysql'
|
168
247
|
hash['database'].should == 'sequel_rails_test_storage_remote'
|
169
248
|
end
|
170
|
-
subject
|
249
|
+
subject.connect environment
|
171
250
|
end
|
172
251
|
|
173
252
|
context "when url is already given" do
|
@@ -179,77 +258,23 @@ describe SequelRails::Configuration do
|
|
179
258
|
url.should == "jdbc:adapter_name://HOST/DB?user=U&password=P&ssl=true&sslfactory=sslFactoryOption"
|
180
259
|
hash['adapter'].should == 'jdbc:adapter_name'
|
181
260
|
end
|
182
|
-
subject
|
261
|
+
subject.connect environment
|
183
262
|
end
|
184
263
|
|
185
264
|
end
|
186
265
|
end
|
187
266
|
end
|
188
|
-
end
|
189
|
-
|
190
|
-
describe "#schema_dump" do
|
191
|
-
before{ Rails.stub(:env).and_return environment }
|
192
|
-
subject{ described_class.new }
|
193
|
-
|
194
|
-
context "in test environment" do
|
195
|
-
let(:environment) { "test" }
|
196
|
-
it "defaults to false" do
|
197
|
-
subject.schema_dump.should be_false
|
198
|
-
end
|
199
|
-
it "can be assigned" do
|
200
|
-
subject.schema_dump = true
|
201
|
-
subject.schema_dump.should be_true
|
202
|
-
end
|
203
|
-
it "can be set from merging another hash" do
|
204
|
-
subject.merge!(:schema_dump => true)
|
205
|
-
subject.schema_dump.should be_true
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
context "in production environment" do
|
210
|
-
let(:environment) { "production" }
|
211
|
-
it "defaults to false" do
|
212
|
-
subject.schema_dump.should be_false
|
213
|
-
end
|
214
|
-
it "can be assigned" do
|
215
|
-
subject.schema_dump = true
|
216
|
-
subject.schema_dump.should be_true
|
217
|
-
end
|
218
|
-
it "can be set from merging another hash" do
|
219
|
-
subject.merge!(:schema_dump => true)
|
220
|
-
subject.schema_dump.should be_true
|
221
|
-
end
|
222
|
-
end
|
223
267
|
|
224
|
-
|
268
|
+
describe "after connect hook" do
|
269
|
+
let(:hook) { double }
|
225
270
|
let(:environment) { "development" }
|
226
|
-
|
227
|
-
subject.schema_dump.should be_true
|
228
|
-
end
|
229
|
-
it "can be assigned" do
|
230
|
-
subject.schema_dump = false
|
231
|
-
subject.schema_dump.should be_false
|
232
|
-
end
|
233
|
-
it "can be set from merging another hash" do
|
234
|
-
subject.merge!(:schema_dump => false)
|
235
|
-
subject.schema_dump.should be_false
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
271
|
+
before { SequelRails.unstub :jruby? }
|
239
272
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
end
|
246
|
-
it "can be assigned" do
|
247
|
-
subject.load_database_tasks = false
|
248
|
-
subject.load_database_tasks.should be_false
|
249
|
-
end
|
250
|
-
it "can be set from merging another hash" do
|
251
|
-
subject.merge!(:load_database_tasks => false)
|
252
|
-
subject.load_database_tasks.should be_false
|
273
|
+
it "runs hook if provided" do
|
274
|
+
subject.after_connect = hook
|
275
|
+
hook.should_receive(:call)
|
276
|
+
subject.connect environment
|
277
|
+
end
|
253
278
|
end
|
254
279
|
end
|
255
280
|
end
|