swift 0.10.0 → 0.11.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.
- data/API.rdoc +9 -16
- data/README.rdoc +10 -7
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/ext/adapter.cc +155 -25
- data/ext/extconf.rb +3 -3
- data/ext/pool.cc +1 -1
- data/ext/result.cc +2 -2
- data/ext/statement.cc +1 -1
- data/ext/swift.cc +49 -4
- data/ext/swift.h +2 -1
- data/lib/swift/adapter/sql.rb +69 -0
- data/lib/swift/adapter.rb +15 -136
- data/lib/swift/attribute.rb +7 -0
- data/lib/swift/db.rb +5 -3
- data/lib/swift/migrations.rb +51 -8
- data/lib/swift/scheme.rb +32 -36
- data/lib/swift.rb +2 -1
- data/swift.gemspec +10 -25
- data/test/helper.rb +6 -0
- data/test/minitest_teardown_hack.rb +20 -0
- data/test/test_scheme.rb +17 -22
- data/test/test_swift.rb +71 -0
- metadata +42 -78
- data/examples/async.rb +0 -65
- data/examples/db.rb +0 -44
- data/examples/scheme.rb +0 -54
data/test/test_swift.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require_relative 'helper'
|
3
|
+
|
4
|
+
describe 'Swift' do
|
5
|
+
supported_by Swift::DB::Sqlite3 do
|
6
|
+
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
|
+
it 'should trace commands' do
|
17
|
+
sql = 'create table users (id integer, name text)'
|
18
|
+
Swift.trace(true, @file)
|
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
|
31
|
+
|
32
|
+
Swift.db.execute(sql2)
|
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)
|
47
|
+
end
|
48
|
+
|
49
|
+
Swift.db.execute(sql2)
|
50
|
+
|
51
|
+
log = @file.rewind && @file.read
|
52
|
+
refute_match sql1, log
|
53
|
+
assert_match sql2, log
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should cascade exceptions in block form trace' do
|
57
|
+
sql1 = 'create table users (id integer, name text)'
|
58
|
+
|
59
|
+
assert_raises(RuntimeError) do
|
60
|
+
Swift.trace(true, @file) do
|
61
|
+
Swift.db.execute(sql1)
|
62
|
+
raise "foo"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
log = @file.rewind && @file.read
|
67
|
+
assert_match sql1, log
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,63 +1,50 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: swift
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 10
|
8
|
-
- 0
|
9
|
-
version: 0.10.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.11.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Shane Hanna
|
13
9
|
- Bharanee 'Barney' Rathna
|
14
10
|
autorequire:
|
15
11
|
bindir: bin
|
16
12
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-09-30 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: minitest
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &10219940 !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 7
|
32
|
-
- 0
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
33
22
|
version: 1.7.0
|
34
23
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: eventmachine
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: *10219940
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: eventmachine
|
28
|
+
requirement: &10219160 !ruby/object:Gem::Requirement
|
40
29
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
- 0
|
46
|
-
version: "0"
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
47
34
|
type: :development
|
48
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *10219160
|
49
37
|
description: A rational rudimentary database abstraction.
|
50
|
-
email:
|
38
|
+
email:
|
51
39
|
- shane.hanna@gmail.com
|
52
40
|
- deepfryed@gmail.com
|
53
41
|
executables: []
|
54
|
-
|
55
|
-
extensions:
|
42
|
+
extensions:
|
56
43
|
- ext/extconf.rb
|
57
|
-
extra_rdoc_files:
|
44
|
+
extra_rdoc_files:
|
58
45
|
- LICENSE
|
59
46
|
- README.rdoc
|
60
|
-
files:
|
47
|
+
files:
|
61
48
|
- API.rdoc
|
62
49
|
- LICENSE
|
63
50
|
- README.rdoc
|
@@ -84,6 +71,7 @@ files:
|
|
84
71
|
- ext/swift.h
|
85
72
|
- lib/swift.rb
|
86
73
|
- lib/swift/adapter.rb
|
74
|
+
- lib/swift/adapter/sql.rb
|
87
75
|
- lib/swift/attribute.rb
|
88
76
|
- lib/swift/db.rb
|
89
77
|
- lib/swift/header.rb
|
@@ -96,6 +84,7 @@ files:
|
|
96
84
|
- swift.gemspec
|
97
85
|
- test/helper.rb
|
98
86
|
- test/house-explode.jpg
|
87
|
+
- test/minitest_teardown_hack.rb
|
99
88
|
- test/test_adapter.rb
|
100
89
|
- test/test_encoding.rb
|
101
90
|
- test/test_error.rb
|
@@ -103,58 +92,33 @@ files:
|
|
103
92
|
- test/test_io.rb
|
104
93
|
- test/test_pool.rb
|
105
94
|
- test/test_scheme.rb
|
95
|
+
- test/test_swift.rb
|
106
96
|
- test/test_timestamps.rb
|
107
97
|
- test/test_transactions.rb
|
108
98
|
- test/test_types.rb
|
109
99
|
- test/test_validations.rb
|
110
|
-
- examples/async.rb
|
111
|
-
- examples/db.rb
|
112
|
-
- examples/scheme.rb
|
113
|
-
has_rdoc: true
|
114
100
|
homepage: http://github.com/shanna/swift
|
115
101
|
licenses: []
|
116
|
-
|
117
102
|
post_install_message:
|
118
103
|
rdoc_options: []
|
119
|
-
|
120
|
-
require_paths:
|
104
|
+
require_paths:
|
121
105
|
- lib
|
122
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
107
|
none: false
|
124
|
-
requirements:
|
125
|
-
- -
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
|
128
|
-
|
129
|
-
version: "0"
|
130
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
113
|
none: false
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
|
136
|
-
- 0
|
137
|
-
version: "0"
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
138
118
|
requirements: []
|
139
|
-
|
140
119
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.
|
120
|
+
rubygems_version: 1.8.5
|
142
121
|
signing_key:
|
143
122
|
specification_version: 3
|
144
123
|
summary: A rational rudimentary database abstraction.
|
145
|
-
test_files:
|
146
|
-
- examples/async.rb
|
147
|
-
- examples/db.rb
|
148
|
-
- examples/scheme.rb
|
149
|
-
- test/helper.rb
|
150
|
-
- test/test_adapter.rb
|
151
|
-
- test/test_encoding.rb
|
152
|
-
- test/test_error.rb
|
153
|
-
- test/test_identity_map.rb
|
154
|
-
- test/test_io.rb
|
155
|
-
- test/test_pool.rb
|
156
|
-
- test/test_scheme.rb
|
157
|
-
- test/test_timestamps.rb
|
158
|
-
- test/test_transactions.rb
|
159
|
-
- test/test_types.rb
|
160
|
-
- test/test_validations.rb
|
124
|
+
test_files: []
|
data/examples/async.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
|
3
|
-
require_relative '../lib/swift'
|
4
|
-
require_relative '../lib/swift/pool'
|
5
|
-
|
6
|
-
adapter = ARGV.first =~ /mysql/i ? Swift::DB::Mysql : Swift::DB::Postgres
|
7
|
-
puts "Using DB: #{adapter}"
|
8
|
-
|
9
|
-
Swift.setup :default, adapter, db: 'swift'
|
10
|
-
Swift.trace true
|
11
|
-
|
12
|
-
# create test table
|
13
|
-
Swift.db do |db|
|
14
|
-
puts '-- create --'
|
15
|
-
db.execute('DROP TABLE IF EXISTS users')
|
16
|
-
db.execute('CREATE TABLE users(id serial, name text, email text)')
|
17
|
-
|
18
|
-
sample = DATA.read.split(/\n/).map {|v| v.split(/\t+/) }
|
19
|
-
|
20
|
-
puts '-- insert --'
|
21
|
-
ins = db.prepare('insert into users(name, email) values(?, ?)')
|
22
|
-
9.times {|n| ins.execute(*sample[n%3]) }
|
23
|
-
end
|
24
|
-
|
25
|
-
sleep_clause = {
|
26
|
-
Swift::DB::Postgres => "case length(pg_sleep(%s)::text) when 0 then '%s' else '%s' end as sleep",
|
27
|
-
Swift::DB::Mysql => "if (sleep(%s), '%s', '%s') as sleep"
|
28
|
-
}
|
29
|
-
|
30
|
-
puts '-- select 9 times with a pool of size 5 --'
|
31
|
-
Swift.trace false
|
32
|
-
Swift.pool(5) do |db|
|
33
|
-
(1..9).each do |n|
|
34
|
-
pause = '%0.3f' % ((20-n)/20.0)
|
35
|
-
pause = sleep_clause[adapter] % 3.times.map { pause }
|
36
|
-
db.execute("select *, #{pause} from users where id = ?", n) {|r| p r.first }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
Swift.trace true
|
40
|
-
|
41
|
-
puts '-- multiple pools: size 2, size 1 --'
|
42
|
-
EM.run {
|
43
|
-
pool1 = Swift.pool(2)
|
44
|
-
pool2 = Swift.pool(1)
|
45
|
-
|
46
|
-
pool1.execute("select * from users limit 3 offset 0") do |rs|
|
47
|
-
puts '-- Inside pool1 #callback --'
|
48
|
-
rs.each {|r| p r }
|
49
|
-
pool1.execute("select * from users limit 3 offset 3") do |rs|
|
50
|
-
puts '-- Inside pool1 #callback again --'
|
51
|
-
rs.each {|r| p r }
|
52
|
-
EM.stop
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
pool2.execute("select * from users limit 3 offset 6") do |rs|
|
57
|
-
puts '-- Inside pool2 #callback --'
|
58
|
-
rs.each {|r| p r }
|
59
|
-
end
|
60
|
-
}
|
61
|
-
|
62
|
-
__END__
|
63
|
-
Apple Arthurton apple@example.com
|
64
|
-
Benny Arthurton benny@example.com
|
65
|
-
James Arthurton james@example.com
|
data/examples/db.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
-
|
5
|
-
require 'pp'
|
6
|
-
require 'swift'
|
7
|
-
require 'swift/migrations'
|
8
|
-
|
9
|
-
class User < Swift::Scheme
|
10
|
-
store :users
|
11
|
-
attribute :id, Swift::Type::Integer, serial: true, key: true
|
12
|
-
attribute :name, Swift::Type::String
|
13
|
-
attribute :email, Swift::Type::String
|
14
|
-
end # User
|
15
|
-
|
16
|
-
adapter = ARGV.first =~ /mysql/i ? Swift::DB::Mysql : Swift::DB::Postgres
|
17
|
-
puts "Using DB: #{adapter}"
|
18
|
-
|
19
|
-
Swift.setup :default, adapter, db: 'swift'
|
20
|
-
Swift.trace true
|
21
|
-
|
22
|
-
Swift.db do |db|
|
23
|
-
db.migrate! User
|
24
|
-
|
25
|
-
puts '-- create --'
|
26
|
-
db.create(User,
|
27
|
-
{name: 'Apple Arthurton', email: 'apple@arthurton.local'},
|
28
|
-
{name: 'Benny Arthurton', email: 'benny@arthurton.local'}
|
29
|
-
)
|
30
|
-
|
31
|
-
puts '', '-- select --'
|
32
|
-
pp users = db.prepare(User, 'select * from users').execute.to_a
|
33
|
-
|
34
|
-
puts '', '-- update --'
|
35
|
-
db.update(User, *users.map!{|user| user.name = 'Fred Nurk'; user})
|
36
|
-
pp db.prepare(User, 'select * from users').execute.to_a
|
37
|
-
|
38
|
-
puts '', '-- get --'
|
39
|
-
pp db.get(User, id: 1)
|
40
|
-
|
41
|
-
puts '', '-- destroy --'
|
42
|
-
pp db.destroy(User, id: 1).map(&:rows).first
|
43
|
-
end
|
44
|
-
|
data/examples/scheme.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
-
|
5
|
-
require 'pp'
|
6
|
-
require 'swift'
|
7
|
-
require 'swift/migrations'
|
8
|
-
require 'swift/validations'
|
9
|
-
|
10
|
-
class User < Swift::Scheme
|
11
|
-
store :users
|
12
|
-
attribute :id, Swift::Type::Integer, serial: true, key: true
|
13
|
-
attribute :name, Swift::Type::String
|
14
|
-
attribute :email, Swift::Type::String
|
15
|
-
attribute :active, Swift::Type::Boolean
|
16
|
-
attribute :created, Swift::Type::Time, default: proc { Time.now }
|
17
|
-
attribute :optional, Swift::Type::String, default: 'woot'
|
18
|
-
|
19
|
-
validations do |errors|
|
20
|
-
errors << [:name, 'is blank'] if name.to_s.empty?
|
21
|
-
end
|
22
|
-
end # User
|
23
|
-
|
24
|
-
adapter = ARGV.first =~ /mysql/i ? Swift::DB::Mysql : Swift::DB::Postgres
|
25
|
-
puts "Using DB: #{adapter}"
|
26
|
-
|
27
|
-
Swift.setup :default, adapter, db: 'swift'
|
28
|
-
Swift.trace true
|
29
|
-
|
30
|
-
puts '-- migrate! --'
|
31
|
-
User.migrate!
|
32
|
-
|
33
|
-
puts '', '-- create --'
|
34
|
-
User.create name: 'Apple Arthurton', email: 'apple@arthurton.local'
|
35
|
-
User.create name: 'Benny Arthurton', email: 'benny@arthurton.local'
|
36
|
-
|
37
|
-
puts '', '-- all --'
|
38
|
-
pp User.all.to_a
|
39
|
-
|
40
|
-
puts '', '-- first --'
|
41
|
-
pp User.first(':name like ?', '%Arthurton')
|
42
|
-
|
43
|
-
puts '', '-- get --'
|
44
|
-
pp user = User.get(id: 2)
|
45
|
-
pp user = User.get(id: 2)
|
46
|
-
|
47
|
-
puts '', '-- update --'
|
48
|
-
user.update(name: 'Jimmy Arthurton')
|
49
|
-
|
50
|
-
puts '', '-- destroy --'
|
51
|
-
user.destroy
|
52
|
-
|
53
|
-
puts '', '-- all --'
|
54
|
-
pp User.all.to_a
|