sequel-rails 0.9.16 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,28 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'railties', '~> 5.2.2'
4
+ gem 'activemodel', '~> 5.2.2'
5
+ gem 'actionpack', '~> 5.2.2'
6
+
7
+ gemspec :path => '../'
8
+
9
+ gem 'sequel', "#{ENV['SEQUEL']}"
10
+
11
+ gem 'fakefs', '0.11.2', :require => 'fakefs/safe'
12
+
13
+ # MRI/Rubinius Adapter Dependencies
14
+ platform :ruby do
15
+ gem 'pg'
16
+ if RUBY_VERSION < '2.4'
17
+ gem 'mysql'
18
+ end
19
+ gem 'mysql2'
20
+ gem 'sqlite3'
21
+ end
22
+
23
+ # JRuby Adapter Dependencies
24
+ platform :jruby do
25
+ gem 'jdbc-sqlite3'
26
+ gem 'jdbc-mysql'
27
+ gem 'jdbc-postgres'
28
+ end
@@ -0,0 +1,28 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'railties', '~> 6.0.0'
4
+ gem 'activemodel', '~> 6.0.0'
5
+ gem 'actionpack', '~> 6.0.0'
6
+
7
+ gemspec :path => '../'
8
+
9
+ gem 'sequel', "#{ENV['SEQUEL']}"
10
+
11
+ gem 'fakefs', '0.11.2', :require => 'fakefs/safe'
12
+
13
+ # MRI/Rubinius Adapter Dependencies
14
+ platform :ruby do
15
+ gem 'pg'
16
+ if RUBY_VERSION < '2.4'
17
+ gem 'mysql'
18
+ end
19
+ gem 'mysql2'
20
+ gem 'sqlite3'
21
+ end
22
+
23
+ # JRuby Adapter Dependencies
24
+ platform :jruby do
25
+ gem 'jdbc-sqlite3'
26
+ gem 'jdbc-mysql'
27
+ gem 'jdbc-postgres'
28
+ end
@@ -26,13 +26,17 @@ module ActionDispatch
26
26
  end
27
27
 
28
28
  def get_session(env, sid)
29
- session = load_from_store(sid)
30
- env[SESSION_RECORD_KEY] = session
31
- [session.session_id, session.data]
29
+ with_silenced_logger do
30
+ session = load_from_store(sid)
31
+ env[SESSION_RECORD_KEY] = session
32
+ [session.session_id, session.data]
33
+ end
32
34
  end
33
35
 
34
36
  def write_session(req, sid, session_data, options)
35
- set_session(req.env, sid, session_data, options)
37
+ with_silenced_logger do
38
+ set_session(req.env, sid, session_data, options)
39
+ end
36
40
  end
37
41
 
38
42
  def set_session(env, sid, session_data, options)
@@ -42,7 +46,9 @@ module ActionDispatch
42
46
  end
43
47
 
44
48
  def delete_session(req, sid, options)
45
- destroy_session(req.env, sid, options)
49
+ with_silenced_logger do
50
+ destroy_session(req.env, sid, options)
51
+ end
46
52
  end
47
53
 
48
54
  def destroy_session(env, sid, options)
@@ -53,10 +59,12 @@ module ActionDispatch
53
59
  end
54
60
 
55
61
  def get_session_model(env, sid)
56
- if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
57
- env[SESSION_RECORD_KEY] = load_from_store(sid)
58
- else
59
- env[SESSION_RECORD_KEY] ||= load_from_store(sid)
62
+ with_silenced_logger do
63
+ if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
64
+ env[SESSION_RECORD_KEY] = load_from_store(sid)
65
+ else
66
+ env[SESSION_RECORD_KEY] ||= load_from_store(sid)
67
+ end
60
68
  end
61
69
  end
62
70
 
@@ -65,6 +73,10 @@ module ActionDispatch
65
73
  klass.where(:session_id => sid).first ||
66
74
  klass.new(:session_id => generate_sid, :data => {})
67
75
  end
76
+
77
+ def with_silenced_logger
78
+ Rails.application.config.sequel.logger.silence { yield }
79
+ end
68
80
  end
69
81
  end
70
82
  end
@@ -17,6 +17,13 @@ module Sequel
17
17
  )
18
18
  end
19
19
 
20
+ # Implement the required interface for Rails::Generators::Migration.
21
+ #
22
+ def self.next_migration_number(dirname) #:nodoc:
23
+ next_migration_number = current_migration_number(dirname) + 1
24
+ [Time.now.utc.strftime('%Y%m%d%H%M%S'), format('%.14d', next_migration_number)].max
25
+ end
26
+
20
27
  protected
21
28
 
22
29
  # Sequel does not care if migrations have the same name as long as
@@ -25,13 +32,6 @@ module Sequel
25
32
  def migration_exists?(_dirname, _file_name) #:nodoc:
26
33
  false
27
34
  end
28
-
29
- # Implement the required interface for Rails::Generators::Migration.
30
- #
31
- def self.next_migration_number(dirname) #:nodoc:
32
- next_migration_number = current_migration_number(dirname) + 1
33
- [Time.now.utc.strftime('%Y%m%d%H%M%S'), format('%.14d', next_migration_number)].max
34
- end
35
35
  end
36
36
 
37
37
  class ActiveModel < ::Rails::Generators::ActiveModel #:nodoc:
@@ -61,7 +61,7 @@ module Sequel
61
61
  end
62
62
 
63
63
  def validate_file_name!
64
- fail IllegalMigrationNameError file_name unless file_name =~ /^[_a-z0-9]+$/
64
+ raise IllegalMigrationNameError.new(file_name) unless file_name =~ /^[_a-z0-9]+$/
65
65
  end
66
66
  end
67
67
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Sequel.migration do
2
4
  <%- if use_change -%>
3
5
  change do
@@ -12,10 +12,11 @@ module Sequel
12
12
  class_option :parent, :type => :string, :desc => 'The parent class for the generated model'
13
13
 
14
14
  def create_migration_file
15
+ return unless options[:migration]
15
16
  migration_template(
16
17
  'migration.rb.erb',
17
18
  File.join('db', 'migrate', "create_#{table_name}.rb")
18
- ) if options[:migration]
19
+ )
19
20
  end
20
21
 
21
22
  def create_model_file
@@ -23,7 +23,7 @@ module Sequel
23
23
  end
24
24
 
25
25
  def validate_file_name!
26
- fail IllegalMigrationNameError file_name unless file_name =~ /^[_a-z0-9]+$/
26
+ raise IllegalMigrationNameError, file_name unless file_name =~ /^[_a-z0-9]+$/
27
27
  end
28
28
  end
29
29
  end
@@ -28,6 +28,7 @@ module SequelRails
28
28
  self.load_database_tasks = true
29
29
  self.after_connect = nil
30
30
  self.skip_connect = nil
31
+ self.test_connect = true
31
32
  end
32
33
 
33
34
  def environment_for(name)
@@ -37,7 +38,7 @@ module SequelRails
37
38
  def environments
38
39
  @environments ||= raw.reduce(
39
40
  # default config - use just the environment variable
40
- Hash.new normalize_repository_config({})
41
+ Hash.new(normalize_repository_config({}))
41
42
  ) do |normalized, environment|
42
43
  name = environment.first
43
44
  config = environment.last
@@ -49,8 +50,8 @@ module SequelRails
49
50
  def connect(environment)
50
51
  normalized_config = environment_for environment
51
52
 
52
- unless (normalized_config.keys & %w(adapter url)).any?
53
- fail "Database not configured.\n" \
53
+ unless (normalized_config.keys & %w[adapter url]).any?
54
+ raise "Database not configured.\n" \
54
55
  'Please create config/database.yml or set DATABASE_URL in environment.'
55
56
  end
56
57
 
@@ -64,7 +65,7 @@ module SequelRails
64
65
  private
65
66
 
66
67
  def default_schema_dump
67
- !%w(test production).include? Rails.env
68
+ !%w[test production].include? Rails.env
68
69
  end
69
70
 
70
71
  def normalize_repository_config(hash)
@@ -72,6 +73,8 @@ module SequelRails
72
73
 
73
74
  config['max_connections'] = max_connections if max_connections
74
75
  config['search_path'] = search_path if search_path
76
+ config['servers'] = servers if servers
77
+ config['test'] = test_connect
75
78
 
76
79
  url = ENV['DATABASE_URL']
77
80
  config['url'] ||= url if url
@@ -33,7 +33,7 @@ module SequelRails
33
33
  ADAPTER_MAPPING = {
34
34
  'sqlite3' => 'sqlite',
35
35
  'postgresql' => 'postgres'
36
- }
36
+ }.freeze
37
37
 
38
38
  def normalize_adapter
39
39
  self[:adapter] = ADAPTER_MAPPING[adapter.to_s] || adapter.to_s
@@ -59,7 +59,7 @@ module SequelRails
59
59
  scheme, subadapter = adapter.split ':'
60
60
  URI::Generic.build(
61
61
  :scheme => scheme,
62
- :opaque => build_url(to_hash.merge 'adapter' => subadapter).to_s
62
+ :opaque => build_url(to_hash.merge('adapter' => subadapter)).to_s
63
63
  )
64
64
  else
65
65
  build_url to_hash
@@ -73,8 +73,8 @@ module SequelRails
73
73
  return URI::Generic.build(:scheme => adapter, :opaque => database)
74
74
  end
75
75
 
76
- # these four are handled separately
77
- params = cfg.reject { |k, _| %w(adapter host port database).include? k }
76
+ # these are handled separately
77
+ params = cfg.reject { |k, _| non_params.include? k }
78
78
 
79
79
  if (v = params['search_path'])
80
80
  # make sure there's no whitespace
@@ -96,6 +96,10 @@ module SequelRails
96
96
  :query => q
97
97
  )
98
98
  end
99
+
100
+ def non_params
101
+ %w(adapter host port database servers)
102
+ end
99
103
  end
100
104
  end
101
105
 
@@ -6,7 +6,14 @@ module SequelRails
6
6
  def migrate(version = nil)
7
7
  opts = {}
8
8
  opts[:target] = version.to_i if version
9
- ::Sequel::Migrator.run(::Sequel::Model.db, migrations_dir, opts)
9
+ opts[:allow_missing_migration_files] = !!SequelRails.configuration.allow_missing_migration_files
10
+
11
+ if migrations_dir.directory?
12
+ ::Sequel::Migrator.run(::Sequel::Model.db, migrations_dir, opts)
13
+ else
14
+ relative_path_name = migrations_dir.relative_path_from(Rails.root).to_s
15
+ raise "The #{relative_path_name} directory doesn't exist, you need to create it."
16
+ end
10
17
  end
11
18
  alias_method :migrate_up!, :migrate
12
19
  alias_method :migrate_down!, :migrate
@@ -23,8 +30,7 @@ module SequelRails
23
30
  res = ''
24
31
 
25
32
  if available_migrations?
26
- migrator_class = ::Sequel::Migrator.send(:migrator_class, migrations_dir)
27
- migrator = migrator_class.new db, migrations_dir
33
+ migrator = init_migrator
28
34
  res << adapter.schema_information_dump(migrator, sql)
29
35
  end
30
36
  res
@@ -37,8 +43,8 @@ module SequelRails
37
43
  def current_migration
38
44
  return unless available_migrations?
39
45
 
40
- migrator_class = ::Sequel::Migrator.send(:migrator_class, migrations_dir)
41
- migrator = migrator_class.new ::Sequel::Model.db, migrations_dir
46
+ migrator = init_migrator
47
+
42
48
  if migrator.respond_to?(:applied_migrations)
43
49
  migrator.applied_migrations.last
44
50
  elsif migrator.respond_to?(:current_version)
@@ -49,8 +55,8 @@ module SequelRails
49
55
  def previous_migration
50
56
  return unless available_migrations?
51
57
 
52
- migrator_class = ::Sequel::Migrator.send(:migrator_class, migrations_dir)
53
- migrator = migrator_class.new ::Sequel::Model.db, migrations_dir
58
+ migrator = init_migrator
59
+
54
60
  if migrator.respond_to?(:applied_migrations)
55
61
  migrator.applied_migrations[-2] || '0'
56
62
  elsif migrator.respond_to?(:current_version)
@@ -61,6 +67,16 @@ module SequelRails
61
67
  def available_migrations?
62
68
  File.exist?(migrations_dir) && Dir[File.join(migrations_dir, '*')].any?
63
69
  end
70
+
71
+ def init_migrator
72
+ migrator_class = ::Sequel::Migrator.send(:migrator_class, migrations_dir)
73
+
74
+ migrator_class.new(
75
+ ::Sequel::Model.db,
76
+ migrations_dir,
77
+ allow_missing_migration_files: !!SequelRails.configuration.allow_missing_migration_files
78
+ )
79
+ end
64
80
  end
65
81
  end
66
82
  end
@@ -38,12 +38,16 @@ module SequelRails
38
38
 
39
39
  rake_tasks do |app|
40
40
  load_tasks_config = app.config.sequel.load_database_tasks
41
+
41
42
  SequelRails::TASK_NAMESPACE =
42
- case load_tasks_config
43
- when Symbol, String then load_tasks_config.to_sym
44
- else :db
45
- end
43
+ case load_tasks_config
44
+ when Symbol, String then load_tasks_config.to_sym
45
+ else :db
46
+ end
47
+
46
48
  load 'sequel_rails/railties/database.rake' if load_tasks_config
49
+
50
+ check_skip_connect_conditions(app)
47
51
  end
48
52
 
49
53
  initializer 'sequel.load_hooks' do
@@ -68,7 +72,7 @@ module SequelRails
68
72
  end
69
73
 
70
74
  initializer 'sequel.connect' do |app|
71
- ::SequelRails.setup ::Rails.env unless app.config.sequel[:skip_connect]
75
+ ::SequelRails.setup(::Rails.env) if database_connection_required?(app)
72
76
  end
73
77
 
74
78
  initializer 'sequel.spring' do |_app|
@@ -105,5 +109,17 @@ module SequelRails
105
109
  require 'sequel_rails/railties/controller_runtime'
106
110
  ActionController::Base.send :include, SequelRails::Railties::ControllerRuntime
107
111
  end
112
+
113
+ def check_skip_connect_conditions(app)
114
+ app.config.sequel[:skip_connect] ||= database_create_command?
115
+ end
116
+
117
+ def database_connection_required?(app)
118
+ !app.config.sequel[:skip_connect]
119
+ end
120
+
121
+ def database_create_command?
122
+ ["db:create", "db:create:all"].any? { |c| ARGV.include?(c) }
123
+ end
108
124
  end
109
125
  end
@@ -22,11 +22,17 @@ namespace sequel_rails_namespace do
22
22
  task :dump => :environment do
23
23
  db_for_current_env.extension :schema_dumper
24
24
  filename = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
25
- File.open filename, 'w' do |file|
26
- file << db_for_current_env.dump_schema_migration(:same_db => true)
27
- file << SequelRails::Migrations.dump_schema_information(:sql => false)
25
+
26
+ if Rails.root.join("db").exist?
27
+ File.open filename, 'w' do |file|
28
+ file << db_for_current_env.dump_schema_migration(:same_db => true)
29
+ file << SequelRails::Migrations.dump_schema_information(:sql => false)
30
+ end
31
+
32
+ Rake::Task["#{sequel_rails_namespace}:schema:dump"].reenable
33
+ else
34
+ abort "The db/ directory doesn't exist, please create it."
28
35
  end
29
- Rake::Task["#{sequel_rails_namespace}:schema:dump"].reenable
30
36
  end
31
37
 
32
38
  desc 'Load a schema.rb file into the database'
@@ -45,6 +51,7 @@ namespace sequel_rails_namespace do
45
51
  namespace :structure do
46
52
  desc 'Dump the database structure to db/structure.sql'
47
53
  task :dump, [:env] => :environment do |_t, args|
54
+ db_for_current_env
48
55
  args.with_defaults(:env => Rails.env)
49
56
 
50
57
  filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, 'db', 'structure.sql')
@@ -126,6 +133,7 @@ namespace sequel_rails_namespace do
126
133
  namespace :migrate do
127
134
  task :load => :environment do
128
135
  require 'sequel_rails/migrations'
136
+ db_for_current_env
129
137
  end
130
138
 
131
139
  desc 'Rollbacks the database one migration and re migrate up. If you want to rollback more than one step, define STEP=x. Target specific version with VERSION=x.'
@@ -145,7 +153,7 @@ namespace sequel_rails_namespace do
145
153
  desc 'Runs the "up" for a given migration VERSION.'
146
154
  task :up => :load do
147
155
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
148
- fail 'VERSION is required' unless version
156
+ raise 'VERSION is required' unless version
149
157
  SequelRails::Migrations.migrate_up!(version)
150
158
  Rake::Task["#{sequel_rails_namespace}:dump"].invoke if SequelRails.configuration.schema_dump
151
159
  end
@@ -153,7 +161,7 @@ namespace sequel_rails_namespace do
153
161
  desc 'Runs the "down" for a given migration VERSION.'
154
162
  task :down => :load do
155
163
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
156
- fail 'VERSION is required' unless version
164
+ raise 'VERSION is required' unless version
157
165
  SequelRails::Migrations.migrate_down!(version)
158
166
  Rake::Task["#{sequel_rails_namespace}:dump"].invoke if SequelRails.configuration.schema_dump
159
167
  end
@@ -205,6 +213,23 @@ namespace sequel_rails_namespace do
205
213
  Rails.env = previous_env
206
214
  end
207
215
  end
216
+
217
+ namespace :sessions do
218
+ desc 'Clear the sessions table'
219
+ task clear: :environment do
220
+ db_for_current_env.from(:sessions).truncate
221
+ end
222
+
223
+ desc 'Trim old sessions from the table (default: > 30 days)'
224
+ task :trim, [:threshold] => :environment do |_, args|
225
+ cutoff_period = (args.fetch(:threshold) { 30 }).to_i.days.ago
226
+
227
+ db_for_current_env
228
+ .from(:sessions)
229
+ .where { updated_at < cutoff_period }
230
+ .delete
231
+ end
232
+ end
208
233
  end
209
234
 
210
235
  task 'test:prepare' => "#{sequel_rails_namespace}:test:prepare"