sequel-rails 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f76a96adfae8ea0e88a9309033960f3257abc59
|
4
|
+
data.tar.gz: ee00b69625771c517e4b0c9d595420fac941b62b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d988bf8488b10141f59786d78902694cb3f3bc44eaeffcdb09afc885f343b731b7d1faf36f070daa38d0628900e21687726c5f4b477aaf023a21d1ae9b85ec9
|
7
|
+
data.tar.gz: 96fc1e85b462e0d74ba7389f33c7aafe1ed94bd0d9fbbf4eeeb997ce6bb26ec22b25c94c6e99f6f50d19bd36dd77d8ac2bfeb28b680e943ece1ff8d76fdd4b7c
|
data/Gemfile
CHANGED
data/History.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
0.7.0 (2013-10-11)
|
2
|
+
==================
|
3
|
+
|
4
|
+
* Add more information in the README, related to features of SequelRails [#54](https://github.com/TalentBox/sequel-rails/issues/54)
|
5
|
+
* Refactor storage shell command construction/execution/escaping [#55](https://github.com/TalentBox/sequel-rails/issues/55)
|
6
|
+
* Handle more options from database.yml for PostgreSQL when creating/dropping/loading/dumping database [#55](https://github.com/TalentBox/sequel-rails/issues/55)
|
7
|
+
* Allow dumping the schema even if there aren't any migrations to run. (Kevin Menard) [#53](https://github.com/TalentBox/sequel-rails/pull/53)
|
8
|
+
* Fix Postgres rake tasks under JRuby (Kevin Menard, Chris Heisterkamp) [#52](https://github.com/TalentBox/sequel-rails/pull/52) [#38](https://github.com/TalentBox/sequel-rails/pull/38)
|
9
|
+
* Fix SQL schema dumps using timestamp migration (Joshua Hansen) [#50](https://github.com/TalentBox/sequel-rails/pull/50)
|
10
|
+
* Apply all migrations in the schema.rb file when loading it (Robert Payne) [#49](https://github.com/TalentBox/sequel-rails/pull/49)
|
11
|
+
* Make dump_schema_information compatible with integer based migration (Robert Payne) [#48](https://github.com/TalentBox/sequel-rails/pull/48) [#47](https://github.com/TalentBox/sequel-rails/issues/47)
|
12
|
+
* Add an `after_connect` hook (Jan Berdajs) [#46](https://github.com/TalentBox/sequel-rails/pull/46)
|
13
|
+
* Update license dates and add license to gemspec [#45](https://github.com/TalentBox/sequel-rails/issues/45)
|
14
|
+
|
1
15
|
0.6.1 (2013-09-16)
|
2
16
|
==================
|
3
17
|
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,18 +4,27 @@ sequel-rails
|
|
4
4
|
[![Build Status](https://travis-ci.org/TalentBox/sequel-rails.png?branch=master)](https://travis-ci.org/TalentBox/sequel-rails)
|
5
5
|
[![Code Climate](https://codeclimate.com/github/TalentBox/sequel-rails.png)](https://codeclimate.com/github/TalentBox/sequel-rails)
|
6
6
|
|
7
|
-
This gem provides the railtie that allows
|
7
|
+
This gem provides the railtie that allows
|
8
|
+
[sequel](http://github.com/jeremyevans/sequel) to hook into
|
9
|
+
[Rails (3.x and 4.x)](http://github.com/rails/rails) and thus behave like a
|
10
|
+
rails framework component. Just like activerecord does in rails,
|
11
|
+
[sequel-rails](http://github.com/talentbox/sequel-rails) uses the railtie API to
|
12
|
+
hook into rails. The two are actually hooked into rails almost identically.
|
8
13
|
|
9
|
-
The code for this gem was initially taken from the excellent
|
14
|
+
The code for this gem was initially taken from the excellent
|
15
|
+
[dm-rails](http://github.com/datamapper/dm-rails) project.
|
10
16
|
|
11
|
-
This was originally a fork of [brasten](https://github.com/brasten)'s
|
17
|
+
This was originally a fork of [brasten](https://github.com/brasten)'s
|
18
|
+
[sequel-rails](https://github.com/brasten/sequel-rails) that has been updated to
|
19
|
+
support newer versions of rails.
|
12
20
|
|
13
|
-
Since January 2013, we've became the official maintainers of the gem after
|
21
|
+
Since January 2013, we've became the official maintainers of the gem after
|
22
|
+
[brasten](https://github.com/brasten) proposed us.
|
14
23
|
|
15
24
|
Using sequel-rails
|
16
25
|
==================
|
17
26
|
|
18
|
-
Using sequel with
|
27
|
+
Using sequel with Rails (3.x or 4.x) requires a couple minor changes.
|
19
28
|
|
20
29
|
First, add the following to your Gemfile (after the `Rails` lines):
|
21
30
|
|
@@ -30,7 +39,9 @@ gem "sequel-rails"
|
|
30
39
|
|
31
40
|
... be sure to run "bundle install" if needed!
|
32
41
|
|
33
|
-
Secondly, you'll need to require the different Rails components separately in
|
42
|
+
Secondly, you'll need to require the different Rails components separately in
|
43
|
+
your `config/application.rb` file, and not require `ActiveRecord`.
|
44
|
+
The top of your `config/application.rb` will probably look something like:
|
34
45
|
|
35
46
|
```ruby
|
36
47
|
# require 'rails/all'
|
@@ -44,7 +55,8 @@ require "sprockets/railtie"
|
|
44
55
|
|
45
56
|
Starting with sequel-rails 0.4.0.pre3 we don't change default Sequel behaviour
|
46
57
|
nor include any plugin by default, if you want to get back the previous
|
47
|
-
behaviour, you can create a new initializer (eg: `config/initializers/sequel.rb`)
|
58
|
+
behaviour, you can create a new initializer (eg: `config/initializers/sequel.rb`)
|
59
|
+
with content:
|
48
60
|
|
49
61
|
```ruby
|
50
62
|
require "sequel_rails/railties/legacy_model_config"
|
@@ -52,8 +64,62 @@ require "sequel_rails/railties/legacy_model_config"
|
|
52
64
|
|
53
65
|
After those changes, you should be good to go!
|
54
66
|
|
67
|
+
Features provided by `sequel-rails`
|
68
|
+
===================================
|
69
|
+
|
70
|
+
1. Connection management:
|
71
|
+
|
72
|
+
`sequel-rails` will initiate the `Sequel` connection mechanism based on your
|
73
|
+
configuration in `database.yml`.
|
74
|
+
|
75
|
+
2. Generators:
|
76
|
+
|
77
|
+
You can use them just like `ActiveRecord`'s ones:
|
78
|
+
|
79
|
+
Migration:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
rails generate migration create_admin_users
|
83
|
+
# Or
|
84
|
+
rails generate migration CreateAdminUsers
|
85
|
+
```
|
86
|
+
|
87
|
+
Model:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
rails generate model User email:string
|
91
|
+
```
|
92
|
+
|
93
|
+
Observer:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
rails generate observer User
|
97
|
+
```
|
98
|
+
|
99
|
+
3. Rake tasks similar to `ActiveRecord`, see
|
100
|
+
[Available sequel specific rake tasks](#available-sequel-specific-rake-tasks)
|
101
|
+
|
102
|
+
4. Add some `Sequel` and `sequel-rails` specific exceptions to `ActionDispatch`'s `rescue_responses`
|
103
|
+
|
104
|
+
`Sequel::Plugins::RailsExtensions::ModelNotFound` is mapped to `:not_found`
|
105
|
+
|
106
|
+
`Sequel::NoMatchingRow` is mapped to `:not_found`
|
107
|
+
|
108
|
+
`Sequel::ValidationFailed` is mapped to `:unprocessable_entity`
|
109
|
+
|
110
|
+
`Sequel::NoExistingObject` is mapped to `:unprocessable_entity`
|
111
|
+
|
112
|
+
5. Add a `i18n_scope` method to `Sequel::Model` which respond with `"sequel"`.
|
113
|
+
This is used by `ActiveModel`.
|
114
|
+
|
115
|
+
6. Adding `Sequel` to `ActiveSupport::LogSubscriber`. This is what allows you to
|
116
|
+
see SQL queries in the log and also allows us to implement the next item.
|
117
|
+
|
118
|
+
7. Add a hook in `ActionController::Base` so that the sum of SQL queries time
|
119
|
+
for the current action is reported as `DB` for the controller's line in logs.
|
120
|
+
|
55
121
|
Configuration
|
56
|
-
|
122
|
+
=============
|
57
123
|
You can configure some options with the usual rails mechanism, in
|
58
124
|
`config/application.rb` and/or in `config/environments/*.rb`.
|
59
125
|
|
@@ -74,6 +140,78 @@ You can configure some options with the usual rails mechanism, in
|
|
74
140
|
config.sequel.load_database_tasks = false
|
75
141
|
```
|
76
142
|
|
143
|
+
The connection settings are read from the file `config/database.yml` and is
|
144
|
+
expected to be similar to `ActiveRecord`'s format.
|
145
|
+
|
146
|
+
Here's some examples:
|
147
|
+
|
148
|
+
1. For PostgreSQL:
|
149
|
+
|
150
|
+
```yaml
|
151
|
+
development:
|
152
|
+
adapter: postgresql
|
153
|
+
database: a_database_name
|
154
|
+
user: user_name # Also accept 'username' as key, if both are present 'username' is used
|
155
|
+
password: password
|
156
|
+
host: 10.0.0.2 # Optional
|
157
|
+
port: 5432 # Optional
|
158
|
+
owner: owner_name # Optional
|
159
|
+
encoding: utf8 # Optional, also accept 'charset' as key, if both are present 'encoding' is used (defaults to 'utf8')
|
160
|
+
maintenance_db: template2 # Optional
|
161
|
+
locale: en_US.UTF-8 # Optional, equivalent to setting 'collation' and 'ctype' to the same value
|
162
|
+
collation: en_US.UTF-8 # Optional
|
163
|
+
ctype: en_US.UTF-8 # Optional
|
164
|
+
template: template1 # Optional
|
165
|
+
tablespace: non_default_tablespace_name # Optional
|
166
|
+
```
|
167
|
+
|
168
|
+
2. For MySQL:
|
169
|
+
|
170
|
+
```yaml
|
171
|
+
development:
|
172
|
+
adapter: mysql # Also accept mysql2
|
173
|
+
database: a_database_name
|
174
|
+
user: user_name # Also accept 'username' as key, if both are present 'username' is used
|
175
|
+
password: password
|
176
|
+
host: 10.0.0.2 # Optional
|
177
|
+
port: 5432 # Optional
|
178
|
+
charset: latin1 # Optional (defaults to 'utf8')
|
179
|
+
collation: latin1_general_ci # Optional (defaults to 'utf8_unicode_ci')
|
180
|
+
```
|
181
|
+
|
182
|
+
2. For SQLite:
|
183
|
+
|
184
|
+
```yaml
|
185
|
+
development:
|
186
|
+
adapter: sqlite # Also accept sqlite3
|
187
|
+
database: db/mydatabase.sqlite # Path to db relative to Rails root
|
188
|
+
```
|
189
|
+
|
190
|
+
For in memory testing:
|
191
|
+
|
192
|
+
```yaml
|
193
|
+
development:
|
194
|
+
adapter: sqlite # Also accept sqlite3
|
195
|
+
database: ":memory:"
|
196
|
+
```
|
197
|
+
|
198
|
+
Enabling plugins
|
199
|
+
================
|
200
|
+
|
201
|
+
If you want to enable plugins for all your models, you should use the
|
202
|
+
after_connect configuration option in `config/application.rb` (0.6.2+):
|
203
|
+
|
204
|
+
```ruby
|
205
|
+
config.sequel.after_connect = proc do
|
206
|
+
Sequel::Model.plugin :timestamps, update_on_create: true
|
207
|
+
end
|
208
|
+
```
|
209
|
+
|
210
|
+
This will ensure that these plugins are loaded before any Sequel models are
|
211
|
+
loaded. Loading plugins into `Sequel::Model` after subclasses are already
|
212
|
+
created is not supported by Sequel. You can also load extensions in
|
213
|
+
`after_connect` or perform any custom actions that you need.
|
214
|
+
|
77
215
|
Available sequel specific rake tasks
|
78
216
|
====================================
|
79
217
|
|
@@ -153,6 +291,10 @@ Improvements has been made by those awesome contributors:
|
|
153
291
|
* Saulius Grigaliunas (sauliusg)
|
154
292
|
* Jacques Crocker (railsjedi)
|
155
293
|
* Eric Strathmeyer (strathmeyer)
|
294
|
+
* Jan Berdajs (mrbrdo)
|
295
|
+
* Robert Payne (robertjpayne)
|
296
|
+
* Kevin Menard (nirvdrum)
|
297
|
+
* Chris Heisterkamp (cheister)
|
156
298
|
|
157
299
|
Credits
|
158
300
|
=======
|
@@ -5,12 +5,7 @@ module SequelRails
|
|
5
5
|
mattr_accessor :configuration
|
6
6
|
|
7
7
|
def self.setup(environment)
|
8
|
-
|
9
|
-
if config['url']
|
10
|
-
::Sequel.connect config['url'], config
|
11
|
-
else
|
12
|
-
::Sequel.connect config
|
13
|
-
end
|
8
|
+
configuration.connect environment
|
14
9
|
end
|
15
10
|
|
16
11
|
class Configuration < ActiveSupport::OrderedOptions
|
@@ -32,6 +27,7 @@ module SequelRails
|
|
32
27
|
self.migration_dir = nil
|
33
28
|
self.schema_dump = default_schema_dump
|
34
29
|
self.load_database_tasks = true
|
30
|
+
self.after_connect = nil
|
35
31
|
end
|
36
32
|
|
37
33
|
def environment_for(name)
|
@@ -46,6 +42,17 @@ module SequelRails
|
|
46
42
|
end
|
47
43
|
end
|
48
44
|
|
45
|
+
def connect(environment)
|
46
|
+
normalized_config = environment_for environment
|
47
|
+
db = if normalized_config['url']
|
48
|
+
::Sequel.connect normalized_config['url'], normalized_config
|
49
|
+
else
|
50
|
+
::Sequel.connect normalized_config
|
51
|
+
end
|
52
|
+
after_connect.call if after_connect.respond_to?(:call)
|
53
|
+
db
|
54
|
+
end
|
55
|
+
|
49
56
|
private
|
50
57
|
|
51
58
|
def default_schema_dump
|
@@ -6,34 +6,46 @@ 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,
|
9
|
+
::Sequel::Migrator.run(::Sequel::Model.db, migrations_dir, opts)
|
10
10
|
end
|
11
11
|
alias_method :migrate_up!, :migrate
|
12
12
|
alias_method :migrate_down!, :migrate
|
13
13
|
|
14
14
|
def pending_migrations?
|
15
|
-
return false unless
|
16
|
-
!::Sequel::Migrator.is_current?(::Sequel::Model.db,
|
15
|
+
return false unless available_migrations?
|
16
|
+
!::Sequel::Migrator.is_current?(::Sequel::Model.db, migrations_dir)
|
17
17
|
end
|
18
18
|
|
19
19
|
def dump_schema_information(opts={})
|
20
20
|
sql = opts.fetch :sql
|
21
21
|
db = ::Sequel::Model.db
|
22
|
-
|
22
|
+
res = ""
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
24
|
+
if available_migrations?
|
25
|
+
migrator_class = ::Sequel::Migrator.send(:migrator_class, migrations_dir)
|
26
|
+
migrator = migrator_class.new db, migrations_dir
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
inserts = migrator.ds.map do |hash|
|
29
|
+
insert = migrator.ds.insert_sql(hash)
|
30
|
+
sql ? "#{insert};" : " self << #{insert.inspect}"
|
31
|
+
end
|
32
|
+
|
33
|
+
if inserts.any?
|
34
|
+
res << "Sequel.migration do\n change do\n" unless sql
|
35
|
+
res << inserts.join("\n")
|
36
|
+
res << "\n end\nend\n" unless sql
|
37
|
+
end
|
34
38
|
end
|
35
39
|
res
|
36
40
|
end
|
41
|
+
|
42
|
+
def migrations_dir
|
43
|
+
Rails.root.join("db/migrate")
|
44
|
+
end
|
45
|
+
|
46
|
+
def available_migrations?
|
47
|
+
File.exists?(migrations_dir) && Dir[File.join(migrations_dir, '*')].any?
|
48
|
+
end
|
37
49
|
end
|
38
50
|
end
|
39
51
|
end
|
@@ -33,7 +33,7 @@ namespace :db do
|
|
33
33
|
if File.exists?(file)
|
34
34
|
require 'sequel/extensions/migration'
|
35
35
|
load(file)
|
36
|
-
::Sequel::Migration.descendants.
|
36
|
+
::Sequel::Migration.descendants.each{|m| m.apply(db_for_current_env, :up)}
|
37
37
|
else
|
38
38
|
abort %{#{file} doesn't exist yet. Run "rake db:migrate" to create it then try again. If you do not intend to use a database, you should instead alter #{Rails.root}/config/boot.rb to limit the frameworks that will be loaded}
|
39
39
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module SequelRails
|
2
|
+
begin
|
3
|
+
require "shellwords"
|
4
|
+
Shellwords = ::Shellwords
|
5
|
+
rescue LoadError
|
6
|
+
# Taken from shellwords.rb (Ruby 2.0.0p247)
|
7
|
+
class Shellwords
|
8
|
+
def self.shellescape(str)
|
9
|
+
str = str.to_s
|
10
|
+
|
11
|
+
# An empty argument will be skipped, so return empty quotes.
|
12
|
+
return "''" if str.empty?
|
13
|
+
|
14
|
+
str = str.dup
|
15
|
+
|
16
|
+
# Treat multibyte characters as is. It is caller's responsibility
|
17
|
+
# to encode the string in the right encoding for the shell
|
18
|
+
# environment.
|
19
|
+
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")
|
20
|
+
|
21
|
+
# A LF cannot be escaped with a backslash because a backslash + LF
|
22
|
+
# combo is regarded as line continuation and simply ignored.
|
23
|
+
str.gsub!(/\n/, "'\n'")
|
24
|
+
|
25
|
+
return str
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.shelljoin(array)
|
29
|
+
array.map { |arg| shellescape(arg) }.join(' ')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/sequel_rails/storage.rb
CHANGED
@@ -39,31 +39,59 @@ module SequelRails
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def database
|
42
|
-
@database ||= config[
|
42
|
+
@database ||= config["database"] || config["path"]
|
43
43
|
end
|
44
44
|
|
45
45
|
def username
|
46
|
-
@username ||= config[
|
46
|
+
@username ||= config["username"] || config["user"] || ""
|
47
47
|
end
|
48
48
|
|
49
49
|
def password
|
50
|
-
@password ||= config[
|
50
|
+
@password ||= config["password"] || ""
|
51
51
|
end
|
52
52
|
|
53
53
|
def host
|
54
|
-
@host ||= config[
|
54
|
+
@host ||= config["host"] || ""
|
55
55
|
end
|
56
56
|
|
57
57
|
def port
|
58
|
-
@port ||= config[
|
58
|
+
@port ||= config["port"] || ""
|
59
59
|
end
|
60
60
|
|
61
61
|
def owner
|
62
|
-
@owner ||= config[
|
62
|
+
@owner ||= config["owner"] || ""
|
63
63
|
end
|
64
64
|
|
65
65
|
def charset
|
66
|
-
@charset ||= config[
|
66
|
+
@charset ||= config["charset"] || ENV["CHARSET"] || "utf8"
|
67
|
+
end
|
68
|
+
|
69
|
+
def collation
|
70
|
+
@collation ||= config["collation"] || ENV["COLLATION"]
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def add_option(commands, name, value)
|
76
|
+
if value.present?
|
77
|
+
separator = name[0,2]=="--" ? "=" : " "
|
78
|
+
commands << "#{name}#{separator}#{value}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_flag(commands, flag)
|
83
|
+
commands << flag
|
84
|
+
end
|
85
|
+
|
86
|
+
def exec(escaped_command)
|
87
|
+
`#{escaped_command}`
|
88
|
+
|
89
|
+
# Evaluate command status as a boolean like `system` does.
|
90
|
+
$?.exitstatus == 0
|
91
|
+
end
|
92
|
+
|
93
|
+
def safe_exec(args)
|
94
|
+
exec SequelRails::Shellwords.join(Array(args))
|
67
95
|
end
|
68
96
|
|
69
97
|
end
|