sequel-rails 0.9.16 → 1.1.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.
Files changed (46) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +39 -60
  3. data/Gemfile +4 -13
  4. data/History.md +54 -0
  5. data/README.md +28 -10
  6. data/Rakefile +1 -1
  7. data/ci/rails-4.0.gemfile +3 -11
  8. data/ci/rails-4.1.gemfile +3 -11
  9. data/ci/rails-4.2.gemfile +3 -11
  10. data/ci/rails-5.0.gemfile +3 -3
  11. data/ci/rails-5.1.gemfile +28 -0
  12. data/ci/rails-5.2.gemfile +28 -0
  13. data/ci/rails-6.0.gemfile +28 -0
  14. data/lib/action_dispatch/middleware/session/sequel_store.rb +21 -9
  15. data/lib/generators/sequel.rb +7 -7
  16. data/lib/generators/sequel/migration/migration_generator.rb +1 -1
  17. data/lib/generators/sequel/migration/templates/migration.rb.erb +2 -0
  18. data/lib/generators/sequel/model/model_generator.rb +2 -1
  19. data/lib/generators/sequel/session_migration/session_migration_generator.rb +1 -1
  20. data/lib/sequel_rails/configuration.rb +7 -4
  21. data/lib/sequel_rails/db_config.rb +8 -4
  22. data/lib/sequel_rails/migrations.rb +23 -7
  23. data/lib/sequel_rails/railtie.rb +21 -5
  24. data/lib/sequel_rails/railties/database.rake +31 -6
  25. data/lib/sequel_rails/sequel/plugins/rails_extensions.rb +1 -1
  26. data/lib/sequel_rails/storage.rb +2 -4
  27. data/lib/sequel_rails/storage/abstract.rb +17 -5
  28. data/lib/sequel_rails/storage/jdbc.rb +2 -2
  29. data/lib/sequel_rails/storage/mysql.rb +1 -0
  30. data/lib/sequel_rails/storage/postgres.rb +7 -3
  31. data/lib/sequel_rails/version.rb +1 -1
  32. data/rubocop-todo.yml +4 -1
  33. data/sequel-rails.gemspec +13 -21
  34. data/spec/helpers/io.rb +1 -5
  35. data/spec/integration/sessions_controller_spec.rb +6 -1
  36. data/spec/lib/generators/sequel/migration_spec.rb +9 -1
  37. data/spec/lib/generators/sequel/session_migration_spec.rb +1 -1
  38. data/spec/lib/sequel_rails/configuration_spec.rb +78 -0
  39. data/spec/lib/sequel_rails/migrations_spec.rb +21 -4
  40. data/spec/lib/sequel_rails/railtie_spec.rb +1 -1
  41. data/spec/lib/sequel_rails/railties/database_rake_spec.rb +42 -0
  42. data/spec/lib/sequel_rails/storage/mysql_spec.rb +1 -1
  43. data/spec/lib/sequel_rails/storage/postgres_spec.rb +1 -1
  44. data/spec/spec_helper.rb +5 -2
  45. metadata +29 -34
  46. data/ci/rails-3.2.gemfile +0 -42
@@ -25,7 +25,7 @@ module Sequel
25
25
  module ClassMethods
26
26
  def find!(args)
27
27
  m = self[args]
28
- fail ModelNotFound, "Couldn't find #{self} matching #{args}." unless m
28
+ raise ModelNotFound, "Couldn't find #{self} matching #{args}." unless m
29
29
  m
30
30
  end
31
31
  end
@@ -51,8 +51,6 @@ module SequelRails
51
51
  lookup_class(config['adapter']).new config
52
52
  end
53
53
 
54
- private
55
-
56
54
  def self.parse_url(value)
57
55
  URI(value) if value.present?
58
56
  rescue ArgumentError
@@ -106,12 +104,12 @@ module SequelRails
106
104
  end
107
105
 
108
106
  def self.lookup_class(adapter)
109
- fail 'Adapter not specified in config, please set the :adapter key.' unless adapter
107
+ raise 'Adapter not specified in config, please set the :adapter key.' unless adapter
110
108
  return Jdbc if adapter =~ /jdbc/
111
109
 
112
110
  klass_name = adapter.camelize.to_sym
113
111
  unless self.const_defined?(klass_name)
114
- fail "Adapter #{adapter} not supported (#{klass_name.inspect})"
112
+ raise "Adapter #{adapter} not supported (#{klass_name.inspect})"
115
113
  end
116
114
 
117
115
  const_get klass_name
@@ -80,13 +80,13 @@ module SequelRails
80
80
  if inserts.any?
81
81
  res = inserts.join("\n")
82
82
  unless sql_dump
83
- res = <<-EOS.strip_heredoc
83
+ res = <<-RUBY.strip_heredoc
84
84
  Sequel.migration do
85
85
  change do
86
86
  #{res}
87
87
  end
88
88
  end
89
- EOS
89
+ RUBY
90
90
  end
91
91
  end
92
92
  res
@@ -127,7 +127,19 @@ module SequelRails
127
127
  end
128
128
 
129
129
  def safe_exec(args)
130
- exec SequelRails::Shellwords.join(Array(args))
130
+ if !Gem.win_platform?
131
+ exec SequelRails::Shellwords.join(Array(args))
132
+ else
133
+ jarg = args.map do |arg|
134
+ str = arg.to_s
135
+ return "''" if str.empty?
136
+ str = str.dup
137
+ str.gsub!(%r{([^A-Za-z0-9_\-.,:/@\n])}, '\\1')
138
+ str.gsub!(/\n/, "'\n'")
139
+ str
140
+ end
141
+ exec jarg.join(' ')
142
+ end
131
143
  end
132
144
 
133
145
  def schema_information_inserts(migrator, sql_dump)
@@ -146,14 +158,14 @@ module SequelRails
146
158
  if sql_dump
147
159
  res = "#{set_search_path_sql};\n#{res}"
148
160
  else
149
- res = <<-EOS.strip_heredoc
161
+ res = <<-RUBY.strip_heredoc
150
162
  Sequel.migration do
151
163
  change do
152
164
  self << #{set_search_path_sql.inspect}
153
165
  #{res}
154
166
  end
155
167
  end
156
- EOS
168
+ RUBY
157
169
  end
158
170
  end
159
171
  res
@@ -58,7 +58,7 @@ module SequelRails
58
58
  adapter = ::SequelRails::Storage::Postgres.new(config)
59
59
  adapter._dump(filename)
60
60
  else
61
- fail NotImplementedError
61
+ raise NotImplementedError
62
62
  end
63
63
  end
64
64
 
@@ -67,7 +67,7 @@ module SequelRails
67
67
  adapter = ::SequelRails::Storage::Postgres.new(config)
68
68
  adapter._load(filename)
69
69
  else
70
- fail NotImplementedError
70
+ raise NotImplementedError
71
71
  end
72
72
  end
73
73
 
@@ -13,6 +13,7 @@ module SequelRails
13
13
  commands = ['mysqldump']
14
14
  add_connection_settings commands
15
15
  add_flag commands, '--no-data'
16
+ add_flag commands, '--skip-dump-date'
16
17
  add_option commands, '--result-file', filename
17
18
  commands << database
18
19
  safe_exec commands
@@ -22,6 +22,7 @@ module SequelRails
22
22
  with_pgpassword do
23
23
  commands = ['dropdb']
24
24
  add_connection_settings commands
25
+ add_flag commands, '--if-exists'
25
26
  commands << database
26
27
  safe_exec commands
27
28
  end
@@ -64,6 +65,9 @@ module SequelRails
64
65
  # command. Seems to be only way to ensure *all* test connections
65
66
  # are closed
66
67
  nil
68
+ rescue Sequel::DatabaseConnectionError
69
+ # Will raise an error if the database doesn't exist.
70
+ nil
67
71
  end
68
72
 
69
73
  def encoding
@@ -104,9 +108,9 @@ module SequelRails
104
108
  end
105
109
 
106
110
  def add_connection_settings(commands)
107
- add_option commands, '--username', username
108
- add_option commands, '--host', host
109
- add_option commands, '--port', port.to_s
111
+ add_option commands, '--username', username unless username.blank?
112
+ add_option commands, '--host', host unless host.blank?
113
+ add_option commands, '--port', port.to_s unless port.to_s.blank? || port.to_s == '0'
110
114
  end
111
115
  end
112
116
  end
@@ -1,3 +1,3 @@
1
1
  module SequelRails
2
- VERSION = '0.9.16'
2
+ VERSION = '1.1.1'.freeze
3
3
  end
@@ -23,7 +23,10 @@ LineLength:
23
23
  MethodLength:
24
24
  Enabled: false
25
25
 
26
- TrailingComma:
26
+ TrailingCommaInLiteral:
27
+ Enabled: false
28
+
29
+ TrailingCommaInArguments:
27
30
  Enabled: false
28
31
 
29
32
  Metrics/AbcSize:
@@ -1,4 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
+
2
3
  $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
4
 
4
5
  require 'sequel_rails/version'
@@ -20,29 +21,20 @@ Gem::Specification.new do |s|
20
21
  s.rdoc_options = ['--charset=UTF-8']
21
22
  s.license = 'MIT'
22
23
 
23
- if RUBY_VERSION < '1.9.3'
24
- s.post_install_message = <<-NOTE
25
-
26
- !!! sequel-rails
27
- NOTE: Support for Ruby < 1.9.3 (this is 1.8.x, 1.9.0, 1.9.2) in sequel-rails
28
- is deprecated and will be dropped in the next major release. If you really
29
- rely on it please complain at http://git.io/WgfgZQ to delay the inevitable.
30
- !!!
31
-
32
- NOTE
33
- end
24
+ s.required_ruby_version = '>= 2.2.2'
25
+ s.required_rubygems_version = '>= 1.8.11'
34
26
 
35
- s.add_dependency 'activemodel'
36
- s.add_dependency 'railties', '>= 3.2.0'
37
- s.add_dependency 'actionpack', '>= 3.2.0'
38
- s.add_dependency 'sequel', ['>= 3.28', '< 5.0']
27
+ s.add_dependency 'activemodel', '>= 4.0.0'
28
+ s.add_dependency 'railties', '>= 4.0.0'
29
+ s.add_dependency 'actionpack', '>= 4.0.0'
30
+ s.add_dependency 'sequel', ['>= 3.28', '< 6.0']
39
31
 
40
32
  s.add_development_dependency 'combustion'
41
33
  s.add_development_dependency 'generator_spec'
42
- s.add_development_dependency 'rake', '>= 0.8.7', '< 11.0'
43
- s.add_development_dependency 'rspec', '~> 3.1'
44
- s.add_development_dependency 'rspec-rails', '~> 3.1', '< 3.3'
45
- s.add_development_dependency 'rubocop', '~> 0.33.0' unless RUBY_VERSION < '1.9.2'
46
- s.add_development_dependency 'ammeter', '1.1.3'
47
- s.add_development_dependency 'test-unit' if RUBY_VERSION >= '2.2.0'
34
+ s.add_development_dependency 'rake', '>= 0.8.7', '< 12.1'
35
+ s.add_development_dependency 'rspec', '~> 3.7'
36
+ s.add_development_dependency 'rspec-rails', '~> 3.7'
37
+ s.add_development_dependency 'rubocop', '~> 0.52.0'
38
+ s.add_development_dependency 'ammeter', '1.1.4'
39
+ s.add_development_dependency 'test-unit'
48
40
  end
@@ -2,11 +2,7 @@ module IOSpecHelper
2
2
  def pretend_file_not_exists(pattern)
3
3
  allow(IO).to receive(:read).and_wrap_original do |m, *a|
4
4
  # if this isn't a good use for case equality I don't know what is
5
- if pattern === a.first # rubocop:disable CaseEquality
6
- fail Errno::ENOENT
7
- else
8
- m.call(*a)
9
- end
5
+ pattern === a.first ? raise(Errno::ENOENT) : m.call(*a) # rubocop:disable CaseEquality
10
6
  end
11
7
  end
12
8
  end
@@ -4,7 +4,12 @@ describe SessionsController, :type => :request do
4
4
  let(:session_class) { ::ActionDispatch::Session::SequelStore.session_class }
5
5
 
6
6
  def login
7
- post '/session', :status => 'logged_in'
7
+ opts = if ActionPack::VERSION::MAJOR >= 5
8
+ {params: {:status => 'logged_in'}}
9
+ else
10
+ {:status => 'logged_in'}
11
+ end
12
+ post '/session', opts
8
13
  end
9
14
 
10
15
  describe '#create' do
@@ -21,7 +21,7 @@ describe Sequel::Generators::MigrationGenerator do
21
21
  it 'refuses to generate migration with invalid filename' do
22
22
  expect do
23
23
  run_generator ['add_something:datetime']
24
- end.to raise_error
24
+ end.to raise_error(Sequel::IllegalMigrationNameError)
25
25
  end
26
26
 
27
27
  context 'when name starts with create' do
@@ -251,5 +251,13 @@ describe Sequel::Generators::MigrationGenerator do
251
251
  }
252
252
  end
253
253
  end
254
+
255
+ context 'when invalid migration name' do
256
+ it 'raises error' do
257
+ expect { run_generator ['invalid:file:name'] }
258
+ .to raise_error(Sequel::IllegalMigrationNameError)
259
+ .with_message("Illegal name for migration file: invalid:file:name (only lower case letters, numbers, and '_' allowed)")
260
+ end
261
+ end
254
262
  end
255
263
  end
@@ -11,7 +11,7 @@ describe Sequel::Generators::SessionMigrationGenerator do
11
11
  it 'refuses to generate migration with invalid filename' do
12
12
  expect do
13
13
  run_generator ['add:sessions']
14
- end.to raise_error
14
+ end.to raise_error(Sequel::IllegalMigrationNameError)
15
15
  end
16
16
 
17
17
  it 'creates a new migration for sessions table' do
@@ -96,6 +96,22 @@ describe SequelRails::Configuration do
96
96
  end
97
97
  end
98
98
 
99
+ describe '#test_connect' do
100
+ it 'defaults to true' do
101
+ expect(subject.test_connect).to be true
102
+ end
103
+
104
+ it 'can be assigned' do
105
+ subject.test_connect = true
106
+ expect(subject.test_connect).to be true
107
+ end
108
+
109
+ it 'can be set from merging another hash' do
110
+ subject.merge!(:test_connect => true)
111
+ expect(subject.test_connect).to be true
112
+ end
113
+ end
114
+
99
115
  describe '#connect' do
100
116
  let(:environments) do
101
117
  {
@@ -135,6 +151,22 @@ describe SequelRails::Configuration do
135
151
  context 'when stubbing SequelRails.jruby?' do
136
152
  before { allow(SequelRails).to receive(:jruby?).and_return(is_jruby) }
137
153
 
154
+ shared_examples 'test_connect' do
155
+ context 'test_connect' do
156
+ it 'passes the value' do
157
+ expect(::Sequel).to receive(:connect) do |hash_or_url, *_|
158
+ if hash_or_url.is_a? Hash
159
+ expect(hash_or_url[:test]).to eq true
160
+ else
161
+ expect(hash_or_url).to include('test=true')
162
+ end
163
+ end
164
+
165
+ subject.connect environment
166
+ end
167
+ end
168
+ end
169
+
138
170
  shared_examples 'max_connections' do
139
171
  context 'with max_connections=7 config option' do
140
172
  let(:max_connections) { 31_337 }
@@ -172,6 +204,44 @@ describe SequelRails::Configuration do
172
204
  end
173
205
  end
174
206
 
207
+ shared_examples 'servers' do
208
+ context 'servers' do
209
+ let(:servers) { { read_only: { host: 'replica' } } }
210
+
211
+ shared_examples 'passes the value only through options hash' do
212
+ it 'passes the value only through options hash' do
213
+ expect(::Sequel).to receive(:connect) do |hash_or_url, *_|
214
+ if hash_or_url.is_a? Hash
215
+ servers.keys.each do |k|
216
+ expect(hash_or_url[:servers][k]).to eq servers[k]
217
+ end
218
+ else
219
+ puts hash_or_url
220
+ expect(hash_or_url).not_to include('servers=')
221
+ end
222
+ end
223
+ subject.connect environment
224
+ end
225
+ end
226
+
227
+ context 'with servers set in config' do
228
+ before do
229
+ subject.servers = servers
230
+ end
231
+
232
+ include_examples 'passes the value only through options hash'
233
+ end
234
+
235
+ context 'with servers set in environment' do
236
+ before do
237
+ environments[environment]['servers'] = servers
238
+ end
239
+
240
+ include_examples 'passes the value only through options hash'
241
+ end
242
+ end
243
+ end
244
+
175
245
  shared_examples 'with DATABASE_URL in ENV' do
176
246
  let(:database_url) { 'adapter://user:pass@host/db' }
177
247
  def with_database_url_env
@@ -248,8 +318,10 @@ describe SequelRails::Configuration do
248
318
  let(:environment) { 'development' }
249
319
 
250
320
  context 'in C-Ruby' do
321
+ include_examples 'test_connect'
251
322
  include_examples 'max_connections'
252
323
  include_examples 'search_path'
324
+ include_examples 'servers'
253
325
  include_examples 'with DATABASE_URL in ENV'
254
326
 
255
327
  let(:is_jruby) { false }
@@ -263,8 +335,10 @@ describe SequelRails::Configuration do
263
335
  end
264
336
 
265
337
  context 'in JRuby' do
338
+ include_examples 'test_connect'
266
339
  include_examples 'max_connections'
267
340
  include_examples 'search_path'
341
+ include_examples 'servers'
268
342
  include_examples 'with DATABASE_URL in ENV'
269
343
 
270
344
  let(:is_jruby) { true }
@@ -296,7 +370,9 @@ describe SequelRails::Configuration do
296
370
  let(:environment) { 'remote' }
297
371
 
298
372
  context 'in C-Ruby' do
373
+ include_examples 'test_connect'
299
374
  include_examples 'max_connections'
375
+ include_examples 'servers'
300
376
  include_examples 'with DATABASE_URL in ENV'
301
377
 
302
378
  let(:is_jruby) { false }
@@ -310,7 +386,9 @@ describe SequelRails::Configuration do
310
386
  end
311
387
 
312
388
  context 'in JRuby' do
389
+ include_examples 'test_connect'
313
390
  include_examples 'max_connections'
391
+ include_examples 'servers'
314
392
  include_examples 'with DATABASE_URL in ENV'
315
393
 
316
394
  let(:is_jruby) { true }
@@ -8,23 +8,40 @@ describe SequelRails::Migrations do
8
8
  describe ".#{migration_method}" do
9
9
  let(:result) { double(:result) }
10
10
  context 'with no version specified' do
11
- let(:opts) { {} }
12
11
  it 'runs migrations using Sequel::Migrator' do
13
12
  expect(::Sequel::Migrator).to receive(:run).with(
14
- db, Rails.root.join('db/migrate'), opts
13
+ db, Rails.root.join('db/migrate'), allow_missing_migration_files: false
15
14
  ).and_return result
16
15
  expect(described_class.send(migration_method)).to be(result)
17
16
  end
18
17
  end
19
18
  context 'with version specified' do
20
- let(:opts) { { :target => 1 } }
21
19
  it 'runs migrations using Sequel::Migrator' do
22
20
  expect(::Sequel::Migrator).to receive(:run).with(
23
- db, Rails.root.join('db/migrate'), opts
21
+ db, Rails.root.join('db/migrate'), allow_missing_migration_files: false, target: 1
24
22
  ).and_return result
25
23
  expect(described_class.send(migration_method, 1)).to be(result)
26
24
  end
27
25
  end
26
+
27
+ context 'with allow_missing_migration_files' do
28
+ around do |ex|
29
+ option = SequelRails.configuration.allow_missing_migration_files
30
+ SequelRails.configuration.allow_missing_migration_files = true
31
+
32
+ ex.run
33
+
34
+ SequelRails.configuration.allow_missing_migration_files = option
35
+ end
36
+
37
+ it 'runs migrations using Sequel::Migrator' do
38
+ expect(::Sequel::Migrator).to receive(:run).with(
39
+ db, Rails.root.join('db/migrate'), allow_missing_migration_files: true
40
+ ).and_return result
41
+
42
+ described_class.send(migration_method)
43
+ end
44
+ end
28
45
  end
29
46
  end
30
47