swift 0.14.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/API.rdoc +14 -14
- data/README.md +110 -61
- data/Rakefile +2 -5
- data/VERSION +1 -1
- data/lib/swift/adapter/mysql.rb +30 -0
- data/lib/swift/adapter/postgres.rb +27 -0
- data/lib/swift/adapter/sql.rb +23 -29
- data/lib/swift/adapter/sqlite3.rb +59 -0
- data/lib/swift/adapter.rb +129 -70
- data/lib/swift/attribute.rb +19 -8
- data/lib/swift/eventmachine.rb +49 -0
- data/lib/swift/identity_map.rb +7 -7
- data/lib/swift/migrations.rb +12 -12
- data/lib/swift/{scheme.rb → record.rb} +16 -17
- data/lib/swift/result.rb +24 -0
- data/lib/swift/statement.rb +25 -0
- data/lib/swift/synchrony.rb +38 -0
- data/lib/swift/validations.rb +2 -2
- data/lib/swift.rb +8 -6
- data/swift.gemspec +19 -31
- data/test/helper.rb +11 -6
- data/test/test_adapter.rb +11 -25
- data/test/test_async.rb +9 -12
- data/test/test_encoding.rb +2 -2
- data/test/test_error.rb +8 -8
- data/test/test_io.rb +2 -2
- data/test/{test_scheme.rb → test_record.rb} +6 -6
- data/test/test_swift.rb +9 -51
- data/test/test_timestamps.rb +1 -1
- data/test/test_transactions.rb +2 -2
- data/test/test_types.rb +3 -3
- data/test/test_validations.rb +2 -2
- metadata +20 -27
- data/ext/adapter.cc +0 -479
- data/ext/adapter.h +0 -13
- data/ext/adapter_io.cc +0 -62
- data/ext/adapter_io.h +0 -24
- data/ext/attribute.cc +0 -22
- data/ext/attribute.h +0 -8
- data/ext/datetime.cc +0 -96
- data/ext/datetime.h +0 -12
- data/ext/extconf.rb +0 -61
- data/ext/query.cc +0 -104
- data/ext/query.h +0 -20
- data/ext/result.cc +0 -229
- data/ext/result.h +0 -27
- data/ext/statement.cc +0 -116
- data/ext/statement.h +0 -22
- data/ext/swift.cc +0 -114
- data/ext/swift.h +0 -60
- data/lib/swift/db.rb +0 -89
data/lib/swift/validations.rb
CHANGED
@@ -7,7 +7,7 @@ module Swift
|
|
7
7
|
end
|
8
8
|
end # Errors
|
9
9
|
|
10
|
-
class
|
10
|
+
class Record
|
11
11
|
def self.validations &validations
|
12
12
|
define_method :validate do
|
13
13
|
errors = Errors.new(self)
|
@@ -23,5 +23,5 @@ module Swift
|
|
23
23
|
def valid?
|
24
24
|
validate.empty?
|
25
25
|
end
|
26
|
-
end #
|
26
|
+
end # Record
|
27
27
|
end # Swift
|
data/lib/swift.rb
CHANGED
@@ -8,13 +8,11 @@ unless %r{^1\.9\.[3-9]|^2\.}.match(RUBY_VERSION)
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# Extension.
|
11
|
-
require_relative '../ext/swift'
|
12
11
|
require_relative 'swift/adapter'
|
13
12
|
require_relative 'swift/adapter/sql'
|
14
13
|
require_relative 'swift/attribute'
|
15
|
-
require_relative 'swift/db'
|
16
14
|
require_relative 'swift/header'
|
17
|
-
require_relative 'swift/
|
15
|
+
require_relative 'swift/record'
|
18
16
|
require_relative 'swift/type'
|
19
17
|
|
20
18
|
# A rational rudimentary object relational mapper.
|
@@ -26,7 +24,7 @@ require_relative 'swift/type'
|
|
26
24
|
# Swift.trace true # Debugging.
|
27
25
|
# Swift.setup :default, Swift::DB::Postgres, db: 'swift'
|
28
26
|
#
|
29
|
-
# class User < Swift::
|
27
|
+
# class User < Swift::Record
|
30
28
|
# store :users
|
31
29
|
# attribute :id, Swift::Type::Integer, serial: true, key: true
|
32
30
|
# attribute :name, Swift::Type::String
|
@@ -99,8 +97,8 @@ module Swift
|
|
99
97
|
# other_users.execute(32)
|
100
98
|
# end
|
101
99
|
#
|
102
|
-
# @param [Symbol] name
|
103
|
-
# @param [Proc]
|
100
|
+
# @param [Symbol] name Adapter name.
|
101
|
+
# @param [Proc] block Scope this block to the named adapter instead of <tt>:default</tt>.
|
104
102
|
# @return [Swift::Adapter]
|
105
103
|
#--
|
106
104
|
# I pilfered the logic from DM but I don't really understand what is/isn't thread safe.
|
@@ -131,5 +129,9 @@ module Swift
|
|
131
129
|
def schema
|
132
130
|
@schema ||= []
|
133
131
|
end
|
132
|
+
|
133
|
+
def trace io = $stdout, &block
|
134
|
+
Swift.db.trace(io, &block)
|
135
|
+
end
|
134
136
|
end
|
135
137
|
end # Swift
|
data/swift.gemspec
CHANGED
@@ -4,15 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "swift"
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email = [
|
15
|
-
s.extensions = [%q{ext/extconf.rb}]
|
11
|
+
s.authors = ["Shane Hanna", "Bharanee 'Barney' Rathna"]
|
12
|
+
s.date = "2012-08-01"
|
13
|
+
s.description = "A rational rudimentary database abstraction."
|
14
|
+
s.email = ["shane.hanna@gmail.com", "deepfryed@gmail.com"]
|
16
15
|
s.extra_rdoc_files = [
|
17
16
|
"LICENSE",
|
18
17
|
"README.md"
|
@@ -23,32 +22,21 @@ Gem::Specification.new do |s|
|
|
23
22
|
"README.md",
|
24
23
|
"Rakefile",
|
25
24
|
"VERSION",
|
26
|
-
"ext/adapter.cc",
|
27
|
-
"ext/adapter.h",
|
28
|
-
"ext/adapter_io.cc",
|
29
|
-
"ext/adapter_io.h",
|
30
|
-
"ext/attribute.cc",
|
31
|
-
"ext/attribute.h",
|
32
|
-
"ext/datetime.cc",
|
33
|
-
"ext/datetime.h",
|
34
|
-
"ext/extconf.rb",
|
35
|
-
"ext/query.cc",
|
36
|
-
"ext/query.h",
|
37
|
-
"ext/result.cc",
|
38
|
-
"ext/result.h",
|
39
|
-
"ext/statement.cc",
|
40
|
-
"ext/statement.h",
|
41
|
-
"ext/swift.cc",
|
42
|
-
"ext/swift.h",
|
43
25
|
"lib/swift.rb",
|
44
26
|
"lib/swift/adapter.rb",
|
27
|
+
"lib/swift/adapter/mysql.rb",
|
28
|
+
"lib/swift/adapter/postgres.rb",
|
45
29
|
"lib/swift/adapter/sql.rb",
|
30
|
+
"lib/swift/adapter/sqlite3.rb",
|
46
31
|
"lib/swift/attribute.rb",
|
47
|
-
"lib/swift/
|
32
|
+
"lib/swift/eventmachine.rb",
|
48
33
|
"lib/swift/header.rb",
|
49
34
|
"lib/swift/identity_map.rb",
|
50
35
|
"lib/swift/migrations.rb",
|
51
|
-
"lib/swift/
|
36
|
+
"lib/swift/record.rb",
|
37
|
+
"lib/swift/result.rb",
|
38
|
+
"lib/swift/statement.rb",
|
39
|
+
"lib/swift/synchrony.rb",
|
52
40
|
"lib/swift/type.rb",
|
53
41
|
"lib/swift/validations.rb",
|
54
42
|
"swift.gemspec",
|
@@ -62,17 +50,17 @@ Gem::Specification.new do |s|
|
|
62
50
|
"test/test_error.rb",
|
63
51
|
"test/test_identity_map.rb",
|
64
52
|
"test/test_io.rb",
|
65
|
-
"test/
|
53
|
+
"test/test_record.rb",
|
66
54
|
"test/test_swift.rb",
|
67
55
|
"test/test_timestamps.rb",
|
68
56
|
"test/test_transactions.rb",
|
69
57
|
"test/test_types.rb",
|
70
58
|
"test/test_validations.rb"
|
71
59
|
]
|
72
|
-
s.homepage =
|
73
|
-
s.require_paths = [
|
74
|
-
s.rubygems_version =
|
75
|
-
s.summary =
|
60
|
+
s.homepage = "http://github.com/shanna/swift"
|
61
|
+
s.require_paths = ["lib"]
|
62
|
+
s.rubygems_version = "1.8.23"
|
63
|
+
s.summary = "A rational rudimentary database abstraction."
|
76
64
|
|
77
65
|
if s.respond_to? :specification_version then
|
78
66
|
s.specification_version = 3
|
data/test/helper.rb
CHANGED
@@ -1,19 +1,26 @@
|
|
1
1
|
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
$:.unshift(File.join(File.dirname(__FILE__), '..', 'test'))
|
3
3
|
|
4
|
-
require '
|
5
|
-
|
4
|
+
require 'bundler/setup'
|
5
|
+
|
6
|
+
require 'etc'
|
7
|
+
require 'minitest/autorun'
|
6
8
|
require 'minitest_teardown_hack'
|
7
9
|
require 'swift'
|
10
|
+
require 'swift/adapter/mysql'
|
11
|
+
require 'swift/adapter/postgres'
|
12
|
+
require 'swift/adapter/sqlite3'
|
8
13
|
require 'swift/migrations'
|
9
|
-
require 'etc'
|
10
14
|
|
11
15
|
class MiniTest::Spec
|
12
16
|
def self.supported_by *adapters, &block
|
13
|
-
adapter_defaults = { Swift::
|
17
|
+
adapter_defaults = { Swift::Adapter::Sqlite3 => { db: ':memory:' } }
|
14
18
|
connection_defaults = { db: 'swift_test', user: Etc.getlogin, host: '127.0.0.1' }
|
15
19
|
adapters.each do |adapter|
|
16
20
|
begin
|
21
|
+
#next if Swift::Adapter::Sqlite3 == adapter
|
22
|
+
#next if Swift::Adapter::Mysql == adapter
|
23
|
+
#next if Swift::Adapter::Postgres == adapter
|
17
24
|
Swift.setup :default, adapter, connection_defaults.merge(adapter_defaults.fetch(adapter, {}))
|
18
25
|
rescue => error
|
19
26
|
warn "Unable to setup 'swift_test' db for #{adapter}, #{error.message}. Skipping..."
|
@@ -32,5 +39,3 @@ class MiniTest::Spec
|
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
35
|
-
|
36
|
-
MiniTest::Unit.autorun
|
data/test/test_adapter.rb
CHANGED
@@ -2,13 +2,13 @@ require_relative 'helper'
|
|
2
2
|
require 'stringio'
|
3
3
|
|
4
4
|
describe 'Adapter' do
|
5
|
-
supported_by Swift::
|
5
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
6
6
|
describe 'db' do
|
7
7
|
before do
|
8
8
|
@db = Swift.db
|
9
9
|
@db.execute('drop table if exists users')
|
10
10
|
serial = case @db
|
11
|
-
when Swift::
|
11
|
+
when Swift::Adapter::Sqlite3 then 'integer primary key'
|
12
12
|
else 'serial'
|
13
13
|
end
|
14
14
|
@db.execute %Q{create table users(id #{serial}, name text, email text, created_at timestamp)}
|
@@ -20,12 +20,6 @@ describe 'Adapter' do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
it 'reconnects to db' do
|
24
|
-
Swift.trace true, open('/dev/null', 'w')
|
25
|
-
assert_block { @db.reconnect }
|
26
|
-
Swift.trace false
|
27
|
-
end
|
28
|
-
|
29
23
|
it 'records closed state' do
|
30
24
|
assert !Swift.db.closed?
|
31
25
|
Swift.db.close
|
@@ -43,9 +37,9 @@ describe 'Adapter' do
|
|
43
37
|
end
|
44
38
|
|
45
39
|
describe 'prepared statements' do
|
46
|
-
it 'executes via
|
40
|
+
it 'executes via Adapter#prepare' do
|
47
41
|
result = []
|
48
|
-
|
42
|
+
@db.prepare('select count(*) as n from users').execute.each {|r| result << r[:n] }
|
49
43
|
assert_kind_of Fixnum, result[0]
|
50
44
|
end
|
51
45
|
|
@@ -53,12 +47,6 @@ describe 'Adapter' do
|
|
53
47
|
assert @db.prepare(%q{insert into users (name) values ('Apple Arthurton')}).execute
|
54
48
|
end
|
55
49
|
|
56
|
-
it 'returns the command' do
|
57
|
-
sql = 'select * from users where id = ?'
|
58
|
-
assert_equal sql, @db.prepare(sql).command
|
59
|
-
assert_equal sql, @db.prepare(sql).to_s
|
60
|
-
end
|
61
|
-
|
62
50
|
it 'executes with bind values' do
|
63
51
|
assert @db.prepare(%q{insert into users (name) values (?)}).execute('Apple Arthurton')
|
64
52
|
end
|
@@ -71,12 +59,11 @@ describe 'Adapter' do
|
|
71
59
|
|
72
60
|
it 'has insert_id' do
|
73
61
|
sql = case @db
|
74
|
-
when Swift::
|
62
|
+
when Swift::Adapter::Postgres then %q{insert into users (name) values (?) returning id}
|
75
63
|
else %q{insert into users (name) values (?)}
|
76
64
|
end
|
77
65
|
statement = @db.prepare(sql)
|
78
66
|
assert 1, statement.execute('Connie Arthurton').insert_id
|
79
|
-
assert 1, statement.insert_id # caches insert_id, just interface compatibility with dbic++
|
80
67
|
end
|
81
68
|
end
|
82
69
|
|
@@ -111,8 +98,8 @@ describe 'Adapter' do
|
|
111
98
|
@db.execute('select * from users') {|r| assert_kind_of Hash, r }
|
112
99
|
end
|
113
100
|
|
114
|
-
it 'returns a result set on Adapter#
|
115
|
-
|
101
|
+
it 'returns a result set on Adapter#execute' do
|
102
|
+
assert_respond_to @db.execute('select * from users'), :each
|
116
103
|
end
|
117
104
|
|
118
105
|
it 'returns fields' do
|
@@ -131,16 +118,15 @@ describe 'Adapter' do
|
|
131
118
|
end
|
132
119
|
end
|
133
120
|
|
134
|
-
|
135
|
-
describe 'bulk writes!' do
|
121
|
+
describe 'bulk writes' do
|
136
122
|
it 'writes from an IO object' do
|
137
123
|
data = StringIO.new "Sally Arthurton\tsally@local\nJonas Arthurton\tjonas@local\n"
|
138
|
-
assert_equal 2, @db.write('users', %w{name email}, data)
|
124
|
+
assert_equal 2, @db.write('users', %w{name email}, data).affected_rows
|
139
125
|
end
|
140
126
|
|
141
127
|
it 'writes from a string' do
|
142
128
|
data = "Sally Arthurton\tsally@local\nJonas Arthurton\tjonas@local\n"
|
143
|
-
assert_equal 2, @db.write('users', %w{name email}, data)
|
129
|
+
assert_equal 2, @db.write('users', %w{name email}, data).affected_rows
|
144
130
|
end
|
145
131
|
|
146
132
|
it 'writes with no columns specified' do
|
@@ -148,7 +134,7 @@ describe 'Adapter' do
|
|
148
134
|
data = "1\tSally Arthurton\tsally@local\t#{ts}\n"
|
149
135
|
row = {id: 1, name: 'Sally Arthurton', email: 'sally@local', created_at: ts}
|
150
136
|
|
151
|
-
assert_equal 1, @db.write('users',
|
137
|
+
assert_equal 1, @db.write('users', data).affected_rows
|
152
138
|
assert_equal row, @db.execute('select * from users limit 1').first
|
153
139
|
end
|
154
140
|
end
|
data/test/test_async.rb
CHANGED
@@ -1,26 +1,23 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql do
|
5
5
|
describe 'async operations' do
|
6
6
|
it 'can runs queries async' do
|
7
7
|
rows = []
|
8
|
-
pool = 3.times.map.with_index {|n| Swift.setup n, Swift
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
Thread.new do
|
15
|
-
pool[1].async_execute('select pg_sleep(0.2), 2 as query_id') {|row| rows << row[:query_id]}
|
8
|
+
pool = 3.times.map.with_index {|n| Swift.setup n, Swift.db.class, db: 'swift_test' }
|
9
|
+
func = case Swift.db
|
10
|
+
when Swift::Adapter::Mysql then 'sleep'
|
11
|
+
when Swift::Adapter::Postgres then 'pg_sleep'
|
16
12
|
end
|
17
13
|
|
18
|
-
|
19
|
-
|
14
|
+
3.times do |n|
|
15
|
+
Thread.new do
|
16
|
+
pool[n].query("select #{func}(#{(3 - n) / 10.0}), #{n + 1} as query_id") {|row| rows << row[:query_id]}
|
17
|
+
end
|
20
18
|
end
|
21
19
|
|
22
20
|
Thread.list.reject {|thread| Thread.current == thread}.each(&:join)
|
23
|
-
|
24
21
|
assert_equal [3, 2, 1], rows
|
25
22
|
end
|
26
23
|
end
|
data/test/test_encoding.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
5
5
|
describe 'character encoding' do
|
6
6
|
before do
|
7
7
|
Swift.db do |db|
|
@@ -9,7 +9,7 @@ describe 'Adapter' do
|
|
9
9
|
db.execute %q{create table users(name text)}
|
10
10
|
|
11
11
|
# Mysql on debian at least doesn't default to utf8.
|
12
|
-
if db.kind_of? Swift::
|
12
|
+
if db.kind_of? Swift::Adapter::Mysql
|
13
13
|
db.execute %q{alter table users default character set utf8}
|
14
14
|
db.execute %q{alter table users change name name text charset utf8}
|
15
15
|
end
|
data/test/test_error.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Error' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
5
5
|
describe 'prepare' do
|
6
6
|
before do
|
7
7
|
Swift.db do |db|
|
@@ -11,20 +11,20 @@ describe 'Error' do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'throws a runtime error on invalid sql' do
|
14
|
-
assert_raises(
|
14
|
+
assert_raises(Swift::RuntimeError) do
|
15
15
|
Swift.db.prepare('garble garble garble')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'throws a runtime error on invalid bind parameters' do
|
20
|
-
assert_raises(
|
20
|
+
assert_raises(Swift::ArgumentError) do
|
21
21
|
Swift.db.prepare('select * from users where id > ?').execute
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
supported_by Swift::
|
27
|
+
supported_by Swift::Adapter::Postgres do
|
28
28
|
describe 'execute' do
|
29
29
|
before do
|
30
30
|
Swift.db do |db|
|
@@ -39,10 +39,10 @@ describe 'Error' do
|
|
39
39
|
|
40
40
|
Swift.db.close
|
41
41
|
|
42
|
-
assert_raises(
|
43
|
-
assert_raises(
|
44
|
-
assert_raises(
|
45
|
-
assert_raises(
|
42
|
+
assert_raises(Swift::ConnectionError) { select1.execute }
|
43
|
+
assert_raises(Swift::ConnectionError) { select2.execute(1) }
|
44
|
+
assert_raises(Swift::ConnectionError) { Swift.db.execute("select * from users") }
|
45
|
+
assert_raises(Swift::ConnectionError) { Swift.db.execute("select * from users where id > ?", 1) }
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/test/test_io.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
5
5
|
describe 'Storing binary objects' do
|
6
6
|
before do
|
7
|
-
user = Class.new(Swift::
|
7
|
+
user = Class.new(Swift::Record) do
|
8
8
|
store :users
|
9
9
|
attribute :id, Swift::Type::Integer, serial: true, key: true
|
10
10
|
attribute :name, Swift::Type::String
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
describe '
|
3
|
+
describe 'record' do
|
4
4
|
before do
|
5
|
-
@user = Class.new(Swift::
|
5
|
+
@user = Class.new(Swift::Record) do
|
6
6
|
store :users
|
7
7
|
attribute :id, Swift::Type::Integer, serial: true, key: true
|
8
8
|
attribute :name, Swift::Type::String, default: "dave"
|
@@ -57,13 +57,13 @@ describe 'scheme' do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
supported_by Swift::
|
60
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
61
61
|
describe 'adapter operations' do
|
62
62
|
before do
|
63
63
|
Swift.db.migrate! @user
|
64
64
|
end
|
65
65
|
|
66
|
-
it 'should return
|
66
|
+
it 'should return record instance when given record in #execute' do
|
67
67
|
user = @user.create
|
68
68
|
assert_equal 1, Swift.db.execute(@user, 'select * from users').first.id
|
69
69
|
end
|
@@ -77,12 +77,12 @@ describe 'scheme' do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'adapter should barf when trying to delete an invalid instance' do
|
80
|
-
assert_raises(ArgumentError) { Swift.db.delete @user, {id: nil, name: 'foo'} }
|
80
|
+
assert_raises(Swift::ArgumentError) { Swift.db.delete @user, {id: nil, name: 'foo'} }
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'should not update without valid keys' do
|
84
84
|
user = @user.new
|
85
|
-
assert_raises(ArgumentError) { user.update(name: 'dave') }
|
85
|
+
assert_raises(Swift::ArgumentError) { user.update(name: 'dave') }
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should update with valid keys' do
|
data/test/test_swift.rb
CHANGED
@@ -1,70 +1,28 @@
|
|
1
|
-
require 'tempfile'
|
2
1
|
require_relative 'helper'
|
3
2
|
|
4
3
|
describe 'Swift' do
|
5
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Sqlite3 do
|
6
5
|
describe 'Trace' do
|
7
|
-
before do
|
8
|
-
Swift.trace(false)
|
9
|
-
@file = Tempfile.new('swift-test')
|
10
|
-
end
|
11
|
-
|
12
|
-
after do
|
13
|
-
@file.unlink
|
14
|
-
end
|
15
|
-
|
16
6
|
it 'should trace commands' do
|
17
7
|
sql = 'create table users (id integer, name text)'
|
18
|
-
|
19
|
-
Swift.db.execute(sql)
|
20
|
-
|
21
|
-
log = @file.rewind && @file.read
|
22
|
-
assert_match sql, log
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should trace commands in block form' do
|
26
|
-
sql1 = 'create table users (id integer, name text)'
|
27
|
-
sql2 = 'drop table users'
|
28
|
-
|
29
|
-
res = Swift.trace(true, @file) { Swift.db.execute(sql1) && 'foobar' }
|
30
|
-
assert_equal 'foobar', res
|
8
|
+
io = StringIO.new
|
31
9
|
|
32
|
-
Swift.
|
33
|
-
|
34
|
-
log = @file.rewind && @file.read
|
35
|
-
assert_match sql1, log
|
36
|
-
refute_match sql2, log
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should trace commands in block form and preserve state' do
|
40
|
-
sql1 = 'create table users (id integer, name text)'
|
41
|
-
sql2 = 'drop table users'
|
42
|
-
|
43
|
-
Swift.trace(true, @file)
|
44
|
-
|
45
|
-
Swift.trace(false) do
|
46
|
-
Swift.db.execute(sql1)
|
10
|
+
Swift.trace(io) do
|
11
|
+
Swift.db.execute(sql)
|
47
12
|
end
|
48
13
|
|
49
|
-
|
50
|
-
|
51
|
-
log = @file.rewind && @file.read
|
52
|
-
refute_match sql1, log
|
53
|
-
assert_match sql2, log
|
14
|
+
assert_match sql, io.rewind && io.read
|
54
15
|
end
|
55
16
|
|
56
|
-
it 'should cascade exceptions in
|
57
|
-
|
17
|
+
it 'should cascade exceptions in trace' do
|
18
|
+
sql = 'create table users (id integer, name text)'
|
58
19
|
|
59
20
|
assert_raises(RuntimeError) do
|
60
|
-
Swift.trace(
|
61
|
-
Swift.db.execute(
|
21
|
+
Swift.trace(StringIO.new) do
|
22
|
+
Swift.db.execute(sql)
|
62
23
|
raise "foo"
|
63
24
|
end
|
64
25
|
end
|
65
|
-
|
66
|
-
log = @file.rewind && @file.read
|
67
|
-
assert_match sql1, log
|
68
26
|
end
|
69
27
|
end
|
70
28
|
end
|
data/test/test_timestamps.rb
CHANGED
data/test/test_transactions.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
5
5
|
describe 'transactions' do
|
6
6
|
before do
|
7
7
|
@name = 'test1 - transaction 1'
|
@@ -10,7 +10,7 @@ describe 'Adapter' do
|
|
10
10
|
@db.execute %q{create table users(name text, created_at timestamp)}
|
11
11
|
|
12
12
|
# In case of MyISAM default.
|
13
|
-
@db.kind_of?(Swift::
|
13
|
+
@db.kind_of?(Swift::Adapter::Mysql) && @db.execute('alter table users engine=innodb')
|
14
14
|
|
15
15
|
@sth = @db.prepare('select count(*) as c from users where name = ?')
|
16
16
|
end
|
data/test/test_types.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::
|
4
|
+
supported_by Swift::Adapter::Postgres, Swift::Adapter::Mysql, Swift::Adapter::Sqlite3 do
|
5
5
|
describe 'typecasting' do
|
6
6
|
before do
|
7
7
|
@db = Swift.db
|
8
8
|
@db.execute %q{drop table if exists users}
|
9
9
|
serial = case @db
|
10
|
-
when Swift::
|
10
|
+
when Swift::Adapter::Sqlite3 then 'integer primary key'
|
11
11
|
else 'serial'
|
12
12
|
end
|
13
13
|
@db.execute %Q{
|
@@ -40,7 +40,7 @@ describe 'Adapter' do
|
|
40
40
|
assert_kind_of DateTime, result[:updated]
|
41
41
|
|
42
42
|
assert_equal dt, result[:updated].strftime('%F %T')
|
43
|
-
assert_equal 65000, result[:updated].to_time.usec unless @db.kind_of?(Swift::
|
43
|
+
assert_equal 65000, result[:updated].to_time.usec unless @db.kind_of?(Swift::Adapter::Mysql)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/test/test_validations.rb
CHANGED
@@ -3,7 +3,7 @@ require 'swift/validations'
|
|
3
3
|
|
4
4
|
describe 'validations' do
|
5
5
|
before do
|
6
|
-
@user = Class.new(Swift::
|
6
|
+
@user = Class.new(Swift::Record) do
|
7
7
|
store :users
|
8
8
|
attribute :id, Swift::Type::Integer, serial: true, key: true
|
9
9
|
attribute :name, Swift::Type::String
|
@@ -40,7 +40,7 @@ describe 'validations' do
|
|
40
40
|
|
41
41
|
describe 'errors' do
|
42
42
|
it 'has relation' do
|
43
|
-
assert_kind_of Swift::
|
43
|
+
assert_kind_of Swift::Record, @user.new.validate.relation
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|